Merge pull request #4195 from RedPhoenixQ/node-event-types

Svelte: Fix Node event types
This commit is contained in:
Moritz Klack
2024-05-02 11:25:03 +02:00
committed by GitHub
4 changed files with 24 additions and 26 deletions
@@ -5,17 +5,17 @@
import { useStore } from '$lib/store'; import { useStore } from '$lib/store';
import { Selection } from '$lib/components/Selection'; import { Selection } from '$lib/components/Selection';
import drag from '$lib/actions/drag'; import drag from '$lib/actions/drag';
import type { Node } from '$lib/types'; import type { Node, NodeEventMap } from '$lib/types';
import { createNodeEventDispatcher } from '$lib';
const store = useStore(); const store = useStore();
const { selectionRectMode, nodes } = store; const { selectionRectMode, nodes } = store;
const dispatch = createEventDispatcher<{ const dispatch = createEventDispatcher<
selectioncontextmenu: { nodes: Node[]; event: MouseEvent | TouchEvent }; NodeEventMap & {
selectionclick: { nodes: Node[]; event: MouseEvent | TouchEvent }; selectioncontextmenu: { nodes: Node[]; event: MouseEvent | TouchEvent };
}>(); selectionclick: { nodes: Node[]; event: MouseEvent | TouchEvent };
const dispatchNodeEvent = createNodeEventDispatcher(); }
>();
$: selectedNodes = $nodes.filter((n) => n.selected); $: selectedNodes = $nodes.filter((n) => n.selected);
$: bounds = getNodesBounds(selectedNodes); $: bounds = getNodesBounds(selectedNodes);
@@ -37,13 +37,13 @@
disabled: false, disabled: false,
store, store,
onDrag: (event, _, __, nodes) => { onDrag: (event, _, __, nodes) => {
dispatchNodeEvent('nodedrag', { event, targetNode: null, nodes }); dispatch('nodedrag', { event, targetNode: null, nodes });
}, },
onDragStart: (event, _, __, nodes) => { onDragStart: (event, _, __, nodes) => {
dispatchNodeEvent('nodedragstart', { event, targetNode: null, nodes }); dispatch('nodedragstart', { event, targetNode: null, nodes });
}, },
onDragStop: (event, _, __, nodes) => { onDragStop: (event, _, __, nodes) => {
dispatchNodeEvent('nodedragstop', { event, targetNode: null, nodes }); dispatch('nodedragstop', { event, targetNode: null, nodes });
} }
}} }}
on:contextmenu={onContextMenu} on:contextmenu={onContextMenu}
@@ -1,7 +1,7 @@
<svelte:options immutable /> <svelte:options immutable />
<script lang="ts"> <script lang="ts">
import { setContext, onDestroy } from 'svelte'; import { setContext, onDestroy, createEventDispatcher } from 'svelte';
import { get, writable } from 'svelte/store'; import { get, writable } from 'svelte/store';
import cc from 'classcat'; import cc from 'classcat';
import { errorMessages, Position } from '@xyflow/system'; import { errorMessages, Position } from '@xyflow/system';
@@ -11,7 +11,7 @@
import DefaultNode from '$lib/components/nodes/DefaultNode.svelte'; import DefaultNode from '$lib/components/nodes/DefaultNode.svelte';
import type { NodeWrapperProps } from './types'; import type { NodeWrapperProps } from './types';
import { getNodeInlineStyleDimensions } from './utils'; import { getNodeInlineStyleDimensions } from './utils';
import { createNodeEventDispatcher } from '$lib'; import type { NodeEventMap } from '$lib/types';
interface $$Props extends NodeWrapperProps {} interface $$Props extends NodeWrapperProps {}
@@ -58,7 +58,7 @@
let nodeRef: HTMLDivElement; let nodeRef: HTMLDivElement;
let prevNodeRef: HTMLDivElement | null = null; let prevNodeRef: HTMLDivElement | null = null;
const dispatchNodeEvent = createNodeEventDispatcher(); const dispatchNodeEvent = createEventDispatcher<NodeEventMap>();
const connectableStore = writable(connectable); const connectableStore = writable(connectable);
let prevType: string | undefined = undefined; let prevType: string | undefined = undefined;
let prevSourcePosition: Position | undefined = undefined; let prevSourcePosition: Position | undefined = undefined;
+11
View File
@@ -45,3 +45,14 @@ export type NodeTypes = Record<
export type DefaultNodeOptions = Partial<Omit<Node, 'id'>>; export type DefaultNodeOptions = Partial<Omit<Node, 'id'>>;
export type BuiltInNode = Node<{ label: string }, 'input' | 'output' | 'default'>; export type BuiltInNode = Node<{ label: string }, 'input' | 'output' | 'default'>;
export type NodeEventMap = {
nodeclick: { node: Node; event: MouseEvent | TouchEvent };
nodecontextmenu: { node: Node; event: MouseEvent | TouchEvent };
nodedrag: { targetNode: Node | null; nodes: Node[]; event: MouseEvent | TouchEvent };
nodedragstart: { targetNode: Node | null; nodes: Node[]; event: MouseEvent | TouchEvent };
nodedragstop: { targetNode: Node | null; nodes: Node[]; event: MouseEvent | TouchEvent };
nodemouseenter: { node: Node; event: MouseEvent | TouchEvent };
nodemouseleave: { node: Node; event: MouseEvent | TouchEvent };
nodemousemove: { node: Node; event: MouseEvent | TouchEvent };
};
-13
View File
@@ -1,4 +1,3 @@
import { createEventDispatcher } from 'svelte';
import { isNodeBase, isEdgeBase } from '@xyflow/system'; import { isNodeBase, isEdgeBase } from '@xyflow/system';
import type { Edge, Node } from '$lib/types'; import type { Edge, Node } from '$lib/types';
@@ -22,15 +21,3 @@ export const isNode = <NodeType extends Node = Node>(element: unknown): element
*/ */
export const isEdge = <EdgeType extends Edge = Edge>(element: unknown): element is EdgeType => export const isEdge = <EdgeType extends Edge = Edge>(element: unknown): element is EdgeType =>
isEdgeBase<EdgeType>(element); isEdgeBase<EdgeType>(element);
export const createNodeEventDispatcher = () =>
createEventDispatcher<{
nodeclick: { node: Node; event: MouseEvent | TouchEvent };
nodecontextmenu: { node: Node; event: MouseEvent | TouchEvent };
nodedrag: { targetNode: Node | null; nodes: Node[]; event: MouseEvent | TouchEvent };
nodedragstart: { targetNode: Node | null; nodes: Node[]; event: MouseEvent | TouchEvent };
nodedragstop: { targetNode: Node | null; nodes: Node[]; event: MouseEvent | TouchEvent };
nodemouseenter: { node: Node; event: MouseEvent | TouchEvent };
nodemouseleave: { node: Node; event: MouseEvent | TouchEvent };
nodemousemove: { node: Node; event: MouseEvent | TouchEvent };
}>();