feat(props): add mouse event to onNodeDragStart, onNodeDragStop, onElementClick, and onPaneClick
This commit is contained in:
@@ -79,10 +79,10 @@ const BasicFlow = () => <ReactFlow elements={elements} />;
|
||||
- `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 = () => <ReactFlow elements={elements} />;
|
||||
- `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.
|
||||
|
||||
@@ -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 } },
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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 = [
|
||||
|
||||
@@ -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([]);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 } },
|
||||
|
||||
@@ -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<EdgeCompProps>) => {
|
||||
const edgeGroupStyle: CSSProperties = {
|
||||
pointerEvents: elementsSelectable ? 'all' : 'none',
|
||||
};
|
||||
const onEdgeClick = (): void => {
|
||||
const onEdgeClick = (evt: React.MouseEvent<SVGGElement, MouseEvent>): void => {
|
||||
if (!elementsSelectable) {
|
||||
return;
|
||||
}
|
||||
@@ -59,7 +59,7 @@ export default (EdgeComponent: ComponentType<EdgeCompProps>) => {
|
||||
setSelectedElements({ id, source, target });
|
||||
|
||||
if (onClick) {
|
||||
onClick({ id, source, target, type });
|
||||
onClick(evt, { id, source, target, type });
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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<NodeComponentProps>) => {
|
||||
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<NodeComponentProps>) => {
|
||||
})
|
||||
}
|
||||
onDrag={(evt) => onDrag({ evt: evt as MouseEvent, setDragging, id, offset, transform, updateNodePos })}
|
||||
onStop={() =>
|
||||
onStop={(evt) =>
|
||||
onStop({
|
||||
evt: evt as MouseEvent,
|
||||
onNodeDragStop,
|
||||
selectNodesOnDrag,
|
||||
isSelectable,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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]);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,14 +34,14 @@ import '../../style.css';
|
||||
|
||||
export interface ReactFlowProps extends Omit<HTMLAttributes<HTMLDivElement>, '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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user