From fdcca1d0ed7f7c32aa6c40f4751f554826064619 Mon Sep 17 00:00:00 2001 From: Charlie Kolb Date: Mon, 24 Mar 2025 15:52:37 +0100 Subject: [PATCH] fix(editor): Adjust URL on lost change warning Cancel or failed save (#13683) --- .../composables/modals/save-changes-modal.ts | 10 ++++ cypress/composables/workflowsPage.ts | 4 ++ cypress/e2e/44-routing.cy.ts | 55 +++++++++++++++---- .../src/composables/useWorkflowHelpers.ts | 32 ++++++++--- 4 files changed, 83 insertions(+), 18 deletions(-) diff --git a/cypress/composables/modals/save-changes-modal.ts b/cypress/composables/modals/save-changes-modal.ts index d44b09bd46..e2a629a63e 100644 --- a/cypress/composables/modals/save-changes-modal.ts +++ b/cypress/composables/modals/save-changes-modal.ts @@ -1,3 +1,13 @@ export function getSaveChangesModal() { return cy.get('.el-overlay').contains('Save changes before leaving?'); } + +// this is the button next to 'Save Changes' +export function getCancelSaveChangesButton() { + return cy.get('.btn--cancel'); +} + +// This is the top right 'x' +export function getCloseSaveChangesButton() { + return cy.get('.el-message-box__headerbtn'); +} diff --git a/cypress/composables/workflowsPage.ts b/cypress/composables/workflowsPage.ts index c7bcf39888..cbab641de2 100644 --- a/cypress/composables/workflowsPage.ts +++ b/cypress/composables/workflowsPage.ts @@ -6,6 +6,10 @@ export function getWorkflowsPageUrl() { return '/home/workflows'; } +export const getCreateWorkflowButton = () => cy.getByTestId('add-resource-workflow'); + +export const getNewWorkflowCardButton = () => cy.getByTestId('new-workflow-card'); + /** * Actions */ diff --git a/cypress/e2e/44-routing.cy.ts b/cypress/e2e/44-routing.cy.ts index 1d3a8746a9..c3129c4e9d 100644 --- a/cypress/e2e/44-routing.cy.ts +++ b/cypress/e2e/44-routing.cy.ts @@ -1,26 +1,59 @@ -import { getSaveChangesModal } from '../composables/modals/save-changes-modal'; +import { + getCancelSaveChangesButton, + getCloseSaveChangesButton, + getSaveChangesModal, +} from '../composables/modals/save-changes-modal'; +import { getHomeButton } from '../composables/projects'; +import { addNodeToCanvas } from '../composables/workflow'; +import { + getCreateWorkflowButton, + getNewWorkflowCardButton, + getWorkflowsPageUrl, + visitWorkflowsPage, +} from '../composables/workflowsPage'; import { EDIT_FIELDS_SET_NODE_NAME } from '../constants'; -import { WorkflowPage as WorkflowPageClass } from '../pages/workflow'; -import { WorkflowsPage as WorkflowsPageClass } from '../pages/workflows'; - -const WorkflowsPage = new WorkflowsPageClass(); -const WorkflowPage = new WorkflowPageClass(); describe('Workflows', () => { beforeEach(() => { - cy.visit(WorkflowsPage.url); + visitWorkflowsPage(); }); it('should ask to save unsaved changes before leaving route', () => { - WorkflowsPage.getters.newWorkflowButtonCard().should('be.visible'); - WorkflowsPage.getters.newWorkflowButtonCard().click(); + getNewWorkflowCardButton().should('be.visible'); + getNewWorkflowCardButton().click(); cy.createFixtureWorkflow('Test_workflow_1.json', 'Empty State Card Workflow'); - WorkflowPage.actions.addNodeToCanvas(EDIT_FIELDS_SET_NODE_NAME); + addNodeToCanvas(EDIT_FIELDS_SET_NODE_NAME); - cy.getByTestId('project-home-menu-item').click(); + getHomeButton().click(); + + // We expect to still be on the workflow route here + cy.url().should('include', '/workflow/'); getSaveChangesModal().should('be.visible'); + getCancelSaveChangesButton().click(); + + // Only now do we switch + cy.url().should('include', getWorkflowsPageUrl()); + }); + + it('should correct route after cancelling saveChangesModal', () => { + getCreateWorkflowButton().click(); + + cy.createFixtureWorkflow('Test_workflow_1.json', 'Empty State Card Workflow'); + addNodeToCanvas(EDIT_FIELDS_SET_NODE_NAME); + + // Here we go back via browser rather than the home button + // As this already updates the route + cy.go(-1); + + cy.url().should('include', getWorkflowsPageUrl()); + + getSaveChangesModal().should('be.visible'); + getCloseSaveChangesButton().click(); + + // Confirm the url is back to the workflow + cy.url().should('include', '/workflow/'); }); }); diff --git a/packages/frontend/editor-ui/src/composables/useWorkflowHelpers.ts b/packages/frontend/editor-ui/src/composables/useWorkflowHelpers.ts index cb1d8871b3..5652851931 100644 --- a/packages/frontend/editor-ui/src/composables/useWorkflowHelpers.ts +++ b/packages/frontend/editor-ui/src/composables/useWorkflowHelpers.ts @@ -1,6 +1,7 @@ import { HTTP_REQUEST_NODE_TYPE, MODAL_CANCEL, + MODAL_CLOSE, MODAL_CONFIRM, PLACEHOLDER_EMPTY_WORKFLOW_ID, PLACEHOLDER_FILLED_AT_EXECUTION_TIME, @@ -827,6 +828,12 @@ export function useWorkflowHelpers(options: { router: ReturnType