refactor(svelte): replace on:connect with onconnect
This commit is contained in:
@@ -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)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user