From f6ad3c4c082bc72192a685ff481ece65cdf6b0d9 Mon Sep 17 00:00:00 2001 From: Mutasem Date: Mon, 1 Nov 2021 11:54:47 +0100 Subject: [PATCH] prevent duplicate connections --- packages/editor-ui/src/views/NodeView.vue | 37 ++++++++++++++++++----- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/editor-ui/src/views/NodeView.vue b/packages/editor-ui/src/views/NodeView.vue index 60eab1675e..07dea2dd8a 100644 --- a/packages/editor-ui/src/views/NodeView.vue +++ b/packages/editor-ui/src/views/NodeView.vue @@ -1451,12 +1451,37 @@ export default mixins( this.openNodeCreator(info.eventSource); }; + let dropPrevented = false; - this.instance.bind('connectionAborted', (info) => insertNodeAfterSelected({ - sourceId: info.sourceId, - index: info.getParameters().index, - eventSource: 'node_connection_drop', - })); + this.instance.bind('connectionAborted', (info) => { + if (dropPrevented) { + dropPrevented = false; + return; + } + + insertNodeAfterSelected({ + sourceId: info.sourceId, + index: info.getParameters().index, + eventSource: 'node_connection_drop', + }); + }); + + this.instance.bind('beforeDrop', (info) => { + const sourceInfo = info.connection.endpoints[0].getParameters(); + // @ts-ignore + const targetInfo = info.dropEndpoint.getParameters(); + + const sourceNodeName = this.$store.getters.getNodeNameByIndex(sourceInfo.nodeIndex); + const targetNodeName = this.$store.getters.getNodeNameByIndex(targetInfo.nodeIndex); + + // check for duplicates + if (this.getJSPlumbConnection(sourceNodeName, sourceInfo.index, targetNodeName, targetInfo.index)) { + dropPrevented = true; + return false; + } + + return true; + }); // only one set of visible actions should be visible at the same time let activeConnection: null | Connection = null; @@ -1480,9 +1505,7 @@ export default mixins( }; this.instance.bind('connection', (info: OnConnectionBindInfo) => { - // @ts-ignore const sourceInfo = info.sourceEndpoint.getParameters(); - // @ts-ignore const targetInfo = info.targetEndpoint.getParameters(); const sourceNodeName = this.$store.getters.getNodeNameByIndex(sourceInfo.nodeIndex);