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:
@@ -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 })
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user