diff --git a/cypress/integration/grid.js b/cypress/integration/grid.js new file mode 100644 index 0000000000..4fa52712cf --- /dev/null +++ b/cypress/integration/grid.js @@ -0,0 +1,92 @@ +context('Grid', () => { + beforeEach(() => { + cy.login(); + cy.visit('/app/website'); + }); + before(() => { + cy.login(); + cy.visit('/app/website'); + return cy.window().its('frappe').then(frappe => { + return frappe.call("frappe.tests.ui_test_helpers.create_contact_phone_nos_records"); + }); + }); + it('update docfield property using update_docfield_property', () => { + cy.visit('/app/contact/Test Contact'); + cy.window().its("cur_frm").then(frm => { + cy.get('.frappe-control[data-fieldname="phone_nos"]').as('table'); + let field = frm.get_field("phone_nos"); + field.grid.update_docfield_property("is_primary_phone", "hidden", true); + + cy.get('@table').find('[data-idx="1"] .edit-grid-row').click(); + cy.get('.grid-row-open').as('table-form'); + cy.get('@table-form').find('.frappe-control[data-fieldname="is_primary_phone"]').should("be.hidden"); + cy.get('@table-form').find('.grid-footer-toolbar').click(); + + cy.get('@table').find('[data-idx="2"] .edit-grid-row').click(); + cy.get('.grid-row-open').as('table-form'); + cy.get('@table-form').find('.frappe-control[data-fieldname="is_primary_phone"]').should("be.hidden"); + cy.get('@table-form').find('.grid-footer-toolbar').click(); + }); + }); + it('update docfield property using toggle_display', () => { + cy.visit('/app/contact/Test Contact'); + cy.window().its("cur_frm").then(frm => { + cy.get('.frappe-control[data-fieldname="phone_nos"]').as('table'); + let field = frm.get_field("phone_nos"); + field.grid.toggle_display("is_primary_mobile_no", false); + + cy.get('@table').find('[data-idx="1"] .edit-grid-row').click(); + cy.get('.grid-row-open').as('table-form'); + cy.get('@table-form').find('.frappe-control[data-fieldname="is_primary_mobile_no"]').should("be.hidden"); + cy.get('@table-form').find('.grid-footer-toolbar').click(); + + cy.get('@table').find('[data-idx="2"] .edit-grid-row').click(); + cy.get('.grid-row-open').as('table-form'); + cy.get('@table-form').find('.frappe-control[data-fieldname="is_primary_mobile_no"]').should("be.hidden"); + cy.get('@table-form').find('.grid-footer-toolbar').click(); + }); + }); + it('update docfield property using toggle_enable', () => { + cy.visit('/app/contact/Test Contact'); + cy.window().its("cur_frm").then(frm => { + cy.get('.frappe-control[data-fieldname="phone_nos"]').as('table'); + let field = frm.get_field("phone_nos"); + field.grid.toggle_enable("phone", false); + + + cy.get('@table').find('[data-idx="1"] .edit-grid-row').click(); + cy.get('.grid-row-open').as('table-form'); + cy.get('@table-form').find('.frappe-control[data-fieldname="phone"] .control-value').should('have.class', 'like-disabled-input'); + cy.get('@table-form').find('.grid-footer-toolbar').click(); + + cy.get('@table').find('[data-idx="2"] .edit-grid-row').click(); + cy.get('.grid-row-open').as('table-form'); + cy.get('@table-form').find('.frappe-control[data-fieldname="phone"] .control-value').should('have.class', 'like-disabled-input'); + cy.get('@table-form').find('.grid-footer-toolbar').click(); + }); + }); + it('update docfield property using toggle_reqd', () => { + cy.visit('/app/contact/Test Contact'); + cy.window().its("cur_frm").then(frm => { + cy.get('.frappe-control[data-fieldname="phone_nos"]').as('table'); + let field = frm.get_field("phone_nos"); + field.grid.toggle_reqd("phone", false); + + cy.get('@table').find('[data-idx="1"] .edit-grid-row').click(); + cy.get('.grid-row-open').as('table-form'); + cy.get_field("phone").as('phone-field'); + cy.get('@phone-field').focus().clear().wait(500).blur(); + cy.get('@phone-field').should("not.have.class", "has-error"); + cy.get('@table-form').find('.grid-footer-toolbar').click(); + + cy.get('@table').find('[data-idx="2"] .edit-grid-row').click(); + cy.get('.grid-row-open').as('table-form'); + cy.get_field("phone").as('phone-field'); + cy.get('@phone-field').focus().clear().wait(500).blur(); + cy.get('@phone-field').should("not.have.class", "has-error"); + cy.get('@table-form').find('.grid-footer-toolbar').click(); + + }); + }); +}); + diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index c0c7ce8b4e..53e86b9cde 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -1363,6 +1363,7 @@ frappe.ui.form.Form = class FrappeForm { set_df_property(fieldname, property, value, docname, table_field, table_row_name=null) { let df; + if (!docname || !table_field) { df = this.get_docfield(fieldname); } else { @@ -1372,8 +1373,10 @@ frappe.ui.form.Form = class FrappeForm { df = frappe.meta.get_docfield(filtered_fields[0].parent, table_field, table_row_name); } } + if (df && df[property] != value) { df[property] = value; + if (table_field && table_row_name) { if (this.fields_dict[fieldname].grid.grid_rows_by_docname[table_row_name]) { this.fields_dict[fieldname].grid.grid_rows_by_docname[table_row_name].refresh_field(fieldname); diff --git a/frappe/public/js/frappe/form/grid.js b/frappe/public/js/frappe/form/grid.js index 8b615f3c59..11fda3c8b0 100644 --- a/frappe/public/js/frappe/form/grid.js +++ b/frappe/public/js/frappe/form/grid.js @@ -502,10 +502,9 @@ export default class Grid { set_column_disp(fieldname, show) { if ($.isArray(fieldname)) { - for (var i = 0, l = fieldname.length; i < l; i++) { - var fname = fieldname[i]; - this.get_docfield(fname).hidden = show ? 0 : 1; - this.set_editable_grid_column_disp(fname, show); + for (let field of fieldname) { + this.update_docfield_property(field, "hidden", show); + this.set_editable_grid_column_disp(field, show); } } else { this.get_docfield(fieldname).hidden = show ? 0 : 1; @@ -555,17 +554,17 @@ export default class Grid { } toggle_reqd(fieldname, reqd) { - this.get_docfield(fieldname).reqd = reqd; + this.update_docfield_property(fieldname, "reqd", reqd); this.debounced_refresh(); } toggle_enable(fieldname, enable) { - this.get_docfield(fieldname).read_only = enable ? 0 : 1; + this.update_docfield_property(fieldname, "read_only", enable ? 0 : 1); this.debounced_refresh(); } toggle_display(fieldname, show) { - this.get_docfield(fieldname).hidden = show ? 0 : 1; + this.update_docfield_property(fieldname, "hidden", show ? 0 : 1); this.debounced_refresh(); } diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index 0de6b1db0d..1378718495 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -547,9 +547,11 @@ frappe.ui.form.Layout = class Layout { } refresh_dependency() { - // Resolve "depends_on" and show / hide accordingly + /** + Resolve "depends_on" and show / hide accordingly + build dependants' dictionary + */ - // build dependants' dictionary let has_dep = false; for (let fkey in this.fields_list) {