Skip to content

Commit 20a56df

Browse files
committed
refactor(core): align node type(s) with xyflow system
Signed-off-by: braks <78412429+bcakmakoglu@users.noreply.github.com>
1 parent d465d1b commit 20a56df

File tree

14 files changed

+99
-242
lines changed

14 files changed

+99
-242
lines changed

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
"@vueuse/core": "^10.5.0",
7474
"d3-drag": "^3.0.0",
7575
"d3-selection": "^3.0.0",
76-
"@xyflow/system": "^0.0.37"
76+
"@xyflow/system": "^0.0.73"
7777
},
7878
"devDependencies": {
7979
"@rollup/plugin-replace": "^5.0.3",

packages/core/src/components/Nodes/NodeWrapper.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ const NodeWrapper = defineComponent({
9292
return slot
9393
}
9494

95-
let nodeType = node.template || getNodeTypes.value[name]
95+
let nodeType = getNodeTypes.value[name]
9696

9797
if (typeof nodeType === 'string') {
9898
if (instance) {
@@ -112,7 +112,7 @@ const NodeWrapper = defineComponent({
112112
return false
113113
})
114114

115-
const { emit, on } = useNodeHooks(node, emits)
115+
const { emit } = useNodeHooks(emits)
116116

117117
const dragging = useDrag({
118118
id: props.id,
@@ -139,15 +139,15 @@ const NodeWrapper = defineComponent({
139139
const getStyle = computed(() => {
140140
const styles = (node.style instanceof Function ? node.style(node) : node.style) || {}
141141

142-
const width = node.width instanceof Function ? node.width(node) : node.width
143-
const height = node.height instanceof Function ? node.height(node) : node.height
142+
const width = node.width
143+
const height = node.height
144144

145145
if (width) {
146-
styles.width = typeof width === 'string' ? width : `${width}px`
146+
styles.width = `${width}px`
147147
}
148148

149149
if (height) {
150-
styles.height = typeof height === 'string' ? height : `${height}px`
150+
styles.height = `${height}px`
151151
}
152152

153153
return styles
@@ -228,7 +228,7 @@ const NodeWrapper = defineComponent({
228228
// if extent is parent, we need dimensions to properly clamp the position
229229
if (
230230
node.extent === 'parent' ||
231-
(typeof node.extent === 'object' && 'range' in node.extent && node.extent.range === 'parent')
231+
(!!node.extent && typeof node.extent === 'object' && 'range' in node.extent && node.extent.range === 'parent')
232232
) {
233233
until(() => isInit)
234234
.toBe(true)
@@ -286,21 +286,17 @@ const NodeWrapper = defineComponent({
286286
id: node.id,
287287
type: node.type,
288288
data: node.data,
289-
events: { ...node.events, ...on },
290289
selected: node.selected,
291290
resizing: node.resizing,
292291
dragging: dragging.value,
293292
connectable: isConnectable.value,
294293
position: node.computedPosition,
295294
dimensions: node.dimensions,
296-
isValidTargetPos: node.isValidTargetPos,
297-
isValidSourcePos: node.isValidSourcePos,
298295
parent: node.parentNode,
299296
parentNodeId: node.parentNode,
300297
zIndex: node.computedPosition.z ?? zIndex.value,
301298
targetPosition: node.targetPosition,
302299
sourcePosition: node.sourcePosition,
303-
label: node.label,
304300
dragHandle: node.dragHandle,
305301
onUpdateNodeInternals: updateInternals,
306302
}),

packages/core/src/composables/useHandle.ts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,7 @@ export function useHandle({
7979
const doc = getHostForElement(event.target as HTMLElement)
8080

8181
if ((isMouseTriggered && event.button === 0) || !isMouseTriggered) {
82-
const node = findNode(toValue(nodeId))
83-
84-
let isValidConnectionHandler = toValue(isValidConnection) || isValidConnectionProp.value || alwaysValid
85-
86-
if (!isValidConnectionHandler && node) {
87-
isValidConnectionHandler = (!isTarget ? node.isValidTargetPos : node.isValidSourcePos) || alwaysValid
88-
}
82+
const isValidConnectionHandler = toValue(isValidConnection) || isValidConnectionProp.value || alwaysValid
8983

9084
let closestHandle: ConnectionHandle | null
9185

@@ -268,21 +262,15 @@ export function useHandle({
268262
return
269263
}
270264

271-
const isTarget = toValue(type) === 'target'
272-
273265
if (!connectionClickStartHandle.value) {
274266
emits.clickConnectStart({ event, nodeId: toValue(nodeId), handleId: toValue(handleId) })
275267

276268
startConnection({ nodeId: toValue(nodeId), type: toValue(type), handleId: toValue(handleId) }, undefined, true)
277269
} else {
278-
let isValidConnectionHandler = toValue(isValidConnection) || isValidConnectionProp.value || alwaysValid
270+
const isValidConnectionHandler = toValue(isValidConnection) || isValidConnectionProp.value || alwaysValid
279271

280272
const node = findNode(toValue(nodeId))
281273

282-
if (!isValidConnectionHandler && node) {
283-
isValidConnectionHandler = (!isTarget ? node.isValidTargetPos : node.isValidSourcePos) || alwaysValid
284-
}
285-
286274
if (node && (typeof node.connectable === 'undefined' ? nodesConnectable.value : node.connectable) === false) {
287275
return
288276
}

packages/core/src/composables/useNode.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { computed, inject, ref } from 'vue'
2-
import type { CustomEvent, ElementData } from '../types'
2+
import type { GraphNode, Node } from '../types'
33
import { ErrorCode, VueFlowError, getConnectedEdges } from '../utils'
44
import { NodeRef } from '../context'
55
import { useVueFlow } from './useVueFlow'
@@ -16,13 +16,13 @@ import { useNodeId } from './useNodeId'
1616
* @param id - The id of the node to access
1717
* @returns the node id, the node, the node dom element, it's parent and connected edges
1818
*/
19-
export function useNode<Data = ElementData, CustomEvents extends Record<string, CustomEvent> = any>(id?: string) {
19+
export function useNode<NodeType extends Node = Node>(id?: string) {
2020
const nodeId = id ?? useNodeId() ?? ''
2121
const nodeEl = inject(NodeRef, ref(null))
2222

2323
const { findNode, edges, emits } = useVueFlow()
2424

25-
const node = findNode<Data, CustomEvents>(nodeId)!
25+
const node = findNode(nodeId)! as GraphNode<NodeType>
2626

2727
if (!node) {
2828
emits.error(new VueFlowError(ErrorCode.NODE_NOT_FOUND, nodeId))

packages/core/src/composables/useNodeHooks.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { GraphNode, NodeEventsEmit, NodeEventsOn, VueFlowStore } from '../types'
1+
import type { NodeEventsEmit, NodeEventsOn, VueFlowStore } from '../types'
22
import { createExtendedEventHook } from '../utils'
33

44
function createNodeHooks() {
@@ -20,52 +20,43 @@ function createNodeHooks() {
2020
*
2121
* @internal
2222
*/
23-
export function useNodeHooks(node: GraphNode, emits: VueFlowStore['emits']): { emit: NodeEventsEmit; on: NodeEventsOn } {
23+
export function useNodeHooks(emits: VueFlowStore['emits']): { emit: NodeEventsEmit; on: NodeEventsOn } {
2424
const nodeHooks = createNodeHooks()
2525

2626
nodeHooks.doubleClick.on((event) => {
2727
emits.nodeDoubleClick(event)
28-
node.events?.doubleClick?.(event)
2928
})
3029

3130
nodeHooks.click.on((event) => {
3231
emits.nodeClick(event)
33-
node.events?.click?.(event)
3432
})
3533

3634
nodeHooks.mouseEnter.on((event) => {
3735
emits.nodeMouseEnter(event)
38-
node.events?.mouseEnter?.(event)
3936
})
4037

4138
nodeHooks.mouseMove.on((event) => {
4239
emits.nodeMouseMove(event)
43-
node.events?.mouseMove?.(event)
4440
})
4541

4642
nodeHooks.mouseLeave.on((event) => {
4743
emits.nodeMouseLeave(event)
48-
node.events?.mouseLeave?.(event)
4944
})
5045

5146
nodeHooks.contextMenu.on((event) => {
5247
emits.nodeContextMenu(event)
53-
node.events?.contextMenu?.(event)
5448
})
5549

5650
nodeHooks.dragStart.on((event) => {
5751
emits.nodeDragStart(event)
58-
node.events?.dragStart?.(event)
5952
})
6053

6154
nodeHooks.drag.on((event) => {
6255
emits.nodeDrag(event)
63-
node.events?.drag?.(event)
6456
})
6557

6658
nodeHooks.dragStop.on((event) => {
6759
emits.nodeDragStop(event)
68-
node.events?.dragStop?.(event)
6960
})
7061

7162
return Object.entries(nodeHooks).reduce(

packages/core/src/store/actions.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ export function useActions(state: State, nodeLookup: ComputedRef<NodeLookup>, ed
528528
}
529529

530530
// todo: maybe we should use a more immutable approach, this is a bit too much mutation and hard to maintain
531-
const updateNode: Actions['updateNode'] = (id, nodeUpdate, options = { replace: false }) => {
531+
const updateNode: Actions['updateNode'] = <NodeType extends Node = Node>(id, nodeUpdate, options = { replace: false }) => {
532532
const node = findNode(id)
533533

534534
if (!node) {
@@ -538,7 +538,7 @@ export function useActions(state: State, nodeLookup: ComputedRef<NodeLookup>, ed
538538
const nextNode = typeof nodeUpdate === 'function' ? nodeUpdate(node) : nodeUpdate
539539

540540
if (options.replace) {
541-
state.nodes.splice(state.nodes.indexOf(node), 1, nextNode as GraphNode)
541+
state.nodes.splice(state.nodes.indexOf(node), 1, nextNode as GraphNode<NodeType>)
542542
} else {
543543
Object.assign(node, nextNode)
544544
}
@@ -722,7 +722,6 @@ export function useActions(state: State, nodeLookup: ComputedRef<NodeLookup>, ed
722722
isParent: _____,
723723
resizing: ______,
724724
dragging: _______,
725-
events: _________,
726725
...rest
727726
} = node
728727

packages/core/src/types/edge.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { CSSProperties, Component, VNode } from 'vue'
2-
import type { ClassFunc, ElementData, Position, StyleFunc, Styles } from './flow'
2+
import type { ElementData, Position, Styles } from './flow'
33
import type { GraphNode } from './node'
44
import type { EdgeComponent, EdgeTextProps } from './components'
55
import type { CustomEvent, EdgeEventsHandler, EdgeEventsOn } from './hooks'
@@ -92,9 +92,9 @@ export interface DefaultEdge<
9292
/** Disable/enable deleting edge */
9393
deletable?: boolean
9494
/** Additional class names, can be a string or a callback returning a string (receives current flow element) */
95-
class?: string | string[] | Record<string, any> | ClassFunc<GraphEdge<Data, CustomEvents>>
95+
class?: string | string[] | Record<string, any>
9696
/** Additional styles, can be an object or a callback returning an object (receives current flow element) */
97-
style?: Styles | StyleFunc<GraphEdge<Data, CustomEvents>>
97+
style?: Styles
9898
/** Is edge hidden */
9999
hidden?: boolean
100100
/** Radius of mouse event triggers (to ease selecting edges), defaults to 2 */

packages/core/src/types/flow.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,6 @@ export type CSSVars =
7575

7676
export type ThemeVars = { [key in CSSVars]?: CSSProperties['color'] }
7777
export type Styles = CSSProperties & ThemeVars & CustomThemeVars
78-
/** @deprecated will be removed in the next major version */
79-
export type ClassFunc<ElementType extends FlowElement = FlowElement> = (element: ElementType) => string | void
80-
81-
/** @deprecated will be removed in the next major version */
82-
export type StyleFunc<ElementType extends FlowElement = FlowElement> = (element: ElementType) => Styles | void
8378

8479
/** Handle Positions */
8580
export enum Position {

packages/core/src/types/hooks.ts

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@ import type { EventHookOn, EventHookTrigger } from '@vueuse/core'
22
import type { Viewport } from '@xyflow/system'
33
import type { EventHookExtended, VueFlowError } from '../utils'
44
import type { GraphEdge } from './edge'
5-
import type { GraphNode } from './node'
5+
import type { GraphNode, Node } from './node'
66
import type { Connection, OnConnectStartParams } from './connection'
77
import type { EdgeChange, NodeChange } from './changes'
88
import type { VueFlowStore } from './store'
99

1010
export type MouseTouchEvent = MouseEvent | TouchEvent
1111

12-
export interface NodeMouseEvent {
12+
export interface NodeMouseEvent<NodeType extends Node = Node> {
1313
event: MouseTouchEvent
14-
node: GraphNode
14+
node: GraphNode<NodeType>
1515
}
1616

17-
export interface NodeDragEvent {
17+
export interface NodeDragEvent<NodeType extends Node = Node> {
1818
event: MouseTouchEvent
19-
node: GraphNode
20-
nodes: GraphNode[]
19+
node: GraphNode<NodeType>
20+
nodes: GraphNode<NodeType>[]
2121
}
2222

2323
export interface EdgeMouseEvent {
@@ -104,37 +104,31 @@ export type FlowHooksEmit = Readonly<{
104104
[key in keyof FlowEvents]: EventHookTrigger<FlowEvents[key]>
105105
}>
106106

107-
/**
108-
* To type `Args` (the event callback arguments) pass an array as argument list as first generic type
109-
* To type `Return` (the event callback return value) pass a value to the second generic type
110-
*/
111-
export type CustomEvent<Args extends any[] = any[], Return = any> = (...args: Args) => Return
112-
113-
type CustomEventHandlers<CustomEvents = object> = {
114-
[key in keyof CustomEvents]: CustomEvents[key]
107+
export interface NodeEventsHandler<NodeType extends Node = Node> {
108+
doubleClick: (event: NodeMouseEvent<NodeType>) => void | { off: () => void }
109+
click: (event: NodeMouseEvent<NodeType>) => void | { off: () => void }
110+
mouseEnter: (event: NodeMouseEvent<NodeType>) => void | { off: () => void }
111+
mouseMove: (event: NodeMouseEvent<NodeType>) => void | { off: () => void }
112+
mouseLeave: (event: NodeMouseEvent<NodeType>) => void | { off: () => void }
113+
contextMenu: (event: NodeMouseEvent<NodeType>) => void | { off: () => void }
114+
dragStart: (event: NodeDragEvent<NodeType>) => void | { off: () => void }
115+
drag: (event: NodeDragEvent<NodeType>) => void | { off: () => void }
116+
dragStop: (event: NodeDragEvent<NodeType>) => void | { off: () => void }
115117
}
116118

117-
export type NodeEventsHandler<CustomEvents = object> = {
118-
doubleClick: (event: NodeMouseEvent) => void | { off: () => void }
119-
click: (event: NodeMouseEvent) => void | { off: () => void }
120-
mouseEnter: (event: NodeMouseEvent) => void | { off: () => void }
121-
mouseMove: (event: NodeMouseEvent) => void | { off: () => void }
122-
mouseLeave: (event: NodeMouseEvent) => void | { off: () => void }
123-
contextMenu: (event: NodeMouseEvent) => void | { off: () => void }
124-
dragStart: (event: NodeDragEvent) => void | { off: () => void }
125-
drag: (event: NodeDragEvent) => void | { off: () => void }
126-
dragStop: (event: NodeDragEvent) => void | { off: () => void }
127-
} & CustomEventHandlers<CustomEvents>
128-
129-
export type NodeEventsOn<CustomEvents = object> = {
130-
[key in keyof NodeEventsHandler]: EventHookOn<NodeEventsHandler[key] extends (event: infer Event) => any ? Event : never>
131-
} & CustomEventHandlers<CustomEvents>
119+
export type NodeEventsOn<NodeType extends Node = Node> = {
120+
[key in keyof NodeEventsHandler<NodeType>]: EventHookOn<
121+
NodeEventsHandler<NodeType>[key] extends (event: infer Event) => any ? Event : never
122+
>
123+
}
132124

133-
export type NodeEventsEmit<CustomEvents = object> = {
134-
[key in keyof NodeEventsHandler]: EventHookTrigger<NodeEventsHandler[key] extends (event: infer Event) => any ? Event : never>
135-
} & CustomEventHandlers<CustomEvents>
125+
export type NodeEventsEmit<NodeType extends Node = Node> = {
126+
[key in keyof NodeEventsHandler<NodeType>]: EventHookTrigger<
127+
NodeEventsHandler<NodeType>[key] extends (event: infer Event) => any ? Event : never
128+
>
129+
}
136130

137-
export type EdgeEventsHandler<CustomEvents = object> = {
131+
export interface EdgeEventsHandler {
138132
doubleClick: (event: EdgeMouseEvent) => void | { off: () => void }
139133
click: (event: EdgeMouseEvent) => void | { off: () => void }
140134
mouseEnter: (event: EdgeMouseEvent) => void | { off: () => void }
@@ -144,12 +138,12 @@ export type EdgeEventsHandler<CustomEvents = object> = {
144138
updateStart: (event: EdgeMouseEvent) => void | { off: () => void }
145139
update: (event: EdgeUpdateEvent) => void | { off: () => void }
146140
updateEnd: (event: EdgeMouseEvent) => void | { off: () => void }
147-
} & CustomEventHandlers<CustomEvents>
141+
}
148142

149-
export type EdgeEventsOn<CustomEvents = object> = {
143+
export type EdgeEventsOn = {
150144
[key in keyof EdgeEventsHandler]: EventHookOn<EdgeEventsHandler[key] extends (event: infer Event) => any ? Event : never>
151-
} & CustomEventHandlers<CustomEvents>
145+
}
152146

153-
export type EdgeEventsEmit<CustomEvents = object> = {
147+
export type EdgeEventsEmit = {
154148
[key in keyof EdgeEventsHandler]: EventHookTrigger<EdgeEventsHandler[key] extends (event: infer Event) => any ? Event : never>
155-
} & CustomEventHandlers<CustomEvents>
149+
}

0 commit comments

Comments
 (0)