From 50021ab22f4cac23e2c8ec9838a468385d9f11cd Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Mon, 14 Feb 2022 13:22:09 +0530 Subject: [PATCH 1/3] fix: depends_on not working with tabs --- frappe/public/js/frappe/form/layout.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index 0de6b1db0d..f7219282c6 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -552,19 +552,21 @@ frappe.ui.form.Layout = class Layout { // build dependants' dictionary let has_dep = false; - for (let fkey in this.fields_list) { - let f = this.fields_list[fkey]; - f.dependencies_clear = true; + const fields = this.fields_list.concat(this.tabs); + + for (let fkey in fields) { + let f = fields[fkey]; if (f.df.depends_on || f.df.mandatory_depends_on || f.df.read_only_depends_on) { has_dep = true; + break; } } if (!has_dep) return; // show / hide based on values - for (let i = this.fields_list.length - 1; i >= 0; i--) { - let f = this.fields_list[i]; + for (let i = fields.length - 1; i >= 0; i--) { + let f = fields[i]; f.guardian_has_value = true; if (f.df.depends_on) { // evaluate guardian From 74748c60b2cb9e84a6c68aa3a873dbc31ee52635 Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Fri, 18 Feb 2022 12:45:21 +0530 Subject: [PATCH 2/3] test: depends on for tabs --- cypress/integration/depends_on.js | 21 +++++++++++++++++++++ frappe/public/js/frappe/form/tab.js | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/cypress/integration/depends_on.js b/cypress/integration/depends_on.js index 9aa6b5d89d..c0dbbf63f6 100644 --- a/cypress/integration/depends_on.js +++ b/cypress/integration/depends_on.js @@ -55,10 +55,31 @@ context('Depends On', () => { 'read_only_depends_on': "eval:doc.test_field=='Some Other Value'", 'options': "Child Test Depends On" }, + { + "label": "Dependent Tab", + "fieldname": "dependent_tab", + "fieldtype": "Tab Break", + "depends_on": "eval:doc.test_field=='Show Tab'" + }, + { + "fieldname": "tab_section", + "fieldtype": "Section Break", + }, + { + "label": "Field in Tab", + "fieldname": "field_in_tab", + "fieldtype": "Data", + } ] }); }); }); + it('should show the tab on other setting field value', () => { + cy.new_form('Test Depends On'); + cy.fill_field('test_field', 'Show Tab'); + cy.get('body').click(); + cy.findByRole("tab", {name: "Dependent Tab"}).should('be.visible'); + }) it('should set the field as mandatory depending on other fields value', () => { cy.new_form('Test Depends On'); cy.fill_field('test_field', 'Some Value'); diff --git a/frappe/public/js/frappe/form/tab.js b/frappe/public/js/frappe/form/tab.js index c8ca016398..7df4d3a0cc 100644 --- a/frappe/public/js/frappe/form/tab.js +++ b/frappe/public/js/frappe/form/tab.js @@ -40,7 +40,7 @@ export default class Tab { hide = true; } - hide && this.toggle(false); + this.toggle(!hide) } toggle(show) { From b8539028909f7786f6be21ab6c8a1dc861496afa Mon Sep 17 00:00:00 2001 From: Saqib Ansari Date: Fri, 18 Feb 2022 13:03:31 +0530 Subject: [PATCH 3/3] chore: add missing semicolon --- cypress/integration/depends_on.js | 2 +- frappe/public/js/frappe/form/tab.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/integration/depends_on.js b/cypress/integration/depends_on.js index c0dbbf63f6..12f54f2b6e 100644 --- a/cypress/integration/depends_on.js +++ b/cypress/integration/depends_on.js @@ -79,7 +79,7 @@ context('Depends On', () => { cy.fill_field('test_field', 'Show Tab'); cy.get('body').click(); cy.findByRole("tab", {name: "Dependent Tab"}).should('be.visible'); - }) + }); it('should set the field as mandatory depending on other fields value', () => { cy.new_form('Test Depends On'); cy.fill_field('test_field', 'Some Value'); diff --git a/frappe/public/js/frappe/form/tab.js b/frappe/public/js/frappe/form/tab.js index 7df4d3a0cc..0e740ce49c 100644 --- a/frappe/public/js/frappe/form/tab.js +++ b/frappe/public/js/frappe/form/tab.js @@ -40,7 +40,7 @@ export default class Tab { hide = true; } - this.toggle(!hide) + this.toggle(!hide); } toggle(show) {