Merge pull request #3412 from wbkd/svelte-flow-expose-on-connect
Svelte flow expose/fix on:connectstart on:connectend
This commit is contained in:
@@ -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 }>;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user