diff --git a/packages/vue-flow/src/components/Nodes/NodeWrapper.vue b/packages/vue-flow/src/components/Nodes/NodeWrapper.vue index ca216e1b..100dafd8 100644 --- a/packages/vue-flow/src/components/Nodes/NodeWrapper.vue +++ b/packages/vue-flow/src/components/Nodes/NodeWrapper.vue @@ -19,16 +19,14 @@ provide(NodeId, id) const { edges, viewport, - noDragClassName, noPanClassName, selectNodesOnDrag, - setState, - updateNodeDimensions, - getNode, - addSelectedNodes, + nodesSelectionActive, multiSelectionActive, + getNode, removeSelectedElements, - getSelectedNodes, + addSelectedNodes, + updateNodeDimensions, onUpdateNodeInternals, } = $(useVueFlow()) @@ -43,8 +41,6 @@ const dragging = useDrag({ id, el: nodeElement, disabled: computed(() => !draggable), - noDragClassName: $$(noDragClassName) as any, - handleSelector: node.dragHandle, onStart(event, node, nodes) { emit.dragStart({ event, node, nodes }) }, @@ -154,7 +150,7 @@ const onDoubleClick = (event: MouseEvent) => { const onSelectNode = (event: MouseEvent) => { if (selectable && (!selectNodesOnDrag || !draggable)) { - handleNodeClick(node, multiSelectionActive, addSelectedNodes, removeSelectedElements, setState) + handleNodeClick(node, multiSelectionActive, addSelectedNodes, removeSelectedElements, $$(nodesSelectionActive)) } emit.click({ event, node, connectedEdges: getConnectedEdges([node], edges) }) } diff --git a/packages/vue-flow/src/composables/useDrag.ts b/packages/vue-flow/src/composables/useDrag.ts index 9f5e9c98..2b4865d5 100644 --- a/packages/vue-flow/src/composables/useDrag.ts +++ b/packages/vue-flow/src/composables/useDrag.ts @@ -5,7 +5,7 @@ import type { Ref } from 'vue' import type { MaybeRef } from '@vueuse/core' import useVueFlow from './useVueFlow' import { handleNodeClick, pointToRendererPoint } from '~/utils' -import type { NodeDragEvent, NodeDragItem, XYPosition } from '~/types' +import type { NodeDragEvent, NodeDragItem, SnapGrid, XYPosition } from '~/types' import { getDragItems, getEventHandlerParams, hasSelector, updatePosition } from '~/utils/drag' export type UseDragEvent = D3DragEvent @@ -16,8 +16,6 @@ interface UseDragParams { onStop: (event: NodeDragEvent['event'], currentNode: NodeDragEvent['node'], nodes: NodeDragEvent['nodes']) => void el: Ref disabled?: MaybeRef - noDragClassName?: MaybeRef - handleSelector?: string id?: string } @@ -27,26 +25,29 @@ function useDrag(params: UseDragParams) { const { viewport, snapToGrid, - snapGrid, + snapGrid: globalSnapGrid, + noDragClassName, nodes, nodeExtent, getNode, multiSelectionActive, + nodesSelectionActive, selectNodesOnDrag, removeSelectedElements, addSelectedNodes, - setState, updateNodePositions, } = $(useVueFlow()) - const { onStart, onDrag, onStop, el, disabled = false, noDragClassName, id, handleSelector } = $(params) + const { onStart, onDrag, onStop, el, disabled = false, id } = $(params) const dragging = ref(false) let dragItems = $ref() let lastPos = $ref>({ x: undefined, y: undefined }) let dragHandler = $ref() - const getMousePosition = (event: UseDragEvent) => { + const hasSnapGrid = (sg?: SnapGrid) => (sg ?? snapToGrid ? globalSnapGrid : undefined) + + const getMousePosition = (event: UseDragEvent, snapGrid: SnapGrid) => { const x = event.sourceEvent.touches ? event.sourceEvent.touches[0].clientX : event.sourceEvent.clientX const y = event.sourceEvent.touches ? event.sourceEvent.touches[0].clientY : event.sourceEvent.clientY @@ -56,13 +57,13 @@ function useDrag(params: UseDragParams) { y, }, viewport, - snapToGrid, - snapGrid, + !!snapGrid ?? snapToGrid, + snapGrid ?? globalSnapGrid, ) } watch( - [() => disabled, () => noDragClassName, () => id, () => el], + [() => disabled, () => el], () => { if (el) { const selection = select(el) @@ -80,10 +81,10 @@ function useDrag(params: UseDragParams) { } if (node && !disabled && selectNodesOnDrag) { - handleNodeClick(node, multiSelectionActive, addSelectedNodes, removeSelectedElements, setState) + handleNodeClick(node, multiSelectionActive, addSelectedNodes, removeSelectedElements, $$(nodesSelectionActive)) } - const mousePos = getMousePosition(event) + const mousePos = getMousePosition(event, hasSnapGrid(node?.snapGrid) as SnapGrid) dragItems = getDragItems(nodes, mousePos, getNode, id) if (onStart && dragItems) { @@ -96,7 +97,7 @@ function useDrag(params: UseDragParams) { } }) .on('drag', (event: UseDragEvent) => { - const mousePos = getMousePosition(event) + const mousePos = getMousePosition(event, hasSnapGrid(node?.snapGrid) as SnapGrid) // skip events without movement if ((lastPos.x !== mousePos.x || lastPos.y !== mousePos.y) && dragItems) { @@ -138,7 +139,7 @@ function useDrag(params: UseDragParams) { !event.button && (!noDragClassName || (!hasSelector(target, `.${noDragClassName}`, $$(el)) && - (!handleSelector || hasSelector(target, handleSelector, $$(el))))) + (!node?.dragHandle || hasSelector(target, node.dragHandle, $$(el))))) ) }) diff --git a/packages/vue-flow/src/container/NodeRenderer/NodeRenderer.vue b/packages/vue-flow/src/container/NodeRenderer/NodeRenderer.vue index 2a88d0ee..29957380 100644 --- a/packages/vue-flow/src/container/NodeRenderer/NodeRenderer.vue +++ b/packages/vue-flow/src/container/NodeRenderer/NodeRenderer.vue @@ -21,7 +21,6 @@ const { const draggable = (d?: boolean) => (typeof d === 'undefined' ? nodesDraggable : d) const selectable = (s?: boolean) => (typeof s === 'undefined' ? elementsSelectable : s) const connectable = (c?: boolean) => (typeof c === 'undefined' ? nodesConnectable : c) -const hasSnapGrid = (sg?: SnapGrid) => (sg ?? snapToGrid ? snapGrid : undefined) const getType = (type?: string, template?: GraphNode['template']) => { const name = type || 'default' @@ -65,7 +64,6 @@ export default { :draggable="draggable(node.draggable)" :selectable="selectable(node.selectable)" :connectable="connectable(node.connectable)" - :snap-grid="hasSnapGrid(node.snapGrid)" /> diff --git a/packages/vue-flow/src/utils/node.ts b/packages/vue-flow/src/utils/node.ts index 8d11b158..e7e55b47 100644 --- a/packages/vue-flow/src/utils/node.ts +++ b/packages/vue-flow/src/utils/node.ts @@ -1,5 +1,6 @@ import { getDimensions } from './graph' import type { Actions, GraphNode, HandleElement, Position } from '~/types' +import { Ref } from "vue"; export const getHandleBoundsByHandleType = ( selector: string, @@ -43,9 +44,9 @@ export const handleNodeClick = ( multiSelectionActive: boolean, addSelectedNodes: Actions['addSelectedNodes'], removeSelectedElements: Actions['removeSelectedElements'], - setState: Actions['setState'], + nodesSelectionActive: Ref, ) => { - setState({ nodesSelectionActive: false }) + nodesSelectionActive.value = false if (!node.selected) { addSelectedNodes([node])