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/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..b725c8db6c 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,113 @@ 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) { + let wrapper = $(frm.get_field("condition_json").wrapper).empty(); + let table = $(` + + +
| ${__("Filter")} | +${__("Condition")} | +${__("Value")} | +
|---|
${__("Click table to edit")}
`).appendTo(wrapper); + + let filters = JSON.parse(frm.doc.condition_json || "[]"); + let filters_set = false; + + let fields = [ + { + fieldtype: "HTML", + fieldname: "filter_area", + }, + ]; + + if (filters?.length) { + filters.forEach((filter) => { + const filter_row = $(`Multiple webforms can be created for a single doctype. Write a condition specific to this webform to display correct record after submission.
For Example:
\nIf 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:
\nIf 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", + "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 12:51:18.341792", "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