diff --git a/packages/editor-ui/src/constants.ts b/packages/editor-ui/src/constants.ts index 8bcd3d4d5f..5618434be5 100644 --- a/packages/editor-ui/src/constants.ts +++ b/packages/editor-ui/src/constants.ts @@ -62,3 +62,5 @@ export const REQUEST_NODE_FORM_URL = 'https://n8n-community.typeform.com/to/K1fB // General export const INSTANCE_ID_HEADER = 'n8n-instance-id'; export const WAIT_TIME_UNLIMITED = '3000-01-01T00:00:00.000Z'; + +export const JSPLUMB_FLOWCHART_STUB = 60; diff --git a/packages/editor-ui/src/views/NodeView.vue b/packages/editor-ui/src/views/NodeView.vue index 9ec86c5055..a3ca4b6b51 100644 --- a/packages/editor-ui/src/views/NodeView.vue +++ b/packages/editor-ui/src/views/NodeView.vue @@ -111,7 +111,7 @@ import { } from 'jsplumb'; import { MessageBoxInputData } from 'element-ui/types/message-box'; import { jsPlumb, Endpoint, OnConnectionBindInfo } from 'jsplumb'; -import { NODE_NAME_PREFIX, PLACEHOLDER_EMPTY_WORKFLOW_ID, START_NODE_TYPE } from '@/constants'; +import { JSPLUMB_FLOWCHART_STUB, NODE_NAME_PREFIX, PLACEHOLDER_EMPTY_WORKFLOW_ID, START_NODE_TYPE } from '@/constants'; import { copyPaste } from '@/components/mixins/copyPaste'; import { externalHooks } from '@/components/mixins/externalHooks'; import { genericHelpers } from '@/components/mixins/genericHelpers'; @@ -132,7 +132,7 @@ import NodeCreator from '@/components/NodeCreator/NodeCreator.vue'; import NodeSettings from '@/components/NodeSettings.vue'; import RunData from '@/components/RunData.vue'; -import { getLeftmostTopNode, getWorkflowCorners, scaleSmaller, scaleBigger, scaleReset, addOrRemoveMidpointArrow } from './helpers'; +import { getLeftmostTopNode, getWorkflowCorners, scaleSmaller, scaleBigger, scaleReset, addOrRemoveMidpointArrow, addEndpointArrow, getDefaultOverlays } from './helpers'; import mixins from 'vue-typed-mixins'; import { v4 as uuidv4} from 'uuid'; @@ -1312,27 +1312,7 @@ export default mixins( } }, initNodeView () { - const connectionOverlays: OverlaySpec[] = [ - [ - 'Arrow', - { - id: 'endpoint-arrow', - location: 1, - width: 12, - foldback: 1, - length: 10, - }, - ], - [ - 'Label', - { - id: 'drop-add-node', - label: 'Drop connection
to create node', - cssClass: 'drop-add-node-label', - location: 0.5, - }, - ], - ]; + this.instance.importDefaults({ Connector: ['Bezier', { curviness: 150 }], @@ -1342,7 +1322,7 @@ export default mixins( EndpointStyle: { radius: 9, fill: '#acd', stroke: 'red' }, HoverPaintStyle: { stroke: '#ff6d5a', lineWidth: 4 }, EndpointHoverStyle: { fill: '#ff6d5a', stroke: '#acd' }, - ConnectionOverlays: connectionOverlays, + ConnectionOverlays: getDefaultOverlays(), Container: '#node-view', }); @@ -1362,17 +1342,9 @@ export default mixins( }); this.instance.bind('connection', (info: OnConnectionBindInfo) => { - info.connection.setConnector(['Flowchart', { cornerRadius: 8, stub: 60, gap: 5, alwaysRespectStubs: false}]); - info.connection.addOverlay([ - 'Arrow', - { - id: 'endpoint-arrow', - location: 1, - width: 12, - foldback: 1, - length: 10, - }, - ]); + info.connection.setConnector(['Flowchart', { cornerRadius: 8, stub: JSPLUMB_FLOWCHART_STUB, gap: 5, alwaysRespectStubs: true}]); + + addEndpointArrow(info.connection); addOrRemoveMidpointArrow(info.connection); // @ts-ignore diff --git a/packages/editor-ui/src/views/helpers.ts b/packages/editor-ui/src/views/helpers.ts index 46e78a38be..607ce5197d 100644 --- a/packages/editor-ui/src/views/helpers.ts +++ b/packages/editor-ui/src/views/helpers.ts @@ -1,5 +1,6 @@ +import { JSPLUMB_FLOWCHART_STUB } from "@/constants"; import { INodeUi, IZoomConfig } from "@/Interface"; -import { Connection } from "jsplumb"; +import { Connection, OverlaySpec } from "jsplumb"; interface ICorners { minX: number; @@ -85,10 +86,48 @@ export const scaleReset = (config: IZoomConfig): IZoomConfig => { return config; }; +export const getDefaultOverlays = (): OverlaySpec[] => ([ + [ + 'Arrow', + { + id: 'endpoint-arrow', + location: 1, + width: 12, + foldback: 1, + length: 10, + }, + ], + [ + 'Label', + { + id: 'drop-add-node', + label: 'Drop connection
to create node', + cssClass: 'drop-add-node-label', + location: 0.5, + }, + ], +]); + +export const addEndpointArrow = (connection: Connection) => { + const hasArrow = !!connection.getOverlay('midpoint-arrow'); + if (!hasArrow) { + connection.addOverlay([ + 'Arrow', + { + id: 'endpoint-arrow', + location: 1, + width: 12, + foldback: 1, + length: 10, + }, + ]); + } +}; + export const addOrRemoveMidpointArrow = (connection: Connection) => { const sourceEndpoint = connection.endpoints[0]; const targetEndpoint = connection.endpoints[1]; - const requiresArrow = sourceEndpoint.anchor.lastReturnValue[0] >= targetEndpoint.anchor.lastReturnValue[0]; + const requiresArrow = sourceEndpoint.anchor.lastReturnValue[0] >= (targetEndpoint.anchor.lastReturnValue[0] - JSPLUMB_FLOWCHART_STUB); const hasArrow = !!connection.getOverlay('midpoint-arrow');