From fb9c111ed24e0d7bfc78f55676028f4970bb318a Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 10 Oct 2023 11:47:03 +0530 Subject: [PATCH 1/2] fix: conditional webform with list view enabled --- .../js/frappe/web_form/web_form_list.js | 6 + .../js/frappe/web_form/webform_script.js | 1 + frappe/website/doctype/web_form/web_form.js | 105 ++++++++++++++++++ frappe/website/doctype/web_form/web_form.json | 30 ++--- frappe/website/doctype/web_form/web_form.py | 16 +-- 5 files changed, 130 insertions(+), 28 deletions(-) diff --git a/frappe/public/js/frappe/web_form/web_form_list.js b/frappe/public/js/frappe/web_form/web_form_list.js index 6d89b8ac95..1db53a4b51 100644 --- a/frappe/public/js/frappe/web_form/web_form_list.js +++ b/frappe/public/js/frappe/web_form/web_form_list.js @@ -109,6 +109,12 @@ export default class WebFormList { } fetch_data() { + if (this.condition_json && JSON.parse(this.condition_json)) { + let filter = frappe.utils.get_filter_from_json(this.condition_json); + filter = frappe.utils.get_filter_as_json(filter); + this.filters = Object.assign(this.filters, JSON.parse(filter)); + } + let args = { method: "frappe.www.list.get_list_data", args: { diff --git a/frappe/public/js/frappe/web_form/webform_script.js b/frappe/public/js/frappe/web_form/webform_script.js index 8a5d123d2f..4c745a3909 100644 --- a/frappe/public/js/frappe/web_form/webform_script.js +++ b/frappe/public/js/frappe/web_form/webform_script.js @@ -27,6 +27,7 @@ frappe.ready(function () { doctype: web_form_doc.doc_type, web_form_name: web_form_doc.name, list_columns: web_form_doc.list_columns, + condition_json: web_form_doc.condition_json, settings: { allow_delete: web_form_doc.allow_delete, }, diff --git a/frappe/website/doctype/web_form/web_form.js b/frappe/website/doctype/web_form/web_form.js index c745cd265d..bfb19efd53 100644 --- a/frappe/website/doctype/web_form/web_form.js +++ b/frappe/website/doctype/web_form/web_form.js @@ -36,6 +36,7 @@ frappe.ui.form.on("Web Form", { frm.trigger("set_fields"); frm.trigger("add_get_fields_button"); frm.trigger("add_publish_button"); + frm.trigger("render_condition_table"); }, login_required: function (frm) { @@ -174,6 +175,110 @@ frappe.ui.form.on("Web Form", { allow_multiple: function (frm) { frm.doc.allow_multiple && frm.set_value("show_list", 1); }, + + before_save: function (frm) { + let static_filters = JSON.parse(frm.doc.condition_json || "[]"); + frm.set_value("condition_json", JSON.stringify(static_filters)); + frm.trigger("render_condition_table"); + }, + + render_condition_table: function (frm) { + // frm.set_df_property("filters_section", "hidden", 0); + let is_document_type = true; + + let wrapper = $(frm.get_field("condition_json").wrapper).empty(); + let table = $(` + + + + + + + + +
${__("Filter")}${__("Condition")}${__("Value")}
`).appendTo(wrapper); + $(`

${__("Click table to edit")}

`).appendTo(wrapper); + + let filters = JSON.parse(frm.doc.condition_json || "[]"); + let filters_set = false; + + let fields = []; + if (is_document_type) { + fields = [ + { + fieldtype: "HTML", + fieldname: "filter_area", + }, + ]; + + if (filters?.length) { + filters.forEach((filter) => { + const filter_row = $(` + ${filter[1]} + ${filter[2] || ""} + ${filter[3]} + `); + + table.find("tbody").append(filter_row); + }); + filters_set = true; + } + } else if (frm.filters.length) { + fields = frm.filters.filter((f) => f.fieldname); + fields.map((f) => { + if (filters[f.fieldname]) { + let condition = "="; + const filter_row = $(` + ${f.label} + ${condition} + ${filters[f.fieldname] || ""} + `); + table.find("tbody").append(filter_row); + if (!filters_set) filters_set = true; + } + }); + } + + if (!filters_set) { + const filter_row = $(` + ${__("Click to Set Filters")}`); + table.find("tbody").append(filter_row); + } + + table.on("click", () => { + let dialog = new frappe.ui.Dialog({ + title: __("Set Filters"), + fields: fields, + primary_action: function () { + let values = this.get_values(); + if (values) { + this.hide(); + if (is_document_type) { + let filters = frm.filter_group.get_filters(); + frm.set_value("condition_json", JSON.stringify(filters)); + } else { + frm.set_value("condition_json", JSON.stringify(values)); + } + frm.trigger("render_condition_table"); + } + }, + primary_action_label: "Set", + }); + + if (is_document_type) { + frm.filter_group = new frappe.ui.FilterGroup({ + parent: dialog.get_field("filter_area").$wrapper, + doctype: frm.doc.doc_type, + on_change: () => {}, + }); + filters && frm.filter_group.add_filters_to_filter_group(filters); + } + + dialog.show(); + + dialog.set_values(filters); + }); + }, }); frappe.ui.form.on("Web Form List Column", { diff --git a/frappe/website/doctype/web_form/web_form.json b/frappe/website/doctype/web_form/web_form.json index e0883ba439..ee6a543510 100644 --- a/frappe/website/doctype/web_form/web_form.json +++ b/frappe/website/doctype/web_form/web_form.json @@ -31,9 +31,8 @@ "allow_incomplete", "section_break_2", "max_attachment_size", - "section_break_xzqr", - "condition", - "column_break_tjgl", + "condition_section", + "condition_json", "condition_description", "section_break_3", "list_setting_message", @@ -374,32 +373,27 @@ "fieldtype": "Check", "label": "Anonymous" }, - { - "fieldname": "condition", - "fieldtype": "Code", - "label": "Condition", - "max_height": "150px" - }, - { - "fieldname": "section_break_xzqr", - "fieldtype": "Section Break" - }, - { - "fieldname": "column_break_tjgl", - "fieldtype": "Column Break" - }, { "fieldname": "condition_description", "fieldtype": "HTML", "label": "Condition Description", "options": "

Multiple webforms can be created for a single doctype. Write a condition specific to this webform to display correct record after submission.

For Example:

\n

If you create a separate webform every year to capture feedback from employees add a \n field named year in doctype and add a condition doc.year==\"2023\"

\n" + }, + { + "fieldname": "condition_section", + "fieldtype": "Section Break" + }, + { + "fieldname": "condition_json", + "fieldtype": "JSON", + "label": "Condition JSON" } ], "has_web_view": 1, "icon": "icon-edit", "is_published_field": "published", "links": [], - "modified": "2023-06-03 19:18:56.760479", + "modified": "2023-10-10 11:31:56.609386", "modified_by": "Administrator", "module": "Website", "name": "Web Form", diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py index 43a1a6ab1d..6c47ebd5fa 100644 --- a/frappe/website/doctype/web_form/web_form.py +++ b/frappe/website/doctype/web_form/web_form.py @@ -200,16 +200,12 @@ def get_context(context): and not frappe.form_dict.name and not frappe.form_dict.is_list ): - names = frappe.db.get_values(self.doc_type, {"owner": frappe.session.user}, pluck="name") - for name in names: - if self.condition: - doc = frappe.get_doc(self.doc_type, name) - if frappe.safe_eval(self.condition, None, {"doc": doc.as_dict()}): - context.in_view_mode = True - frappe.redirect(f"/{self.route}/{name}") - else: - context.in_view_mode = True - frappe.redirect(f"/{self.route}/{name}") + condition_json = json.loads(self.condition_json) if self.condition_json else [] + condition_json.append(["owner", "=", frappe.session.user]) + names = frappe.get_all(self.doc_type, filters=condition_json, pluck="name") + if names: + context.in_view_mode = True + frappe.redirect(f"/{self.route}/{names[0]}") # Show new form when # - User is Guest From 46f3b5b12dc675d76983b04aabe1533173f274dd Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 10 Oct 2023 12:53:21 +0530 Subject: [PATCH 2/2] fix: changed table style to match grid style updated description and some minor fixes --- .../js/frappe/ui/filters/filter_list.js | 2 +- frappe/website/doctype/web_form/web_form.js | 99 ++++++++++--------- frappe/website/doctype/web_form/web_form.json | 6 +- 3 files changed, 55 insertions(+), 52 deletions(-) diff --git a/frappe/public/js/frappe/ui/filters/filter_list.js b/frappe/public/js/frappe/ui/filters/filter_list.js index 9d017000b6..9fab23545b 100644 --- a/frappe/public/js/frappe/ui/filters/filter_list.js +++ b/frappe/public/js/frappe/ui/filters/filter_list.js @@ -36,7 +36,7 @@ frappe.ui.FilterGroup = class { } hide_popover() { - this.filter_button.popover("hide"); + this.filter_button?.popover("hide"); } init_filter_popover() { diff --git a/frappe/website/doctype/web_form/web_form.js b/frappe/website/doctype/web_form/web_form.js index bfb19efd53..b725c8db6c 100644 --- a/frappe/website/doctype/web_form/web_form.js +++ b/frappe/website/doctype/web_form/web_form.js @@ -183,60 +183,69 @@ frappe.ui.form.on("Web Form", { }, render_condition_table: function (frm) { - // frm.set_df_property("filters_section", "hidden", 0); - let is_document_type = true; - let wrapper = $(frm.get_field("condition_json").wrapper).empty(); - let table = $(` + let table = $(` + + +
- +
${__("Filter")}${__("Filter")} ${__("Condition")} ${__("Value")}
`).appendTo(wrapper); - $(`

${__("Click table to edit")}

`).appendTo(wrapper); + $(`

${__("Click table to edit")}

`).appendTo(wrapper); let filters = JSON.parse(frm.doc.condition_json || "[]"); let filters_set = false; - let fields = []; - if (is_document_type) { - fields = [ - { - fieldtype: "HTML", - fieldname: "filter_area", - }, - ]; + let fields = [ + { + fieldtype: "HTML", + fieldname: "filter_area", + }, + ]; - if (filters?.length) { - filters.forEach((filter) => { - const filter_row = $(` + if (filters?.length) { + filters.forEach((filter) => { + const filter_row = $(` ${filter[1]} ${filter[2] || ""} ${filter[3]} `); - table.find("tbody").append(filter_row); - }); - filters_set = true; - } - } else if (frm.filters.length) { - fields = frm.filters.filter((f) => f.fieldname); - fields.map((f) => { - if (filters[f.fieldname]) { - let condition = "="; - const filter_row = $(` - ${f.label} - ${condition} - ${filters[f.fieldname] || ""} - `); - table.find("tbody").append(filter_row); - if (!filters_set) filters_set = true; - } + table.find("tbody").append(filter_row); }); + filters_set = true; } if (!filters_set) { @@ -253,26 +262,20 @@ frappe.ui.form.on("Web Form", { let values = this.get_values(); if (values) { this.hide(); - if (is_document_type) { - let filters = frm.filter_group.get_filters(); - frm.set_value("condition_json", JSON.stringify(filters)); - } else { - frm.set_value("condition_json", JSON.stringify(values)); - } + let filters = frm.filter_group.get_filters(); + frm.set_value("condition_json", JSON.stringify(filters)); frm.trigger("render_condition_table"); } }, primary_action_label: "Set", }); - if (is_document_type) { - frm.filter_group = new frappe.ui.FilterGroup({ - parent: dialog.get_field("filter_area").$wrapper, - doctype: frm.doc.doc_type, - on_change: () => {}, - }); - filters && frm.filter_group.add_filters_to_filter_group(filters); - } + frm.filter_group = new frappe.ui.FilterGroup({ + parent: dialog.get_field("filter_area").$wrapper, + doctype: frm.doc.doc_type, + on_change: () => {}, + }); + filters && frm.filter_group.add_filters_to_filter_group(filters); dialog.show(); diff --git a/frappe/website/doctype/web_form/web_form.json b/frappe/website/doctype/web_form/web_form.json index ee6a543510..0e70620542 100644 --- a/frappe/website/doctype/web_form/web_form.json +++ b/frappe/website/doctype/web_form/web_form.json @@ -32,8 +32,8 @@ "section_break_2", "max_attachment_size", "condition_section", - "condition_json", "condition_description", + "condition_json", "section_break_3", "list_setting_message", "show_list", @@ -377,7 +377,7 @@ "fieldname": "condition_description", "fieldtype": "HTML", "label": "Condition Description", - "options": "

Multiple webforms can be created for a single doctype. Write a condition specific to this webform to display correct record after submission.

For Example:

\n

If you create a separate webform every year to capture feedback from employees add a \n field named year in doctype and add a condition doc.year==\"2023\"

\n" + "options": "

Multiple webforms can be created for a single doctype. Add filters specific to this webform to display correct record after submission.

For Example:

\n

If you create a separate webform every year to capture feedback from employees add a \n field named year in doctype and add a filter year = 2023

\n" }, { "fieldname": "condition_section", @@ -393,7 +393,7 @@ "icon": "icon-edit", "is_published_field": "published", "links": [], - "modified": "2023-10-10 11:31:56.609386", + "modified": "2023-10-10 12:51:18.341792", "modified_by": "Administrator", "module": "Website", "name": "Web Form",