From c5b9d5144d33e8e922f03c7399a296ed8d850384 Mon Sep 17 00:00:00 2001 From: Alex Grozav Date: Tue, 17 Dec 2024 17:15:47 +0200 Subject: [PATCH] fix(editor): Prevent connection line from showing when clicking the plus button of a node (#12265) --- .../edges/CanvasConnectionLine.test.ts | 16 ++++++++++ .../elements/edges/CanvasConnectionLine.vue | 32 +++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/packages/editor-ui/src/components/canvas/elements/edges/CanvasConnectionLine.test.ts b/packages/editor-ui/src/components/canvas/elements/edges/CanvasConnectionLine.test.ts index 8b99a45090e37e..85d87711095162 100644 --- a/packages/editor-ui/src/components/canvas/elements/edges/CanvasConnectionLine.test.ts +++ b/packages/editor-ui/src/components/canvas/elements/edges/CanvasConnectionLine.test.ts @@ -5,6 +5,7 @@ import { setActivePinia } from 'pinia'; import type { ConnectionLineProps } from '@vue-flow/core'; import { Position } from '@vue-flow/core'; import { createCanvasProvide } from '@/__tests__/data'; +import { waitFor } from '@testing-library/vue'; const DEFAULT_PROPS = { sourceX: 0, @@ -63,4 +64,19 @@ describe('CanvasConnectionLine', () => { 'M-50 130L-90 130L -124,130Q -140,130 -140,114L -140,-84Q -140,-100 -124,-100L-100 -100', ); }); + + it('should show the connection line after a short delay', async () => { + vi.useFakeTimers(); + const { container } = renderComponent({ + props: DEFAULT_PROPS, + }); + + const edge = container.querySelector('.vue-flow__edge-path'); + + expect(edge).not.toHaveClass('visible'); + + vi.advanceTimersByTime(300); + + await waitFor(() => expect(edge).toHaveClass('visible')); + }); }); diff --git a/packages/editor-ui/src/components/canvas/elements/edges/CanvasConnectionLine.vue b/packages/editor-ui/src/components/canvas/elements/edges/CanvasConnectionLine.vue index dddf41c9593df2..e4833cb4c2d724 100644 --- a/packages/editor-ui/src/components/canvas/elements/edges/CanvasConnectionLine.vue +++ b/packages/editor-ui/src/components/canvas/elements/edges/CanvasConnectionLine.vue @@ -2,7 +2,7 @@ /* eslint-disable vue/no-multiple-template-root */ import type { ConnectionLineProps } from '@vue-flow/core'; import { BaseEdge } from '@vue-flow/core'; -import { computed, useCssModule } from 'vue'; +import { computed, onMounted, ref, useCssModule } from 'vue'; import { getEdgeRenderData } from './utils'; import { useCanvas } from '@/composables/useCanvas'; import { NodeConnectionType } from 'n8n-workflow'; @@ -18,6 +18,13 @@ const connectionType = computed( () => parseCanvasConnectionHandleString(connectingHandle.value?.handleId).type, ); +const classes = computed(() => { + return { + [$style.edge]: true, + [$style.visible]: isVisible.value, + }; +}); + const edgeColor = computed(() => { if (connectionType.value !== NodeConnectionType.Main) { return 'var(--node-type-supplemental-color)'; @@ -37,13 +44,25 @@ const renderData = computed(() => ); const segments = computed(() => renderData.value.segments); + +/** + * Used to delay the visibility of the connection line to prevent flickering + * when the actual user intent is to click the plus button + */ +const isVisible = ref(false); + +onMounted(() => { + setTimeout(() => { + isVisible.value = true; + }, 300); +});