Merge pull request #3417 from wbkd/svelte-flow-node-drag

feat(svelte) added nodedrag events
This commit is contained in:
Moritz Klack
2023-09-20 15:51:33 +02:00
committed by GitHub
7 changed files with 51 additions and 5 deletions
@@ -144,9 +144,21 @@
on:connectend={(event) => console.log('on connect end', event)} on:connectend={(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) => {
event.preventDefault();
console.log('on pane contextmenu', event); console.log('on pane contextmenu', event);
}} }}
on:nodedrag={(event) => {
console.log('on node drag', event);
}}
on:nodedragstart={(event) => {
console.log('on node drag start', event);
}}
on:nodedragstop={(event) => {
console.log('on node drag stop', event);
}}
on:nodecontextmenu={(event) => {
event.detail.event.preventDefault();
console.log('on node contextmenu', event);
}}
> >
<Controls /> <Controls />
<Background variant={BackgroundVariant.Dots} /> <Background variant={BackgroundVariant.Dots} />
+5
View File
@@ -1,3 +1,8 @@
## 0.0.21
- add `on:nodedragstart`, `on:nodedrag` and `on:nodedragstop`
- add `on:nodecontextmenu`
## 0.0.20 ## 0.0.20
- [breaking change] use same convention for all custom events: Always pass the original event if possible and additional data - [breaking change] use same convention for all custom events: Always pass the original event if possible and additional data
@@ -1,22 +1,28 @@
import { get } from 'svelte/store'; import { get } from 'svelte/store';
import { XYDrag } from '@xyflow/system'; import { XYDrag, type OnDrag } from '@xyflow/system';
import type { SvelteFlowStore } from '$lib/store/types'; import type { SvelteFlowStore } from '$lib/store/types';
type UseDragParams = { export type UseDragParams = {
store: SvelteFlowStore; store: SvelteFlowStore;
disabled?: boolean; disabled?: boolean;
noDragClass?: string; noDragClass?: string;
handleSelector?: string; handleSelector?: string;
nodeId?: string; nodeId?: string;
isSelectable?: boolean; isSelectable?: boolean;
onDrag?: OnDrag;
onDragStart?: OnDrag;
onDragStop?: OnDrag;
}; };
export default function drag(domNode: Element, params: UseDragParams) { export default function drag(domNode: Element, params: UseDragParams) {
const { store, onDrag, onDragStart, onDragStop } = params;
const dragInstance = XYDrag({ const dragInstance = XYDrag({
domNode, domNode,
onDrag,
onDragStart,
onDragStop,
getStoreItems: () => { getStoreItems: () => {
const { store } = params;
const snapGrid = get(store.snapGrid); const snapGrid = get(store.snapGrid);
return { return {
@@ -97,6 +97,15 @@
disabled: false, disabled: false,
handleSelector: dragHandle, handleSelector: dragHandle,
noDragClass: 'nodrag', noDragClass: 'nodrag',
onDrag: (event, _, node, nodes) => {
dispatch('nodedrag', { event, node, nodes });
},
onDragStart: (event, _, node, nodes) => {
dispatch('nodedragstart', { event, node, nodes });
},
onDragStop: (event, _, node, nodes) => {
dispatch('nodedragstop', { event, node, nodes });
},
store store
}} }}
bind:this={nodeRef} bind:this={nodeRef}
@@ -115,6 +124,7 @@
on:mouseenter={(event) => dispatchEvent('nodemouseenter', event)} on:mouseenter={(event) => dispatchEvent('nodemouseenter', event)}
on:mouseleave={(event) => dispatchEvent('nodemouseleave', event)} on:mouseleave={(event) => dispatchEvent('nodemouseleave', event)}
on:mousemove={(event) => dispatchEvent('nodemousemove', event)} on:mousemove={(event) => dispatchEvent('nodemousemove', event)}
on:contextmenu={(event) => dispatchEvent('nodecontextmenu', event)}
> >
<svelte:component <svelte:component
this={nodeComponent} this={nodeComponent}
@@ -72,6 +72,10 @@
on:connectstart on:connectstart
on:connect on:connect
on:connectend on:connectend
on:nodedrag
on:nodedragstart
on:nodedragstop
on:nodecontextmenu
/> />
{/each} {/each}
</div> </div>
@@ -154,6 +154,10 @@
on:connectstart on:connectstart
on:connect on:connect
on:connectend on:connectend
on:nodedragstart
on:nodedrag
on:nodedragstop
on:nodecontextmenu
/> />
<NodeSelection /> <NodeSelection />
</ViewportComponent> </ViewportComponent>
@@ -12,7 +12,8 @@ import type {
CoordinateExtent, CoordinateExtent,
PanOnScrollMode, PanOnScrollMode,
IsValidConnection, IsValidConnection,
HandleType HandleType,
NodeBase
} 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';
@@ -74,4 +75,8 @@ export type SvelteFlowProps = DOMAttributes<HTMLDivElement> & {
'on:connectend'?: CustomEvent<{ event: MouseEvent | TouchEvent }>; 'on:connectend'?: CustomEvent<{ event: MouseEvent | TouchEvent }>;
'on:paneclick'?: CustomEvent<{ event: MouseEvent | TouchEvent }>; 'on:paneclick'?: CustomEvent<{ event: MouseEvent | TouchEvent }>;
'on:panecontextmenu'?: CustomEvent<{ event: MouseEvent }>; 'on:panecontextmenu'?: CustomEvent<{ event: MouseEvent }>;
'on:nodedragstart'?: CustomEvent<{ event: MouseEvent; node: NodeBase; nodes: NodeBase[] }>;
'on:nodedrag'?: CustomEvent<{ event: MouseEvent; node: NodeBase; nodes: NodeBase[] }>;
'on:nodedragstop'?: CustomEvent<{ event: MouseEvent; node: NodeBase; nodes: NodeBase[] }>;
'on:nodecontextmenu'?: CustomEvent<{ event: MouseEvent; node: NodeBase }>;
}; };