diff --git a/README.md b/README.md index 4d8ae2e9..e2ca976a 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 +- `onPaneClick()`: 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..96d8d734 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 onPaneClick = () => console.log('onPaneClick'); 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} + onPaneClick={captureZoomClick ? onPaneClick : undefined} > @@ -116,6 +119,18 @@ const InteractionFlow = () => { /> +
+ +
); diff --git a/src/container/GraphView/index.tsx b/src/container/GraphView/index.tsx index 2b509c31..1d598c71 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; + onPaneClick?: () => void; selectionKeyCode: number; nodeTypes: NodeTypesType; edgeTypes: EdgeTypesType; @@ -100,6 +101,7 @@ const GraphView = ({ zoomOnScroll, zoomOnDoubleClick, paneMoveable, + onPaneClick, }: 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 onZoomPaneClick = () => { + onPaneClick?.(); + setNodesSelection({ isActive: false }); + }; const updateDimensions = () => { if (!rendererNode.current) { diff --git a/src/container/ReactFlow/index.tsx b/src/container/ReactFlow/index.tsx index 55bdf12d..44882aa7 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; + onPaneClick?: () => void; nodeTypes: NodeTypesType; edgeTypes: EdgeTypesType; connectionLineType: ConnectionLineType; @@ -112,6 +113,7 @@ const ReactFlow = ({ zoomOnScroll, zoomOnDoubleClick, paneMoveable, + onPaneClick, }: ReactFlowProps) => { const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), []); const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), []); @@ -157,6 +159,7 @@ const ReactFlow = ({ zoomOnScroll={zoomOnScroll} zoomOnDoubleClick={zoomOnDoubleClick} paneMoveable={paneMoveable} + onPaneClick={onPaneClick} /> {onSelectionChange && } {children}