From 79bccf03058de777cee01bf2db352a73ab493b75 Mon Sep 17 00:00:00 2001 From: Elias Meire Date: Wed, 24 Jul 2024 14:47:18 +0200 Subject: [PATCH] feat(editor): Implement custom edge to support loops (no-changelog) (#10171) Co-authored-by: Alex Grozav --- .../editor-ui/src/__tests__/data/canvas.ts | 2 + .../src/components/canvas/Canvas.vue | 2 +- .../canvas/elements/edges/CanvasEdge.spec.ts | 31 ++++++++ .../canvas/elements/edges/CanvasEdge.vue | 26 +++---- .../canvas/elements/edges/utils/edgePath.ts | 45 +++++++++++ .../nodes/render-types/CanvasNodeDefault.vue | 40 +++++++--- .../CanvasNodeDefault.spec.ts.snap | 75 +++++++++++++++---- .../src/composables/useCanvasMapping.spec.ts | 5 ++ .../src/composables/useCanvasMapping.ts | 34 ++++++++- .../src/composables/useCanvasNode.spec.ts | 1 + .../src/composables/useCanvasNode.ts | 3 + packages/editor-ui/src/types/canvas.ts | 1 + .../src/utils/__tests__/canvasUtilsV2.spec.ts | 13 ++++ packages/editor-ui/src/utils/canvasUtilsV2.ts | 4 +- 14 files changed, 236 insertions(+), 46 deletions(-) create mode 100644 packages/editor-ui/src/components/canvas/elements/edges/utils/edgePath.ts diff --git a/packages/editor-ui/src/__tests__/data/canvas.ts b/packages/editor-ui/src/__tests__/data/canvas.ts index fd4516b4a..d14e9cc74 100644 --- a/packages/editor-ui/src/__tests__/data/canvas.ts +++ b/packages/editor-ui/src/__tests__/data/canvas.ts @@ -12,6 +12,7 @@ import { NodeConnectionType } from 'n8n-workflow'; export function createCanvasNodeData({ id = 'node', name = 'Test Node', + subtitle = 'Test Node Subtitle', type = 'test', typeVersion = 1, disabled = false, @@ -30,6 +31,7 @@ export function createCanvasNodeData({ return { id, name, + subtitle, type, typeVersion, execution, diff --git a/packages/editor-ui/src/components/canvas/Canvas.vue b/packages/editor-ui/src/components/canvas/Canvas.vue index b9f1ab4cb..f4c734cd9 100644 --- a/packages/editor-ui/src/components/canvas/Canvas.vue +++ b/packages/editor-ui/src/components/canvas/Canvas.vue @@ -401,7 +401,7 @@ watch(() => props.readOnly, setReadonly, { /> - + diff --git a/packages/editor-ui/src/components/canvas/elements/edges/CanvasEdge.spec.ts b/packages/editor-ui/src/components/canvas/elements/edges/CanvasEdge.spec.ts index 1726b9aaf..1e251abc8 100644 --- a/packages/editor-ui/src/components/canvas/elements/edges/CanvasEdge.spec.ts +++ b/packages/editor-ui/src/components/canvas/elements/edges/CanvasEdge.spec.ts @@ -91,4 +91,35 @@ describe('CanvasEdge', () => { stroke: 'var(--color-secondary)', }); }); + + it('should render a correct bezier path', () => { + const { container } = renderComponent({ + props: DEFAULT_PROPS, + }); + + const edge = container.querySelector('.vue-flow__edge-path'); + + expect(edge).toHaveAttribute('d', 'M0,0 C0,-62.5 100,162.5 100,100'); + }); + + it('should render a correct smooth step path when the connection is backwards', () => { + const { container } = renderComponent({ + props: { + ...DEFAULT_PROPS, + sourceX: 0, + sourceY: 0, + sourcePosition: Position.Right, + targetX: -100, + targetY: -100, + targetPosition: Position.Left, + }, + }); + + const edge = container.querySelector('.vue-flow__edge-path'); + + expect(edge).toHaveAttribute( + 'd', + 'M0 0L 32,0Q 40,0 40,8L 40,132Q 40,140 32,140L1 140L0 140M0 140L-40 140L -132,140Q -140,140 -140,132L -140,-92Q -140,-100 -132,-100L-100 -100', + ); + }); }); diff --git a/packages/editor-ui/src/components/canvas/elements/edges/CanvasEdge.vue b/packages/editor-ui/src/components/canvas/elements/edges/CanvasEdge.vue index 620f1b097..78af35b1c 100644 --- a/packages/editor-ui/src/components/canvas/elements/edges/CanvasEdge.vue +++ b/packages/editor-ui/src/components/canvas/elements/edges/CanvasEdge.vue @@ -1,12 +1,13 @@