fix(edge-drag): update to new version

This commit is contained in:
moklick
2020-11-05 16:26:02 +01:00
parent 28ad06a7bd
commit 9dfe7ea8e3
7 changed files with 33 additions and 43 deletions
+4 -2
View File
@@ -1,6 +1,6 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import ReactFlow, { MiniMap, Controls, Background, updateEdge } from 'react-flow-renderer'; import ReactFlow, { MiniMap, Controls, Background, updateEdge, addEdge } from 'react-flow-renderer';
const onLoad = (reactFlowInstance) => { const onLoad = (reactFlowInstance) => {
console.log('flow loaded:', reactFlowInstance); console.log('flow loaded:', reactFlowInstance);
@@ -52,7 +52,8 @@ const DragEdge = () => {
const [elements, setElements] = useState(initialElements); const [elements, setElements] = useState(initialElements);
const onEdgeUpdate = (oldEdge, newConnection) => { const onEdgeUpdate = (oldEdge, newConnection) => {
setElements((els) => updateEdge(oldEdge, newConnection, els)); setElements((els) => updateEdge(oldEdge, newConnection, els));
} };
const onConnect = (params) => setElements((els) => addEdge(params, els));
return ( return (
<ReactFlow <ReactFlow
@@ -61,6 +62,7 @@ const DragEdge = () => {
snapToGrid={true} snapToGrid={true}
snapGrid={snapGrid} snapGrid={snapGrid}
onEdgeUpdate={onEdgeUpdate} onEdgeUpdate={onEdgeUpdate}
onConnect={onConnect}
> >
<MiniMap <MiniMap
nodeStrokeColor={(n) => { nodeStrokeColor={(n) => {
+12 -12
View File
@@ -63,10 +63,10 @@ export default (EdgeComponent: ComponentType<EdgeProps>) => {
[elementsSelectable, id, source, target, type, data, onClick] [elementsSelectable, id, source, target, type, data, onClick]
); );
const handleEitherEndOfEdgePress = useCallback( const handleEdgeUpdaterMouseDown = useCallback(
(event: React.MouseEvent<SVGGElement, MouseEvent>, isEdgeHeader?: boolean): void => { (event: React.MouseEvent<SVGGElement, MouseEvent>, isEdgeHeader?: boolean): void => {
if (elementsSelectable) { if (elementsSelectable) {
setSelectedElements({ id, source, target }); addSelectedElements({ id, source, target });
} }
const edgeElement: Edge = { id, source, target, type }; const edgeElement: Edge = { id, source, target, type };
@@ -80,18 +80,18 @@ export default (EdgeComponent: ComponentType<EdgeProps>) => {
[elementsSelectable, id, source, target, type, data, onEitherEndOfEdgePress] [elementsSelectable, id, source, target, type, data, onEitherEndOfEdgePress]
); );
const handleEdgeHeaderPress = useCallback( const handleEdgeTargetMouseDown = useCallback(
(event: React.MouseEvent<SVGGElement, MouseEvent>): void => { (event: React.MouseEvent<SVGGElement, MouseEvent>): void => {
handleEitherEndOfEdgePress(event, true); handleEdgeUpdaterMouseDown(event, true);
}, },
[handleEitherEndOfEdgePress], [handleEdgeUpdaterMouseDown]
); );
const handleEdgeFooterPress = useCallback( const handleEdgeSourceMouseDown = useCallback(
(event: React.MouseEvent<SVGGElement, MouseEvent>): void => { (event: React.MouseEvent<SVGGElement, MouseEvent>): void => {
handleEitherEndOfEdgePress(event); handleEdgeUpdaterMouseDown(event);
}, },
[handleEitherEndOfEdgePress], [handleEdgeUpdaterMouseDown]
); );
if (isHidden) { if (isHidden) {
@@ -100,9 +100,9 @@ export default (EdgeComponent: ComponentType<EdgeProps>) => {
return ( return (
<g className={edgeClasses} onClick={onEdgeClick}> <g className={edgeClasses} onClick={onEdgeClick}>
<g onMouseDown={handleEdgeFooterPress}> <g onMouseDown={handleEdgeSourceMouseDown}>
<circle <circle
className="move-handler" className="react-flow__edgeupdater"
cx={sourceX} cx={sourceX}
cy={sourceY} cy={sourceY}
r="12" r="12"
@@ -133,9 +133,9 @@ export default (EdgeComponent: ComponentType<EdgeProps>) => {
targetPosition={targetPosition} targetPosition={targetPosition}
markerEndId={markerEndId} markerEndId={markerEndId}
/> />
<g onMouseDown={handleEdgeHeaderPress}> <g onMouseDown={handleEdgeTargetMouseDown}>
<circle <circle
className="move-handler" className="react-flow__edgeupdater"
cx={targetX} cx={targetX}
cy={targetY} cy={targetY}
r="12" r="12"
+7 -22
View File
@@ -15,7 +15,7 @@ import {
ConnectionLineType, ConnectionLineType,
ConnectionLineComponent, ConnectionLineComponent,
Connection, Connection,
OnEdgeUpdateFunc OnEdgeUpdateFunc,
} from '../../types'; } from '../../types';
import { onMouseDown, SetSourceIdFunc } from '../../components/Handle/BaseHandle'; import { onMouseDown, SetSourceIdFunc } from '../../components/Handle/BaseHandle';
@@ -140,7 +140,7 @@ function renderEdge(
selectedElements: Elements | null, selectedElements: Elements | null,
elementsSelectable: boolean, elementsSelectable: boolean,
setConnectionNodeId: SetSourceIdFunc, setConnectionNodeId: SetSourceIdFunc,
setPosition: (pos: XYPosition) => void, setPosition: (pos: XYPosition) => void
) { ) {
const sourceId = edge.source; const sourceId = edge.source;
const sourceHandleId = edge.sourceHandle || null; const sourceHandleId = edge.sourceHandle || null;
@@ -197,7 +197,7 @@ function renderEdge(
if (onEdgeUpdate) { if (onEdgeUpdate) {
onEdgeUpdate(edge, connection); onEdgeUpdate(edge, connection);
} }
} };
const handleEitherEndOfEdgePress = (event: React.MouseEvent, edge: Edge, isEdgeHeader = false) => { const handleEitherEndOfEdgePress = (event: React.MouseEvent, edge: Edge, isEdgeHeader = false) => {
const { source, target } = edge; const { source, target } = edge;
@@ -205,16 +205,8 @@ function renderEdge(
const isValidConnection = () => true; const isValidConnection = () => true;
const isTarget = !isEdgeHeader; const isTarget = !isEdgeHeader;
onMouseDown( onMouseDown(event, null, nodeId, setConnectionNodeId, setPosition, onConnect, isTarget, isValidConnection);
event, };
nodeId,
setConnectionNodeId,
setPosition,
onConnect,
isTarget,
isValidConnection,
)
}
return ( return (
<EdgeComponent <EdgeComponent
@@ -282,15 +274,8 @@ const EdgeRenderer = (props: EdgeRendererProps) => {
<MarkerDefinitions color={arrowHeadColor} /> <MarkerDefinitions color={arrowHeadColor} />
<g transform={transformStyle}> <g transform={transformStyle}>
{edges.map((edge: Edge) => {edges.map((edge: Edge) =>
renderEdge( renderEdge(edge, props, nodes, selectedElements, elementsSelectable, setConnectionNodeId, setPosition)
edge, )}
props,
nodes,
selectedElements,
elementsSelectable,
setConnectionNodeId,
setPosition,
))}
{renderConnectionLine && ( {renderConnectionLine && (
<ConnectionLine <ConnectionLine
nodes={nodes} nodes={nodes}
+4 -1
View File
@@ -159,7 +159,10 @@ const ZoomPane = ({
} }
// when the target element is a node, we still allow zooming // when the target element is a node, we still allow zooming
if (event.target.closest('.react-flow__node') && event.type !== 'wheel') { if (
(event.target.closest('.react-flow__node') || event.target.closest('.react-flow__edgeupdater')) &&
event.type !== 'wheel'
) {
return false; return false;
} }
+2 -2
View File
@@ -157,8 +157,8 @@ export const storeModel: StoreModel = {
viewportBox: computed((state) => ({ x: 0, y: 0, width: state.width, height: state.height })), viewportBox: computed((state) => ({ x: 0, y: 0, width: state.width, height: state.height })),
transform: [0, 0, 1], transform: [0, 0, 1],
elements: [], elements: [],
nodes: computed((state) => state.elements.filter((el) => isNode(el)) as Node[]), nodes: computed((state) => state.elements.filter(isNode)),
edges: computed((state) => state.elements.filter((el) => isEdge(el)) as Edge[]), edges: computed((state) => state.elements.filter(isEdge)),
selectedElements: null, selectedElements: null,
selectedNodesBbox: { x: 0, y: 0, width: 0, height: 0 }, selectedNodesBbox: { x: 0, y: 0, width: 0, height: 0 },
+1 -1
View File
@@ -237,6 +237,6 @@
transform: translate(0, -50%); transform: translate(0, -50%);
} }
.move-handler { .react-flow__edgeupdater {
cursor: move; cursor: move;
} }