Fire node drag events also when dragging selection

This commit is contained in:
peterkogo
2024-02-19 16:37:35 +01:00
parent 6eea7eb2ab
commit b15b7dbd6b
2 changed files with 32 additions and 18 deletions
+9 -2
View File
@@ -13,10 +13,13 @@ import {
OnNodeDrag, OnNodeDrag,
} from '@xyflow/react'; } from '@xyflow/react';
const onNodeDrag: OnNodeDrag = (_, node) => console.log('drag', node); const onNodeDrag: OnNodeDrag = (_, node: Node, nodes: Node[]) => console.log('drag', node, nodes);
const onNodeDragStop = (_: MouseEvent, node: Node) => console.log('drag stop', node); const onNodeDragStart = (_: MouseEvent, node: Node, nodes: Node[]) => console.log('drag start', node, nodes);
const onNodeDragStop = (_: MouseEvent, node: Node, nodes: Node[]) => console.log('drag stop', node, nodes);
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node); const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
const printSelectionEvent = (name: string) => (_: MouseEvent, nodes: Node[]) => console.log(name, nodes);
const initialNodes: Node[] = [ const initialNodes: Node[] = [
{ {
id: '1', id: '1',
@@ -113,7 +116,11 @@ const BasicFlow = () => {
defaultEdges={initialEdges} defaultEdges={initialEdges}
onNodeClick={onNodeClick} onNodeClick={onNodeClick}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
onNodeDragStart={onNodeDragStart}
onNodeDrag={onNodeDrag} onNodeDrag={onNodeDrag}
onSelectionDragStart={printSelectionEvent('selection drag start')}
onSelectionDrag={printSelectionEvent('selection drag')}
onSelectionDragStop={printSelectionEvent('selection drag stop')}
className="react-flow-basic-example" className="react-flow-basic-example"
minZoom={0.2} minZoom={0.2}
maxZoom={4} maxZoom={4}
+23 -16
View File
@@ -27,6 +27,7 @@ import type {
UpdateNodePositions, UpdateNodePositions,
Box, Box,
} from '../types'; } from '../types';
import { on } from 'events';
export type OnDrag = (event: MouseEvent, dragItems: NodeDragItem[], node: NodeBase, nodes: NodeBase[]) => void; export type OnDrag = (event: MouseEvent, dragItems: NodeDragItem[], node: NodeBase, nodes: NodeBase[]) => void;
@@ -171,16 +172,19 @@ export function XYDrag<OnNodeDrag extends (e: any, nodes: any, node: any) => voi
} }
updateNodePositions(dragItems, true); updateNodePositions(dragItems, true);
const onNodeOrSelectionDrag = nodeId ? onNodeDrag : wrapSelectionDragFunc(onSelectionDrag);
if (dragEvent && (onDrag || onNodeOrSelectionDrag)) { if (dragEvent) {
const [currentNode, currentNodes] = getEventHandlerParams({ const [currentNode, currentNodes] = getEventHandlerParams({
nodeId, nodeId,
dragItems, dragItems,
nodeLookup, nodeLookup,
}); });
onDrag?.(dragEvent as MouseEvent, dragItems, currentNode, currentNodes); onDrag?.(dragEvent as MouseEvent, dragItems, currentNode, currentNodes);
onNodeOrSelectionDrag?.(dragEvent as MouseEvent, currentNode, currentNodes); onNodeDrag?.(dragEvent as MouseEvent, currentNode, currentNodes);
if (!nodeId) {
const _onSelectionDrag = wrapSelectionDragFunc(onSelectionDrag);
_onSelectionDrag?.(dragEvent as MouseEvent, currentNode, currentNodes);
}
} }
} }
@@ -236,16 +240,18 @@ export function XYDrag<OnNodeDrag extends (e: any, nodes: any, node: any) => voi
lastPos = pointerPos; lastPos = pointerPos;
dragItems = getDragItems(nodes, nodesDraggable, pointerPos, nodeId); dragItems = getDragItems(nodes, nodesDraggable, pointerPos, nodeId);
const onNodeOrSelectionDragStart = nodeId ? onNodeDragStart : wrapSelectionDragFunc(onSelectionDragStart); if (dragItems.length > 0) {
if (dragItems.length > 0 && (onDragStart || onNodeOrSelectionDragStart)) {
const [currentNode, currentNodes] = getEventHandlerParams({ const [currentNode, currentNodes] = getEventHandlerParams({
nodeId, nodeId,
dragItems, dragItems,
nodeLookup, nodeLookup,
}); });
onDragStart?.(event.sourceEvent as MouseEvent, dragItems, currentNode, currentNodes); onDragStart?.(event.sourceEvent as MouseEvent, dragItems, currentNode, currentNodes);
onNodeOrSelectionDragStart?.(event.sourceEvent as MouseEvent, currentNode, currentNodes); onNodeDragStart?.(event.sourceEvent as MouseEvent, currentNode, currentNodes);
if (!nodeId) {
const _onSelectionDragStart = wrapSelectionDragFunc(onSelectionDragStart);
_onSelectionDragStart?.(event.sourceEvent as MouseEvent, currentNode, currentNodes);
}
} }
} }
@@ -300,18 +306,19 @@ export function XYDrag<OnNodeDrag extends (e: any, nodes: any, node: any) => voi
if (dragItems.length > 0) { if (dragItems.length > 0) {
const { nodeLookup, updateNodePositions, onNodeDragStop, onSelectionDragStop } = getStoreItems(); const { nodeLookup, updateNodePositions, onNodeDragStop, onSelectionDragStop } = getStoreItems();
const onNodeOrSelectionDragStop = nodeId ? onNodeDragStop : wrapSelectionDragFunc(onSelectionDragStop);
updateNodePositions(dragItems, false); updateNodePositions(dragItems, false);
if (onDragStop || onNodeOrSelectionDragStop) { const [currentNode, currentNodes] = getEventHandlerParams({
const [currentNode, currentNodes] = getEventHandlerParams({ nodeId,
nodeId, dragItems,
dragItems, nodeLookup,
nodeLookup, });
}); onDragStop?.(event.sourceEvent as MouseEvent, dragItems, currentNode, currentNodes);
onDragStop?.(event.sourceEvent as MouseEvent, dragItems, currentNode, currentNodes); onNodeDragStop?.(event.sourceEvent as MouseEvent, currentNode, currentNodes);
onNodeOrSelectionDragStop?.(event.sourceEvent as MouseEvent, currentNode, currentNodes); if (!nodeId) {
const _onSelectionDragStop = wrapSelectionDragFunc(onSelectionDragStop);
_onSelectionDragStop?.(event.sourceEvent as MouseEvent, currentNode, currentNodes);
} }
} }
}) })