diff --git a/cypress/integration/control_data.js b/cypress/integration/control_data.js index 25a5c14eff..01f9168667 100644 --- a/cypress/integration/control_data.js +++ b/cypress/integration/control_data.js @@ -124,6 +124,5 @@ context('Data Control', () => { cy.get('.actions-btn-group > .btn').contains('Actions').click(); cy.get('.actions-btn-group > .dropdown-menu [data-label="Delete"]').click(); cy.click_modal_primary_button('Yes'); - cy.hide_dialog(); }); }); \ No newline at end of file diff --git a/cypress/integration/folder_navigation.js b/cypress/integration/folder_navigation.js index cec7edb59f..bab14f5441 100644 --- a/cypress/integration/folder_navigation.js +++ b/cypress/integration/folder_navigation.js @@ -17,8 +17,8 @@ context('Folder Navigation', () => { //Adding folder (Test Folder) cy.get('.menu-btn-group > .btn').click(); cy.get('.menu-btn-group [data-label="New Folder"]').click(); - cy.get('form > [data-fieldname="value"]').type('Test Folder'); - cy.findByRole('button', {name: 'Create'}).click(); + cy.fill_field('value', 'Test Folder'); + cy.click_modal_primary_button('Create'); }); it('Navigating the nested folders, checking if the URL formed is correct, checking if the added content in the child folder is correct', () => { @@ -32,8 +32,8 @@ context('Folder Navigation', () => { //Adding folder inside the attachments folder cy.get('.menu-btn-group > .btn').click(); cy.get('.menu-btn-group [data-label="New Folder"]').click(); - cy.get('form > [data-fieldname="value"]').type('Test Folder'); - cy.findByRole('button', {name: 'Create'}).click(); + cy.fill_field('value', 'Test Folder'); + cy.click_modal_primary_button('Create'); //Navigating inside the added folder in the Attachments folder cy.get('[title="Test Folder"] > span').click(); @@ -46,26 +46,31 @@ context('Folder Navigation', () => { cy.findByRole('button', {name: 'Add File'}).eq(0).click({force: true}); cy.get('.file-uploader').findByText('Link').click(); cy.get('.input-group > .form-control').type('https://wallpaperplay.com/walls/full/8/2/b/72402.jpg'); - cy.findByRole('button', {name: 'Upload'}).click(); + cy.click_modal_primary_button('Upload'); //To check if the added file is present in the Test Folder cy.get('span.level-item > span').should('contain', 'Test Folder'); cy.get('.list-row-container').eq(0).should('contain.text', '72402.jpg'); cy.get('.list-row-checkbox').eq(0).click(); + cy.intercept({ + method: 'POST', + url: 'api/method/frappe.desk.reportview.delete_items' + }).as('file_deleted'); + //Deleting the added file from the Test folder cy.findByRole('button', {name: 'Actions'}).click(); cy.get('.actions-btn-group [data-label="Delete"]').click(); - cy.wait(700); - cy.findByRole('button', {name: 'Yes'}).click(); - cy.wait(700); + cy.click_modal_primary_button('Yes'); + cy.wait('@file_deleted'); //Deleting the Test Folder cy.visit('/app/file/view/home/Attachments'); cy.get('.list-row-checkbox').eq(0).click(); cy.findByRole('button', {name: 'Actions'}).click(); cy.get('.actions-btn-group [data-label="Delete"]').click(); - cy.findByRole('button', {name: 'Yes'}).click(); + cy.click_modal_primary_button('Yes'); + cy.wait('@file_deleted'); }); it('Deleting Test Folder from the home', () => { @@ -74,6 +79,6 @@ context('Folder Navigation', () => { cy.get('.level-left > .list-subject > .file-select >.list-row-checkbox').eq(0).click({force: true, delay: 500}); cy.findByRole('button', {name: 'Actions'}).click(); cy.get('.actions-btn-group [data-label="Delete"]').click(); - cy.findByRole('button', {name: 'Yes'}).click(); + cy.click_modal_primary_button('Yes'); }); }); diff --git a/cypress/integration/kanban.js b/cypress/integration/kanban.js index 50fc41afe3..6ebab5d008 100644 --- a/cypress/integration/kanban.js +++ b/cypress/integration/kanban.js @@ -26,7 +26,7 @@ context('Kanban Board', () => { cy.click_listview_primary_button('Add ToDo'); - cy.fill_field('description', 'Test Kanban ToDo', 'Text Editor'); + cy.fill_field('description', 'Test Kanban ToDo', 'Text Editor').wait(300); cy.get('.modal-footer .btn-primary').last().click(); cy.wait('@save-todo'); diff --git a/cypress/integration/timeline.js b/cypress/integration/timeline.js index 6c4733400d..cb4d43a96a 100644 --- a/cypress/integration/timeline.js +++ b/cypress/integration/timeline.js @@ -78,12 +78,5 @@ context('Timeline', () => { cy.get('.page-actions').findByRole('button', {name: 'Actions'}).click(); cy.get('.page-actions .actions-btn-group [data-label="Delete"]').click(); cy.click_modal_primary_button('Yes'); - - //Deleting the custom doctype - cy.visit('/app/doctype'); - cy.select_listview_row_checkbox(0); - cy.get('.page-actions').findByRole('button', {name: 'Actions'}).click(); - cy.get('.page-actions .actions-btn-group [data-label="Delete"]').click(); - cy.click_modal_primary_button('Yes'); }); }); \ No newline at end of file diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 95b5cbb670..7686626fea 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -341,7 +341,8 @@ Cypress.Commands.add('clear_filters', () => { }); Cypress.Commands.add('click_modal_primary_button', (btn_name) => { - cy.get('.modal-footer > .standard-actions > .btn-primary').contains(btn_name).trigger('click', {force: true}); + cy.wait(400); + cy.get('.modal-footer > .standard-actions > .btn-primary').contains(btn_name).click({force: true}); }); Cypress.Commands.add('click_sidebar_button', (btn_name) => { diff --git a/frappe/public/js/frappe/form/controls/base_input.js b/frappe/public/js/frappe/form/controls/base_input.js index b7fe61b385..5545a453e9 100644 --- a/frappe/public/js/frappe/form/controls/base_input.js +++ b/frappe/public/js/frappe/form/controls/base_input.js @@ -159,6 +159,13 @@ frappe.ui.form.ControlInput = class ControlInput extends frappe.ui.form.Control this.$wrapper.find(".help-box").html(""); } set_mandatory(value) { + // do not set has-error class on form load + if (this.frm && this.frm.cscript && this.frm.cscript.is_onload) return; + + // do not set has-error class while dialog is rendered + // set has-error if dialog primary button is clicked + if (this.layout && this.layout.is_dialog && !this.layout.primary_action_fulfilled) return; + this.$wrapper.toggleClass("has-error", Boolean(this.df.reqd && is_null(value))); } set_invalid () { diff --git a/frappe/public/js/frappe/form/controls/link.js b/frappe/public/js/frappe/form/controls/link.js index 34b863d54f..ebaf36fe4e 100644 --- a/frappe/public/js/frappe/form/controls/link.js +++ b/frappe/public/js/frappe/form/controls/link.js @@ -312,8 +312,10 @@ frappe.ui.form.ControlLink = class ControlLink extends frappe.ui.form.ControlDat } let value = me.get_input_value(); let label = me.get_label_value(); + let last_value = me.last_value || ""; + let last_label = me.label || ""; - if (value !== me.last_value || me.label !== label) { + if (value !== last_value || label !== last_label) { me.parse_validate_and_set_in_model(value, null, label); } }); diff --git a/frappe/public/js/frappe/ui/field_group.js b/frappe/public/js/frappe/ui/field_group.js index 178d1a65cb..cba702407a 100644 --- a/frappe/public/js/frappe/ui/field_group.js +++ b/frappe/public/js/frappe/ui/field_group.js @@ -105,6 +105,10 @@ frappe.ui.FieldGroup = class FieldGroup extends frappe.ui.form.Layout { if (!is_null(v)) ret[f.df.fieldname] = v; } + + if (this.is_dialog && f.df.reqd && !f.value) { + f.refresh_input(); + } } if (errors.length && !ignore_errors) { frappe.msgprint({