seitime-frappe/frappe/core/page/dashboard/dashboard.js
2020-05-20 14:09:52 +05:30

192 lines
No EOL
4.6 KiB
JavaScript

// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors
// MIT License. See license.txt
frappe.provide('frappe.dashboards');
frappe.provide('frappe.dashboards.chart_sources');
frappe.pages['dashboard'].on_page_load = function(wrapper) {
frappe.ui.make_app_page({
parent: wrapper,
title: __("Dashboard"),
single_column: true
});
frappe.dashboard = new Dashboard(wrapper);
$(wrapper).bind('show', function() {
frappe.dashboard.show();
});
};
class Dashboard {
constructor(wrapper) {
this.wrapper = $(wrapper);
$(`<div class="dashboard" style="overflow-y: hidden">
<div class="dashboard-graph"></div>
</div>`).appendTo(this.wrapper.find(".page-content").empty());
this.container = this.wrapper.find(".dashboard-graph");
this.page = wrapper.page;
this.page.set_title_sub(
$(`<button class="restricted-button">
<span class="octicon octicon-lock"></span>
<span>${__('Restricted')}</span>
</button>`)
);
}
show() {
this.route = frappe.get_route();
if (this.route.length > 1) {
// from route
this.show_dashboard(this.route.slice(-1)[0]);
} else {
// last opened
if (frappe.last_dashboard) {
frappe.set_route('dashboard', frappe.last_dashboard);
} else {
// default dashboard
frappe.db.get_list('Dashboard', {filters: {is_default: 1}}).then(data => {
if (data && data.length) {
frappe.set_route('dashboard', data[0].name);
} else {
// no default, get the latest one
frappe.db.get_list('Dashboard', {limit: 1}).then(data => {
if (data && data.length) {
frappe.set_route('dashboard', data[0].name);
} else {
// create a new dashboard!
frappe.new_doc('Dashboard');
}
});
}
});
}
}
}
show_dashboard(current_dashboard_name) {
if (this.dashboard_name !== current_dashboard_name) {
this.dashboard_name = current_dashboard_name;
let title = this.dashboard_name;
if (!this.dashboard_name.toLowerCase().includes(__('dashboard'))) {
// ensure dashboard title has "dashboard"
title = __('{0} Dashboard', [title]);
}
this.page.set_title(title);
this.set_dropdown();
this.container.empty();
this.refresh();
}
this.charts = {};
frappe.last_dashboard = current_dashboard_name;
}
refresh() {
frappe.run_serially([
() => this.render_cards(),
() => this.render_charts()
]);
}
render_charts() {
return this.get_permitted_items(
'frappe.desk.doctype.dashboard.dashboard.get_permitted_charts'
).then(charts => {
if (!charts.length) {
frappe.msgprint(__('No Permitted Charts on this Dashboard'), __('No Permitted Charts'))
}
frappe.dashboard_utils.get_dashboard_settings().then((settings) => {
let chart_config = settings.chart_config? JSON.parse(settings.chart_config): {};
this.charts =
charts.map(chart => {
return {
chart_name: chart.chart,
label: chart.chart,
chart_settings: chart_config[chart.chart] || {},
...chart
}
});
this.chart_group = new frappe.widget.WidgetGroup({
title: null,
container: this.container,
type: "chart",
columns: 2,
options: {
allow_sorting: false,
allow_create: false,
allow_delete: false,
allow_hiding: false,
allow_edit: false,
},
widgets: this.charts,
});
})
});
}
render_cards() {
return this.get_permitted_items(
'frappe.desk.doctype.dashboard.dashboard.get_permitted_cards'
).then(cards => {
if (!cards.length) {
return;
}
this.number_cards =
cards.map(card => {
return {
name: card.card,
};
});
this.number_card_group = new frappe.widget.WidgetGroup({
container: this.container,
type: "number_card",
columns: 3,
options: {
allow_sorting: false,
allow_create: false,
allow_delete: false,
allow_hiding: false,
allow_edit: false,
},
widgets: this.number_cards,
});
});
}
get_permitted_items(method) {
return frappe.xcall(
method,
{
dashboard_name: this.dashboard_name
}
).then(items => {
return items;
});
}
set_dropdown() {
this.page.clear_menu();
this.page.add_menu_item('Edit...', () => {
frappe.set_route('Form', 'Dashboard', frappe.dashboard.dashboard_name);
}, 1);
this.page.add_menu_item('New...', () => {
frappe.new_doc('Dashboard');
}, 1);
frappe.db.get_list("Dashboard").then(dashboards => {
dashboards.map(dashboard => {
let name = dashboard.name;
if(name != this.dashboard_name){
this.page.add_menu_item(name, () => frappe.set_route("dashboard", name));
}
});
});
}
}