Skip to content

Commit 9d14595

Browse files
committed
fix(core): emit node click if drag was aborted (#1525)
* fix(core): emit node click if drag was aborted * chore(changeset): add * chore(core): cleanup
1 parent 0a0dfe9 commit 9d14595

File tree

3 files changed

+28
-14
lines changed

3 files changed

+28
-14
lines changed

.changeset/giant-pears-agree.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@vue-flow/core": patch
3+
---
4+
5+
Prevent duplicate node click event by checking if drag was actually aborted before emitting node-click

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,17 @@ const NodeWrapper = defineComponent({
120120
disabled: () => !isDraggable.value,
121121
selectable: isSelectable,
122122
dragHandle: () => node.dragHandle,
123-
onStart(args) {
124-
emit.dragStart(args)
123+
onStart(event) {
124+
emit.dragStart(event)
125125
},
126-
onDrag(args) {
127-
emit.drag(args)
126+
onDrag(event) {
127+
emit.drag(event)
128128
},
129-
onStop(args) {
130-
emit.dragStop(args)
129+
onStop(event) {
130+
emit.dragStop(event)
131+
},
132+
onClick(event) {
133+
emit.click({ node, event })
131134
},
132135
})
133136

packages/core/src/composables/useDrag.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ import { useGetPointerPosition, useVueFlow } from '.'
1818
export type UseDragEvent = D3DragEvent<HTMLDivElement, null, SubjectPosition>
1919

2020
interface UseDragParams {
21-
onStart: (args: Omit<NodeDragEvent, 'intersections'>) => void
22-
onDrag: (event: Omit<NodeDragEvent, 'intersections'>) => void
23-
onStop: (event: Omit<NodeDragEvent, 'intersections'>) => void
21+
onStart: (event: NodeDragEvent) => void
22+
onDrag: (event: NodeDragEvent) => void
23+
onStop: (event: NodeDragEvent) => void
24+
onClick?: (event: MouseEvent) => void
2425
el: Ref<Element | null>
2526
disabled?: MaybeRefOrGetter<boolean>
2627
selectable?: MaybeRefOrGetter<boolean>
@@ -57,7 +58,7 @@ export function useDrag(params: UseDragParams) {
5758
emits,
5859
} = useVueFlow()
5960

60-
const { onStart, onDrag, onStop, el, disabled, id, selectable, dragHandle } = params
61+
const { onStart, onDrag, onStop, onClick, el, disabled, id, selectable, dragHandle } = params
6162

6263
const dragging = ref(false)
6364

@@ -71,6 +72,7 @@ export function useDrag(params: UseDragParams) {
7172
let mousePosition: XYPosition = { x: 0, y: 0 }
7273
let dragEvent: MouseEvent | null = null
7374
let dragStarted = false
75+
let dragAborted = false
7476

7577
let autoPanId = 0
7678
let autoPanStarted = false
@@ -223,15 +225,17 @@ export function useDrag(params: UseDragParams) {
223225
mousePosition = getEventPosition(event.sourceEvent, containerBounds!)
224226

225227
updateNodes(pointerPos)
228+
} else {
229+
dragAborted = true
226230
}
227231
}
228232

229233
const eventEnd = (event: UseDragEvent) => {
230234
if (!dragStarted) {
231-
const node = findNode(id)
232-
233-
if (node) {
234-
emits.nodeClick({ node, event: event.sourceEvent })
235+
// if the node was dragged without any movement, and we're not dragging a selection, we want to emit the node-click event
236+
if (dragAborted && onClick) {
237+
onClick?.(event.sourceEvent)
238+
dragAborted = false
235239
}
236240

237241
return
@@ -240,6 +244,8 @@ export function useDrag(params: UseDragParams) {
240244
dragging.value = false
241245
autoPanStarted = false
242246
dragStarted = false
247+
dragAborted = false
248+
243249
cancelAnimationFrame(autoPanId)
244250

245251
if (dragItems.length) {

0 commit comments

Comments
 (0)