From 2e486384a89292a6c9c02550b50fea158ebe97f6 Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 14 Mar 2023 16:48:47 +0100 Subject: [PATCH] feat(svelte): add drag n drop example --- .../example-components/Header/Header.svelte | 1 + .../container/SvelteFlow/SvelteFlow.svelte | 6 +- .../src/lib/container/SvelteFlow/types.ts | 25 ++++--- .../svelte/src/lib/hooks/useSvelteFlow.ts | 10 ++- packages/svelte/src/lib/store/index.ts | 1 + .../src/routes/drag-n-drop/+page.svelte | 52 +++++++++++++++ .../svelte/src/routes/drag-n-drop/Flow.svelte | 65 +++++++++++++++++++ .../src/routes/drag-n-drop/Sidebar.svelte | 59 +++++++++++++++++ 8 files changed, 202 insertions(+), 17 deletions(-) create mode 100644 packages/svelte/src/routes/drag-n-drop/+page.svelte create mode 100644 packages/svelte/src/routes/drag-n-drop/Flow.svelte create mode 100644 packages/svelte/src/routes/drag-n-drop/Sidebar.svelte diff --git a/packages/svelte/src/example-components/Header/Header.svelte b/packages/svelte/src/example-components/Header/Header.svelte index 078f8ed9..0d937de5 100644 --- a/packages/svelte/src/example-components/Header/Header.svelte +++ b/packages/svelte/src/example-components/Header/Header.svelte @@ -2,6 +2,7 @@ import { goto } from '$app/navigation'; const routes = [ + 'drag-n-drop', 'overview', 'stress', 'usesvelteflow', diff --git a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte index 469954eb..a12fd924 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte +++ b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte @@ -12,10 +12,9 @@ import { KeyHandler } from '$lib/components/KeyHandler'; import { ConnectionLine } from '$lib/components/ConnectionLine'; import { useStore } from '$lib/store'; - import type { SvelteFlowProps, SvelteFlowEvents } from './types'; + import type { SvelteFlowProps } from './types'; type $$Props = SvelteFlowProps; - type $$Events = SvelteFlowEvents; export let id: $$Props['id'] = '1'; export let fitView: $$Props['fitView'] = undefined; @@ -98,6 +97,9 @@ style={style} class={cc(['svelte-flow', className])} data-testid="rf__wrapper" + on:dragover + on:drop + {...$$restProps} > diff --git a/packages/svelte/src/lib/container/SvelteFlow/types.ts b/packages/svelte/src/lib/container/SvelteFlow/types.ts index 5876d199..6526bd5d 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/types.ts +++ b/packages/svelte/src/lib/container/SvelteFlow/types.ts @@ -1,3 +1,4 @@ +import type { DOMAttributes } from 'svelte/elements'; import type { Connection, ConnectionLineType, @@ -17,7 +18,7 @@ import type { IsValidConnection } from '$lib/types'; -export type SvelteFlowProps = { +export type SvelteFlowProps = DOMAttributes & { id?: string; nodeTypes?: NodeTypes; edgeTypes?: EdgeTypes; @@ -37,19 +38,17 @@ export type SvelteFlowProps = { connectionLineType?: ConnectionLineType; isValidConnection?: IsValidConnection; -}; -export type SvelteFlowEvents = { - 'node:click': CustomEvent; - 'node:mouseenter': CustomEvent; - 'node:mousemove': CustomEvent; - 'node:mouseleave': CustomEvent; - 'edge:click': CustomEvent; - 'connect:start': CustomEvent; - connect: CustomEvent; - 'connect:end': CustomEvent; - 'pane:click': CustomEvent; - 'pane:contextmenu': CustomEvent; + 'on:node:click'?: CustomEvent; + 'on:node:mouseenter'?: CustomEvent; + 'on:node:mousemove'?: CustomEvent; + 'on:node:mouseleave'?: CustomEvent; + 'on:edge:click'?: CustomEvent; + 'on:connect:start'?: CustomEvent; + 'on:connect'?: CustomEvent; + 'on:connect:end'?: CustomEvent; + 'on:pane:click'?: CustomEvent; + 'on:pane:contextmenu'?: CustomEvent; }; export type SvelteFlowSlots = { diff --git a/packages/svelte/src/lib/hooks/useSvelteFlow.ts b/packages/svelte/src/lib/hooks/useSvelteFlow.ts index 9cd685f9..cd246eea 100644 --- a/packages/svelte/src/lib/hooks/useSvelteFlow.ts +++ b/packages/svelte/src/lib/hooks/useSvelteFlow.ts @@ -1,9 +1,10 @@ -import type { Viewport, ZoomInOut } from '@reactflow/system'; +import type { Project, Viewport, XYPosition, ZoomInOut } from '@reactflow/system'; import { useStore } from '$lib/store'; import type { FitViewOptions } from '$lib/types'; import { get, writable, type Writable } from 'svelte/store'; import type { SvelteFlowStore } from '$lib/store/types'; +import { pointToRendererPoint } from '@reactflow/utils'; export function useSvelteFlow(): { zoomIn: ZoomInOut; @@ -12,9 +13,10 @@ export function useSvelteFlow(): { viewport: Writable; nodes: SvelteFlowStore['nodes']; edges: SvelteFlowStore['edges']; + project: Project; } { // how to get the new context here? fit view doesn't work, because the store is not updated (uses old nodes store) - const { zoomIn, zoomOut, fitView, transform, nodes, edges } = useStore(); + const { zoomIn, zoomOut, fitView, snapGrid: snapGridStore, transform, nodes, edges } = useStore(); const transformValues = get(transform); const viewportWritable = writable({ @@ -35,6 +37,10 @@ export function useSvelteFlow(): { zoomIn, zoomOut, fitView, + project: (position: XYPosition) => { + const snapGrid = get(snapGridStore); + return pointToRendererPoint(position, get(transform), snapGrid !== null, snapGrid || [1, 1]); + }, nodes, edges, viewport: viewportWritable diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts index 660b4b26..bfbd94c9 100644 --- a/packages/svelte/src/lib/store/index.ts +++ b/packages/svelte/src/lib/store/index.ts @@ -292,6 +292,7 @@ export function createStore(params: CreateStoreParams): SvelteFlowStore { store.fitViewOnInitDone.set(false); store.selectionRect.set(null); store.selectionRectMode.set(null); + store.snapGrid.set(null); resetSelectedElements(); cancelConnection(); diff --git a/packages/svelte/src/routes/drag-n-drop/+page.svelte b/packages/svelte/src/routes/drag-n-drop/+page.svelte new file mode 100644 index 00000000..82d960f3 --- /dev/null +++ b/packages/svelte/src/routes/drag-n-drop/+page.svelte @@ -0,0 +1,52 @@ + + + + + diff --git a/packages/svelte/src/routes/drag-n-drop/Flow.svelte b/packages/svelte/src/routes/drag-n-drop/Flow.svelte new file mode 100644 index 00000000..3d3c16c9 --- /dev/null +++ b/packages/svelte/src/routes/drag-n-drop/Flow.svelte @@ -0,0 +1,65 @@ + + +
+ + + + + + +
+ + \ No newline at end of file diff --git a/packages/svelte/src/routes/drag-n-drop/Sidebar.svelte b/packages/svelte/src/routes/drag-n-drop/Sidebar.svelte new file mode 100644 index 00000000..532cfbed --- /dev/null +++ b/packages/svelte/src/routes/drag-n-drop/Sidebar.svelte @@ -0,0 +1,59 @@ + + + + + \ No newline at end of file