refactor(svelte): replace on:connect with onconnect

This commit is contained in:
moklick
2023-12-13 11:33:49 +01:00
parent 8ceb1addc1
commit b332b86090
16 changed files with 65 additions and 69 deletions
@@ -1,6 +1,12 @@
<script lang="ts"> <script lang="ts">
import { writable } from 'svelte/store'; import { writable } from 'svelte/store';
import { SvelteFlow, useSvelteFlow, type Edge, type Node } from '@xyflow/svelte'; import {
SvelteFlow,
useSvelteFlow,
type Edge,
type Node,
type OnConnectEnd
} from '@xyflow/svelte';
import '@xyflow/svelte/dist/style.css'; import '@xyflow/svelte/dist/style.css';
@@ -16,16 +22,18 @@
const nodes = writable<Node[]>(initialNodes); const nodes = writable<Node[]>(initialNodes);
const edges = writable<Edge[]>([]); const edges = writable<Edge[]>([]);
let connectingNodeId: string = '0'; let connectingNodeId: string | null = '0';
let rect: DOMRectReadOnly; let rect: DOMRectReadOnly;
let id = 1; let id = 1;
const getId = () => `${id++}`; const getId = () => `${id++}`;
const { screenToFlowPosition, flowToScreenPosition } = useSvelteFlow(); const { screenToFlowPosition, flowToScreenPosition } = useSvelteFlow();
function handleConnectEnd({ detail: { event } }: { detail: { event: MouseEvent | TouchEvent } }) { const handleConnectEnd: OnConnectEnd = (event) => {
if (!connectingNodeId) return;
// See of connection landed inside the flow pane // See of connection landed inside the flow pane
const targetIsPane = event.target?.classList.contains('svelte-flow__pane'); const targetIsPane = (event.target as HTMLDivElement)?.classList.contains('svelte-flow__pane');
if (targetIsPane) { if (targetIsPane) {
const id = getId(); const id = getId();
const position = { const position = {
@@ -58,7 +66,7 @@
$nodes = $nodes; $nodes = $nodes;
$edges = $edges; $edges = $edges;
} }
} };
</script> </script>
<svelte:window /> <svelte:window />
@@ -69,11 +77,11 @@
{edges} {edges}
fitView fitView
fitViewOptions={{ padding: 2 }} fitViewOptions={{ padding: 2 }}
on:connectstart={({ detail: { nodeId } }) => { onconnectstart={(_, { nodeId }) => {
// Memorize the nodeId you start draggin a connection line from a node // Memorize the nodeId you start draggin a connection line from a node
connectingNodeId = nodeId; connectingNodeId = nodeId;
}} }}
on:connectend={handleConnectEnd} onconnectend={handleConnectEnd}
/> />
</div> </div>
@@ -87,7 +87,7 @@
{nodeTypes} {nodeTypes}
style="--xy-background-color: {$bgColor}" style="--xy-background-color: {$bgColor}"
fitView fitView
on:connect={onConnect} onconnect={onConnect}
> >
<Controls /> <Controls />
<Background variant={BackgroundVariant.Dots} /> <Background variant={BackgroundVariant.Dots} />
@@ -10,7 +10,7 @@
</script> </script>
<div class="custom"> <div class="custom">
<Handle type="target" position={Position.Left} on:connect /> <Handle type="target" position={Position.Left} />
<div> <div>
Custom Color Picker Node: <strong>{$colorStore}</strong> Custom Color Picker Node: <strong>{$colorStore}</strong>
</div> </div>
@@ -20,14 +20,8 @@
on:input={(evt) => colorStore.set(evt.currentTarget.value)} on:input={(evt) => colorStore.set(evt.currentTarget.value)}
value={$colorStore} value={$colorStore}
/> />
<Handle type="source" position={Position.Right} id="a" style="top: 20px;" on:connect /> <Handle type="source" position={Position.Right} id="a" style="top: 20px;" />
<Handle <Handle type="source" position={Position.Right} id="b" style="top: auto; bottom: 10px;" />
type="source"
position={Position.Right}
id="b"
style="top: auto; bottom: 10px;"
on:connect
/>
</div> </div>
<style> <style>
@@ -150,9 +150,9 @@
on:nodemouseenter={(event) => console.log('on node enter', event)} on:nodemouseenter={(event) => console.log('on node enter', event)}
on:nodemouseleave={(event) => console.log('on node leave', event)} on:nodemouseleave={(event) => console.log('on node leave', event)}
on:edgeclick={(event) => console.log('edge click', event)} on:edgeclick={(event) => console.log('edge click', event)}
on:connectstart={(event) => console.log('on connect start', event)} onconnectstart={(event) => console.log('on connect start', event)}
on:connect={(event) => console.log('on connect', event)} onconnect={(event) => console.log('on connect', event)}
on:connectend={(event) => console.log('on connect end', event)} onconnectend={(event) => console.log('on connect end', event)}
on:paneclick={(event) => console.log('on pane click', event)} on:paneclick={(event) => console.log('on pane click', event)}
on:panecontextmenu={(event) => { on:panecontextmenu={(event) => {
console.log('on pane contextmenu', event); console.log('on pane contextmenu', event);
@@ -2,10 +2,10 @@
import { import {
Handle, Handle,
Position, Position,
type NodeProps,
useHandleConnections, useHandleConnections,
useNodesData, useNodesData,
useSvelteFlow useSvelteFlow,
type NodeProps
} from '@xyflow/svelte'; } from '@xyflow/svelte';
type $$Props = NodeProps; type $$Props = NodeProps;
@@ -15,15 +15,9 @@
}; };
</script> </script>
<Handle type="target" position={Position.Top} on:connect /> <Handle type="target" position={Position.Top} />
<button on:click={onClick}>add handle</button> <button on:click={onClick}>add handle</button>
{#each Array.from({ length: handleCount }) as handle, i} {#each Array.from({ length: handleCount }) as handle, i}
<Handle <Handle type="source" position={Position.Bottom} id={`${i}`} style={`left: ${i * 10}px;`} />
type="source"
position={Position.Bottom}
id={`${i}`}
style={`left: ${i * 10}px;`}
on:connect
/>
{/each} {/each}
@@ -1,19 +1,18 @@
<script lang="ts"> <script lang="ts">
import { getContext, createEventDispatcher } from 'svelte'; import { getContext } from 'svelte';
import type { Writable } from 'svelte/store';
import cc from 'classcat'; import cc from 'classcat';
import { import {
Position, Position,
XYHandle, XYHandle,
isMouseEvent, isMouseEvent,
type Connection, type Connection,
type HandleType,
areConnectionMapsEqual, areConnectionMapsEqual,
handleConnectionChange handleConnectionChange
} from '@xyflow/system'; } from '@xyflow/system';
import { useStore } from '$lib/store'; import { useStore } from '$lib/store';
import type { HandleComponentProps } from '$lib/types'; import type { HandleComponentProps } from '$lib/types';
import type { Writable } from 'svelte/store';
type $$Props = HandleComponentProps; type $$Props = HandleComponentProps;
@@ -36,18 +35,6 @@
$: handleConnectable = isConnectable !== undefined ? isConnectable : $connectable; $: handleConnectable = isConnectable !== undefined ? isConnectable : $connectable;
const handleId = id || null; const handleId = id || null;
const dispatch = createEventDispatcher<{
connect: { connection: Connection };
connectstart: {
event: MouseEvent | TouchEvent;
nodeId: string | null;
handleId: string | null;
handleType: HandleType | null;
};
connectend: {
event: MouseEvent | TouchEvent;
};
}>();
const store = useStore(); const store = useStore();
const { const {
@@ -65,7 +52,10 @@
updateConnection, updateConnection,
autoPanOnConnect, autoPanOnConnect,
edges, edges,
connectionLookup connectionLookup,
onconnect: onConnectAction,
onconnectstart: onConnectStartAction,
onconnectend: onConnectEndAction
} = store; } = store;
function onPointerDown(event: MouseEvent | TouchEvent) { function onPointerDown(event: MouseEvent | TouchEvent) {
@@ -94,20 +84,17 @@
} }
addEdge(edge); addEdge(edge);
// @todo: should we change/ improve the stuff we are passing here? $onConnectAction?.(connection);
// instead of source/target we could pass fromNodeId, fromHandleId, etc
dispatch('connect', { connection });
}, },
onConnectStart: (event, startParams) => { onConnectStart: (event, startParams) => {
dispatch('connectstart', { $onConnectStartAction?.(event, {
event,
nodeId: startParams.nodeId, nodeId: startParams.nodeId,
handleId: startParams.handleId, handleId: startParams.handleId,
handleType: startParams.handleType handleType: startParams.handleType
}); });
}, },
onConnectEnd: (event) => { onConnectEnd: (event) => {
dispatch('connectend', { event }); $onConnectEndAction?.(event);
}, },
getTransform: () => [$viewport.x, $viewport.y, $viewport.zoom] getTransform: () => [$viewport.x, $viewport.y, $viewport.zoom]
}); });
@@ -194,9 +194,6 @@
positionAbsolute={{ x: positionX, y: positionY }} positionAbsolute={{ x: positionX, y: positionY }}
{width} {width}
{height} {height}
on:connectstart
on:connect
on:connectend
/> />
</div> </div>
{/if} {/if}
@@ -37,6 +37,6 @@
isConnectable; isConnectable;
</script> </script>
<Handle type="target" position={targetPosition} on:connectstart on:connect on:connectend /> <Handle type="target" position={targetPosition} />
{data?.label} {data?.label}
<Handle type="source" position={sourcePosition} on:connectstart on:connect on:connectend /> <Handle type="source" position={sourcePosition} />
@@ -39,4 +39,4 @@
</script> </script>
{data?.label} {data?.label}
<Handle type="source" position={sourcePosition} on:connectstart on:connect on:connectend /> <Handle type="source" position={sourcePosition} />
@@ -36,4 +36,4 @@
</script> </script>
{data?.label} {data?.label}
<Handle type="target" position={targetPosition} on:connectstart on:connect on:connectend /> <Handle type="target" position={targetPosition} />
@@ -83,9 +83,6 @@
on:nodemouseenter on:nodemouseenter
on:nodemousemove on:nodemousemove
on:nodemouseleave on:nodemouseleave
on:connectstart
on:connect
on:connectend
on:nodedrag on:nodedrag
on:nodedragstart on:nodedragstart
on:nodedragstop on:nodedragstop
@@ -78,6 +78,9 @@
export let width: $$Props['width'] = undefined; export let width: $$Props['width'] = undefined;
export let height: $$Props['height'] = undefined; export let height: $$Props['height'] = undefined;
export let colorMode: $$Props['colorMode'] = 'light'; export let colorMode: $$Props['colorMode'] = 'light';
export let onconnect: $$Props['onconnect'] = undefined;
export let onconnectstart: $$Props['onconnectstart'] = undefined;
export let onconnectend: $$Props['onconnectend'] = undefined;
export let defaultMarkerColor = '#b1b1b7'; export let defaultMarkerColor = '#b1b1b7';
@@ -152,7 +155,10 @@
ondelete, ondelete,
onedgecreate, onedgecreate,
connectionMode, connectionMode,
nodeDragThreshold nodeDragThreshold,
onconnect,
onconnectstart,
onconnectend
}; };
updateStoreByKeys(store, updatableProps); updateStoreByKeys(store, updatableProps);
@@ -217,9 +223,6 @@
on:nodemouseenter on:nodemouseenter
on:nodemousemove on:nodemousemove
on:nodemouseleave on:nodemouseleave
on:connectstart
on:connect
on:connectend
on:nodedragstart on:nodedragstart
on:nodedrag on:nodedrag
on:nodedragstop on:nodedragstop
@@ -15,7 +15,10 @@ import type {
ConnectionMode, ConnectionMode,
PanelPosition, PanelPosition,
ProOptions, ProOptions,
ColorMode ColorMode,
OnConnect,
OnConnectStart,
OnConnectEnd
} from '@xyflow/system'; } from '@xyflow/system';
import type { import type {
@@ -92,4 +95,8 @@ export type SvelteFlowProps = DOMAttributes<HTMLDivElement> & {
ondelete?: OnDelete; ondelete?: OnDelete;
onedgecreate?: OnEdgeCreate; onedgecreate?: OnEdgeCreate;
onconnect?: OnConnect;
onconnectstart?: OnConnectStart;
onconnectend?: OnConnectEnd;
}; };
@@ -66,6 +66,9 @@ export type UpdatableStoreProps = {
ondelete?: UnwrapWritable<SvelteFlowStore['ondelete']>; ondelete?: UnwrapWritable<SvelteFlowStore['ondelete']>;
onedgecreate?: UnwrapWritable<SvelteFlowStore['onedgecreate']>; onedgecreate?: UnwrapWritable<SvelteFlowStore['onedgecreate']>;
nodeDragThreshold?: UnwrapWritable<SvelteFlowStore['nodeDragThreshold']>; nodeDragThreshold?: UnwrapWritable<SvelteFlowStore['nodeDragThreshold']>;
onconnect?: UnwrapWritable<SvelteFlowStore['onconnect']>;
onconnectstart?: UnwrapWritable<SvelteFlowStore['onconnectstart']>;
onconnectend?: UnwrapWritable<SvelteFlowStore['onconnectend']>;
}; };
export function updateStoreByKeys(store: SvelteFlowStore, keys: UpdatableStoreProps) { export function updateStoreByKeys(store: SvelteFlowStore, keys: UpdatableStoreProps) {
@@ -19,7 +19,10 @@ import {
getNodesBounds, getNodesBounds,
getViewportForBounds, getViewportForBounds,
updateConnectionLookup, updateConnectionLookup,
type ConnectionLookup type ConnectionLookup,
type OnConnect,
type OnConnectStart,
type OnConnectEnd
} from '@xyflow/system'; } from '@xyflow/system';
import DefaultNode from '$lib/components/nodes/DefaultNode.svelte'; import DefaultNode from '$lib/components/nodes/DefaultNode.svelte';
@@ -140,6 +143,9 @@ export const getInitialStore = ({
onlyRenderVisibleElements: writable<boolean>(false), onlyRenderVisibleElements: writable<boolean>(false),
onerror: writable<OnError>(devWarn), onerror: writable<OnError>(devWarn),
ondelete: writable<OnDelete>(undefined), ondelete: writable<OnDelete>(undefined),
onedgecreate: writable<OnEdgeCreate>(undefined) onedgecreate: writable<OnEdgeCreate>(undefined),
onconnect: writable<OnConnect>(undefined),
onconnectstart: writable<OnConnectStart>(undefined),
onconnectend: writable<OnConnectEnd>(undefined)
}; };
}; };