diff --git a/src/components/graph-view-props.js b/src/components/graph-view-props.js index aa9cccce..c7d5dd0d 100644 --- a/src/components/graph-view-props.js +++ b/src/components/graph-view-props.js @@ -61,6 +61,7 @@ export type IGraphViewProps = { hoveredNode: INode | null, swapEdge: IEdge ) => boolean, + canDragNode?: (nodeId: string) => boolean, onBackgroundClick?: (x: number, y: number, event: any) => void, onCopySelected?: () => void, onCreateEdge?: (sourceNode: INode, targetNode: INode) => void, @@ -77,6 +78,7 @@ export type IGraphViewProps = { onSwapEdge?: (sourceNode: INode, targetNode: INode, edge: IEdge) => void, onUndo?: () => void, onUpdateNode?: (node: INode) => void, + onMoveNode?: (node: INode) => void, onArrowClicked?: (selectedEdge: IEdge) => void, renderBackground?: (gridSize?: number) => any, renderDefs?: () => any, diff --git a/src/components/graph-view.js b/src/components/graph-view.js index 653024ab..0fb72d3e 100644 --- a/src/components/graph-view.js +++ b/src/components/graph-view.js @@ -72,6 +72,7 @@ class GraphView extends React.Component { canSwapEdge: () => true, canDeleteEdge: () => true, canDeleteNode: () => true, + canDragNode: () => true, edgeArrowSize: 8, gridSpacing: 36, layoutEngineType: 'None', @@ -788,8 +789,7 @@ class GraphView extends React.Component { } handleNodeMove = (position: IPoint, nodeId: string, shiftKey: boolean) => { - const { canCreateEdge, readOnly } = this.props; - const { draggingEdge } = this.state; + const { canCreateEdge, readOnly, onMoveNode, canDragNode } = this.props; const nodeMapNode: INodeMapNode | null = this.getNodeById(nodeId); if (!nodeMapNode) { @@ -798,11 +798,15 @@ class GraphView extends React.Component { const node = nodeMapNode.node; - if (readOnly) { + if (readOnly || !canDragNode(nodeId)) { return; } - if (!shiftKey && !draggingEdge) { + if (onMoveNode) { + onMoveNode(node); + } + + if (!shiftKey && !this.state.draggingEdge) { // node moved node.x = position.x; node.y = position.y; diff --git a/src/styles/main.scss b/src/styles/main.scss index d1ee23a2..b89a5ea6 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -162,6 +162,10 @@ $background-color: #f9f9f9; border-radius: 2px; cursor: pointer; margin: 0; + + > svg { + vertical-align: sub; + } } } diff --git a/typings/index.d.ts b/typings/index.d.ts index 617b90df..5d3b69ad 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -129,7 +129,8 @@ declare module 'react-digraph' { sourceNode: INode, hoveredNode: INode | null, swapEdge: IEdge - ) => boolean, + ) => boolean; + canDragNode?: (nodeId: string) => boolean; onBackgroundClick?: (x: number, y: number, event: any) => void, onCopySelected?: () => void; onCreateEdge?: (sourceNode: INode, targetNode: INode) => void; @@ -139,10 +140,11 @@ declare module 'react-digraph' { onPasteSelected?: ( selectedNode: INode, xyCoords?: { x: number, y: number } - ) => void, + ) => void; onSelectEdge?: (selectedEdge: IEdge) => void; onSelectNode?: (node: INode | null, event: any) => void; onSwapEdge?: (sourceNode: INode, targetNode: INode, edge: IEdge) => void; + onMoveNode?: (node: INode) => void; onUndo?: () => void; onUpdateNode?: (node: INode) => void; renderBackground?: (gridSize?: number) => any;