fix: Use correct node version when pasting/importing nodes (#8456)

Co-authored-by: Michael Kret <michael.k@radency.com>
This commit is contained in:
Elias Meire 2024-01-26 15:09:50 +01:00 committed by GitHub
parent 8a595d1527
commit 70af67e744
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 135 additions and 47 deletions

View file

@ -258,11 +258,11 @@ describe('Undo/Redo', () => {
cy.fixture('Test_workflow-actions_paste-data.json').then((data) => { cy.fixture('Test_workflow-actions_paste-data.json').then((data) => {
cy.get('body').paste(JSON.stringify(data)); cy.get('body').paste(JSON.stringify(data));
WorkflowPage.actions.zoomToFit(); WorkflowPage.actions.zoomToFit();
WorkflowPage.getters.canvasNodes().should('have.have.length', 2); WorkflowPage.getters.canvasNodes().should('have.have.length', 5);
WorkflowPage.actions.hitUndo(); WorkflowPage.actions.hitUndo();
WorkflowPage.getters.canvasNodes().should('have.have.length', 0); WorkflowPage.getters.canvasNodes().should('have.have.length', 0);
WorkflowPage.actions.hitRedo(); WorkflowPage.actions.hitRedo();
WorkflowPage.getters.canvasNodes().should('have.have.length', 2); WorkflowPage.getters.canvasNodes().should('have.have.length', 5);
}); });
}); });
@ -338,8 +338,8 @@ describe('Undo/Redo', () => {
WorkflowPage.getters.nodeConnections().should('have.length', 1); 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.length', 1);
cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch')) cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch'))
.should('have.css', 'left', `637px`) .should('have.css', 'left', `637px`)
.should('have.css', 'top', `501px`); .should('have.css', 'top', `501px`);
cy.fixture('Test_workflow_form_switch.json').then((data) => { cy.fixture('Test_workflow_form_switch.json').then((data) => {
cy.get('body').paste(JSON.stringify(data)); cy.get('body').paste(JSON.stringify(data));
@ -353,8 +353,8 @@ describe('Undo/Redo', () => {
WorkflowPage.getters.nodeConnections().should('have.length', 1); 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.length', 1);
cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch')) cy.get(WorkflowPage.getters.getEndpointSelector('input', 'Switch'))
.should('have.css', 'left', `637px`) .should('have.css', 'left', `637px`)
.should('have.css', 'top', `501px`); .should('have.css', 'top', `501px`);
}); });
it('should not undo/redo when NDV or a modal is open', () => { it('should not undo/redo when NDV or a modal is open', () => {

View file

@ -120,10 +120,12 @@ describe('Workflow Actions', () => {
WorkflowPage.getters.successToast().should('exist'); WorkflowPage.getters.successToast().should('exist');
}); });
it('should paste nodes', () => { it('should paste nodes (both current and old node versions)', () => {
cy.fixture('Test_workflow-actions_paste-data.json').then((data) => { cy.fixture('Test_workflow-actions_paste-data.json').then((data) => {
cy.get('body').paste(JSON.stringify(data)); cy.get('body').paste(JSON.stringify(data));
WorkflowPage.getters.canvasNodes().should('have.have.length', 2); WorkflowPage.actions.zoomToFit();
WorkflowPage.getters.canvasNodes().should('have.length', 5);
WorkflowPage.getters.nodeConnections().should('have.length', 5);
}); });
}); });
@ -147,8 +149,8 @@ describe('Workflow Actions', () => {
.selectFile('cypress/fixtures/Test_workflow-actions_paste-data.json', { force: true }); .selectFile('cypress/fixtures/Test_workflow-actions_paste-data.json', { force: true });
cy.waitForLoad(false); cy.waitForLoad(false);
WorkflowPage.actions.zoomToFit(); WorkflowPage.actions.zoomToFit();
WorkflowPage.getters.canvasNodes().should('have.length', 2); WorkflowPage.getters.canvasNodes().should('have.length', 5);
WorkflowPage.getters.nodeConnections().should('have.length', 1); WorkflowPage.getters.nodeConnections().should('have.length', 5);
}); });
it('should update workflow settings', () => { it('should update workflow settings', () => {

View file

@ -1,42 +1,128 @@
{ {
"meta": { "meta": {
"instanceId": "1a30c82b98a30444ad25bce513655a5e02be772d361403542c23172be6062f04" "templateCredsSetupCompleted": true,
"instanceId": "669258f419ee5d9faf0a484944244a47fcc28c541f3c6c874e50a171a0be1e6b"
}, },
"nodes": [ "nodes": [
{ {
"parameters": { "parameters": {
"rule": { "rule": {
"interval": [{}] "interval": [
} {}
}, ]
"id": "a898563b-d2a4-4b15-a979-366872e801b0", }
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [420, 260]
}, },
{ "id": "54b1cdeb-b453-4568-8107-c17fcf2aa25a",
"parameters": { "name": "Schedule Trigger",
"options": {} "type": "n8n-nodes-base.scheduleTrigger",
}, "typeVersion": 1,
"id": "b9a13e3d-bfa5-4873-959f-fd3d67e380d9", "position": [
"name": "Set", 240,
"type": "n8n-nodes-base.set", 560
"typeVersion": 1, ]
"position": [640, 260] },
} {
"parameters": {
"options": {}
},
"id": "5f6dffef-61f7-459d-930c-ef701d08d49a",
"name": "Set",
"type": "n8n-nodes-base.set",
"typeVersion": 1,
"position": [
460,
460
]
},
{
"parameters": {
"rules": {
"rules": [
{
"outputKey": "a"
}
]
}
},
"id": "c07d3a12-1ee2-4131-bec2-ab366457d042",
"name": "Old version Switch Node",
"type": "n8n-nodes-base.switch",
"typeVersion": 2,
"position": [
460,
680
]
},
{
"parameters": {
"options": {}
},
"id": "182a833d-3b93-4e86-a0db-3ceb19d6562b",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
720,
560
]
},
{
"parameters": {},
"id": "b0d0aeb7-0c8f-4810-8b78-6c0db3c9a486",
"name": "Replace Me",
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
900,
560
]
}
], ],
"connections": { "connections": {
"Schedule Trigger": { "Schedule Trigger": {
"main": [ "main": [
[ [
{ {
"node": "Set", "node": "Set",
"type": "main", "type": "main",
"index": 0 "index": 0
} },
] {
] "node": "Old version Switch Node",
} "type": "main",
} "index": 0
} },
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
null,
[
{
"node": "Replace Me",
"type": "main",
"index": 0
}
]
]
},
"Replace Me": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {}
}

View file

@ -184,7 +184,7 @@ export function generateNodesGraph(
webhookNodeNames.push(node.name); webhookNodeNames.push(node.name);
} else { } else {
try { try {
const nodeType = nodeTypes.getByNameAndVersion(node.type); const nodeType = nodeTypes.getByNameAndVersion(node.type, node.typeVersion);
if (nodeType) { if (nodeType) {
const nodeParameters = getNodeParameters( const nodeParameters = getNodeParameters(
nodeType.description.properties, nodeType.description.properties,
@ -230,7 +230,7 @@ export function generateNodesGraph(
Object.keys(connections).forEach((key) => { Object.keys(connections).forEach((key) => {
connections[key].forEach((element) => { connections[key].forEach((element) => {
element.forEach((element2) => { (element ?? []).forEach((element2) => {
nodeGraph.node_connections.push(getGraphConnectionItem(nodeName, element2)); nodeGraph.node_connections.push(getGraphConnectionItem(nodeName, element2));
}); });
}); });