feat(nodes): add onDragStart handler #241
This commit is contained in:
@@ -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,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}
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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: () => {},
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user