Merge pull request #855 from wbkd/feat/onDrag

Feat/on drag
This commit is contained in:
Moritz Klack
2021-01-27 10:39:50 +01:00
committed by GitHub
6 changed files with 25 additions and 8 deletions
+2
View File
@@ -3,6 +3,7 @@ import React, { useState } from 'react';
import ReactFlow, { removeElements, addEdge, MiniMap, Controls, Background, isNode } from 'react-flow-renderer'; import ReactFlow, { removeElements, addEdge, MiniMap, Controls, Background, isNode } from 'react-flow-renderer';
const onNodeDragStart = (event, node) => console.log('drag start', node); const onNodeDragStart = (event, node) => console.log('drag start', node);
const onNodeDrag = (event, node) => console.log('drag', node);
const onNodeDragStop = (event, node) => console.log('drag stop', node); const onNodeDragStop = (event, node) => console.log('drag stop', node);
const onPaneClick = (event) => console.log('pane click', event); const onPaneClick = (event) => console.log('pane click', event);
const onPaneScroll = (event) => console.log('pane scroll', event); const onPaneScroll = (event) => console.log('pane scroll', event);
@@ -132,6 +133,7 @@ const OverviewFlow = () => {
onPaneScroll={onPaneScroll} onPaneScroll={onPaneScroll}
onPaneContextMenu={onPaneContextMenu} onPaneContextMenu={onPaneContextMenu}
onNodeDragStart={onNodeDragStart} onNodeDragStart={onNodeDragStart}
onNodeDrag={onNodeDrag}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
onSelectionDragStart={onSelectionDragStart} onSelectionDragStart={onSelectionDragStart}
onSelectionDrag={onSelectionDrag} onSelectionDrag={onSelectionDrag}
+14 -7
View File
@@ -1,5 +1,5 @@
import React, { useEffect, useRef, memo, ComponentType, CSSProperties, useMemo, MouseEvent, useCallback } from 'react'; import React, { useEffect, useRef, memo, ComponentType, CSSProperties, useMemo, MouseEvent, useCallback } from 'react';
import { DraggableCore } from 'react-draggable'; import { DraggableCore, DraggableData, DraggableEvent } from 'react-draggable';
import cc from 'classcat'; import cc from 'classcat';
import { useStoreActions } from '../../store/hooks'; import { useStoreActions } from '../../store/hooks';
@@ -21,6 +21,7 @@ export default (NodeComponent: ComponentType<NodeComponentProps>) => {
onMouseLeave, onMouseLeave,
onContextMenu, onContextMenu,
onNodeDragStart, onNodeDragStart,
onNodeDrag,
onNodeDragStop, onNodeDragStop,
style, style,
className, className,
@@ -107,7 +108,7 @@ export default (NodeComponent: ComponentType<NodeComponentProps>) => {
); );
const onDragStart = useCallback( const onDragStart = useCallback(
(event) => { (event: DraggableEvent) => {
onNodeDragStart?.(event as MouseEvent, node); onNodeDragStart?.(event as MouseEvent, node);
if (selectNodesOnDrag && isSelectable) { if (selectNodesOnDrag && isSelectable) {
@@ -125,20 +126,26 @@ export default (NodeComponent: ComponentType<NodeComponentProps>) => {
); );
const onDrag = useCallback( const onDrag = useCallback(
(_, data) => { (event: DraggableEvent, draggableData: DraggableData) => {
if (onNodeDrag) {
node.position.x += draggableData.deltaX;
node.position.y += draggableData.deltaY;
onNodeDrag(event as MouseEvent, node);
}
updateNodePosDiff({ updateNodePosDiff({
id, id,
diff: { diff: {
x: data.deltaX, x: draggableData.deltaX,
y: data.deltaY, y: draggableData.deltaY,
}, },
}); });
}, },
[id] [id, node, onNodeDrag]
); );
const onDragStop = useCallback( const onDragStop = useCallback(
(event) => { (event: DraggableEvent) => {
// onDragStop also gets called when user just clicks on a node. // onDragStop also gets called when user just clicks on a node.
// Because of that we set dragging to true inside the onDrag handler and handle the click here // Because of that we set dragging to true inside the onDrag handler and handle the click here
if (!isDragging) { if (!isDragging) {
+2
View File
@@ -40,6 +40,7 @@ const GraphView = ({
onNodeMouseLeave, onNodeMouseLeave,
onNodeContextMenu, onNodeContextMenu,
onNodeDragStart, onNodeDragStart,
onNodeDrag,
onNodeDragStop, onNodeDragStop,
onSelectionDragStart, onSelectionDragStart,
onSelectionDrag, onSelectionDrag,
@@ -243,6 +244,7 @@ const GraphView = ({
onNodeMouseLeave={onNodeMouseLeave} onNodeMouseLeave={onNodeMouseLeave}
onNodeContextMenu={onNodeContextMenu} onNodeContextMenu={onNodeContextMenu}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
onNodeDrag={onNodeDrag}
onNodeDragStart={onNodeDragStart} onNodeDragStart={onNodeDragStart}
selectNodesOnDrag={selectNodesOnDrag} selectNodesOnDrag={selectNodesOnDrag}
snapToGrid={snapToGrid} snapToGrid={snapToGrid}
+2 -1
View File
@@ -3,7 +3,6 @@ import React, { memo, useMemo, ComponentType, MouseEvent } from 'react';
import { getNodesInside } from '../../utils/graph'; import { getNodesInside } from '../../utils/graph';
import { useStoreState, useStoreActions } from '../../store/hooks'; import { useStoreState, useStoreActions } from '../../store/hooks';
import { Node, NodeTypesType, WrapNodeProps, Edge } from '../../types'; import { Node, NodeTypesType, WrapNodeProps, Edge } from '../../types';
interface NodeRendererProps { interface NodeRendererProps {
nodeTypes: NodeTypesType; nodeTypes: NodeTypesType;
selectNodesOnDrag: boolean; selectNodesOnDrag: boolean;
@@ -13,6 +12,7 @@ interface NodeRendererProps {
onNodeMouseLeave?: (event: MouseEvent, node: Node) => void; onNodeMouseLeave?: (event: MouseEvent, node: Node) => void;
onNodeContextMenu?: (event: MouseEvent, node: Node) => void; onNodeContextMenu?: (event: MouseEvent, node: Node) => void;
onNodeDragStart?: (event: MouseEvent, node: Node) => void; onNodeDragStart?: (event: MouseEvent, node: Node) => void;
onNodeDrag?: (event: MouseEvent, node: Node) => void;
onNodeDragStop?: (event: MouseEvent, node: Node) => void; onNodeDragStop?: (event: MouseEvent, node: Node) => void;
snapToGrid: boolean; snapToGrid: boolean;
snapGrid: [number, number]; snapGrid: [number, number];
@@ -91,6 +91,7 @@ const NodeRenderer = (props: NodeRendererProps) => {
onMouseLeave={props.onNodeMouseLeave} onMouseLeave={props.onNodeMouseLeave}
onContextMenu={props.onNodeContextMenu} onContextMenu={props.onNodeContextMenu}
onNodeDragStart={props.onNodeDragStart} onNodeDragStart={props.onNodeDragStart}
onNodeDrag={props.onNodeDrag}
onNodeDragStop={props.onNodeDragStop} onNodeDragStop={props.onNodeDragStop}
scale={transform[2]} scale={transform[2]}
selected={selectedElements?.some(({ id }) => id === node.id) || false} selected={selectedElements?.some(({ id }) => id === node.id) || false}
+3
View File
@@ -58,6 +58,7 @@ export interface ReactFlowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'on
onNodeMouseLeave?: (event: MouseEvent, node: Node) => void; onNodeMouseLeave?: (event: MouseEvent, node: Node) => void;
onNodeContextMenu?: (event: MouseEvent, node: Node) => void; onNodeContextMenu?: (event: MouseEvent, node: Node) => void;
onNodeDragStart?: (event: MouseEvent, node: Node) => void; onNodeDragStart?: (event: MouseEvent, node: Node) => void;
onNodeDrag?: (event: MouseEvent, node: Node) => void;
onNodeDragStop?: (event: MouseEvent, node: Node) => void; onNodeDragStop?: (event: MouseEvent, node: Node) => void;
onConnect?: (connection: Edge | Connection) => void; onConnect?: (connection: Edge | Connection) => void;
onConnectStart?: OnConnectStartFunc; onConnectStart?: OnConnectStartFunc;
@@ -130,6 +131,7 @@ const ReactFlow = ({
onNodeMouseLeave, onNodeMouseLeave,
onNodeContextMenu, onNodeContextMenu,
onNodeDragStart, onNodeDragStart,
onNodeDrag,
onNodeDragStop, onNodeDragStop,
onSelectionChange, onSelectionChange,
onSelectionDragStart, onSelectionDragStart,
@@ -191,6 +193,7 @@ const ReactFlow = ({
onNodeMouseLeave={onNodeMouseLeave} onNodeMouseLeave={onNodeMouseLeave}
onNodeContextMenu={onNodeContextMenu} onNodeContextMenu={onNodeContextMenu}
onNodeDragStart={onNodeDragStart} onNodeDragStart={onNodeDragStart}
onNodeDrag={onNodeDrag}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
nodeTypes={nodeTypesParsed} nodeTypes={nodeTypesParsed}
edgeTypes={edgeTypesParsed} edgeTypes={edgeTypesParsed}
+2
View File
@@ -196,6 +196,7 @@ export interface NodeComponentProps<T = any> {
onMouseLeave?: (node: Node) => void; onMouseLeave?: (node: Node) => void;
onContextMenu?: (node: Node) => void; onContextMenu?: (node: Node) => void;
onNodeDragStart?: (node: Node) => void; onNodeDragStart?: (node: Node) => void;
onNodeDrag?: (node: Node) => void;
onNodeDragStop?: (node: Node) => void; onNodeDragStop?: (node: Node) => void;
style?: CSSProperties; style?: CSSProperties;
isDragging?: boolean; isDragging?: boolean;
@@ -219,6 +220,7 @@ export interface WrapNodeProps<T = any> {
onMouseLeave?: (event: ReactMouseEvent, node: Node) => void; onMouseLeave?: (event: ReactMouseEvent, node: Node) => void;
onContextMenu?: (event: ReactMouseEvent, node: Node) => void; onContextMenu?: (event: ReactMouseEvent, node: Node) => void;
onNodeDragStart?: (event: ReactMouseEvent, node: Node) => void; onNodeDragStart?: (event: ReactMouseEvent, node: Node) => void;
onNodeDrag?: (event: ReactMouseEvent, node: Node) => void;
onNodeDragStop?: (event: ReactMouseEvent, node: Node) => void; onNodeDragStop?: (event: ReactMouseEvent, node: Node) => void;
style?: CSSProperties; style?: CSSProperties;
className?: string; className?: string;