From 3723401ed5d8e1c4cf7f5a14bd6fb2c5509cdf0d Mon Sep 17 00:00:00 2001 From: Mutasem Aldmour Date: Tue, 19 Dec 2023 18:14:01 +0100 Subject: [PATCH 1/3] fix(editor): Fix copy/paste issue when switch node is in workflow --- packages/editor-ui/src/components/Node.vue | 7 ++++--- packages/editor-ui/src/stores/nodeTypes.store.ts | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/editor-ui/src/components/Node.vue b/packages/editor-ui/src/components/Node.vue index d250ed39ccb1e..785ff3beb826e 100644 --- a/packages/editor-ui/src/components/Node.vue +++ b/packages/editor-ui/src/components/Node.vue @@ -377,9 +377,10 @@ export default defineComponent({ styles['--configurable-node-input-count'] = nonMainInputs.length + spacerCount; } - const outputs = - NodeHelpers.getNodeOutputs(this.workflow, this.node, this.nodeType) || - ([] as Array); + let outputs = [] as Array; + if (this.workflow.nodes[this.node.name]) { + outputs = NodeHelpers.getNodeOutputs(this.workflow, this.node, this.nodeType); + } const outputTypes = NodeHelpers.getConnectionTypes(outputs); diff --git a/packages/editor-ui/src/stores/nodeTypes.store.ts b/packages/editor-ui/src/stores/nodeTypes.store.ts index 63776aeab388c..9e5deda06a27b 100644 --- a/packages/editor-ui/src/stores/nodeTypes.store.ts +++ b/packages/editor-ui/src/stores/nodeTypes.store.ts @@ -96,6 +96,9 @@ export const useNodeTypesStore = defineStore(STORES.NODE_TYPES, { }, isConfigNode() { return (workflow: Workflow, node: INode, nodeTypeName: string): boolean => { + if (!workflow.nodes[node.name]) { + return false; + } const nodeType = this.getNodeType(nodeTypeName); if (!nodeType) { return false; From 22902dbfe356c32860c8a4590a6683ab3e294ff3 Mon Sep 17 00:00:00 2001 From: Mutasem Aldmour Date: Wed, 20 Dec 2023 07:44:59 +0100 Subject: [PATCH 2/3] fix: add e2e test, clean up paste function --- cypress/e2e/10-undo-redo.cy.ts | 16 ++++ .../fixtures/Test_workflow_form_switch.json | 78 +++++++++++++++++++ cypress/pages/workflow.ts | 3 - 3 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 cypress/fixtures/Test_workflow_form_switch.json diff --git a/cypress/e2e/10-undo-redo.cy.ts b/cypress/e2e/10-undo-redo.cy.ts index 6d3337456d0c8..165fe56c0ee26 100644 --- a/cypress/e2e/10-undo-redo.cy.ts +++ b/cypress/e2e/10-undo-redo.cy.ts @@ -325,4 +325,20 @@ describe('Undo/Redo', () => { WorkflowPage.getters.nodeConnections().should('have.length', 2); }); }); + + it('should be able to copy and paste pinned data nodes in workflows with dynamic Switch node', () => { + cy.fixture('Test_workflow_form_switch.json').then((data) => { + cy.get('body').paste(JSON.stringify(data)); + }); + WorkflowPage.getters.canvasNodes().should('have.length', 2); + + cy.fixture('Test_workflow_form_switch.json').then((data) => { + cy.get('body').paste(JSON.stringify(data)); + }); + WorkflowPage.getters.canvasNodes().should('have.length', 4); + + WorkflowPage.actions.hitUndo(); + + WorkflowPage.getters.canvasNodes().should('have.length', 2); + }); }); diff --git a/cypress/fixtures/Test_workflow_form_switch.json b/cypress/fixtures/Test_workflow_form_switch.json new file mode 100644 index 0000000000000..78349c3ae5554 --- /dev/null +++ b/cypress/fixtures/Test_workflow_form_switch.json @@ -0,0 +1,78 @@ +{ + "name": "My workflow 8", + "nodes": [ + { + "parameters": { + "path": "d1cba915-ca18-4425-bcfb-133205fc815a", + "formTitle": "test", + "formFields": { + "values": [ + { + "fieldLabel": "test" + } + ] + }, + "options": {} + }, + "id": "9e685367-fb94-4376-a9a4-7f311d9f7e2d", + "name": "n8n Form Trigger", + "type": "n8n-nodes-base.formTrigger", + "typeVersion": 2, + "position": [ + 620, + 580 + ], + "webhookId": "d1cba915-ca18-4425-bcfb-133205fc815a" + }, + { + "parameters": {}, + "id": "0f4dfe66-51c0-4378-9eab-680f8140a572", + "name": "Switch", + "type": "n8n-nodes-base.switch", + "typeVersion": 2, + "position": [ + 800, + 580 + ] + } + ], + "pinData": { + "n8n Form Trigger": [ + { + "json": { + "name": "First item", + "code": 1 + } + }, + { + "json": { + "name": "Second item", + "code": 2 + } + } + ] + }, + "connections": { + "n8n Form Trigger": { + "main": [ + [ + { + "node": "Switch", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": false, + "settings": { + "executionOrder": "v1" + }, + "versionId": "d6c14bc8-a69f-47bb-b5ba-fe6e9db0a3a4", + "id": "UQSimcMQJGbTeTLG", + "meta": { + "instanceId": "a786b722078489c1fa382391a9f3476c2784761624deb2dfb4634827256d51a0" + }, + "tags": [] +} \ No newline at end of file diff --git a/cypress/pages/workflow.ts b/cypress/pages/workflow.ts index d775a0d61d362..853877ed0fb25 100644 --- a/cypress/pages/workflow.ts +++ b/cypress/pages/workflow.ts @@ -351,9 +351,6 @@ export class WorkflowPage extends BasePage { hitCopy: () => { cy.get('body').type(META_KEY, { delay: 500, release: false }).type('c'); }, - hitPaste: () => { - cy.get('body').type(META_KEY, { delay: 500, release: false }).type('P'); - }, hitPinNodeShortcut: () => { cy.get('body').type('p'); }, From e93a4cce4afafad0e557f41d9d3d21bb2747fc6e Mon Sep 17 00:00:00 2001 From: Mutasem Aldmour Date: Wed, 20 Dec 2023 08:07:46 +0100 Subject: [PATCH 3/3] fix: add test for endpoint position --- cypress/e2e/10-undo-redo.cy.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cypress/e2e/10-undo-redo.cy.ts b/cypress/e2e/10-undo-redo.cy.ts index 165fe56c0ee26..e904d891b1a53 100644 --- a/cypress/e2e/10-undo-redo.cy.ts +++ b/cypress/e2e/10-undo-redo.cy.ts @@ -330,15 +330,28 @@ describe('Undo/Redo', () => { cy.fixture('Test_workflow_form_switch.json').then((data) => { cy.get('body').paste(JSON.stringify(data)); }); + WorkflowPage.actions.zoomToFit(); + WorkflowPage.getters.canvasNodes().should('have.length', 2); + WorkflowPage.getters.nodeConnections().should('have.length', 1); + cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch')).should('have.length', 1); + cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch')) + .should('have.css', 'left', `637px`) + .should('have.css', 'top', `501px`); cy.fixture('Test_workflow_form_switch.json').then((data) => { cy.get('body').paste(JSON.stringify(data)); }); WorkflowPage.getters.canvasNodes().should('have.length', 4); + WorkflowPage.getters.nodeConnections().should('have.length', 2); WorkflowPage.actions.hitUndo(); WorkflowPage.getters.canvasNodes().should('have.length', 2); + WorkflowPage.getters.nodeConnections().should('have.length', 1); + cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch')).should('have.length', 1); + cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch')) + .should('have.css', 'left', `637px`) + .should('have.css', 'top', `501px`); }); });