diff --git a/frappe/desk/desktop.py b/frappe/desk/desktop.py index 3713a489e3..6d0356747d 100644 --- a/frappe/desk/desktop.py +++ b/frappe/desk/desktop.py @@ -551,22 +551,7 @@ def save_new_widget(page, new_widgets): original_page.build_links_table_from_card(widgets.card) # remove duplicate and unwanted widgets - content = frappe.db.get_value("Internal Wiki Page", page, "content") - page_widgets = {} - for wid in ['shortcut', 'card', 'chart']: - # get list of widget's name from internal wiki page - page_widgets[wid] = [x['data'][wid + '_name'] for x in json.loads(content) if x['type'] == wid] - - updated_widgets = [] - original_page.get('shortcuts').reverse() - for w in original_page.get('shortcuts'): - if w.label in page_widgets['shortcut'] and w.label not in [x.label for x in updated_widgets]: - updated_widgets.append(w) - original_page.set('shortcuts', updated_widgets) - - for i, v in enumerate(original_page.links): - if v.type == 'Card Break' and v.label not in page_widgets['card']: - del original_page.links[ i : i+v.link_count+1] + clean_up(original_page, page) try: original_page.save(ignore_permissions=True) @@ -586,6 +571,30 @@ def save_new_widget(page, new_widgets): return True +def clean_up(original_page, page): + page_widgets = {} + + content = frappe.db.get_value("Internal Wiki Page", page, "content") + + for wid in ['shortcut', 'card', 'chart']: + # get list of widget's name from internal wiki page + page_widgets[wid] = [x['data'][wid + '_name'] for x in json.loads(content) if x['type'] == wid] + + # shortcut & chart cleanup + for wid in ['shortcut', 'chart']: + updated_widgets = [] + original_page.get(wid+'s').reverse() + + for w in original_page.get(wid+'s'): + if w.label in page_widgets[wid] and w.label not in [x.label for x in updated_widgets]: + updated_widgets.append(w) + original_page.set(wid+'s', updated_widgets) + + # card cleanup + for i, v in enumerate(original_page.links): + if v.type == 'Card Break' and v.label not in page_widgets['card']: + del original_page.links[i : i+v.link_count+1] + def new_widget(config, doctype, parentfield): if not config: return [] diff --git a/frappe/public/js/frappe/wiki_blocks/chart.js b/frappe/public/js/frappe/wiki_blocks/chart.js index 1d637ef5b6..6c51ad873e 100644 --- a/frappe/public/js/frappe/wiki_blocks/chart.js +++ b/frappe/public/js/frappe/wiki_blocks/chart.js @@ -1,3 +1,4 @@ +import get_dialog_constructor from "../widgets/widget_dialog.js"; export default class Chart { static get toolbox() { return { @@ -10,34 +11,32 @@ export default class Chart { return true; } - constructor({data, api, config, readOnly}) { + constructor({data, api, config, readOnly, block}) { this.data = data; this.api = api; + this.block = block; this.config = config; this.readOnly = readOnly; - this.sections = {}; this.col = this.data.col ? this.data.col : "12"; this.pt = this.data.pt ? this.data.pt : "0"; this.pr = this.data.pr ? this.data.pr : "0"; this.pb = this.data.pb ? this.data.pb : "0"; this.pl = this.data.pl ? this.data.pl : "0"; this.allow_customization = !this.readOnly; + this.options = { + allow_sorting: this.allow_customization, + allow_create: this.allow_customization, + allow_delete: this.allow_customization, + allow_hiding: false, + allow_edit: true, + max_widget_count: 2, + }; } render() { - let me = this; this.wrapper = document.createElement('div'); - this._make_fieldgroup(this.wrapper, [{ - fieldtype: "Select", - label: "Chart Name", - fieldname: "chart_name", - options: this.config.page_data.charts.items.map(({ chart_name }) => chart_name), - change: function() { - if (this.value) { - me._make_charts(this.value); - } - } - }]); + this._new_chart(); + if (this.data && this.data.chart_name) { this._make_charts(this.data.chart_name); } @@ -51,7 +50,8 @@ export default class Chart { pt: this._getPadding("t"), pr: this._getPadding("r"), pb: this._getPadding("b"), - pl: this._getPadding("l") + pl: this._getPadding("l"), + new: this.new_chart_widget }; } @@ -64,6 +64,34 @@ export default class Chart { e.classList.add("pl-" + this.pl); } + _new_chart() { + const dialog_class = get_dialog_constructor('chart'); + this.dialog = new dialog_class({ + label: this.label, + type: 'chart', + primary_action: (widget) => { + widget.in_customize_mode = 1; + this.chart_widget = frappe.widget.make_widget({ + ...widget, + widget_type: 'chart', + container: this.wrapper, + options: { + ...this.options, + on_delete: () => this.api.blocks.delete(), + on_edit: () => this.on_edit(this.chart_widget) + } + }); + this.chart_widget.customize(this.options); + this.wrapper.setAttribute("chart_name", this.chart_widget.label); + this.new_chart_widget = this.chart_widget.get_config(); + }, + }); + + if (!this.readOnly && this.data && !this.data.chart_name) { + this.dialog.make(); + } + } + _getCol() { var e = 12; var t = "col-12"; @@ -130,32 +158,31 @@ export default class Chart { this.chart_field.make(); } + on_edit(chart_obj) { + let chart = chart_obj.get_config(); + this.chart_widget.widgets = chart; + this.wrapper.setAttribute("chart_name", chart.label); + this.new_chart_widget = chart_obj.get_config(); + } + _make_charts(chart_name) { let chart = this.config.page_data.charts.items.find(obj => { - return obj.chart_name == chart_name; + return obj.label == chart_name; }); + if (!chart) return; this.wrapper.innerHTML = ''; - this.sections = {}; - chart.in_customize_mode = !this.readOnly; - this.sections["charts"] = new frappe.widget.SingleWidgetGroup({ + this.chart_widget = new frappe.widget.SingleWidgetGroup({ container: this.wrapper, type: "chart", - columns: 1, class_name: "widget-charts", - // hidden: Boolean(this.onboarding_widget), - options: { - allow_sorting: this.allow_customization, - allow_create: this.allow_customization, - allow_delete: this.allow_customization, - allow_hiding: false, - allow_edit: true, - max_widget_count: 2, - }, - widgets: chart + options: this.options, + widgets: chart, + api: this.api, + block: this.block }); this.wrapper.setAttribute("chart_name", chart_name); if (!this.readOnly) { - this.sections["charts"].customize(); + this.chart_widget.customize(); } } } \ No newline at end of file