diff --git a/README.md b/README.md index ec0f8c25..54bf69f1 100644 --- a/README.md +++ b/README.md @@ -79,10 +79,10 @@ const BasicFlow = () => ; - `onlyRenderVisibleNodes`: default: `true` #### Event Handlers -- `onElementClick(element: Node | Edge)`: called when user clicks node or edge click +- `onElementClick(evt: MouseEvent, element: Node | Edge)`: called when user clicks node or edge click - `onElementsRemove(elements: Elements)`: called when user removes node or edge -- `onNodeDragStart(node: Node)`: node drag start -- `onNodeDragStop(node: Node)`: node drag stop +- `onNodeDragStart(evt: MouseEvent, node: Node)`: node drag start +- `onNodeDragStop(evt: MouseEvent, node: Node)`: node drag stop - `onNodeMouseEnter(evt: MouseEvent, node: Node)`: node mouse enter - `onNodeMouseMove(evt: MouseEvent, node: Node)`: node mouse move - `onNodeMouseLeave(evt: MouseEvent, node: Node)`: node mouse leave @@ -95,7 +95,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 +- `onPaneClick(evt: MouseEvent)`: 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/Basic/index.js b/example/src/Basic/index.js index 2e386b24..0a9b6853 100644 --- a/example/src/Basic/index.js +++ b/example/src/Basic/index.js @@ -2,9 +2,9 @@ import React, { useState } from 'react'; import ReactFlow, { removeElements, addEdge, isNode, Background } from 'react-flow-renderer'; -const onNodeDragStop = (node) => console.log('drag stop', node); +const onNodeDragStop = (evt, node) => console.log('drag stop', node); const onLoad = (reactFlowInstance) => console.log('flow loaded:', reactFlowInstance); -const onElementClick = (element) => console.log('click', element); +const onElementClick = (evt, element) => console.log('click', element); const initialElements = [ { id: '1', type: 'input', data: { label: 'Node 1' }, position: { x: 250, y: 5 } }, diff --git a/example/src/CustomNode/index.js b/example/src/CustomNode/index.js index e5b11736..8d6072bb 100644 --- a/example/src/CustomNode/index.js +++ b/example/src/CustomNode/index.js @@ -4,8 +4,8 @@ import ReactFlow, { isEdge, removeElements, addEdge, MiniMap, Controls } from 'r import ColorSelectorNode from './ColorSelectorNode'; -const onNodeDragStop = (node) => console.log('drag stop', node); -const onElementClick = (element) => console.log('click', element); +const onNodeDragStop = (evt, node) => console.log('drag stop', node); +const onElementClick = (evt, element) => console.log('click', element); const onLoad = (reactFlowInstance) => console.log('flow loaded:', reactFlowInstance); const initBgColor = '#f0e742'; diff --git a/example/src/Edges/index.js b/example/src/Edges/index.js index 41040cd4..2265541e 100644 --- a/example/src/Edges/index.js +++ b/example/src/Edges/index.js @@ -4,8 +4,8 @@ import ReactFlow, { removeElements, addEdge, MiniMap, Controls, Background } fro import CustomEdge from './CustomEdge'; -const onNodeDragStop = (node) => console.log('drag stop', node); -const onElementClick = (element) => console.log('click', element); +const onNodeDragStop = (evt, node) => console.log('drag stop', node); +const onElementClick = (evt, element) => console.log('click', element); const onLoad = (reactFlowInstance) => reactFlowInstance.fitView(); const initialElements = [ diff --git a/example/src/Empty/index.js b/example/src/Empty/index.js index 07c6daa0..580fa8e0 100644 --- a/example/src/Empty/index.js +++ b/example/src/Empty/index.js @@ -2,9 +2,9 @@ import React, { useState } from 'react'; import ReactFlow, { removeElements, addEdge, MiniMap, Controls, Background } from 'react-flow-renderer'; -const onNodeDragStop = (node) => console.log('drag stop', node); +const onNodeDragStop = (evt, node) => console.log('drag stop', node); const onLoad = (reactFlowInstance) => console.log('flow loaded:', reactFlowInstance); -const onElementClick = (element) => console.log('click', element); +const onElementClick = (evt, element) => console.log('click', element); const EmptyFlow = () => { const [elements, setElements] = useState([]); diff --git a/example/src/Interaction/index.js b/example/src/Interaction/index.js index 96d8d734..6284bcd3 100644 --- a/example/src/Interaction/index.js +++ b/example/src/Interaction/index.js @@ -11,10 +11,10 @@ const initialElements = [ { id: 'e1-3', source: '1', target: '3' }, ]; -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 onNodeDragStart = (evt, node) => console.log('drag start', node); +const onNodeDragStop = (evt, node) => console.log('drag stop', node); +const onElementClick = (evt, element) => console.log('click', evt, element); +const onPaneClick = (evt) => console.log('onPaneClick', evt); const InteractionFlow = () => { const [elements, setElements] = useState(initialElements); diff --git a/example/src/Overview/index.js b/example/src/Overview/index.js index 8c311dce..7a52c2c5 100644 --- a/example/src/Overview/index.js +++ b/example/src/Overview/index.js @@ -2,9 +2,9 @@ import React, { useState } from 'react'; import ReactFlow, { removeElements, addEdge, MiniMap, Controls, Background, isNode } from 'react-flow-renderer'; -const onNodeDragStart = (node) => console.log('drag start', node); -const onNodeDragStop = (node) => console.log('drag stop', node); -const onElementClick = (element) => console.log(`${isNode(element) ? 'node' : 'edge'} click:`, element); +const onNodeDragStart = (evt, node) => console.log('drag start', node); +const onNodeDragStop = (evt, node) => console.log('drag stop', node); +const onElementClick = (evt, element) => console.log(`${isNode(element) ? 'node' : 'edge'} click:`, element); const onSelectionChange = (elements) => console.log('selection change', elements); const onLoad = (reactFlowInstance) => { console.log('flow loaded:', reactFlowInstance); diff --git a/example/src/Provider/index.js b/example/src/Provider/index.js index 77bee534..e9c88b9d 100644 --- a/example/src/Provider/index.js +++ b/example/src/Provider/index.js @@ -5,7 +5,7 @@ import Sidebar from './Sidebar'; import './provider.css'; -const onElementClick = (element) => console.log('click', element); +const onElementClick = (evt, element) => console.log('click', element); const initialElements = [ { id: '1', type: 'input', data: { label: 'Node 1' }, position: { x: 250, y: 5 } }, diff --git a/src/components/Edges/wrapEdge.tsx b/src/components/Edges/wrapEdge.tsx index 176d29d1..fe21e93a 100644 --- a/src/components/Edges/wrapEdge.tsx +++ b/src/components/Edges/wrapEdge.tsx @@ -14,7 +14,7 @@ interface EdgeWrapperProps { labelShowBg?: boolean; labelBgStyle: CSSProperties; className?: string; - onClick?: (edge: Edge) => void; + onClick?: (evt: React.MouseEvent, edge: Edge) => void; animated?: boolean; selected: boolean; elementsSelectable: boolean; @@ -51,7 +51,7 @@ export default (EdgeComponent: ComponentType) => { const edgeGroupStyle: CSSProperties = { pointerEvents: elementsSelectable ? 'all' : 'none', }; - const onEdgeClick = (): void => { + const onEdgeClick = (evt: React.MouseEvent): void => { if (!elementsSelectable) { return; } @@ -59,7 +59,7 @@ export default (EdgeComponent: ComponentType) => { setSelectedElements({ id, source, target }); if (onClick) { - onClick({ id, source, target, type }); + onClick(evt, { id, source, target, type }); } }; diff --git a/src/components/Nodes/wrapNode.tsx b/src/components/Nodes/wrapNode.tsx index 3d790c7b..6d04ebdf 100644 --- a/src/components/Nodes/wrapNode.tsx +++ b/src/components/Nodes/wrapNode.tsx @@ -44,7 +44,7 @@ interface OnDragStartParams { transform: Transform; position: XYPosition; setSelectedElements: (elms: Elements | Node | Edge) => void; - onNodeDragStart?: (node: Node) => void; + onNodeDragStart?: (evt: MouseEvent, node: Node) => void; } const onStart = ({ @@ -74,7 +74,7 @@ const onStart = ({ setOffset({ x: offsetX, y: offsetY }); if (onNodeDragStart) { - onNodeDragStart(node); + onNodeDragStart(evt as MouseEvent, node); } if (selectNodesOnDrag && isSelectable) { @@ -110,6 +110,7 @@ const onDrag = ({ evt, setDragging, id, offset, transform, updateNodePos }: OnDr }; interface OnDragStopParams { + evt: MouseEvent; isDragging: boolean; setDragging: (isDragging: boolean) => void; id: ElementId; @@ -119,11 +120,12 @@ interface OnDragStopParams { selectNodesOnDrag: boolean; isSelectable: boolean; setSelectedElements: (elms: Elements | Node | Edge) => void; - onNodeDragStop?: (node: Node) => void; - onClick?: (node: Node) => void; + onNodeDragStop?: (evt: MouseEvent, node: Node) => void; + onClick?: (evt: MouseEvent, node: Node) => void; } const onStop = ({ + evt, id, type, position, @@ -148,14 +150,14 @@ const onStop = ({ } if (onClick) { - return onClick(node); + return onClick(evt, node); } } setDragging(false); if (onNodeDragStop) { - onNodeDragStop(node); + onNodeDragStop(evt, node); } }; @@ -240,7 +242,7 @@ export default (NodeComponent: ComponentType) => { setSelectedElements({ id: node.id, type: node.type } as Node); if (onClick) { - onClick(node); + return (evt: MouseEvent) => onClick(evt, node); } } @@ -298,8 +300,9 @@ export default (NodeComponent: ComponentType) => { }) } onDrag={(evt) => onDrag({ evt: evt as MouseEvent, setDragging, id, offset, transform, updateNodePos })} - onStop={() => + onStop={(evt) => onStop({ + evt: evt as MouseEvent, onNodeDragStop, selectNodesOnDrag, isSelectable, diff --git a/src/container/EdgeRenderer/index.tsx b/src/container/EdgeRenderer/index.tsx index 806b2821..9f239b3c 100644 --- a/src/container/EdgeRenderer/index.tsx +++ b/src/container/EdgeRenderer/index.tsx @@ -10,7 +10,7 @@ interface EdgeRendererProps { edgeTypes: any; connectionLineType: ConnectionLineType; connectionLineStyle?: CSSProperties; - onElementClick?: (element: Node | Edge) => void; + onElementClick?: (evt: React.MouseEvent, element: Node | Edge) => void; arrowHeadColor: string; markerEndId?: string; } diff --git a/src/container/GraphView/index.tsx b/src/container/GraphView/index.tsx index 4a1f251b..58e105a5 100644 --- a/src/container/GraphView/index.tsx +++ b/src/container/GraphView/index.tsx @@ -26,14 +26,14 @@ import { export interface GraphViewProps { elements: Elements; - onElementClick?: (element: Node | Edge) => void; + onElementClick?: (evt: MouseEvent, element: Node | Edge) => void; onElementsRemove?: (elements: Elements) => void; onNodeMouseEnter?: (evt: MouseEvent, node: Node) => void; onNodeMouseMove?: (evt: MouseEvent, node: Node) => void; onNodeMouseLeave?: (evt: MouseEvent, node: Node) => void; onNodeContextMenu?: (evt: MouseEvent, node: Node) => void; - onNodeDragStart?: (node: Node) => void; - onNodeDragStop?: (node: Node) => void; + onNodeDragStart?: (evt: MouseEvent, node: Node) => void; + onNodeDragStop?: (evt: MouseEvent, node: Node) => void; onConnect?: (connection: Connection | Edge) => void; onConnectStart?: OnConnectStartFunc; onConnectStop?: () => void; @@ -41,7 +41,7 @@ export interface GraphViewProps { onMove?: (flowTransform?: FlowTransform) => void; onMoveStart?: (flowTransform?: FlowTransform) => void; onMoveEnd?: (flowTransform?: FlowTransform) => void; - onPaneClick?: () => void; + onPaneClick?: (evt: MouseEvent) => void; selectionKeyCode: number; nodeTypes: NodeTypesType; edgeTypes: EdgeTypesType; @@ -125,8 +125,8 @@ const GraphView = ({ const fitView = useStoreActions((actions) => actions.fitView); const zoom = useStoreActions((actions) => actions.zoom); - const onZoomPaneClick = useCallback(() => { - onPaneClick?.(); + const onZoomPaneClick = useCallback((evt: React.MouseEvent) => { + onPaneClick?.(evt); unsetNodesSelection(); }, [onPaneClick]); diff --git a/src/container/NodeRenderer/index.tsx b/src/container/NodeRenderer/index.tsx index 8fc90157..4c5d7c84 100644 --- a/src/container/NodeRenderer/index.tsx +++ b/src/container/NodeRenderer/index.tsx @@ -7,13 +7,13 @@ import { Node, Transform, NodeTypesType, WrapNodeProps, Elements, Edge } from '. interface NodeRendererProps { nodeTypes: NodeTypesType; selectNodesOnDrag: boolean; - onElementClick?: (element: Node | Edge) => void; + onElementClick?: (evt: MouseEvent, element: Node | Edge) => void; onNodeMouseEnter?: (evt: MouseEvent, node: Node) => void; onNodeMouseMove?: (evt: MouseEvent, node: Node) => void; onNodeMouseLeave?: (evt: MouseEvent, node: Node) => void; onNodeContextMenu?: (evt: MouseEvent, node: Node) => void; - onNodeDragStart?: (node: Node) => void; - onNodeDragStop?: (node: Node) => void; + onNodeDragStart?: (evt: MouseEvent, node: Node) => void; + onNodeDragStop?: (evt: MouseEvent, node: Node) => void; onlyRenderVisibleNodes?: boolean; } diff --git a/src/container/ReactFlow/index.tsx b/src/container/ReactFlow/index.tsx index 8e383073..92231b86 100644 --- a/src/container/ReactFlow/index.tsx +++ b/src/container/ReactFlow/index.tsx @@ -34,14 +34,14 @@ import '../../style.css'; export interface ReactFlowProps extends Omit, 'onLoad'> { elements: Elements; - onElementClick?: (element: Node | Edge) => void; + onElementClick?: (evt: MouseEvent, element: Node | Edge) => void; onElementsRemove?: (elements: Elements) => void; onNodeMouseEnter?: (evt: MouseEvent, node: Node) => void; onNodeMouseMove?: (evt: MouseEvent, node: Node) => void; onNodeMouseLeave?: (evt: MouseEvent, node: Node) => void; onNodeContextMenu?: (evt: MouseEvent, node: Node) => void; - onNodeDragStart?: (node: Node) => void; - onNodeDragStop?: (node: Node) => void; + onNodeDragStart?: (evt: MouseEvent, node: Node) => void; + onNodeDragStop?: (evt: MouseEvent, node: Node) => void; onConnect?: (connection: Edge | Connection) => void; onConnectStart?: OnConnectStartFunc; onConnectStop?: () => void; diff --git a/src/types/index.ts b/src/types/index.ts index 931c50e5..3e07b07f 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -154,13 +154,13 @@ export interface WrapNodeProps { isDraggable: boolean; isConnectable: boolean; selectNodesOnDrag: boolean; - onClick?: (node: Node) => void; + onClick?: (evt: MouseEvent, node: Node) => void; onMouseEnter?: (evt: MouseEvent, node: Node) => void; onMouseMove?: (evt: MouseEvent, node: Node) => void; onMouseLeave?: (evt: MouseEvent, node: Node) => void; onContextMenu?: (evt: MouseEvent, node: Node) => void; - onNodeDragStart?: (node: Node) => void; - onNodeDragStop?: (node: Node) => void; + onNodeDragStart?: (evt: MouseEvent, node: Node) => void; + onNodeDragStop?: (evt: MouseEvent, node: Node) => void; style?: CSSProperties; className?: string; sourcePosition?: Position; @@ -235,7 +235,7 @@ export interface EdgeCompProps { labelStyle?: CSSProperties; labelShowBg?: boolean; labelBgStyle?: CSSProperties; - onClick?: (edge: Edge) => void; + onClick?: (evt: MouseEvent, edge: Edge) => void; animated?: boolean; selected?: boolean; data?: any;