From dd3b2cb62da08980ddf5a385b282f8ce189767e5 Mon Sep 17 00:00:00 2001 From: Alex Grozav Date: Wed, 25 Sep 2024 12:59:54 +0300 Subject: [PATCH] fix(editor): Fix node deletion undo/redo in new canvas (no-changelog) (#10935) --- .../__tests__/useCanvasOperations.spec.ts | 59 +++++++++++- .../src/composables/useCanvasOperations.ts | 95 ++++++++++++++++++- .../editor-ui/src/stores/workflows.store.ts | 2 - 3 files changed, 148 insertions(+), 8 deletions(-) diff --git a/packages/editor-ui/src/composables/__tests__/useCanvasOperations.spec.ts b/packages/editor-ui/src/composables/__tests__/useCanvasOperations.spec.ts index 0a6b75d1e..4a329201a 100644 --- a/packages/editor-ui/src/composables/__tests__/useCanvasOperations.spec.ts +++ b/packages/editor-ui/src/composables/__tests__/useCanvasOperations.spec.ts @@ -616,7 +616,6 @@ describe('useCanvasOperations', () => { deleteNode(id, { trackHistory: true }); expect(workflowsStore.removeNodeById).toHaveBeenCalledWith(id); - expect(workflowsStore.removeNodeConnectionsById).toHaveBeenCalledWith(id); expect(workflowsStore.removeNodeExecutionDataById).toHaveBeenCalledWith(id); expect(historyStore.pushCommandToUndo).toHaveBeenCalledWith(new RemoveNodeCommand(node)); }); @@ -644,7 +643,6 @@ describe('useCanvasOperations', () => { deleteNode(id, { trackHistory: false }); expect(workflowsStore.removeNodeById).toHaveBeenCalledWith(id); - expect(workflowsStore.removeNodeConnectionsById).toHaveBeenCalledWith(id); expect(workflowsStore.removeNodeExecutionDataById).toHaveBeenCalledWith(id); expect(historyStore.pushCommandToUndo).not.toHaveBeenCalled(); }); @@ -714,7 +712,6 @@ describe('useCanvasOperations', () => { deleteNode(nodes[1].id); expect(workflowsStore.removeNodeById).toHaveBeenCalledWith(nodes[1].id); - expect(workflowsStore.removeNodeConnectionsById).toHaveBeenCalledWith(nodes[1].id); expect(workflowsStore.removeNodeExecutionDataById).toHaveBeenCalledWith(nodes[1].id); expect(workflowsStore.removeNodeById).toHaveBeenCalledWith(nodes[1].id); }); @@ -1356,6 +1353,62 @@ describe('useCanvasOperations', () => { }); }); + describe('deleteConnectionsByNodeId', () => { + it('should delete all connections for a given node ID', () => { + const workflowsStore = mockedStore(useWorkflowsStore); + const { deleteConnectionsByNodeId } = useCanvasOperations({ router }); + + const node1 = createTestNode({ id: 'node1', name: 'Node 1' }); + const node2 = createTestNode({ id: 'node2', name: 'Node 1' }); + + workflowsStore.workflow.connections = { + [node1.name]: { + [NodeConnectionType.Main]: [ + [{ node: node2.name, type: NodeConnectionType.Main, index: 0 }], + ], + }, + node2: { + [NodeConnectionType.Main]: [ + [{ node: node1.name, type: NodeConnectionType.Main, index: 0 }], + ], + }, + }; + + workflowsStore.getNodeById.mockReturnValue(node1); + workflowsStore.getNodeByName.mockReturnValueOnce(node1).mockReturnValueOnce(node2); + + deleteConnectionsByNodeId(node1.id); + + expect(workflowsStore.removeConnection).toHaveBeenCalledWith({ + connection: [ + { node: node1.name, type: NodeConnectionType.Main, index: 0 }, + { node: node2.name, type: NodeConnectionType.Main, index: 0 }, + ], + }); + + expect(workflowsStore.removeConnection).toHaveBeenCalledWith({ + connection: [ + { node: node2.name, type: NodeConnectionType.Main, index: 0 }, + { node: node1.name, type: NodeConnectionType.Main, index: 0 }, + ], + }); + + expect(workflowsStore.workflow.connections[node1.name]).toBeUndefined(); + }); + + it('should not delete connections if node ID does not exist', () => { + const workflowsStore = mockedStore(useWorkflowsStore); + const { deleteConnectionsByNodeId } = useCanvasOperations({ router }); + + const nodeId = 'nonexistent'; + workflowsStore.getNodeById.mockReturnValue(undefined); + + deleteConnectionsByNodeId(nodeId); + + expect(workflowsStore.removeConnection).not.toHaveBeenCalled(); + }); + }); + describe('duplicateNodes', () => { it('should duplicate nodes', async () => { const workflowsStore = mockedStore(useWorkflowsStore); diff --git a/packages/editor-ui/src/composables/useCanvasOperations.ts b/packages/editor-ui/src/composables/useCanvasOperations.ts index c5ddbd4b9..ca268b645 100644 --- a/packages/editor-ui/src/composables/useCanvasOperations.ts +++ b/packages/editor-ui/src/composables/useCanvasOperations.ts @@ -236,7 +236,7 @@ export function useCanvasOperations({ router }: { router: ReturnType { } removeNode(node); - - // @TODO When removing node connected between two nodes, create a connection between them } function removeNodeConnectionsById(nodeId: string): void {