From 99453f0993fdaceed3888ecb2e334bcb0e14eb2f Mon Sep 17 00:00:00 2001 From: Tornado Softwares Date: Tue, 18 Nov 2025 16:24:11 +0100 Subject: [PATCH] Fix #5633 --- packages/react/src/store/index.ts | 15 +++++++++++---- packages/svelte/src/lib/store/index.ts | 13 +++++++++++-- packages/system/src/xyhandle/XYHandle.ts | 7 +++++-- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/packages/react/src/store/index.ts b/packages/react/src/store/index.ts index 3254bdfa..baef953c 100644 --- a/packages/react/src/store/index.ts +++ b/packages/react/src/store/index.ts @@ -14,6 +14,8 @@ import { NodeOrigin, CoordinateExtent, fitViewport, + getHandlePosition, + Position, } from '@xyflow/system'; import { applyEdgeChanges, applyNodeChanges, createSelectionChange, getSelectionChanges } from '../utils/changes'; @@ -176,7 +178,7 @@ const createStore = ({ updateNodePositions: (nodeDragItems, dragging = false) => { const parentExpandChildren: ParentExpandChild[] = []; const changes = []; - const { nodeLookup, triggerNodeChanges } = get(); + const { nodeLookup, triggerNodeChanges, connection, updateConnection } = get(); for (const [id, dragItem] of nodeDragItems) { // we are using the nodelookup to be sure to use the current expandParent and parentId value @@ -188,13 +190,18 @@ const createStore = ({ type: 'position', position: expandParent ? { - x: Math.max(0, dragItem.position.x), - y: Math.max(0, dragItem.position.y), - } + x: Math.max(0, dragItem.position.x), + y: Math.max(0, dragItem.position.y), + } : dragItem.position, dragging, }; + if (node && connection.inProgress && connection.fromNode.id == node.id) { + const updatedFrom = getHandlePosition(node, connection.fromHandle, Position.Left, true); + updateConnection({...connection,from: updatedFrom}) + } + if (expandParent && node.parentId) { parentExpandChildren.push({ id, diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts index 798e87d8..4619a27e 100644 --- a/packages/svelte/src/lib/store/index.ts +++ b/packages/svelte/src/lib/store/index.ts @@ -15,7 +15,9 @@ import { updateAbsolutePositions, snapPosition, calculateNodePosition, - type SetCenterOptions + type SetCenterOptions, + getHandlePosition, + Position } from '@xyflow/system'; import type { EdgeTypes, NodeTypes, Node, Edge, FitViewOptions } from '$lib/types'; @@ -50,7 +52,14 @@ export function createStore { - store.nodes = store.nodes.map((node) => { + store.nodes = store.nodes.map((node) => { + if (store.connection.inProgress && store.connection.fromNode.id === node.id) { + + store.connection = { + ...store.connection, + from: getHandlePosition(store.nodeLookup.get(node.id), store.connection.fromHandle, Position.Left, true) + }; + } const dragItem = nodeDragItems.get(node.id); return dragItem ? { ...node, position: dragItem.position, dragging } : node; }); diff --git a/packages/system/src/xyhandle/XYHandle.ts b/packages/system/src/xyhandle/XYHandle.ts index 2e714e8b..40d04dff 100644 --- a/packages/system/src/xyhandle/XYHandle.ts +++ b/packages/system/src/xyhandle/XYHandle.ts @@ -171,10 +171,13 @@ function onPointerDown( resultHandleDomNode = result.handleDomNode; connection = result.connection; isValid = isConnectionValid(!!closestHandle, result.isValid); + + const fromNodeInternal = nodeLookup.get(nodeId)!; + const from = getHandlePosition(fromNodeInternal, fromHandle, Position.Left, true); - const newConnection: ConnectionInProgress = { - // from stays the same + const newConnection: ConnectionInProgress = { ...previousConnection, + from, isValid, to: result.toHandle && isValid