feat(nodes): add useNodeHooks composable
# What's changed? * create node hooks for context and global event emitters
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { useDrag, useVueFlow } from '../../composables'
|
import { useDrag, useNodeHooks, useVueFlow } from '../../composables'
|
||||||
import type { NodeComponent, SnapGrid, XYZPosition } from '../../types'
|
import type { NodeComponent, SnapGrid, XYZPosition } from '../../types'
|
||||||
import { NodeId } from '../../context'
|
import { NodeId } from '../../context'
|
||||||
import { getConnectedEdges, getHandleBounds, getXYZPos, handleNodeClick } from '../../utils'
|
import { getConnectedEdges, getHandleBounds, getXYZPos, handleNodeClick } from '../../utils'
|
||||||
@@ -21,7 +21,6 @@ const {
|
|||||||
viewport,
|
viewport,
|
||||||
noDragClassName,
|
noDragClassName,
|
||||||
noPanClassName,
|
noPanClassName,
|
||||||
emits,
|
|
||||||
selectNodesOnDrag,
|
selectNodesOnDrag,
|
||||||
setState,
|
setState,
|
||||||
updateNodeDimensions,
|
updateNodeDimensions,
|
||||||
@@ -38,6 +37,8 @@ const parentNode = $computed(() => (node.parentNode ? getNode(node.parentNode) :
|
|||||||
|
|
||||||
const nodeElement = ref()
|
const nodeElement = ref()
|
||||||
|
|
||||||
|
const { emit, on } = useNodeHooks(node)
|
||||||
|
|
||||||
const dragging = useDrag({
|
const dragging = useDrag({
|
||||||
id,
|
id,
|
||||||
el: nodeElement,
|
el: nodeElement,
|
||||||
@@ -45,13 +46,13 @@ const dragging = useDrag({
|
|||||||
noDragClassName: $$(noDragClassName) as any,
|
noDragClassName: $$(noDragClassName) as any,
|
||||||
handleSelector: node.dragHandle,
|
handleSelector: node.dragHandle,
|
||||||
onStart(event, node, nodes) {
|
onStart(event, node, nodes) {
|
||||||
emits.nodeDragStart({ event, node, nodes })
|
emit.dragStart({ event, node, nodes })
|
||||||
},
|
},
|
||||||
onDrag(event, node, nodes) {
|
onDrag(event, node, nodes) {
|
||||||
emits.nodeDrag({ event, node, nodes })
|
emit.drag({ event, node, nodes })
|
||||||
},
|
},
|
||||||
onStop(event, node, nodes) {
|
onStop(event, node, nodes) {
|
||||||
emits.nodeDragStop({ event, node, nodes })
|
emit.dragStop({ event, node, nodes })
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -123,38 +124,39 @@ onMounted(() => {
|
|||||||
|
|
||||||
const onMouseEnter = (event: MouseEvent) => {
|
const onMouseEnter = (event: MouseEvent) => {
|
||||||
if (!dragging) {
|
if (!dragging) {
|
||||||
emits.nodeMouseEnter({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
emit.mouseEnter({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onMouseMove = (event: MouseEvent) => {
|
const onMouseMove = (event: MouseEvent) => {
|
||||||
if (!dragging) {
|
if (!dragging) {
|
||||||
emits.nodeMouseMove({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
emit.mouseMove({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onMouseLeave = (event: MouseEvent) => {
|
const onMouseLeave = (event: MouseEvent) => {
|
||||||
if (!dragging) {
|
if (!dragging) {
|
||||||
emits.nodeMouseLeave({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
emit.mouseLeave({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onContextMenu = (event: MouseEvent) => {
|
const onContextMenu = (event: MouseEvent) => {
|
||||||
emits.nodeContextMenu({
|
emit.contextMenu({
|
||||||
event,
|
event,
|
||||||
node,
|
node,
|
||||||
connectedEdges: getConnectedEdges([node], edges),
|
connectedEdges: getConnectedEdges([node], edges),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const onDoubleClick = (event: MouseEvent) =>
|
const onDoubleClick = (event: MouseEvent) => {
|
||||||
emits.nodeDoubleClick({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
emit.doubleClick({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
|
}
|
||||||
|
|
||||||
const onSelectNode = (event: MouseEvent) => {
|
const onSelectNode = (event: MouseEvent) => {
|
||||||
if (selectable && (!selectNodesOnDrag || !draggable)) {
|
if (selectable && (!selectNodesOnDrag || !draggable)) {
|
||||||
handleNodeClick(node, multiSelectionActive, addSelectedNodes, removeSelectedElements, setState)
|
handleNodeClick(node, multiSelectionActive, addSelectedNodes, removeSelectedElements, setState)
|
||||||
}
|
}
|
||||||
emits.nodeClick({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
emit.click({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
}
|
}
|
||||||
|
|
||||||
const getClass = computed(() => {
|
const getClass = computed(() => {
|
||||||
@@ -212,6 +214,7 @@ export default {
|
|||||||
:id="node.id"
|
:id="node.id"
|
||||||
:type="node.type"
|
:type="node.type"
|
||||||
:data="node.data"
|
:data="node.data"
|
||||||
|
:events="{ ...node.events, ...on }"
|
||||||
:selected="!!node.selected"
|
:selected="!!node.selected"
|
||||||
:connectable="connectable"
|
:connectable="connectable"
|
||||||
:position="node.position"
|
:position="node.position"
|
||||||
|
|||||||
@@ -4,3 +4,4 @@ export { default as useZoomPanHelper } from './useZoomPanHelper'
|
|||||||
export { default as useWindow } from './useWindow'
|
export { default as useWindow } from './useWindow'
|
||||||
export { default as useVueFlow } from './useVueFlow'
|
export { default as useVueFlow } from './useVueFlow'
|
||||||
export { default as useDrag } from './useDrag'
|
export { default as useDrag } from './useDrag'
|
||||||
|
export { default as useNodeHooks } from './useNodeHooks'
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
import useVueFlow from './useVueFlow'
|
||||||
|
import type { GraphNode, NodeEventsEmit, NodeEventsOn } from '~/types'
|
||||||
|
|
||||||
|
const createNodeHooks = () => ({
|
||||||
|
doubleClick: createEventHook(),
|
||||||
|
click: createEventHook(),
|
||||||
|
mouseEnter: createEventHook(),
|
||||||
|
mouseMove: createEventHook(),
|
||||||
|
mouseLeave: createEventHook(),
|
||||||
|
contextMenu: createEventHook(),
|
||||||
|
dragStart: createEventHook(),
|
||||||
|
drag: createEventHook(),
|
||||||
|
dragStop: createEventHook(),
|
||||||
|
})
|
||||||
|
|
||||||
|
export default function useNodeEvents(node: GraphNode): { emit: NodeEventsEmit; on: NodeEventsOn } {
|
||||||
|
const { emits } = $(useVueFlow())
|
||||||
|
|
||||||
|
const nodeHooks = createNodeHooks()
|
||||||
|
|
||||||
|
nodeHooks.doubleClick.on((event) => {
|
||||||
|
emits.nodeDoubleClick(event)
|
||||||
|
node.events?.doubleClick?.(event)
|
||||||
|
})
|
||||||
|
|
||||||
|
nodeHooks.click.on((event) => {
|
||||||
|
emits.nodeClick(event)
|
||||||
|
node.events?.click?.(event)
|
||||||
|
})
|
||||||
|
|
||||||
|
nodeHooks.mouseEnter.on((event) => {
|
||||||
|
emits.nodeMouseEnter(event)
|
||||||
|
node.events?.mouseEnter?.(event)
|
||||||
|
})
|
||||||
|
|
||||||
|
nodeHooks.mouseMove.on((event) => {
|
||||||
|
emits.nodeMouseMove(event)
|
||||||
|
node.events?.mouseMove?.(event)
|
||||||
|
})
|
||||||
|
|
||||||
|
nodeHooks.mouseLeave.on((event) => {
|
||||||
|
emits.nodeMouseLeave(event)
|
||||||
|
node.events?.mouseLeave?.(event)
|
||||||
|
})
|
||||||
|
|
||||||
|
nodeHooks.contextMenu.on((event) => {
|
||||||
|
emits.nodeContextMenu(event)
|
||||||
|
node.events?.contextMenu?.(event)
|
||||||
|
})
|
||||||
|
|
||||||
|
nodeHooks.dragStart.on((event) => {
|
||||||
|
emits.nodeDragStart(event)
|
||||||
|
node.events?.dragStart?.(event)
|
||||||
|
})
|
||||||
|
|
||||||
|
nodeHooks.drag.on((event) => {
|
||||||
|
emits.nodeDrag(event)
|
||||||
|
node.events?.drag?.(event)
|
||||||
|
})
|
||||||
|
|
||||||
|
nodeHooks.dragStop.on((event) => {
|
||||||
|
emits.nodeDragStop(event)
|
||||||
|
node.events?.dragStop?.(event)
|
||||||
|
})
|
||||||
|
|
||||||
|
return Object.entries(nodeHooks).reduce(
|
||||||
|
(hooks, [key, value]) => {
|
||||||
|
hooks.emit[key as keyof NodeEventsEmit] = value.trigger
|
||||||
|
hooks.on[key as keyof NodeEventsOn] = value.on
|
||||||
|
return hooks
|
||||||
|
},
|
||||||
|
{ emit: {} as NodeEventsEmit, on: {} as NodeEventsOn },
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user