From 1dd5613482e8ae9130aedbb6f98dd4a0332088f9 Mon Sep 17 00:00:00 2001 From: moklick Date: Thu, 23 Feb 2023 18:21:39 +0100 Subject: [PATCH] feat(svelte): add BaseEdge and EdgeLabelRenderer --- .../svelte/src/lib/actions/portal/index.ts | 15 ++++ .../components/EdgeLabelRenderer/index.svelte | 9 +++ .../src/lib/components/edges/BaseEdge.svelte | 70 +++++++++--------- .../lib/components/edges/BezierEdge.svelte | 31 ++++---- .../lib/components/edges/EdgeWrapper.svelte | 73 +++++++++++++++++++ .../components/edges/SmoothStepEdge.svelte | 29 ++++---- .../lib/components/edges/StraightEdge.svelte | 25 ++++--- .../{BaseNode.svelte => NodeWrapper.svelte} | 1 - .../lib/container/EdgeRenderer/index.svelte | 6 +- .../lib/container/NodeRenderer/index.svelte | 4 +- .../src/lib/container/SvelteFlow.svelte | 13 +++- packages/svelte/src/lib/store/index.ts | 33 ++++----- packages/svelte/src/lib/types/edges.ts | 23 +----- packages/svelte/src/lib/types/index.ts | 9 ++- packages/svelte/src/routes/+page.svelte | 6 +- 15 files changed, 225 insertions(+), 122 deletions(-) create mode 100644 packages/svelte/src/lib/actions/portal/index.ts create mode 100644 packages/svelte/src/lib/components/EdgeLabelRenderer/index.svelte create mode 100644 packages/svelte/src/lib/components/edges/EdgeWrapper.svelte rename packages/svelte/src/lib/components/nodes/{BaseNode.svelte => NodeWrapper.svelte} (99%) diff --git a/packages/svelte/src/lib/actions/portal/index.ts b/packages/svelte/src/lib/actions/portal/index.ts new file mode 100644 index 00000000..4c5d89ea --- /dev/null +++ b/packages/svelte/src/lib/actions/portal/index.ts @@ -0,0 +1,15 @@ +export default function (node: Element, target = 'body') { + const targetEl = document.querySelector(target); + + if (targetEl) { + targetEl.appendChild(node); + } + + return { + destroy() { + if (node.parentNode) { + node.parentNode.removeChild(node); + } + } + }; +} diff --git a/packages/svelte/src/lib/components/EdgeLabelRenderer/index.svelte b/packages/svelte/src/lib/components/EdgeLabelRenderer/index.svelte new file mode 100644 index 00000000..03000191 --- /dev/null +++ b/packages/svelte/src/lib/components/EdgeLabelRenderer/index.svelte @@ -0,0 +1,9 @@ + + +
+ +
\ No newline at end of file diff --git a/packages/svelte/src/lib/components/edges/BaseEdge.svelte b/packages/svelte/src/lib/components/edges/BaseEdge.svelte index 1e70dbe6..c92a9412 100644 --- a/packages/svelte/src/lib/components/edges/BaseEdge.svelte +++ b/packages/svelte/src/lib/components/edges/BaseEdge.svelte @@ -1,44 +1,46 @@ - - + +{#if interactionWidth} + - +{/if} + +{#if label} + +
+ {label} +
+
+{/if} \ No newline at end of file diff --git a/packages/svelte/src/lib/components/edges/BezierEdge.svelte b/packages/svelte/src/lib/components/edges/BezierEdge.svelte index 022d754c..c9e4cc4f 100644 --- a/packages/svelte/src/lib/components/edges/BezierEdge.svelte +++ b/packages/svelte/src/lib/components/edges/BezierEdge.svelte @@ -1,21 +1,24 @@ - \ No newline at end of file + diff --git a/packages/svelte/src/lib/components/edges/EdgeWrapper.svelte b/packages/svelte/src/lib/components/edges/EdgeWrapper.svelte new file mode 100644 index 00000000..5a0e79f4 --- /dev/null +++ b/packages/svelte/src/lib/components/edges/EdgeWrapper.svelte @@ -0,0 +1,73 @@ + + + + + + + diff --git a/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte b/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte index 95666355..ec1b2db9 100644 --- a/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte +++ b/packages/svelte/src/lib/components/edges/SmoothStepEdge.svelte @@ -1,21 +1,24 @@ - \ No newline at end of file diff --git a/packages/svelte/src/lib/components/edges/StraightEdge.svelte b/packages/svelte/src/lib/components/edges/StraightEdge.svelte index 285bbadc..f1d7c190 100644 --- a/packages/svelte/src/lib/components/edges/StraightEdge.svelte +++ b/packages/svelte/src/lib/components/edges/StraightEdge.svelte @@ -1,19 +1,22 @@ - \ No newline at end of file diff --git a/packages/svelte/src/lib/components/nodes/BaseNode.svelte b/packages/svelte/src/lib/components/nodes/NodeWrapper.svelte similarity index 99% rename from packages/svelte/src/lib/components/nodes/BaseNode.svelte rename to packages/svelte/src/lib/components/nodes/NodeWrapper.svelte index c5f01795..fecb9832 100644 --- a/packages/svelte/src/lib/components/nodes/BaseNode.svelte +++ b/packages/svelte/src/lib/components/nodes/NodeWrapper.svelte @@ -85,7 +85,6 @@ \ No newline at end of file diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts index 68ceaa35..8839d3b9 100644 --- a/packages/svelte/src/lib/store/index.ts +++ b/packages/svelte/src/lib/store/index.ts @@ -6,6 +6,7 @@ import { type NodeDimensionUpdate, Position, internalsSymbol, + SelectionMode, type NodeOrigin, type D3ZoomInstance, type D3SelectionInstance, @@ -16,17 +17,11 @@ import { import { fitView, getConnectedEdges, getD3Transition, getDimensions } from '@reactflow/utils'; import { getHandleBounds } from '../../utils'; -import { - getEdgePositions, - getHandle, - getNodeData, - type EdgePosition -} from '$lib/container/EdgeRenderer/utils'; -import { SelectionMode } from 'reactflow'; +import { getEdgePositions, getHandle, getNodeData } from '$lib/container/EdgeRenderer/utils'; import DefaultNode from '$lib/components/nodes/DefaultNode.svelte'; import InputNode from '$lib/components/nodes/InputNode.svelte'; import OutputNode from '$lib/components/nodes/OutputNode.svelte'; -import type { EdgeTypes, NodeTypes, Node, Edge } from '$lib/types'; +import type { EdgeTypes, NodeTypes, Node, Edge, WrapEdgeProps } from '$lib/types'; import BezierEdge from '$lib/components/edges/BezierEdge.svelte'; import StraightEdge from '$lib/components/edges/StraightEdge.svelte'; import SmoothStepEdge from '$lib/components/edges/SmoothStepEdge.svelte'; @@ -42,11 +37,6 @@ type CreateStoreProps = { id?: string; }; -export type EdgeWithData = EdgePosition & { - id: string; - type: string; -}; - type SvelteFlowStore = { nodesStore: Writable; edgesStore: Writable; @@ -57,7 +47,7 @@ type SvelteFlowStore = { selection: D3SelectionInstance | null; }>; transformStore: Writable; - edgesWithDataStore: Readable; + edgesWithDataStore: Readable; idStore: Writable; nodeOriginStore: Writable; draggingStore: Writable; @@ -162,16 +152,24 @@ export function createStore({ targetPosition ); + // we nee to do this to match the types + const sourceHandleId = edge.sourceHandle; + const targetHandleId = edge.targetHandle; + return { - id: edge.id, + ...edge, type: edgeType, sourceX, sourceY, targetX, - targetY + targetY, + sourcePosition, + targetPosition, + sourceHandleId, + targetHandleId }; }) - .filter((e) => e !== null) as EdgeWithData[]; + .filter((e) => e !== null) as WrapEdgeProps[]; }); function setEdges(edges: Edge[]) { @@ -359,6 +357,7 @@ export function createStore({ function addSelectedNodes(ids: string[]) { selectionRectStore.set(null); + selectionRectModeStore.set(null); if (get(multiselectionKeyPressedStore)) { // @todo handle multiselection key diff --git a/packages/svelte/src/lib/types/edges.ts b/packages/svelte/src/lib/types/edges.ts index 217b0efd..37df39cd 100644 --- a/packages/svelte/src/lib/types/edges.ts +++ b/packages/svelte/src/lib/types/edges.ts @@ -1,25 +1,4 @@ import type { SvelteComponentTyped } from 'svelte'; -import type { Position } from '@reactflow/system'; - -export type Edge = { - id: string; - type: string; - source: string; - target: string; - sourceHandle?: string; - targetHandle?: string; - selected?: boolean; - deletable?: boolean; -}; - -export type EdgeProps = { - id: string; - sourceX: number; - sourceY: number; - targetX: number; - targetY: number; - sourcePosition?: Position; - targetPosition?: Position; -}; +import type { EdgeProps } from '$lib/types'; export type EdgeTypes = Record>; diff --git a/packages/svelte/src/lib/types/index.ts b/packages/svelte/src/lib/types/index.ts index 43288f9a..ced30c7a 100644 --- a/packages/svelte/src/lib/types/index.ts +++ b/packages/svelte/src/lib/types/index.ts @@ -1,4 +1,11 @@ -export type { Position, XYPosition } from '@reactflow/system'; +export type { + Position, + XYPosition, + Edge, + BaseEdgeProps, + WrapEdgeProps, + EdgeProps +} from '@reactflow/system'; export * from './nodes'; export * from './edges'; diff --git a/packages/svelte/src/routes/+page.svelte b/packages/svelte/src/routes/+page.svelte index 42118d11..2eea4c7c 100644 --- a/packages/svelte/src/routes/+page.svelte +++ b/packages/svelte/src/routes/+page.svelte @@ -83,7 +83,8 @@ id: '1-2', type: 'default', source: '1', - target: '2' + target: '2', + label: 'Edge Text' }, { id: '1-3', type: 'smoothstep', @@ -93,7 +94,8 @@ id: '2-4', type: 'default', source: '2', - target: '4' + target: '4', + animated: true }]; function updateNode() {