feat: add dynamic filters to Web Form list view
This commit is contained in:
parent
9d280e4ada
commit
d0d7ef8ae6
5 changed files with 138 additions and 1 deletions
|
|
@ -116,6 +116,40 @@ export default class WebFormList {
|
|||
this.filters = Object.assign(this.filters, JSON.parse(filter));
|
||||
}
|
||||
|
||||
if (this.dynamic_filters_json) {
|
||||
let dynamic_filters = JSON.parse(this.dynamic_filters_json);
|
||||
if (dynamic_filters.length) {
|
||||
dynamic_filters.forEach((f) => {
|
||||
let expression = f[3];
|
||||
try {
|
||||
f[3] = eval(f[3]);
|
||||
} catch (e) {
|
||||
frappe.throw(
|
||||
__("Invalid expression set in filter {0} ({1}): {2}", [
|
||||
f[1],
|
||||
f[0],
|
||||
expression,
|
||||
])
|
||||
);
|
||||
}
|
||||
if (f[3] == null) {
|
||||
frappe.throw(
|
||||
__("Invalid expression set in filter {0} ({1}): {2}", [
|
||||
f[1],
|
||||
f[0],
|
||||
expression,
|
||||
])
|
||||
);
|
||||
}
|
||||
});
|
||||
let df_obj = {};
|
||||
dynamic_filters.forEach((f) => {
|
||||
df_obj[f[1]] = [f[2], f[3]];
|
||||
});
|
||||
this.filters = Object.assign(this.filters, df_obj);
|
||||
}
|
||||
}
|
||||
|
||||
let args = {
|
||||
method: "frappe.www.list.get_list_data",
|
||||
args: {
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ frappe.ready(function () {
|
|||
web_form_name: web_form_doc.name,
|
||||
list_columns: web_form_doc.list_columns,
|
||||
condition_json: web_form_doc.condition_json,
|
||||
dynamic_filters_json: web_form_doc.dynamic_filters_json,
|
||||
settings: {
|
||||
allow_delete: web_form_doc.allow_delete,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ frappe.ui.form.on("Web Form", {
|
|||
frm.trigger("add_get_fields_button");
|
||||
frm.trigger("add_publish_button");
|
||||
frm.trigger("render_condition_table");
|
||||
frm.trigger("render_dynamic_filters_table");
|
||||
},
|
||||
|
||||
login_required: function (frm) {
|
||||
|
|
@ -203,9 +204,15 @@ frappe.ui.form.on("Web Form", {
|
|||
},
|
||||
|
||||
before_save: function (frm) {
|
||||
let dynamic_filters = JSON.parse(frm.doc.dynamic_filters_json || "null");
|
||||
let static_filters = JSON.parse(frm.doc.condition_json || "[]");
|
||||
static_filters = frappe.dashboard_utils.remove_common_static_filter_values(
|
||||
static_filters,
|
||||
dynamic_filters
|
||||
);
|
||||
frm.set_value("condition_json", JSON.stringify(static_filters));
|
||||
frm.trigger("render_condition_table");
|
||||
frm.trigger("render_dynamic_filters_table");
|
||||
},
|
||||
|
||||
render_condition_table: function (frm) {
|
||||
|
|
@ -308,6 +315,88 @@ frappe.ui.form.on("Web Form", {
|
|||
dialog.set_values(filters);
|
||||
});
|
||||
},
|
||||
render_dynamic_filters_table(frm) {
|
||||
let wrapper = $(frm.get_field("dynamic_filters_json").wrapper).empty();
|
||||
|
||||
frm.dynamic_filter_table = $(`<table class="table table-bordered" style="cursor:${
|
||||
frm.has_perm("write") ? "pointer" : "default"
|
||||
}; margin:0px;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 20%">${__("Filter")}</th>
|
||||
<th style="width: 20%">${__("Condition")}</th>
|
||||
<th>${__("Value")}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
</table>`).appendTo(wrapper);
|
||||
|
||||
frm.dynamic_filters =
|
||||
frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2
|
||||
? JSON.parse(frm.doc.dynamic_filters_json)
|
||||
: null;
|
||||
|
||||
frm.trigger("set_dynamic_filters_in_table");
|
||||
|
||||
let filters = JSON.parse(frm.doc.condition_json || "[]");
|
||||
|
||||
let fields = frappe.dashboard_utils.get_fields_for_dynamic_filter_dialog(
|
||||
true,
|
||||
filters,
|
||||
frm.dynamic_filters
|
||||
);
|
||||
|
||||
frm.dynamic_filter_table.on("click", () => {
|
||||
if (!frm.has_perm("write")) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!frappe.boot.developer_mode && frm.doc.is_standard) {
|
||||
frappe.throw(__("Cannot edit filters for standard Web Forms"));
|
||||
}
|
||||
let dialog = new frappe.ui.Dialog({
|
||||
title: __("Set Dynamic Filters"),
|
||||
fields: fields,
|
||||
primary_action: () => {
|
||||
let values = dialog.get_values();
|
||||
dialog.hide();
|
||||
let dynamic_filters = [];
|
||||
for (let key of Object.keys(values)) {
|
||||
let [doctype, fieldname] = key.split(":");
|
||||
dynamic_filters.push([doctype, fieldname, "=", values[key]]);
|
||||
}
|
||||
frm.set_value("dynamic_filters_json", JSON.stringify(dynamic_filters));
|
||||
frm.trigger("set_dynamic_filters_in_table");
|
||||
},
|
||||
primary_action_label: __("Set"),
|
||||
});
|
||||
|
||||
dialog.show();
|
||||
dialog.set_values(frm.dynamic_filters);
|
||||
});
|
||||
},
|
||||
set_dynamic_filters_in_table: function (frm) {
|
||||
frm.dynamic_filters =
|
||||
frm.doc.dynamic_filters_json && frm.doc.dynamic_filters_json.length > 2
|
||||
? JSON.parse(frm.doc.dynamic_filters_json)
|
||||
: null;
|
||||
|
||||
if (!frm.dynamic_filters) {
|
||||
const filter_row = $(`<tr><td colspan="3" 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 = "";
|
||||
frm.dynamic_filters.forEach((filter) => {
|
||||
filter_rows += `<tr>
|
||||
<td>${filter[1]}</td>
|
||||
<td>${filter[2] || ""}</td>
|
||||
<td>${filter[3]}</td>
|
||||
</tr>`;
|
||||
});
|
||||
frm.dynamic_filter_table.find("tbody").html(filter_rows);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
frappe.ui.form.on("Web Form List Column", {
|
||||
|
|
|
|||
|
|
@ -39,6 +39,8 @@
|
|||
"condition_section",
|
||||
"condition_description",
|
||||
"condition_json",
|
||||
"dynamic_filters_section",
|
||||
"dynamic_filters_json",
|
||||
"section_break_3",
|
||||
"list_setting_message",
|
||||
"show_list",
|
||||
|
|
@ -424,12 +426,22 @@
|
|||
{
|
||||
"fieldname": "column_break_hhec",
|
||||
"fieldtype": "Column Break"
|
||||
},
|
||||
{
|
||||
"fieldname": "dynamic_filters_json",
|
||||
"fieldtype": "JSON",
|
||||
"label": "Dynamic Filters JSON"
|
||||
},
|
||||
{
|
||||
"fieldname": "dynamic_filters_section",
|
||||
"fieldtype": "Section Break",
|
||||
"label": "Dynamic Filters"
|
||||
}
|
||||
],
|
||||
"icon": "icon-edit",
|
||||
"is_published_field": "published",
|
||||
"links": [],
|
||||
"modified": "2025-12-12 16:29:35.806107",
|
||||
"modified": "2026-02-13 19:59:19.807594",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Website",
|
||||
"name": "Web Form",
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ class WebForm(WebsiteGenerator):
|
|||
condition_json: DF.JSON | None
|
||||
custom_css: DF.Code | None
|
||||
doc_type: DF.Link
|
||||
dynamic_filters_json: DF.JSON | None
|
||||
hide_footer: DF.Check
|
||||
hide_navbar: DF.Check
|
||||
introduction_text: DF.TextEditor | None
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue