Merge pull request #3412 from wbkd/svelte-flow-expose-on-connect

Svelte flow expose/fix on:connectstart on:connectend
This commit is contained in:
Moritz Klack
2023-09-19 15:45:08 +02:00
committed by GitHub
5 changed files with 49 additions and 36 deletions
@@ -41,13 +41,13 @@
$: markerStartUrl = markerStart ? `url(#${getMarkerId(markerStart, $flowId)})` : undefined; $: markerStartUrl = markerStart ? `url(#${getMarkerId(markerStart, $flowId)})` : undefined;
$: markerEndUrl = markerEnd ? `url(#${getMarkerId(markerEnd, $flowId)})` : undefined; $: markerEndUrl = markerEnd ? `url(#${getMarkerId(markerEnd, $flowId)})` : undefined;
function onClick() { function onClick(event: MouseEvent | TouchEvent) {
if (selectable) { if (selectable) {
addSelectedEdges([id]); addSelectedEdges([id]);
} }
const edge = $edges.find((e) => e.id === id); const edge = $edges.find((e) => e.id === id);
dispatch('edgeclick', edge); dispatch('edgeclick', { event, edge });
} }
</script> </script>
@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import { getContext, createEventDispatcher } from 'svelte'; import { getContext, createEventDispatcher } from 'svelte';
import cc from 'classcat'; import cc from 'classcat';
import { Position, type Connection, XYHandle, isMouseEvent } from '@xyflow/system'; import { Position, XYHandle, isMouseEvent } 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';
@@ -43,15 +43,6 @@
updateConnection updateConnection
} = store; } = store;
function dispatchEvent(eventName: string, params?: Connection) {
dispatch(eventName, params || { nodeId, handleId, type });
}
function onConnectExtended(params: Connection) {
addEdge(params);
dispatchEvent('connect', params);
}
function onPointerDown(event: MouseEvent | TouchEvent) { function onPointerDown(event: MouseEvent | TouchEvent) {
const isMouseTriggered = isMouseEvent(event); const isMouseTriggered = isMouseEvent(event);
@@ -70,7 +61,24 @@
updateConnection, updateConnection,
cancelConnection, cancelConnection,
panBy, panBy,
onConnect: onConnectExtended, onConnect: (connection) => {
addEdge(connection);
// @todo: should we change/ improve the stuff we are passing here?
// instead of source/target we could pass fromNodeId, fromHandleId, etc
dispatch('connect', { connection });
},
onConnectStart: (event, startParams) => {
dispatch('connectstart', {
event,
nodeId: startParams.nodeId,
handleId: startParams.handleId,
handleType: startParams.handleType
});
},
onConnectEnd: (event) => {
dispatch('connectend', { event });
},
getTransform: () => $transform getTransform: () => $transform
}); });
} }
@@ -69,21 +69,21 @@
}; };
}); });
function dispatchEvent(eventName: string) { function dispatchEvent(eventName: string, event?: MouseEvent | TouchEvent) {
const node = $nodes.find((n) => n.id === id); const node = $nodes.find((n) => n.id === id);
dispatch(eventName, node); dispatch(eventName, { node, event });
} }
function onSelectNodeHandler(event: MouseEvent) { function onSelectNodeHandler(event: MouseEvent | TouchEvent) {
if (selectable && (!selectNodesOnDrag || !draggable)) { if (selectable && (!selectNodesOnDrag || !draggable)) {
// this handler gets called within the drag start event when selectNodesOnDrag=true // this handler gets called within the drag start event when selectNodesOnDrag=true
addSelectedNodes([id]); addSelectedNodes([id]);
} }
// @todo: support multiselection // @todo: support multiselection
dispatchEvent('nodeclick', event);
dispatchEvent('nodeclick');
} }
// @todo: add selectable state // @todo: add selectable state
</script> </script>
@@ -112,9 +112,9 @@
style:transform="translate({positionOrigin?.x ?? 0}px, {positionOrigin?.y ?? 0}px)" style:transform="translate({positionOrigin?.x ?? 0}px, {positionOrigin?.y ?? 0}px)"
{style} {style}
on:click={onSelectNodeHandler} on:click={onSelectNodeHandler}
on:mouseenter={() => dispatchEvent('nodemouseenter')} on:mouseenter={(event) => dispatchEvent('nodemouseenter', event)}
on:mouseleave={() => dispatchEvent('nodemouseleave')} on:mouseleave={(event) => dispatchEvent('nodemouseleave', event)}
on:mousemove={() => dispatchEvent('nodemousemove')} on:mousemove={(event) => dispatchEvent('nodemousemove', event)}
> >
<svelte:component <svelte:component
this={nodeComponent} this={nodeComponent}
@@ -64,8 +64,8 @@
$: hasActiveSelection = $elementsSelectable && (isSelecting || $selectionRectMode === 'user'); $: hasActiveSelection = $elementsSelectable && (isSelecting || $selectionRectMode === 'user');
$: _panOnDrag = $panActivationKeyPressed || panOnDrag; $: _panOnDrag = $panActivationKeyPressed || panOnDrag;
function onClick(event: MouseEvent) { function onClick(event: MouseEvent | TouchEvent) {
dispatch('paneclick', event); dispatch('paneclick', { event });
unselectNodesAndEdges(); unselectNodesAndEdges();
selectionRectMode.set(null); selectionRectMode.set(null);
@@ -180,7 +180,7 @@
return; return;
} }
dispatch('panecontextmenu', event); dispatch('panecontextmenu', { event });
}; };
</script> </script>
@@ -3,7 +3,6 @@ import type {
Connection, Connection,
ConnectionLineType, ConnectionLineType,
NodeOrigin, NodeOrigin,
OnConnectStartParams,
Viewport, Viewport,
SelectionMode, SelectionMode,
SnapGrid, SnapGrid,
@@ -12,7 +11,8 @@ import type {
OnMoveEnd, OnMoveEnd,
CoordinateExtent, CoordinateExtent,
PanOnScrollMode, PanOnScrollMode,
IsValidConnection IsValidConnection,
HandleType
} from '@xyflow/system'; } from '@xyflow/system';
import type { Edge, Node, NodeTypes, KeyDefinition, EdgeTypes } from '$lib/types'; import type { Edge, Node, NodeTypes, KeyDefinition, EdgeTypes } from '$lib/types';
@@ -59,14 +59,19 @@ export type SvelteFlowProps = DOMAttributes<HTMLDivElement> & {
onMove?: OnMove; onMove?: OnMove;
onMoveEnd?: OnMoveEnd; onMoveEnd?: OnMoveEnd;
'on:nodeclick'?: CustomEvent<Node>; 'on:nodeclick'?: CustomEvent<{ event: MouseEvent | TouchEvent; node: Node }>;
'on:nodemouseenter'?: CustomEvent<Node>; 'on:nodemouseenter'?: CustomEvent<{ event: MouseEvent; node: Node }>;
'on:nodemousemove'?: CustomEvent<Node>; 'on:nodemousemove'?: CustomEvent<{ event: MouseEvent; node: Node }>;
'on:nodemouseleave'?: CustomEvent<Node>; 'on:nodemouseleave'?: CustomEvent<{ event: MouseEvent; node: Node }>;
'on:edgeclick'?: CustomEvent<Edge>; 'on:edgeclick'?: CustomEvent<{ event: MouseEvent; edge: Edge }>;
'on:connectstart'?: CustomEvent<OnConnectStartParams>; 'on:connectstart'?: CustomEvent<{
'on:connect'?: CustomEvent<Connection>; event: MouseEvent | TouchEvent;
'on:connectend'?: CustomEvent<OnConnectStartParams>; nodeId?: string;
'on:paneclick'?: CustomEvent; handleId?: string;
'on:panecontextmenu'?: CustomEvent; handleType?: HandleType;
}>;
'on:connect'?: CustomEvent<{ connection: Connection }>;
'on:connectend'?: CustomEvent<{ event: MouseEvent | TouchEvent }>;
'on:paneclick'?: CustomEvent<{ event: MouseEvent | TouchEvent }>;
'on:panecontextmenu'?: CustomEvent<{ event: MouseEvent }>;
}; };