diff --git a/README.md b/README.md index 4d8ae2e9..ee0ee812 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,7 @@ const BasicFlow = () => ; - `onMoveStart()`: called when user starts panning or zooming - `onMoveEnd()`: called when user ends panning or zooming - `onSelectionChange(elements: Elements)`: called when user selects one or multiple elements +- `onZoomPaneClick()`: called when user clicks directly on the canvas #### Interaction - `nodesDraggable`: default: `true`. This applies to all nodes. You can also change the behavior of a specific node with the `draggable` node option. diff --git a/example/src/Interaction/index.js b/example/src/Interaction/index.js index 99027f31..54dd1882 100644 --- a/example/src/Interaction/index.js +++ b/example/src/Interaction/index.js @@ -14,6 +14,7 @@ const initialElements = [ const onNodeDragStart = (node) => console.log('drag start', node); const onNodeDragStop = (node) => console.log('drag stop', node); const onElementClick = (element) => console.log('click', element); +const onZoomPaneClick = () => console.log('onZoomPaneClick'); const InteractionFlow = () => { const [elements, setElements] = useState(initialElements); @@ -25,6 +26,7 @@ const InteractionFlow = () => { const [zoomOnScroll, setZoomOnScroll] = useState(false); const [zoomOnDoubleClick, setZoomOnDoubleClick] = useState(false); const [paneMoveable, setPaneMoveable] = useState(true); + const [captureZoomClick, setCaptureZoomClick] = useState(false); return ( { onNodeDragStart={onNodeDragStart} onNodeDragStop={onNodeDragStop} paneMoveable={paneMoveable} + onZoomPaneClick={captureZoomClick ? onZoomPaneClick : undefined} > @@ -116,6 +119,18 @@ const InteractionFlow = () => { /> +
+ +
); diff --git a/src/container/GraphView/index.tsx b/src/container/GraphView/index.tsx index 2b509c31..d252556d 100644 --- a/src/container/GraphView/index.tsx +++ b/src/container/GraphView/index.tsx @@ -39,6 +39,7 @@ export interface GraphViewProps { onMove?: (flowTransform?: FlowTransform) => void; onMoveStart?: (flowTransform?: FlowTransform) => void; onMoveEnd?: (flowTransform?: FlowTransform) => void; + onZoomPaneClick?: () => void; selectionKeyCode: number; nodeTypes: NodeTypesType; edgeTypes: EdgeTypesType; @@ -100,6 +101,7 @@ const GraphView = ({ zoomOnScroll, zoomOnDoubleClick, paneMoveable, + onZoomPaneClick, }: GraphViewProps) => { const zoomPane = useRef(null); const rendererNode = useRef(null); @@ -121,7 +123,10 @@ const GraphView = ({ const selectionKeyPressed = useKeyPress(selectionKeyCode); - const onZoomPaneClick = () => setNodesSelection({ isActive: false }); + const handleZoomPaneClick = () => { + onZoomPaneClick?.(); + setNodesSelection({ isActive: false }); + }; const updateDimensions = () => { if (!rendererNode.current) { @@ -254,7 +259,7 @@ const GraphView = ({ /> {nodesSelectionActive && } -
+
); }; diff --git a/src/container/ReactFlow/index.tsx b/src/container/ReactFlow/index.tsx index 55bdf12d..8ff5384c 100644 --- a/src/container/ReactFlow/index.tsx +++ b/src/container/ReactFlow/index.tsx @@ -47,6 +47,7 @@ export interface ReactFlowProps extends Omit, 'on onMoveStart?: (flowTransform?: FlowTransform) => void; onMoveEnd?: (flowTransform?: FlowTransform) => void; onSelectionChange?: (elements: Elements | null) => void; + onZoomPaneClick?: () => void; nodeTypes: NodeTypesType; edgeTypes: EdgeTypesType; connectionLineType: ConnectionLineType; @@ -112,6 +113,7 @@ const ReactFlow = ({ zoomOnScroll, zoomOnDoubleClick, paneMoveable, + onZoomPaneClick, }: ReactFlowProps) => { const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), []); const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), []); @@ -157,6 +159,7 @@ const ReactFlow = ({ zoomOnScroll={zoomOnScroll} zoomOnDoubleClick={zoomOnDoubleClick} paneMoveable={paneMoveable} + onZoomPaneClick={onZoomPaneClick} /> {onSelectionChange && } {children}