feat(nodes): add connected edges to node mouse events
# What's changed? * Add `NodeMouseEvent` interface * Add `EdgeMouseEvent` interface * Add `connectedEdges` to node mouse events
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import type { GraphNode, MiniMapNodeFunc, ShapeRendering } from '../../types'
|
import type { GraphNode, MiniMapNodeFunc, ShapeRendering } from '../../types'
|
||||||
import { useVueFlow, useWindow } from '../../composables'
|
import { useVueFlow, useWindow } from '../../composables'
|
||||||
import { getBoundsofRects, getRectOfNodes } from '../../utils'
|
import { getBoundsofRects, getConnectedEdges, getRectOfNodes } from '../../utils'
|
||||||
import type { MiniMapProps } from '../../types/components'
|
import type { MiniMapProps } from '../../types/components'
|
||||||
import MiniMapNode from './MiniMapNode'
|
import MiniMapNode from './MiniMapNode'
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ const window = useWindow()
|
|||||||
const defaultWidth = 200
|
const defaultWidth = 200
|
||||||
const defaultHeight = 150
|
const defaultHeight = 150
|
||||||
|
|
||||||
const { viewport, dimensions, hooks, getNodes } = $(useVueFlow())
|
const { edges, viewport, dimensions, hooks, getNodes } = $(useVueFlow())
|
||||||
|
|
||||||
const elementWidth = attrs.style?.width ?? defaultWidth
|
const elementWidth = attrs.style?.width ?? defaultWidth
|
||||||
|
|
||||||
@@ -83,11 +83,11 @@ const d = controlledComputed($$(viewBox), () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const onNodeClick = (event: MouseEvent, node: GraphNode) => {
|
const onNodeClick = (event: MouseEvent, node: GraphNode) => {
|
||||||
hooks.miniMapNodeClick.trigger({ event, node })
|
hooks.miniMapNodeClick.trigger({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
}
|
}
|
||||||
|
|
||||||
const onNodeDblClick = (event: MouseEvent, node: GraphNode) => {
|
const onNodeDblClick = (event: MouseEvent, node: GraphNode) => {
|
||||||
hooks.miniMapNodeDoubleClick.trigger({ event, node })
|
hooks.miniMapNodeDoubleClick.trigger({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -117,8 +117,8 @@ export default {
|
|||||||
:stroke-color="nodeStrokeColorFunc(node)"
|
:stroke-color="nodeStrokeColorFunc(node)"
|
||||||
:stroke-width="nodeStrokeWidth"
|
:stroke-width="nodeStrokeWidth"
|
||||||
:shape-rendering="shapeRendering"
|
:shape-rendering="shapeRendering"
|
||||||
@click="(e: MouseEvent) => onNodeClick(e, node)"
|
@click="onNodeClick($event, node)"
|
||||||
@dbl-click="(e: MouseEvent) => onNodeDblClick(e, node)"
|
@dblclick="onNodeDblClick($event, node)"
|
||||||
>
|
>
|
||||||
<slot
|
<slot
|
||||||
:id="node.id"
|
:id="node.id"
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ const MiniMapNode: FunctionalComponent<MiniMapNodeProps> = function (
|
|||||||
strokeWidth,
|
strokeWidth,
|
||||||
shapeRendering,
|
shapeRendering,
|
||||||
onClick: (e: MouseEvent) => emit('click', e),
|
onClick: (e: MouseEvent) => emit('click', e),
|
||||||
onDblClick: (e: MouseEvent) => emit('dbl-click', e),
|
onDblClick: (e: MouseEvent) => emit('dblclick', e),
|
||||||
}),
|
}),
|
||||||
slots?.default?.(),
|
slots?.default?.(),
|
||||||
]
|
]
|
||||||
@@ -39,6 +39,6 @@ const MiniMapNode: FunctionalComponent<MiniMapNodeProps> = function (
|
|||||||
MiniMapNode.props = ['position', 'dimensions', 'strokeWidth', 'strokeColor', 'borderRadius', 'color', 'shapeRendering']
|
MiniMapNode.props = ['position', 'dimensions', 'strokeWidth', 'strokeColor', 'borderRadius', 'color', 'shapeRendering']
|
||||||
|
|
||||||
// @todo add mouseover events
|
// @todo add mouseover events
|
||||||
MiniMapNode.emits = ['click', 'dbl-click']
|
MiniMapNode.emits = ['click', 'dblclick']
|
||||||
|
|
||||||
export default MiniMapNode
|
export default MiniMapNode
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import type { CSSProperties } from 'vue'
|
|||||||
import { useVueFlow } from '../../composables'
|
import { useVueFlow } from '../../composables'
|
||||||
import type { GraphNode, NodeComponent, SnapGrid } from '../../types'
|
import type { GraphNode, NodeComponent, SnapGrid } from '../../types'
|
||||||
import { NodeId } from '../../context'
|
import { NodeId } from '../../context'
|
||||||
import { getHandleBounds, getXYZPos } from '../../utils'
|
import { getConnectedEdges, getHandleBounds, getXYZPos } from '../../utils'
|
||||||
|
|
||||||
const { id, type, name, node, draggable, selectable, connectable, snapGrid } = defineProps<{
|
const { id, type, name, node, draggable, selectable, connectable, snapGrid } = defineProps<{
|
||||||
id: string
|
id: string
|
||||||
@@ -20,6 +20,7 @@ const { id, type, name, node, draggable, selectable, connectable, snapGrid } = d
|
|||||||
provide(NodeId, id)
|
provide(NodeId, id)
|
||||||
|
|
||||||
const {
|
const {
|
||||||
|
edges,
|
||||||
viewport,
|
viewport,
|
||||||
noDragClassName,
|
noDragClassName,
|
||||||
noPanClassName,
|
noPanClassName,
|
||||||
@@ -128,19 +129,19 @@ onUnmounted(() => {
|
|||||||
|
|
||||||
const onMouseEnter = (event: MouseEvent) => {
|
const onMouseEnter = (event: MouseEvent) => {
|
||||||
if (!node.dragging) {
|
if (!node.dragging) {
|
||||||
emits.nodeMouseEnter({ event, node })
|
emits.nodeMouseEnter({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onMouseMove = (event: MouseEvent) => {
|
const onMouseMove = (event: MouseEvent) => {
|
||||||
if (!node.dragging) {
|
if (!node.dragging) {
|
||||||
emits.nodeMouseMove({ event, node })
|
emits.nodeMouseMove({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const onMouseLeave = (event: MouseEvent) => {
|
const onMouseLeave = (event: MouseEvent) => {
|
||||||
if (!node.dragging) {
|
if (!node.dragging) {
|
||||||
emits.nodeMouseLeave({ event, node })
|
emits.nodeMouseLeave({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,10 +149,12 @@ const onContextMenu = (event: MouseEvent) => {
|
|||||||
emits.nodeContextMenu({
|
emits.nodeContextMenu({
|
||||||
event,
|
event,
|
||||||
node,
|
node,
|
||||||
|
connectedEdges: getConnectedEdges([node], edges),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const onDoubleClick = (event: MouseEvent) => emits.nodeDoubleClick({ event, node })
|
const onDoubleClick = (event: MouseEvent) =>
|
||||||
|
emits.nodeDoubleClick({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
|
|
||||||
const onSelectNode = (event: MouseEvent) => {
|
const onSelectNode = (event: MouseEvent) => {
|
||||||
if (!draggable) {
|
if (!draggable) {
|
||||||
@@ -162,13 +165,13 @@ const onSelectNode = (event: MouseEvent) => {
|
|||||||
|
|
||||||
if (!node.selected) addSelectedNodes([node])
|
if (!node.selected) addSelectedNodes([node])
|
||||||
}
|
}
|
||||||
emits.nodeClick({ event, node })
|
emits.nodeClick({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onDragStart(({ event }) => {
|
onDragStart(({ event }) => {
|
||||||
addSelectedNodes([])
|
addSelectedNodes([])
|
||||||
emits.nodeDragStart({ event, node })
|
emits.nodeDragStart({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
|
|
||||||
if (selectNodesOnDrag && selectable) {
|
if (selectNodesOnDrag && selectable) {
|
||||||
setState({
|
setState({
|
||||||
@@ -187,7 +190,7 @@ onDragStart(({ event }) => {
|
|||||||
|
|
||||||
onDrag(({ event, data: { deltaX, deltaY } }) => {
|
onDrag(({ event, data: { deltaX, deltaY } }) => {
|
||||||
updateNodePosition({ id: node.id, diff: { x: deltaX, y: deltaY }, dragging: true })
|
updateNodePosition({ id: node.id, diff: { x: deltaX, y: deltaY }, dragging: true })
|
||||||
emits.nodeDrag({ event, node })
|
emits.nodeDrag({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
})
|
})
|
||||||
|
|
||||||
onDragStop(({ event, data: { deltaX, deltaY } }) => {
|
onDragStop(({ event, data: { deltaX, deltaY } }) => {
|
||||||
@@ -197,11 +200,11 @@ onDragStop(({ event, data: { deltaX, deltaY } }) => {
|
|||||||
if (selectable && !selectNodesOnDrag && !node.selected) {
|
if (selectable && !selectNodesOnDrag && !node.selected) {
|
||||||
addSelectedNodes([node])
|
addSelectedNodes([node])
|
||||||
}
|
}
|
||||||
emits.nodeClick({ event, node })
|
emits.nodeClick({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
updateNodePosition({ id: node.id, diff: { x: deltaX, y: deltaY }, dragging: false })
|
updateNodePosition({ id: node.id, diff: { x: deltaX, y: deltaY }, dragging: false })
|
||||||
emits.nodeDragStop({ event, node })
|
emits.nodeDragStop({ event, node, connectedEdges: getConnectedEdges([node], edges) })
|
||||||
})
|
})
|
||||||
|
|
||||||
const getClass = computed(() => {
|
const getClass = computed(() => {
|
||||||
|
|||||||
@@ -8,20 +8,36 @@ import type { Connection, OnConnectStartParams } from './connection'
|
|||||||
import type { FlowTransform } from './zoom'
|
import type { FlowTransform } from './zoom'
|
||||||
import type { EdgeChange, NodeChange } from './changes'
|
import type { EdgeChange, NodeChange } from './changes'
|
||||||
|
|
||||||
|
export interface NodeMouseEvent {
|
||||||
|
event: MouseTouchEvent
|
||||||
|
node: GraphNode
|
||||||
|
connectedEdges: GraphEdge[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface EdgeMouseEvent {
|
||||||
|
event: MouseEvent
|
||||||
|
edge: GraphEdge
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface EdgeUpdateEvent {
|
||||||
|
edge: GraphEdge
|
||||||
|
connection: Connection
|
||||||
|
}
|
||||||
|
|
||||||
export interface FlowEvents {
|
export interface FlowEvents {
|
||||||
nodesChange: NodeChange[]
|
nodesChange: NodeChange[]
|
||||||
edgesChange: EdgeChange[]
|
edgesChange: EdgeChange[]
|
||||||
nodeDoubleClick: { event: MouseTouchEvent; node: GraphNode }
|
nodeDoubleClick: NodeMouseEvent
|
||||||
nodeClick: { event: MouseTouchEvent; node: GraphNode }
|
nodeClick: NodeMouseEvent
|
||||||
nodeMouseEnter: { event: MouseEvent; node: GraphNode }
|
nodeMouseEnter: NodeMouseEvent
|
||||||
nodeMouseMove: { event: MouseEvent; node: GraphNode }
|
nodeMouseMove: NodeMouseEvent
|
||||||
nodeMouseLeave: { event: MouseEvent; node: GraphNode }
|
nodeMouseLeave: NodeMouseEvent
|
||||||
nodeContextMenu: { event: MouseEvent; node: GraphNode }
|
nodeContextMenu: NodeMouseEvent
|
||||||
nodeDragStart: { event: MouseTouchEvent; node: GraphNode }
|
nodeDragStart: NodeMouseEvent
|
||||||
nodeDrag: { event: MouseTouchEvent; node: GraphNode }
|
nodeDrag: NodeMouseEvent
|
||||||
nodeDragStop: { event: MouseTouchEvent; node: GraphNode }
|
nodeDragStop: NodeMouseEvent
|
||||||
miniMapNodeClick: { event: MouseTouchEvent; node: GraphNode }
|
miniMapNodeClick: NodeMouseEvent
|
||||||
miniMapNodeDoubleClick: { event: MouseTouchEvent; node: GraphNode }
|
miniMapNodeDoubleClick: NodeMouseEvent
|
||||||
connect: Connection
|
connect: Connection
|
||||||
connectStart: {
|
connectStart: {
|
||||||
event: MouseEvent
|
event: MouseEvent
|
||||||
@@ -39,15 +55,15 @@ export interface FlowEvents {
|
|||||||
paneScroll: WheelEvent | undefined
|
paneScroll: WheelEvent | undefined
|
||||||
paneClick: MouseEvent
|
paneClick: MouseEvent
|
||||||
paneContextMenu: MouseEvent
|
paneContextMenu: MouseEvent
|
||||||
edgeContextMenu: { event: MouseEvent; edge: GraphEdge }
|
edgeContextMenu: EdgeMouseEvent
|
||||||
edgeMouseEnter: { event: MouseEvent; edge: GraphEdge }
|
edgeMouseEnter: EdgeMouseEvent
|
||||||
edgeMouseMove: { event: MouseEvent; edge: GraphEdge }
|
edgeMouseMove: EdgeMouseEvent
|
||||||
edgeMouseLeave: { event: MouseEvent; edge: GraphEdge }
|
edgeMouseLeave: EdgeMouseEvent
|
||||||
edgeDoubleClick: { event: MouseEvent; edge: GraphEdge }
|
edgeDoubleClick: EdgeMouseEvent
|
||||||
edgeClick: { event: MouseEvent; edge: GraphEdge }
|
edgeClick: EdgeMouseEvent
|
||||||
edgeUpdateStart: { event: MouseEvent; edge: GraphEdge }
|
edgeUpdateStart: EdgeMouseEvent
|
||||||
edgeUpdate: { edge: GraphEdge; connection: Connection }
|
edgeUpdate: EdgeUpdateEvent
|
||||||
edgeUpdateEnd: { event: MouseEvent; edge: GraphEdge }
|
edgeUpdateEnd: EdgeMouseEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
export type FlowHooks = Readonly<{
|
export type FlowHooks = Readonly<{
|
||||||
|
|||||||
Reference in New Issue
Block a user