From d2b140ce5e828e00a96b1c7f5e073fd636a3966e Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 31 Oct 2023 18:31:24 +0100 Subject: [PATCH] fix(svelte): repair selection, add multi selection closes #3557 --- .../svelte/src/routes/customnode/+page.svelte | 40 +------ .../src/routes/customnode/CustomNode.svelte | 45 ++++--- .../react/src/components/Nodes/wrapNode.tsx | 3 +- packages/react/src/hooks/useDrag.ts | 14 +-- packages/svelte/src/lib/actions/drag/index.ts | 6 +- .../components/EdgeWrapper/EdgeWrapper.svelte | 36 ++++-- .../components/KeyHandler/KeyHandler.svelte | 33 +++++- .../src/lib/components/KeyHandler/types.ts | 1 + .../components/NodeWrapper/NodeWrapper.svelte | 20 ++-- packages/svelte/src/lib/store/index.ts | 110 ++++++++++++------ packages/svelte/src/lib/store/types.ts | 3 +- packages/system/src/xydrag/XYDrag.ts | 10 +- 12 files changed, 204 insertions(+), 117 deletions(-) diff --git a/examples/svelte/src/routes/customnode/+page.svelte b/examples/svelte/src/routes/customnode/+page.svelte index e2654938..14130a47 100644 --- a/examples/svelte/src/routes/customnode/+page.svelte +++ b/examples/svelte/src/routes/customnode/+page.svelte @@ -23,28 +23,6 @@ const bgColor = writable('#1A192B'); - const onChange: ChangeEventHandler = (event) => { - nodes.update((nds) => - nds.map((node) => { - if (node.type !== 'colorNode') { - return node; - } - - const color = (event.target as HTMLInputElement)?.value; - - bgColor.set(color); - - return { - ...node, - data: { - ...node.data, - color - } - }; - }) - ); - }; - const nodes = writable([ { id: '1', @@ -56,17 +34,9 @@ { id: '2', type: 'colorNode', - data: { onChange: onChange, color: $bgColor }, - style: 'border: 1px solid #777; padding: 10px', + data: { colorStore: bgColor }, position: { x: 250, y: 50 } }, - { - id: '2a', - type: 'colorNode', - data: { onChange: onChange, color: $bgColor }, - style: 'border: 1px solid #777; padding: 10px', - position: { x: 250, y: 520 } - }, { id: '3', type: 'output', @@ -115,7 +85,7 @@ {nodes} {edges} {nodeTypes} - style="--bgcolor: {$bgColor}" + style="--background-color: {$bgColor}" fitView on:connect={onConnect} > @@ -123,9 +93,3 @@ - - diff --git a/examples/svelte/src/routes/customnode/CustomNode.svelte b/examples/svelte/src/routes/customnode/CustomNode.svelte index 7a40a742..25d37d32 100644 --- a/examples/svelte/src/routes/customnode/CustomNode.svelte +++ b/examples/svelte/src/routes/customnode/CustomNode.svelte @@ -1,21 +1,40 @@ - -
- Custom Color Picker Node: {data.color} +
+ +
+ Custom Color Picker Node: {$colorStore} +
+ colorStore.set(evt.currentTarget.value)} + value={$colorStore} + /> + +
- - - + + diff --git a/packages/react/src/components/Nodes/wrapNode.tsx b/packages/react/src/components/Nodes/wrapNode.tsx index 4ebead71..f96361ce 100644 --- a/packages/react/src/components/Nodes/wrapNode.tsx +++ b/packages/react/src/components/Nodes/wrapNode.tsx @@ -72,7 +72,8 @@ export default (NodeComponent: ComponentType) => { const { selectNodesOnDrag, nodeDragThreshold } = store.getState(); if (isSelectable && (!selectNodesOnDrag || !isDraggable || nodeDragThreshold > 0)) { - // this handler gets called within the drag start event when selectNodesOnDrag=true + // this handler gets called by XYDrag on drag start when selectNodesOnDrag=true + // here we only need to call it when selectNodesOnDrag=false handleNodeClick({ id, store, diff --git a/packages/react/src/hooks/useDrag.ts b/packages/react/src/hooks/useDrag.ts index 1cee64f3..3b332d8a 100644 --- a/packages/react/src/hooks/useDrag.ts +++ b/packages/react/src/hooks/useDrag.ts @@ -23,14 +23,12 @@ function useDrag({ nodeRef, disabled = false, noDragClassName, handleSelector, n xyDrag.current = XYDrag({ domNode: nodeRef.current, getStoreItems: () => store.getState(), - onNodeClick: () => { - if (nodeId) { - handleNodeClick({ - id: nodeId, - store, - nodeRef: nodeRef as RefObject, - }); - } + onNodeMouseDown: (id: string) => { + handleNodeClick({ + id, + store, + nodeRef: nodeRef as RefObject, + }); }, onDragStart: () => { setDragging(true); diff --git a/packages/svelte/src/lib/actions/drag/index.ts b/packages/svelte/src/lib/actions/drag/index.ts index bf93b041..e936d3a5 100644 --- a/packages/svelte/src/lib/actions/drag/index.ts +++ b/packages/svelte/src/lib/actions/drag/index.ts @@ -13,15 +13,17 @@ export type UseDragParams = { onDrag?: OnDrag; onDragStart?: OnDrag; onDragStop?: OnDrag; + onNodeMouseDown?: (id: string) => void; }; export default function drag(domNode: Element, params: UseDragParams) { - const { store, onDrag, onDragStart, onDragStop } = params; + const { store, onDrag, onDragStart, onDragStop, onNodeMouseDown } = params; const dragInstance = XYDrag({ domNode, onDrag, onDragStart, onDragStop, + onNodeMouseDown, getStoreItems: () => { const snapGrid = get(store.snapGrid); const vp = get(store.viewport); @@ -33,7 +35,7 @@ export default function drag(domNode: Element, params: UseDragParams) { snapGrid: snapGrid ? snapGrid : [0, 0], snapToGrid: !!snapGrid, nodeOrigin: [0, 0], - multiSelectionActive: false, + multiSelectionActive: get(store.multiselectionKeyPressed), domNode: get(store.domNode), transform: [vp.x, vp.y, vp.zoom], autoPanOnNodeDrag: get(store.autoPanOnNodeDrag), diff --git a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte index 59c8134c..7a8df68c 100644 --- a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte +++ b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte @@ -3,11 +3,12 @@