From 4956e34c9e40d661de10b60a1cf416e7653dd1ac Mon Sep 17 00:00:00 2001 From: Akash Tom Date: Wed, 25 Feb 2026 15:00:25 +0530 Subject: [PATCH] refactor: revert to using array based filtering --- .../desk/doctype/number_card/number_card.js | 50 +++++---------- .../public/js/frappe/utils/dashboard_utils.js | 62 ++++++++----------- 2 files changed, 41 insertions(+), 71 deletions(-) diff --git a/frappe/desk/doctype/number_card/number_card.js b/frappe/desk/doctype/number_card/number_card.js index 41f7d6a84f..c9533c0a1d 100644 --- a/frappe/desk/doctype/number_card/number_card.js +++ b/frappe/desk/doctype/number_card/number_card.js @@ -397,7 +397,7 @@ frappe.ui.form.on("Number Card", { field_options.push({ label: df.label, value: df.fieldname }); }); - frm.events.show_dynamic_filter_dialog_common(frm, field_options); + frm.events.show_dynamic_filter_dialog_common(frm, field_options, frm.doc.document_type); }, show_report_dynamic_filter_dialog: function (frm) { @@ -405,30 +405,14 @@ frappe.ui.form.on("Number Card", { .filter((f) => f.fieldname) .map((f) => ({ label: f.label || f.fieldname, value: f.fieldname })); - frm.events.show_dynamic_filter_dialog_common(frm, field_options); + frm.events.show_dynamic_filter_dialog_common(frm, field_options, frm.doc.report_name); }, - convert_legacy_dynamic_filters: function (dynamic_filters) { - if (Array.isArray(dynamic_filters)) { - const converted = {}; - dynamic_filters.forEach((filter) => { - if (filter.length >= 4) { - // Old format: [doctype, fieldname, operator, expression] - converted[filter[1]] = filter[3]; - } - }); - return converted; - } - return dynamic_filters; - }, - - show_dynamic_filter_dialog_common: function (frm, field_options) { + show_dynamic_filter_dialog_common: function (frm, field_options, doctype_or_report) { let dynamic_filters = frm.doc.dynamic_filters_json?.length > 2 ? JSON.parse(frm.doc.dynamic_filters_json) - : {}; - - dynamic_filters = frm.events.convert_legacy_dynamic_filters(dynamic_filters); + : []; const dialog = new frappe.ui.Dialog({ title: __("Set Dynamic Filters"), @@ -442,12 +426,12 @@ frappe.ui.form.on("Number Card", { ], size: "large", primary_action: () => { - const filters = {}; + const filters = []; dialog.$wrapper.find(".dynamic-filter-row").each(function () { const field = $(this).find(".filter-field").val(); const expression = $(this).find(".filter-expression").val(); if (field && expression) { - filters[field] = expression; + filters.push([doctype_or_report, field, "=", expression]); } }); dialog.hide(); @@ -462,10 +446,10 @@ frappe.ui.form.on("Number Card", { field_options ); - if (dynamic_filters && Object.keys(dynamic_filters).length) { - Object.entries(dynamic_filters).forEach(([field, expression]) => - add_filter_row(field, expression) - ); + if (dynamic_filters?.length) { + dynamic_filters.forEach((filter) => { + add_filter_row(filter[1], filter[3]); + }); } else { add_filter_row(); } @@ -555,22 +539,20 @@ frappe.ui.form.on("Number Card", { let dynamic_filters = frm.doc.dynamic_filters_json?.length > 2 ? JSON.parse(frm.doc.dynamic_filters_json) - : null; + : []; - dynamic_filters = frm.events.convert_legacy_dynamic_filters(dynamic_filters); - - if (!dynamic_filters || Object.keys(dynamic_filters).length === 0) { + if (!dynamic_filters?.length) { const filter_row = $(` ${__("Click to Set Dynamic Filters")}`); frm.dynamic_filter_table.find("tbody").html(filter_row); } else { let filter_rows = ""; - for (let [key, val] of Object.entries(dynamic_filters)) { + dynamic_filters.forEach((filter) => { filter_rows += ` - ${key} - ${val || ""} + ${filter[1]} + ${filter[3] || ""} `; - } + }); frm.dynamic_filter_table.find("tbody").html(filter_rows); } diff --git a/frappe/public/js/frappe/utils/dashboard_utils.js b/frappe/public/js/frappe/utils/dashboard_utils.js index 33fbaf77b9..3d425aae08 100644 --- a/frappe/public/js/frappe/utils/dashboard_utils.js +++ b/frappe/public/js/frappe/utils/dashboard_utils.js @@ -133,26 +133,17 @@ frappe.dashboard_utils = { remove_common_static_filter_values(static_filters, dynamic_filters) { if (dynamic_filters) { if (Array.isArray(static_filters)) { - if (Array.isArray(dynamic_filters)) { - static_filters = static_filters.filter((static_filter) => { - for (let dynamic_filter of dynamic_filters) { - if ( - static_filter[0] == dynamic_filter[0] && - static_filter[1] == dynamic_filter[1] - ) { - return false; - } + static_filters = static_filters.filter((static_filter) => { + for (let dynamic_filter of dynamic_filters) { + if ( + static_filter[0] == dynamic_filter[0] && + static_filter[1] == dynamic_filter[1] + ) { + return false; } - return true; - }); - } else { - static_filters = static_filters.filter((static_filter) => { - return !Object.prototype.hasOwnProperty.call( - dynamic_filters, - static_filter[1] - ); - }); - } + } + return true; + }); } else { for (let key of Object.keys(dynamic_filters)) { delete static_filters[key]; @@ -216,29 +207,26 @@ frappe.dashboard_utils = { ? JSON.parse(doc.dynamic_filters_json) : null; - if (!dynamic_filters || !Object.keys(dynamic_filters).length) { + if (!dynamic_filters?.length) { return filters; } - if (Array.isArray(dynamic_filters)) { - dynamic_filters.forEach((f) => { - try { - f[3] = eval(f[3]); - } catch (e) { - frappe.throw(__("Invalid expression set in filter {0} ({1})", [f[1], f[0]])); - } - }); + dynamic_filters.forEach((f) => { + try { + f[3] = eval(f[3]); + } catch (e) { + frappe.throw(__("Invalid expression set in filter {0} ({1})", [f[1], f[0]])); + } + }); + + if (!filters) { + filters = dynamic_filters; + } else if (Array.isArray(filters)) { filters = [...filters, ...dynamic_filters]; } else { - for (let key of Object.keys(dynamic_filters)) { - try { - const val = eval(dynamic_filters[key]); - dynamic_filters[key] = val; - } catch (e) { - frappe.throw(__("Invalid expression set in filter {0}", [key])); - } - } - Object.assign(filters, dynamic_filters); + dynamic_filters.forEach((f) => { + filters[f[1]] = f[3]; + }); } return filters;