feat(nodes): add onDragStart handler #241

This commit is contained in:
moklick
2020-05-25 12:14:47 +02:00
parent 3936062e8d
commit 5049379e3b
7 changed files with 33 additions and 13 deletions
+1
View File
@@ -67,6 +67,7 @@ const BasicFlow = () => (
- `elements`: array of [nodes](#nodes) and [edges](#edges) *(required)* - `elements`: array of [nodes](#nodes) and [edges](#edges) *(required)*
- `onElementClick`: element click handler - `onElementClick`: element click handler
- `onElementsRemove`: element remove handler - `onElementsRemove`: element remove handler
- `onNodeDragStart`: node drag start handler
- `onNodeDragStop`: node drag stop handler - `onNodeDragStop`: node drag stop handler
- `onConnect`: connect handler - `onConnect`: connect handler
- `onLoad`: editor load handler - `onLoad`: editor load handler
+2
View File
@@ -2,6 +2,7 @@ import React, { useState } from 'react';
import ReactFlow, { removeElements, addEdge, MiniMap, Controls } from 'react-flow-renderer'; import ReactFlow, { removeElements, addEdge, MiniMap, Controls } from 'react-flow-renderer';
const onNodeDragStart = node => console.log('drag start', node);
const onNodeDragStop = node => console.log('drag stop', node); const onNodeDragStop = node => console.log('drag stop', node);
const onElementClick = element => console.log('click', element); const onElementClick = element => console.log('click', element);
const onLoad = (graph) => { const onLoad = (graph) => {
@@ -50,6 +51,7 @@ const OverviewFlow = () => {
onElementClick={onElementClick} onElementClick={onElementClick}
onElementsRemove={onElementsRemove} onElementsRemove={onElementsRemove}
onConnect={onConnect} onConnect={onConnect}
onNodeDragStart={onNodeDragStart}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
style={{ width: '100%', height: '100%' }} style={{ width: '100%', height: '100%' }}
onLoad={onLoad} onLoad={onLoad}
+20 -13
View File
@@ -12,7 +12,7 @@ const getMouseEvent = (evt: MouseEvent | TouchEvent) =>
const onStart = ( const onStart = (
evt: MouseEvent | TouchEvent, evt: MouseEvent | TouchEvent,
onClick: (node: Node) => void, onDragStart: (node: Node) => void,
id: ElementId, id: ElementId,
type: string, type: string,
data: any, data: any,
@@ -26,13 +26,14 @@ const onStart = (
x: startEvt.clientX * (1 / transform[2]), x: startEvt.clientX * (1 / transform[2]),
y: startEvt.clientY * (1 / transform[2]), y: startEvt.clientY * (1 / transform[2]),
}; };
const offsetX = scaledClient.x - position.x - transform[0]; const offsetX = scaledClient.x - position.x - transform[0];
const offsetY = scaledClient.y - position.y - transform[1]; const offsetY = scaledClient.y - position.y - transform[1];
const node = { id, type, position, data }; const node = { id, type, position, data };
store.dispatch.setSelectedElements({ id, type } as Node); store.dispatch.setSelectedElements({ id, type } as Node);
setOffset({ x: offsetX, y: offsetY }); setOffset({ x: offsetX, y: offsetY });
onClick(node); onDragStart(node);
}; };
const onDrag = ( const onDrag = (
@@ -60,7 +61,8 @@ const onDrag = (
}; };
const onStop = ( const onStop = (
onNodeDragStop: (node: Node) => void, onDragStop: (node: Node) => void,
onClick: (node: Node) => void,
isDragging: boolean, isDragging: boolean,
setDragging: (isDragging: boolean) => void, setDragging: (isDragging: boolean) => void,
id: ElementId, id: ElementId,
@@ -68,15 +70,19 @@ const onStop = (
position: XYPosition, position: XYPosition,
data: any data: any
): void => { ): void => {
if (isDragging) { const node = {
setDragging(false); id,
onNodeDragStop({ type,
id, position,
type, data,
position, } as Node;
data,
} as Node); if (!isDragging) {
return onClick(node);
} }
setDragging(false);
onDragStop(node);
}; };
export default (NodeComponent: ComponentType<NodeComponentProps>) => { export default (NodeComponent: ComponentType<NodeComponentProps>) => {
@@ -90,6 +96,7 @@ export default (NodeComponent: ComponentType<NodeComponentProps>) => {
yPos, yPos,
selected, selected,
onClick, onClick,
onNodeDragStart,
onNodeDragStop, onNodeDragStop,
style, style,
isInteractive, isInteractive,
@@ -139,9 +146,9 @@ export default (NodeComponent: ComponentType<NodeComponentProps>) => {
return ( return (
<DraggableCore <DraggableCore
onStart={(evt) => onStart(evt as MouseEvent, onClick, id, type, data, setOffset, transform, position)} onStart={(evt) => onStart(evt as MouseEvent, onNodeDragStart, id, type, data, setOffset, transform, position)}
onDrag={(evt) => onDrag(evt as MouseEvent, setDragging, id, offset, transform)} onDrag={(evt) => onDrag(evt as MouseEvent, setDragging, id, offset, transform)}
onStop={() => onStop(onNodeDragStop, isDragging, setDragging, id, type, position, data)} onStop={() => onStop(onNodeDragStop, onClick, isDragging, setDragging, id, type, position, data)}
scale={transform[2]} scale={transform[2]}
disabled={!isInteractive} disabled={!isInteractive}
cancel=".nodrag" cancel=".nodrag"
+3
View File
@@ -19,6 +19,7 @@ export interface GraphViewProps {
elements: Elements; elements: Elements;
onElementClick: (element: Node | Edge) => void; onElementClick: (element: Node | Edge) => void;
onElementsRemove: (elements: Elements) => void; onElementsRemove: (elements: Elements) => void;
onNodeDragStart: (node: Node) => void;
onNodeDragStop: (node: Node) => void; onNodeDragStop: (node: Node) => void;
onConnect: (connection: Connection | Edge) => void; onConnect: (connection: Connection | Edge) => void;
onLoad: OnLoadFunc; onLoad: OnLoadFunc;
@@ -46,6 +47,7 @@ const GraphView = memo(
onMove, onMove,
onLoad, onLoad,
onElementClick, onElementClick,
onNodeDragStart,
onNodeDragStop, onNodeDragStop,
connectionLineType, connectionLineType,
connectionLineStyle, connectionLineStyle,
@@ -140,6 +142,7 @@ const GraphView = memo(
nodeTypes={nodeTypes} nodeTypes={nodeTypes}
onElementClick={onElementClick} onElementClick={onElementClick}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
onNodeDragStart={onNodeDragStart}
onlyRenderVisibleNodes={onlyRenderVisibleNodes} onlyRenderVisibleNodes={onlyRenderVisibleNodes}
/> />
<EdgeRenderer <EdgeRenderer
+2
View File
@@ -7,6 +7,7 @@ import { Node, Transform, NodeTypesType, WrapNodeProps, Elements, Edge } from '.
interface NodeRendererProps { interface NodeRendererProps {
nodeTypes: NodeTypesType; nodeTypes: NodeTypesType;
onElementClick: (element: Node | Edge) => void; onElementClick: (element: Node | Edge) => void;
onNodeDragStart: (node: Node) => void;
onNodeDragStop: (node: Node) => void; onNodeDragStop: (node: Node) => void;
onlyRenderVisibleNodes?: boolean; onlyRenderVisibleNodes?: boolean;
} }
@@ -35,6 +36,7 @@ function renderNode(
xPos={node.__rg.position.x} xPos={node.__rg.position.x}
yPos={node.__rg.position.y} yPos={node.__rg.position.y}
onClick={props.onElementClick} onClick={props.onElementClick}
onNodeDragStart={props.onNodeDragStart}
onNodeDragStop={props.onNodeDragStop} onNodeDragStop={props.onNodeDragStop}
transform={transform} transform={transform}
selected={isSelected} selected={isSelected}
+4
View File
@@ -27,6 +27,7 @@ export interface ReactFlowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'on
elements: Elements; elements: Elements;
onElementClick: (element: Node | Edge) => void; onElementClick: (element: Node | Edge) => void;
onElementsRemove: (elements: Elements) => void; onElementsRemove: (elements: Elements) => void;
onNodeDragStart: (node: Node) => void;
onNodeDragStop: (node: Node) => void; onNodeDragStop: (node: Node) => void;
onConnect: (connection: Edge | Connection) => void; onConnect: (connection: Edge | Connection) => void;
onLoad: OnLoadFunc; onLoad: OnLoadFunc;
@@ -59,6 +60,7 @@ const ReactFlow = ({
onMove, onMove,
onElementsRemove, onElementsRemove,
onConnect, onConnect,
onNodeDragStart,
onNodeDragStop, onNodeDragStop,
connectionLineType, connectionLineType,
connectionLineStyle, connectionLineStyle,
@@ -83,6 +85,7 @@ const ReactFlow = ({
onLoad={onLoad} onLoad={onLoad}
onMove={onMove} onMove={onMove}
onElementClick={onElementClick} onElementClick={onElementClick}
onNodeDragStart={onNodeDragStart}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
nodeTypes={nodeTypesParsed} nodeTypes={nodeTypesParsed}
edgeTypes={edgeTypesParsed} edgeTypes={edgeTypesParsed}
@@ -113,6 +116,7 @@ ReactFlow.displayName = 'ReactFlow';
ReactFlow.defaultProps = { ReactFlow.defaultProps = {
onElementClick: () => {}, onElementClick: () => {},
onElementsRemove: () => {}, onElementsRemove: () => {},
onNodeDragStart: () => {},
onNodeDragStop: () => {}, onNodeDragStop: () => {},
onConnect: () => {}, onConnect: () => {},
onLoad: () => {}, onLoad: () => {},
+1
View File
@@ -123,6 +123,7 @@ export interface WrapNodeProps {
yPos: number; yPos: number;
isInteractive: boolean; isInteractive: boolean;
onClick: (node: Node) => void | undefined; onClick: (node: Node) => void | undefined;
onNodeDragStart: (node: Node) => void;
onNodeDragStop: (node: Node) => void; onNodeDragStop: (node: Node) => void;
style?: CSSProperties; style?: CSSProperties;
sourcePosition?: Position; sourcePosition?: Position;