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
This commit is contained in:
Braks
2024-07-09 00:42:51 +02:00
parent 0a0dfe96f1
commit 9d14595f1d
3 changed files with 28 additions and 14 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@vue-flow/core": patch
---
Prevent duplicate node click event by checking if drag was actually aborted before emitting node-click
@@ -120,14 +120,17 @@ const NodeWrapper = defineComponent({
disabled: () => !isDraggable.value, disabled: () => !isDraggable.value,
selectable: isSelectable, selectable: isSelectable,
dragHandle: () => node.dragHandle, dragHandle: () => node.dragHandle,
onStart(args) { onStart(event) {
emit.dragStart(args) emit.dragStart(event)
}, },
onDrag(args) { onDrag(event) {
emit.drag(args) emit.drag(event)
}, },
onStop(args) { onStop(event) {
emit.dragStop(args) emit.dragStop(event)
},
onClick(event) {
emit.click({ node, event })
}, },
}) })
+14 -8
View File
@@ -18,9 +18,10 @@ import { useGetPointerPosition, useVueFlow } from '.'
export type UseDragEvent = D3DragEvent<HTMLDivElement, null, SubjectPosition> export type UseDragEvent = D3DragEvent<HTMLDivElement, null, SubjectPosition>
interface UseDragParams { interface UseDragParams {
onStart: (args: Omit<NodeDragEvent, 'intersections'>) => void onStart: (event: NodeDragEvent) => void
onDrag: (event: Omit<NodeDragEvent, 'intersections'>) => void onDrag: (event: NodeDragEvent) => void
onStop: (event: Omit<NodeDragEvent, 'intersections'>) => void onStop: (event: NodeDragEvent) => void
onClick?: (event: MouseEvent) => void
el: Ref<Element | null> el: Ref<Element | null>
disabled?: MaybeRefOrGetter<boolean> disabled?: MaybeRefOrGetter<boolean>
selectable?: MaybeRefOrGetter<boolean> selectable?: MaybeRefOrGetter<boolean>
@@ -57,7 +58,7 @@ export function useDrag(params: UseDragParams) {
emits, emits,
} = useVueFlow() } = useVueFlow()
const { onStart, onDrag, onStop, el, disabled, id, selectable, dragHandle } = params const { onStart, onDrag, onStop, onClick, el, disabled, id, selectable, dragHandle } = params
const dragging = ref(false) const dragging = ref(false)
@@ -71,6 +72,7 @@ export function useDrag(params: UseDragParams) {
let mousePosition: XYPosition = { x: 0, y: 0 } let mousePosition: XYPosition = { x: 0, y: 0 }
let dragEvent: MouseEvent | null = null let dragEvent: MouseEvent | null = null
let dragStarted = false let dragStarted = false
let dragAborted = false
let autoPanId = 0 let autoPanId = 0
let autoPanStarted = false let autoPanStarted = false
@@ -223,15 +225,17 @@ export function useDrag(params: UseDragParams) {
mousePosition = getEventPosition(event.sourceEvent, containerBounds!) mousePosition = getEventPosition(event.sourceEvent, containerBounds!)
updateNodes(pointerPos) updateNodes(pointerPos)
} else {
dragAborted = true
} }
} }
const eventEnd = (event: UseDragEvent) => { const eventEnd = (event: UseDragEvent) => {
if (!dragStarted) { if (!dragStarted) {
const node = findNode(id) // if the node was dragged without any movement, and we're not dragging a selection, we want to emit the node-click event
if (dragAborted && onClick) {
if (node) { onClick?.(event.sourceEvent)
emits.nodeClick({ node, event: event.sourceEvent }) dragAborted = false
} }
return return
@@ -240,6 +244,8 @@ export function useDrag(params: UseDragParams) {
dragging.value = false dragging.value = false
autoPanStarted = false autoPanStarted = false
dragStarted = false dragStarted = false
dragAborted = false
cancelAnimationFrame(autoPanId) cancelAnimationFrame(autoPanId)
if (dragItems.length) { if (dragItems.length) {