refactor: revert to using array based filtering

This commit is contained in:
Akash Tom 2026-02-25 15:00:25 +05:30
parent 1b03eb1e07
commit 4956e34c9e
2 changed files with 41 additions and 71 deletions

View file

@ -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 = $(`<tr><td colspan="2" class="text-muted text-center">
${__("Click to Set Dynamic Filters")}</td></tr>`);
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 += `<tr>
<td>${key}</td>
<td><code>${val || ""}</code></td>
<td>${filter[1]}</td>
<td><code>${filter[3] || ""}</code></td>
</tr>`;
}
});
frm.dynamic_filter_table.find("tbody").html(filter_rows);
}

View file

@ -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;