From 27e4901e0b60eded3053d41ae5436b6c0297a79c Mon Sep 17 00:00:00 2001 From: Maharshi Patel Date: Sun, 8 Oct 2023 16:42:17 +0530 Subject: [PATCH 1/3] fix: workspace don't strip filter info on save. currently on save of filter ( get_filter_as_json ) is used to convert it to object with following structure: ``` { priority: (2) ['=', 'Medium'], status: (2) ['=', 'Open'] } ``` Doing this we lose information of parent doctype. Missing parent doctype causes field not permitted error. To fix this, I saved filter as it is and converted it to object when required. --- frappe/public/js/frappe/utils/utils.js | 32 +++++++++++-------- .../js/frappe/widgets/quick_list_widget.js | 6 ++-- .../js/frappe/widgets/shortcut_widget.js | 2 +- .../public/js/frappe/widgets/widget_dialog.js | 4 +-- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 7852cfc80b..f4dbe35b4a 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -1606,19 +1606,8 @@ Object.assign(frappe.utils, { } }, - get_filter_as_json(filters) { - // convert filter array to json - let filter = null; - - if (filters.length) { - filter = {}; - filters.forEach((arr) => { - filter[arr[1]] = [arr[2], arr[3]]; - }); - filter = JSON.stringify(filter); - } - - return filter; + process_filter_expression(filter) { + return new Function(`return ${filter}`)(); }, get_filter_from_json(filter_json, doctype) { @@ -1628,12 +1617,22 @@ Object.assign(frappe.utils, { return []; } - const filters_json = new Function(`return ${filter_json}`)(); + const filters_json = this.process_filter_expression(filter_json); if (!doctype) { // e.g. return { // priority: (2) ['=', 'Medium'], // status: (2) ['=', 'Open'] // } + + // don't remove unless patch is created to convert all existing filters from object to array + // backward compatibility + if (Array.isArray(filters_json)) { + let filter = {}; + filters_json.forEach((arr) => { + filter[arr[1]] = [arr[2], arr[3]]; + }); + return filter || []; + } return filters_json || []; } @@ -1641,6 +1640,11 @@ Object.assign(frappe.utils, { // ['ToDo', 'status', '=', 'Open', false], // ['ToDo', 'priority', '=', 'Medium', false] // ] + if (Array.isArray(filters_json)) { + return filters_json; + } + // don't remove unless patch is created to convert all existing filters from object to array + // backward compatibility return Object.keys(filters_json).map((filter) => { let val = filters_json[filter]; return [doctype, filter, val[0], val[1], false]; diff --git a/frappe/public/js/frappe/widgets/quick_list_widget.js b/frappe/public/js/frappe/widgets/quick_list_widget.js index e028d3e252..ffc1ccc418 100644 --- a/frappe/public/js/frappe/widgets/quick_list_widget.js +++ b/frappe/public/js/frappe/widgets/quick_list_widget.js @@ -76,7 +76,7 @@ export default class QuickListWidget extends Widget { delete this.filter_group; } - this.filters = frappe.utils.get_filter_from_json(this.quick_list_filter, doctype); + this.filters = frappe.utils.process_filter_expression(this.quick_list_filter); this.filter_group = new frappe.ui.FilterGroup({ parent: this.dialog.get_field("filter_area").$wrapper, @@ -104,7 +104,7 @@ export default class QuickListWidget extends Widget { primary_action: function () { let old_filter = me.quick_list_filter; let filters = me.filter_group.get_filters(); - me.quick_list_filter = frappe.utils.get_filter_as_json(filters); + me.quick_list_filter = JSON.parse(filters); this.hide(); @@ -193,7 +193,7 @@ export default class QuickListWidget extends Widget { fields.push("modified"); - let quick_list_filter = frappe.utils.get_filter_from_json(this.quick_list_filter); + let quick_list_filter = frappe.utils.process_filter_expression(this.quick_list_filter); let args = { method: "frappe.desk.reportview.get", diff --git a/frappe/public/js/frappe/widgets/shortcut_widget.js b/frappe/public/js/frappe/widgets/shortcut_widget.js index 0a19862a8c..b2524c8a10 100644 --- a/frappe/public/js/frappe/widgets/shortcut_widget.js +++ b/frappe/public/js/frappe/widgets/shortcut_widget.js @@ -71,7 +71,7 @@ export default class ShortcutWidget extends Widget { this.widget.addClass("shortcut-widget-box"); - let filters = frappe.utils.get_filter_from_json(this.stats_filter); + let filters = frappe.utils.process_filter_expression(this.stats_filter); if (this.type == "DocType" && filters) { frappe.db .count(this.link_to, { diff --git a/frappe/public/js/frappe/widgets/widget_dialog.js b/frappe/public/js/frappe/widgets/widget_dialog.js index 04b892b55e..e22e56c47f 100644 --- a/frappe/public/js/frappe/widgets/widget_dialog.js +++ b/frappe/public/js/frappe/widgets/widget_dialog.js @@ -182,7 +182,7 @@ class QuickListDialog extends WidgetDialog { process_data(data) { if (this.filter_group) { let filters = this.filter_group.get_filters(); - data.quick_list_filter = frappe.utils.get_filter_as_json(filters); + data.quick_list_filter = JSON.stringify(filters); } data.label = data.label ? data.label : data.document_type; @@ -540,7 +540,7 @@ class ShortcutDialog extends WidgetDialog { process_data(data) { if (this.dialog.get_value("type") == "DocType" && this.filter_group) { let filters = this.filter_group.get_filters(); - data.stats_filter = frappe.utils.get_filter_as_json(filters); + data.stats_filter = JSON.stringify(filters); } data.label = data.label ? data.label : frappe.model.unscrub(data.link_to); From 8550e7bdedc2d9e67cafa9a5cea323deb1de57cc Mon Sep 17 00:00:00 2001 From: Maharshi Patel Date: Tue, 10 Oct 2023 21:18:20 +0530 Subject: [PATCH 2/3] chore: deprecated get_filter_as_json Instead of removing get_filter_as_json add console warn. --- frappe/public/js/frappe/utils/utils.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index f4dbe35b4a..0a2fb45194 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -1605,6 +1605,20 @@ Object.assign(frappe.utils, { return string; } }, + // deprecated! + get_filter_as_json(filters) { + console.warn("frappe.utils.get_filter_as_json is deprecated."); + // convert filter array to json + let filter = null; + if (filters.length) { + filter = {}; + filters.forEach((arr) => { + filter[arr[1]] = [arr[2], arr[3]]; + }); + filter = JSON.stringify(filter); + } + return filter; + }, process_filter_expression(filter) { return new Function(`return ${filter}`)(); From 7d4de5675cdb77c272f134d2a53e2fdcab1d4200 Mon Sep 17 00:00:00 2001 From: Shariq Ansari <30859809+shariquerik@users.noreply.github.com> Date: Wed, 11 Oct 2023 15:35:53 +0530 Subject: [PATCH 3/3] chore: remove deprecated message --- frappe/public/js/frappe/utils/utils.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frappe/public/js/frappe/utils/utils.js b/frappe/public/js/frappe/utils/utils.js index 0a2fb45194..3a02c723ce 100644 --- a/frappe/public/js/frappe/utils/utils.js +++ b/frappe/public/js/frappe/utils/utils.js @@ -1605,9 +1605,8 @@ Object.assign(frappe.utils, { return string; } }, - // deprecated! + get_filter_as_json(filters) { - console.warn("frappe.utils.get_filter_as_json is deprecated."); // convert filter array to json let filter = null; if (filters.length) {