fix(edge-drag): update to new version
This commit is contained in:
@@ -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) => {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -237,6 +237,6 @@
|
|||||||
transform: translate(0, -50%);
|
transform: translate(0, -50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.move-handler {
|
.react-flow__edgeupdater {
|
||||||
cursor: move;
|
cursor: move;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user