@xyflow/react 12.9.3 → 12.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/additional-components/MiniMap/MiniMap.d.ts +1 -1
- package/dist/esm/additional-components/MiniMap/MiniMapNodes.d.ts.map +1 -1
- package/dist/esm/components/BatchProvider/index.d.ts.map +1 -1
- package/dist/esm/components/EdgeWrapper/EdgeUpdateAnchors.d.ts.map +1 -1
- package/dist/esm/components/EdgeWrapper/index.d.ts.map +1 -1
- package/dist/esm/components/NodesSelection/index.d.ts.map +1 -1
- package/dist/esm/components/ReactFlowProvider/index.d.ts +3 -2
- package/dist/esm/components/ReactFlowProvider/index.d.ts.map +1 -1
- package/dist/esm/components/StoreUpdater/index.d.ts +1 -1
- package/dist/esm/components/StoreUpdater/index.d.ts.map +1 -1
- package/dist/esm/container/FlowRenderer/index.d.ts.map +1 -1
- package/dist/esm/container/ReactFlow/Wrapper.d.ts +3 -2
- package/dist/esm/container/ReactFlow/Wrapper.d.ts.map +1 -1
- package/dist/esm/container/ReactFlow/index.d.ts.map +1 -1
- package/dist/esm/container/ZoomPane/index.d.ts.map +1 -1
- package/dist/esm/hooks/useDrag.d.ts.map +1 -1
- package/dist/esm/hooks/useNodesData.d.ts +3 -2
- package/dist/esm/hooks/useNodesData.d.ts.map +1 -1
- package/dist/esm/hooks/useOnEdgesChangeMiddleware.d.ts +10 -0
- package/dist/esm/hooks/useOnEdgesChangeMiddleware.d.ts.map +1 -0
- package/dist/esm/hooks/useOnNodesChangeMiddleware.d.ts +10 -0
- package/dist/esm/hooks/useOnNodesChangeMiddleware.d.ts.map +1 -0
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +132 -58
- package/dist/esm/index.mjs +132 -58
- package/dist/esm/store/index.d.ts +3 -2
- package/dist/esm/store/index.d.ts.map +1 -1
- package/dist/esm/store/initialState.d.ts +3 -2
- package/dist/esm/store/initialState.d.ts.map +1 -1
- package/dist/esm/types/component-props.d.ts +8 -1
- package/dist/esm/types/component-props.d.ts.map +1 -1
- package/dist/esm/types/store.d.ts +4 -1
- package/dist/esm/types/store.d.ts.map +1 -1
- package/dist/umd/additional-components/MiniMap/MiniMap.d.ts +1 -1
- package/dist/umd/additional-components/MiniMap/MiniMapNodes.d.ts.map +1 -1
- package/dist/umd/components/BatchProvider/index.d.ts.map +1 -1
- package/dist/umd/components/EdgeWrapper/EdgeUpdateAnchors.d.ts.map +1 -1
- package/dist/umd/components/EdgeWrapper/index.d.ts.map +1 -1
- package/dist/umd/components/NodesSelection/index.d.ts.map +1 -1
- package/dist/umd/components/ReactFlowProvider/index.d.ts +3 -2
- package/dist/umd/components/ReactFlowProvider/index.d.ts.map +1 -1
- package/dist/umd/components/StoreUpdater/index.d.ts +1 -1
- package/dist/umd/components/StoreUpdater/index.d.ts.map +1 -1
- package/dist/umd/container/FlowRenderer/index.d.ts.map +1 -1
- package/dist/umd/container/ReactFlow/Wrapper.d.ts +3 -2
- package/dist/umd/container/ReactFlow/Wrapper.d.ts.map +1 -1
- package/dist/umd/container/ReactFlow/index.d.ts.map +1 -1
- package/dist/umd/container/ZoomPane/index.d.ts.map +1 -1
- package/dist/umd/hooks/useDrag.d.ts.map +1 -1
- package/dist/umd/hooks/useNodesData.d.ts +3 -2
- package/dist/umd/hooks/useNodesData.d.ts.map +1 -1
- package/dist/umd/hooks/useOnEdgesChangeMiddleware.d.ts +10 -0
- package/dist/umd/hooks/useOnEdgesChangeMiddleware.d.ts.map +1 -0
- package/dist/umd/hooks/useOnNodesChangeMiddleware.d.ts +10 -0
- package/dist/umd/hooks/useOnNodesChangeMiddleware.d.ts.map +1 -0
- package/dist/umd/index.d.ts +3 -1
- package/dist/umd/index.d.ts.map +1 -1
- package/dist/umd/index.js +2 -2
- package/dist/umd/store/index.d.ts +3 -2
- package/dist/umd/store/index.d.ts.map +1 -1
- package/dist/umd/store/initialState.d.ts +3 -2
- package/dist/umd/store/initialState.d.ts.map +1 -1
- package/dist/umd/types/component-props.d.ts +8 -1
- package/dist/umd/types/component-props.d.ts.map +1 -1
- package/dist/umd/types/store.d.ts +4 -1
- package/dist/umd/types/store.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/esm/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { createContext, useContext, useMemo, forwardRef, useEffect, useRef, useState, useLayoutEffect, useCallback, memo } from 'react';
|
|
4
4
|
import cc from 'classcat';
|
|
5
|
-
import { errorMessages, mergeAriaLabelConfig, infiniteExtent, isInputDOMNode, getViewportForBounds, pointToRendererPoint, rendererPointToPoint, isNodeBase, isEdgeBase, getElementsToRemove, isRectObject, nodeToRect, getOverlappingArea, getNodesBounds, withResolvers, evaluateAbsolutePosition, getDimensions, XYPanZoom, PanOnScrollMode, SelectionMode, getEventPosition, getNodesInside, areSetsEqual, XYDrag, snapPosition, calculateNodePosition, Position, ConnectionMode, isMouseEvent, XYHandle, getHostForElement, addEdge, getInternalNodesBounds, isNumeric, nodeHasDimensions, getNodeDimensions, elementSelectionKeys, isEdgeVisible, MarkerType, createMarkerIds, getBezierEdgeCenter, getSmoothStepPath, getStraightPath, getBezierPath, getEdgePosition, getElevatedEdgeZIndex, getMarkerId, getConnectionStatus, ConnectionLineType, updateConnectionLookup, adoptUserNodes, initialConnection, devWarn, defaultAriaLabelConfig, updateNodeInternals, updateAbsolutePositions, handleExpandParent, panBy, fitViewport, isMacOs, areConnectionMapsEqual, handleConnectionChange, shallowNodeData, XYMinimap, getBoundsOfRects, ResizeControlVariant, XYResizer, XY_RESIZER_LINE_POSITIONS, XY_RESIZER_HANDLE_POSITIONS, getNodeToolbarTransform, getEdgeToolbarTransform } from '@xyflow/system';
|
|
5
|
+
import { errorMessages, mergeAriaLabelConfig, infiniteExtent, isInputDOMNode, getViewportForBounds, pointToRendererPoint, rendererPointToPoint, isNodeBase, isEdgeBase, getElementsToRemove, isRectObject, nodeToRect, getOverlappingArea, getNodesBounds, withResolvers, evaluateAbsolutePosition, getDimensions, XYPanZoom, PanOnScrollMode, SelectionMode, getEventPosition, getNodesInside, areSetsEqual, XYDrag, snapPosition, calculateNodePosition, Position, ConnectionMode, isMouseEvent, XYHandle, getHostForElement, addEdge, getInternalNodesBounds, isNumeric, nodeHasDimensions, getNodeDimensions, elementSelectionKeys, isEdgeVisible, MarkerType, createMarkerIds, getBezierEdgeCenter, getSmoothStepPath, getStraightPath, getBezierPath, getEdgePosition, getElevatedEdgeZIndex, getMarkerId, getConnectionStatus, ConnectionLineType, updateConnectionLookup, adoptUserNodes, initialConnection, devWarn, defaultAriaLabelConfig, updateNodeInternals, updateAbsolutePositions, getHandlePosition, handleExpandParent, panBy, fitViewport, isMacOs, areConnectionMapsEqual, handleConnectionChange, shallowNodeData, XYMinimap, getBoundsOfRects, ResizeControlVariant, XYResizer, XY_RESIZER_LINE_POSITIONS, XY_RESIZER_HANDLE_POSITIONS, getNodeToolbarTransform, getEdgeToolbarTransform } from '@xyflow/system';
|
|
6
6
|
export { ConnectionLineType, ConnectionMode, MarkerType, PanOnScrollMode, Position, ResizeControlVariant, SelectionMode, addEdge, getBezierEdgeCenter, getBezierPath, getConnectedEdges, getEdgeCenter, getIncomers, getNodesBounds, getOutgoers, getSmoothStepPath, getStraightPath, getViewportForBounds, reconnectEdge } from '@xyflow/system';
|
|
7
7
|
import { useStoreWithEqualityFn, createWithEqualityFn } from 'zustand/traditional';
|
|
8
8
|
import { shallow } from 'zustand/shallow';
|
|
@@ -239,6 +239,7 @@ const reactFlowFieldsToTrack = [
|
|
|
239
239
|
'debug',
|
|
240
240
|
'autoPanSpeed',
|
|
241
241
|
'ariaLabelConfig',
|
|
242
|
+
'zIndexMode',
|
|
242
243
|
];
|
|
243
244
|
// rfId doesn't exist in ReactFlowProps, but it's one of the fields we want to update
|
|
244
245
|
const fieldsToTrack = [...reactFlowFieldsToTrack, 'rfId'];
|
|
@@ -676,9 +677,9 @@ function applyChange(change, element) {
|
|
|
676
677
|
}
|
|
677
678
|
case 'dimensions': {
|
|
678
679
|
if (typeof change.dimensions !== 'undefined') {
|
|
679
|
-
element.measured
|
|
680
|
-
|
|
681
|
-
|
|
680
|
+
element.measured = {
|
|
681
|
+
...change.dimensions,
|
|
682
|
+
};
|
|
682
683
|
if (change.setAttributes) {
|
|
683
684
|
if (change.setAttributes === true || change.setAttributes === 'width') {
|
|
684
685
|
element.width = change.dimensions.width;
|
|
@@ -931,7 +932,7 @@ const BatchContext = createContext(null);
|
|
|
931
932
|
function BatchProvider({ children, }) {
|
|
932
933
|
const store = useStoreApi();
|
|
933
934
|
const nodeQueueHandler = useCallback((queueItems) => {
|
|
934
|
-
const { nodes = [], setNodes, hasDefaultNodes, onNodesChange, nodeLookup, fitViewQueued } = store.getState();
|
|
935
|
+
const { nodes = [], setNodes, hasDefaultNodes, onNodesChange, nodeLookup, fitViewQueued, onNodesChangeMiddlewareMap, } = store.getState();
|
|
935
936
|
/*
|
|
936
937
|
* This is essentially an `Array.reduce` in imperative clothing. Processing
|
|
937
938
|
* this queue is a relatively hot path so we'd like to avoid the overhead of
|
|
@@ -941,10 +942,13 @@ function BatchProvider({ children, }) {
|
|
|
941
942
|
for (const payload of queueItems) {
|
|
942
943
|
next = typeof payload === 'function' ? payload(next) : payload;
|
|
943
944
|
}
|
|
944
|
-
|
|
945
|
+
let changes = getElementsDiffChanges({
|
|
945
946
|
items: next,
|
|
946
947
|
lookup: nodeLookup,
|
|
947
948
|
});
|
|
949
|
+
for (const middleware of onNodesChangeMiddlewareMap.values()) {
|
|
950
|
+
changes = middleware(changes);
|
|
951
|
+
}
|
|
948
952
|
if (hasDefaultNodes) {
|
|
949
953
|
setNodes(next);
|
|
950
954
|
}
|
|
@@ -1297,7 +1301,7 @@ function ZoomPane({ onPaneContextMenu, zoomOnScroll = true, zoomOnPinch = true,
|
|
|
1297
1301
|
maxZoom,
|
|
1298
1302
|
translateExtent,
|
|
1299
1303
|
viewport: defaultViewport,
|
|
1300
|
-
onDraggingChange: (paneDragging) => store.setState({ paneDragging }),
|
|
1304
|
+
onDraggingChange: (paneDragging) => store.setState((prevState) => prevState.paneDragging === paneDragging ? prevState : { paneDragging }),
|
|
1301
1305
|
onPanZoomStart: (event, vp) => {
|
|
1302
1306
|
const { onViewportChangeStart, onMoveStart } = store.getState();
|
|
1303
1307
|
onMoveStart?.(event, vp);
|
|
@@ -1601,23 +1605,21 @@ function useDrag({ nodeRef, disabled = false, noDragClassName, handleSelector, n
|
|
|
1601
1605
|
});
|
|
1602
1606
|
}, []);
|
|
1603
1607
|
useEffect(() => {
|
|
1604
|
-
if (disabled) {
|
|
1605
|
-
|
|
1606
|
-
}
|
|
1607
|
-
else if (nodeRef.current) {
|
|
1608
|
-
xyDrag.current?.update({
|
|
1609
|
-
noDragClassName,
|
|
1610
|
-
handleSelector,
|
|
1611
|
-
domNode: nodeRef.current,
|
|
1612
|
-
isSelectable,
|
|
1613
|
-
nodeId,
|
|
1614
|
-
nodeClickDistance,
|
|
1615
|
-
});
|
|
1616
|
-
return () => {
|
|
1617
|
-
xyDrag.current?.destroy();
|
|
1618
|
-
};
|
|
1608
|
+
if (disabled || !nodeRef.current || !xyDrag.current) {
|
|
1609
|
+
return;
|
|
1619
1610
|
}
|
|
1620
|
-
|
|
1611
|
+
xyDrag.current.update({
|
|
1612
|
+
noDragClassName,
|
|
1613
|
+
handleSelector,
|
|
1614
|
+
domNode: nodeRef.current,
|
|
1615
|
+
isSelectable,
|
|
1616
|
+
nodeId,
|
|
1617
|
+
nodeClickDistance,
|
|
1618
|
+
});
|
|
1619
|
+
return () => {
|
|
1620
|
+
xyDrag.current?.destroy();
|
|
1621
|
+
};
|
|
1622
|
+
}, [noDragClassName, handleSelector, disabled, isSelectable, nodeRef, nodeId, nodeClickDistance]);
|
|
1621
1623
|
return dragging;
|
|
1622
1624
|
}
|
|
1623
1625
|
|
|
@@ -1773,10 +1775,10 @@ function HandleComponent({ type = 'source', position = Position.Top, isValidConn
|
|
|
1773
1775
|
panBy: currentStore.panBy,
|
|
1774
1776
|
cancelConnection: currentStore.cancelConnection,
|
|
1775
1777
|
onConnectStart: currentStore.onConnectStart,
|
|
1776
|
-
onConnectEnd:
|
|
1778
|
+
onConnectEnd: (...args) => store.getState().onConnectEnd?.(...args),
|
|
1777
1779
|
updateConnection: currentStore.updateConnection,
|
|
1778
1780
|
onConnect: onConnectExtended,
|
|
1779
|
-
isValidConnection: isValidConnection ||
|
|
1781
|
+
isValidConnection: isValidConnection || ((...args) => store.getState().isValidConnection?.(...args) ?? true),
|
|
1780
1782
|
getTransform: () => store.getState().transform,
|
|
1781
1783
|
getFromHandle: () => store.getState().connection.fromHandle,
|
|
1782
1784
|
autoPanSpeed: currentStore.autoPanSpeed,
|
|
@@ -1944,10 +1946,12 @@ function NodesSelection({ onSelectionContextMenu, noPanClassName, disableKeyboar
|
|
|
1944
1946
|
});
|
|
1945
1947
|
}
|
|
1946
1948
|
}, [disableKeyboardA11y]);
|
|
1949
|
+
const shouldRender = !userSelectionActive && width !== null && height !== null;
|
|
1947
1950
|
useDrag({
|
|
1948
1951
|
nodeRef,
|
|
1952
|
+
disabled: !shouldRender,
|
|
1949
1953
|
});
|
|
1950
|
-
if (
|
|
1954
|
+
if (!shouldRender) {
|
|
1951
1955
|
return null;
|
|
1952
1956
|
}
|
|
1953
1957
|
const onContextMenu = onSelectionContextMenu
|
|
@@ -1978,7 +1982,7 @@ const selector$e = (s) => {
|
|
|
1978
1982
|
return { nodesSelectionActive: s.nodesSelectionActive, userSelectionActive: s.userSelectionActive };
|
|
1979
1983
|
};
|
|
1980
1984
|
function FlowRendererComponent({ children, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneContextMenu, onPaneScroll, paneClickDistance, deleteKeyCode, selectionKeyCode, selectionOnDrag, selectionMode, onSelectionStart, onSelectionEnd, multiSelectionKeyCode, panActivationKeyCode, zoomActivationKeyCode, elementsSelectable, zoomOnScroll, zoomOnPinch, panOnScroll: _panOnScroll, panOnScrollSpeed, panOnScrollMode, zoomOnDoubleClick, panOnDrag: _panOnDrag, defaultViewport, translateExtent, minZoom, maxZoom, preventScrolling, onSelectionContextMenu, noWheelClassName, noPanClassName, disableKeyboardA11y, onViewportChange, isControlledViewport, }) {
|
|
1981
|
-
const { nodesSelectionActive, userSelectionActive } = useStore(selector$e);
|
|
1985
|
+
const { nodesSelectionActive, userSelectionActive } = useStore(selector$e, shallow);
|
|
1982
1986
|
const selectionKeyPressed = useKeyPress(selectionKeyCode, { target: win });
|
|
1983
1987
|
const panActivationKeyPressed = useKeyPress(panActivationKeyCode, { target: win });
|
|
1984
1988
|
const panOnDrag = panActivationKeyPressed || _panOnDrag;
|
|
@@ -2742,7 +2746,7 @@ function EdgeUpdateAnchors({ isReconnectable, reconnectRadius, edge, sourceX, so
|
|
|
2742
2746
|
if (event.button !== 0) {
|
|
2743
2747
|
return;
|
|
2744
2748
|
}
|
|
2745
|
-
const { autoPanOnConnect, domNode,
|
|
2749
|
+
const { autoPanOnConnect, domNode, connectionMode, connectionRadius, lib, onConnectStart, cancelConnection, nodeLookup, rfId: flowId, panBy, updateConnection, } = store.getState();
|
|
2746
2750
|
const isTarget = oppositeHandle.type === 'target';
|
|
2747
2751
|
const _onReconnectEnd = (evt, connectionState) => {
|
|
2748
2752
|
setReconnecting(false);
|
|
@@ -2768,10 +2772,10 @@ function EdgeUpdateAnchors({ isReconnectable, reconnectRadius, edge, sourceX, so
|
|
|
2768
2772
|
flowId,
|
|
2769
2773
|
cancelConnection,
|
|
2770
2774
|
panBy,
|
|
2771
|
-
isValidConnection,
|
|
2775
|
+
isValidConnection: (...args) => store.getState().isValidConnection?.(...args) ?? true,
|
|
2772
2776
|
onConnect: onConnectEdge,
|
|
2773
2777
|
onConnectStart: _onConnectStart,
|
|
2774
|
-
onConnectEnd,
|
|
2778
|
+
onConnectEnd: (...args) => store.getState().onConnectEnd?.(...args),
|
|
2775
2779
|
onReconnectEnd: _onReconnectEnd,
|
|
2776
2780
|
updateConnection,
|
|
2777
2781
|
getTransform: () => store.getState().transform,
|
|
@@ -2830,6 +2834,7 @@ function EdgeWrapper({ id, edgesFocusable, edgesReconnectable, elementsSelectabl
|
|
|
2830
2834
|
sourceNode,
|
|
2831
2835
|
targetNode,
|
|
2832
2836
|
elevateOnSelect: store.elevateEdgesOnSelect,
|
|
2837
|
+
zIndexMode: store.zIndexMode,
|
|
2833
2838
|
});
|
|
2834
2839
|
return {
|
|
2835
2840
|
zIndex,
|
|
@@ -3119,7 +3124,7 @@ function GraphViewComponent({ nodeTypes, edgeTypes, onInit, onNodeClick, onEdgeC
|
|
|
3119
3124
|
GraphViewComponent.displayName = 'GraphView';
|
|
3120
3125
|
const GraphView = memo(GraphViewComponent);
|
|
3121
3126
|
|
|
3122
|
-
const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom = 0.5, maxZoom = 2, nodeOrigin, nodeExtent, } = {}) => {
|
|
3127
|
+
const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom = 0.5, maxZoom = 2, nodeOrigin, nodeExtent, zIndexMode = 'basic', } = {}) => {
|
|
3123
3128
|
const nodeLookup = new Map();
|
|
3124
3129
|
const parentLookup = new Map();
|
|
3125
3130
|
const connectionLookup = new Map();
|
|
@@ -3132,7 +3137,7 @@ const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, heig
|
|
|
3132
3137
|
const nodesInitialized = adoptUserNodes(storeNodes, nodeLookup, parentLookup, {
|
|
3133
3138
|
nodeOrigin: storeNodeOrigin,
|
|
3134
3139
|
nodeExtent: storeNodeExtent,
|
|
3135
|
-
|
|
3140
|
+
zIndexMode,
|
|
3136
3141
|
});
|
|
3137
3142
|
let transform = [0, 0, 1];
|
|
3138
3143
|
if (fitView && width && height) {
|
|
@@ -3182,7 +3187,7 @@ const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, heig
|
|
|
3182
3187
|
edgesReconnectable: true,
|
|
3183
3188
|
elementsSelectable: true,
|
|
3184
3189
|
elevateNodesOnSelect: true,
|
|
3185
|
-
elevateEdgesOnSelect:
|
|
3190
|
+
elevateEdgesOnSelect: true,
|
|
3186
3191
|
selectNodesOnDrag: true,
|
|
3187
3192
|
multiSelectionActive: false,
|
|
3188
3193
|
fitViewQueued: fitView ?? false,
|
|
@@ -3203,10 +3208,13 @@ const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, heig
|
|
|
3203
3208
|
lib: 'react',
|
|
3204
3209
|
debug: false,
|
|
3205
3210
|
ariaLabelConfig: defaultAriaLabelConfig,
|
|
3211
|
+
zIndexMode,
|
|
3212
|
+
onNodesChangeMiddlewareMap: new Map(),
|
|
3213
|
+
onEdgesChangeMiddlewareMap: new Map(),
|
|
3206
3214
|
};
|
|
3207
3215
|
};
|
|
3208
3216
|
|
|
3209
|
-
const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, }) => createWithEqualityFn((set, get) => {
|
|
3217
|
+
const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, zIndexMode, }) => createWithEqualityFn((set, get) => {
|
|
3210
3218
|
async function resolveFitView() {
|
|
3211
3219
|
const { nodeLookup, panZoom, fitViewOptions, fitViewResolver, width, height, minZoom, maxZoom } = get();
|
|
3212
3220
|
if (!panZoom) {
|
|
@@ -3241,9 +3249,10 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3241
3249
|
nodeExtent,
|
|
3242
3250
|
defaultNodes,
|
|
3243
3251
|
defaultEdges,
|
|
3252
|
+
zIndexMode,
|
|
3244
3253
|
}),
|
|
3245
3254
|
setNodes: (nodes) => {
|
|
3246
|
-
const { nodeLookup, parentLookup, nodeOrigin, elevateNodesOnSelect, fitViewQueued } = get();
|
|
3255
|
+
const { nodeLookup, parentLookup, nodeOrigin, elevateNodesOnSelect, fitViewQueued, zIndexMode } = get();
|
|
3247
3256
|
/*
|
|
3248
3257
|
* setNodes() is called exclusively in response to user actions:
|
|
3249
3258
|
* - either when the `<ReactFlow nodes>` prop is updated in the controlled ReactFlow setup,
|
|
@@ -3257,6 +3266,7 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3257
3266
|
nodeExtent,
|
|
3258
3267
|
elevateNodesOnSelect,
|
|
3259
3268
|
checkEquality: true,
|
|
3269
|
+
zIndexMode,
|
|
3260
3270
|
});
|
|
3261
3271
|
if (fitViewQueued && nodesInitialized) {
|
|
3262
3272
|
resolveFitView();
|
|
@@ -3289,12 +3299,12 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3289
3299
|
* new dimensions and update the nodes.
|
|
3290
3300
|
*/
|
|
3291
3301
|
updateNodeInternals: (updates) => {
|
|
3292
|
-
const { triggerNodeChanges, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent, debug, fitViewQueued } = get();
|
|
3293
|
-
const { changes, updatedInternals } = updateNodeInternals(updates, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent);
|
|
3302
|
+
const { triggerNodeChanges, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent, debug, fitViewQueued, zIndexMode, } = get();
|
|
3303
|
+
const { changes, updatedInternals } = updateNodeInternals(updates, nodeLookup, parentLookup, domNode, nodeOrigin, nodeExtent, zIndexMode);
|
|
3294
3304
|
if (!updatedInternals) {
|
|
3295
3305
|
return;
|
|
3296
3306
|
}
|
|
3297
|
-
updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin, nodeExtent });
|
|
3307
|
+
updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin, nodeExtent, zIndexMode });
|
|
3298
3308
|
if (fitViewQueued) {
|
|
3299
3309
|
resolveFitView();
|
|
3300
3310
|
set({ fitViewQueued: false, fitViewOptions: undefined });
|
|
@@ -3312,8 +3322,8 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3312
3322
|
},
|
|
3313
3323
|
updateNodePositions: (nodeDragItems, dragging = false) => {
|
|
3314
3324
|
const parentExpandChildren = [];
|
|
3315
|
-
|
|
3316
|
-
const { nodeLookup, triggerNodeChanges } = get();
|
|
3325
|
+
let changes = [];
|
|
3326
|
+
const { nodeLookup, triggerNodeChanges, connection, updateConnection, onNodesChangeMiddlewareMap } = get();
|
|
3317
3327
|
for (const [id, dragItem] of nodeDragItems) {
|
|
3318
3328
|
// we are using the nodelookup to be sure to use the current expandParent and parentId value
|
|
3319
3329
|
const node = nodeLookup.get(id);
|
|
@@ -3329,6 +3339,10 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3329
3339
|
: dragItem.position,
|
|
3330
3340
|
dragging,
|
|
3331
3341
|
};
|
|
3342
|
+
if (node && connection.inProgress && connection.fromNode.id === node.id) {
|
|
3343
|
+
const updatedFrom = getHandlePosition(node, connection.fromHandle, Position.Left, true);
|
|
3344
|
+
updateConnection({ ...connection, from: updatedFrom });
|
|
3345
|
+
}
|
|
3332
3346
|
if (expandParent && node.parentId) {
|
|
3333
3347
|
parentExpandChildren.push({
|
|
3334
3348
|
id,
|
|
@@ -3347,6 +3361,9 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3347
3361
|
const parentExpandChanges = handleExpandParent(parentExpandChildren, nodeLookup, parentLookup, nodeOrigin);
|
|
3348
3362
|
changes.push(...parentExpandChanges);
|
|
3349
3363
|
}
|
|
3364
|
+
for (const middleware of onNodesChangeMiddlewareMap.values()) {
|
|
3365
|
+
changes = middleware(changes);
|
|
3366
|
+
}
|
|
3350
3367
|
triggerNodeChanges(changes);
|
|
3351
3368
|
},
|
|
3352
3369
|
triggerNodeChanges: (changes) => {
|
|
@@ -3399,8 +3416,12 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3399
3416
|
const { edges: storeEdges, nodes: storeNodes, nodeLookup, triggerNodeChanges, triggerEdgeChanges } = get();
|
|
3400
3417
|
const nodesToUnselect = nodes ? nodes : storeNodes;
|
|
3401
3418
|
const edgesToUnselect = edges ? edges : storeEdges;
|
|
3402
|
-
const nodeChanges =
|
|
3403
|
-
|
|
3419
|
+
const nodeChanges = [];
|
|
3420
|
+
for (const node of nodesToUnselect) {
|
|
3421
|
+
if (!node.selected) {
|
|
3422
|
+
continue; // skip changing nodes that are not selected
|
|
3423
|
+
}
|
|
3424
|
+
const internalNode = nodeLookup.get(node.id);
|
|
3404
3425
|
if (internalNode) {
|
|
3405
3426
|
/*
|
|
3406
3427
|
* we need to unselect the internal node that was selected previously before we
|
|
@@ -3408,9 +3429,15 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3408
3429
|
*/
|
|
3409
3430
|
internalNode.selected = false;
|
|
3410
3431
|
}
|
|
3411
|
-
|
|
3412
|
-
}
|
|
3413
|
-
const edgeChanges =
|
|
3432
|
+
nodeChanges.push(createSelectionChange(node.id, false));
|
|
3433
|
+
}
|
|
3434
|
+
const edgeChanges = [];
|
|
3435
|
+
for (const edge of edgesToUnselect) {
|
|
3436
|
+
if (!edge.selected) {
|
|
3437
|
+
continue; // skip changing edges that are not selected
|
|
3438
|
+
}
|
|
3439
|
+
edgeChanges.push(createSelectionChange(edge.id, false));
|
|
3440
|
+
}
|
|
3414
3441
|
triggerNodeChanges(nodeChanges);
|
|
3415
3442
|
triggerEdgeChanges(edgeChanges);
|
|
3416
3443
|
},
|
|
@@ -3439,7 +3466,7 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3439
3466
|
triggerEdgeChanges(edgeChanges);
|
|
3440
3467
|
},
|
|
3441
3468
|
setNodeExtent: (nextNodeExtent) => {
|
|
3442
|
-
const { nodes, nodeLookup, parentLookup, nodeOrigin, elevateNodesOnSelect, nodeExtent } = get();
|
|
3469
|
+
const { nodes, nodeLookup, parentLookup, nodeOrigin, elevateNodesOnSelect, nodeExtent, zIndexMode } = get();
|
|
3443
3470
|
if (nextNodeExtent[0][0] === nodeExtent[0][0] &&
|
|
3444
3471
|
nextNodeExtent[0][1] === nodeExtent[0][1] &&
|
|
3445
3472
|
nextNodeExtent[1][0] === nodeExtent[1][0] &&
|
|
@@ -3451,6 +3478,7 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3451
3478
|
nodeExtent: nextNodeExtent,
|
|
3452
3479
|
elevateNodesOnSelect,
|
|
3453
3480
|
checkEquality: false,
|
|
3481
|
+
zIndexMode,
|
|
3454
3482
|
});
|
|
3455
3483
|
set({ nodeExtent: nextNodeExtent });
|
|
3456
3484
|
},
|
|
@@ -3517,7 +3545,7 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
|
|
|
3517
3545
|
* your router. If you have multiple flows on the same page you will need to use a separate
|
|
3518
3546
|
* `<ReactFlowProvider />` for each flow.
|
|
3519
3547
|
*/
|
|
3520
|
-
function ReactFlowProvider({ initialNodes: nodes, initialEdges: edges, defaultNodes, defaultEdges, initialWidth: width, initialHeight: height, initialMinZoom: minZoom, initialMaxZoom: maxZoom, initialFitViewOptions: fitViewOptions, fitView, nodeOrigin, nodeExtent, children, }) {
|
|
3548
|
+
function ReactFlowProvider({ initialNodes: nodes, initialEdges: edges, defaultNodes, defaultEdges, initialWidth: width, initialHeight: height, initialMinZoom: minZoom, initialMaxZoom: maxZoom, initialFitViewOptions: fitViewOptions, fitView, nodeOrigin, nodeExtent, zIndexMode, children, }) {
|
|
3521
3549
|
const [store] = useState(() => createStore({
|
|
3522
3550
|
nodes,
|
|
3523
3551
|
edges,
|
|
@@ -3531,11 +3559,12 @@ function ReactFlowProvider({ initialNodes: nodes, initialEdges: edges, defaultNo
|
|
|
3531
3559
|
fitViewOptions,
|
|
3532
3560
|
nodeOrigin,
|
|
3533
3561
|
nodeExtent,
|
|
3562
|
+
zIndexMode,
|
|
3534
3563
|
}));
|
|
3535
3564
|
return (jsx(Provider$1, { value: store, children: jsx(BatchProvider, { children: children }) }));
|
|
3536
3565
|
}
|
|
3537
3566
|
|
|
3538
|
-
function Wrapper({ children, nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, }) {
|
|
3567
|
+
function Wrapper({ children, nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, zIndexMode, }) {
|
|
3539
3568
|
const isWrapped = useContext(StoreContext);
|
|
3540
3569
|
if (isWrapped) {
|
|
3541
3570
|
/*
|
|
@@ -3544,7 +3573,7 @@ function Wrapper({ children, nodes, edges, defaultNodes, defaultEdges, width, he
|
|
|
3544
3573
|
*/
|
|
3545
3574
|
return jsx(Fragment, { children: children });
|
|
3546
3575
|
}
|
|
3547
|
-
return (jsx(ReactFlowProvider, { initialNodes: nodes, initialEdges: edges, defaultNodes: defaultNodes, defaultEdges: defaultEdges, initialWidth: width, initialHeight: height, fitView: fitView, initialFitViewOptions: fitViewOptions, initialMinZoom: minZoom, initialMaxZoom: maxZoom, nodeOrigin: nodeOrigin, nodeExtent: nodeExtent, children: children }));
|
|
3576
|
+
return (jsx(ReactFlowProvider, { initialNodes: nodes, initialEdges: edges, defaultNodes: defaultNodes, defaultEdges: defaultEdges, initialWidth: width, initialHeight: height, fitView: fitView, initialFitViewOptions: fitViewOptions, initialMinZoom: minZoom, initialMaxZoom: maxZoom, nodeOrigin: nodeOrigin, nodeExtent: nodeExtent, zIndexMode: zIndexMode, children: children }));
|
|
3548
3577
|
}
|
|
3549
3578
|
|
|
3550
3579
|
const wrapperStyle = {
|
|
@@ -3554,7 +3583,7 @@ const wrapperStyle = {
|
|
|
3554
3583
|
position: 'relative',
|
|
3555
3584
|
zIndex: 0,
|
|
3556
3585
|
};
|
|
3557
|
-
function ReactFlow({ nodes, edges, defaultNodes, defaultEdges, className, nodeTypes, edgeTypes, onNodeClick, onEdgeClick, onInit, onMove, onMoveStart, onMoveEnd, onConnect, onConnectStart, onConnectEnd, onClickConnectStart, onClickConnectEnd, onNodeMouseEnter, onNodeMouseMove, onNodeMouseLeave, onNodeContextMenu, onNodeDoubleClick, onNodeDragStart, onNodeDrag, onNodeDragStop, onNodesDelete, onEdgesDelete, onDelete, onSelectionChange, onSelectionDragStart, onSelectionDrag, onSelectionDragStop, onSelectionContextMenu, onSelectionStart, onSelectionEnd, onBeforeDelete, connectionMode, connectionLineType = ConnectionLineType.Bezier, connectionLineStyle, connectionLineComponent, connectionLineContainerStyle, deleteKeyCode = 'Backspace', selectionKeyCode = 'Shift', selectionOnDrag = false, selectionMode = SelectionMode.Full, panActivationKeyCode = 'Space', multiSelectionKeyCode = isMacOs() ? 'Meta' : 'Control', zoomActivationKeyCode = isMacOs() ? 'Meta' : 'Control', snapToGrid, snapGrid, onlyRenderVisibleElements = false, selectNodesOnDrag, nodesDraggable, autoPanOnNodeFocus, nodesConnectable, nodesFocusable, nodeOrigin = defaultNodeOrigin, edgesFocusable, edgesReconnectable, elementsSelectable = true, defaultViewport: defaultViewport$1 = defaultViewport, minZoom = 0.5, maxZoom = 2, translateExtent = infiniteExtent, preventScrolling = true, nodeExtent, defaultMarkerColor = '#b1b1b7', zoomOnScroll = true, zoomOnPinch = true, panOnScroll = false, panOnScrollSpeed = 0.5, panOnScrollMode = PanOnScrollMode.Free, zoomOnDoubleClick = true, panOnDrag = true, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneScroll, onPaneContextMenu, paneClickDistance = 1, nodeClickDistance = 0, children, onReconnect, onReconnectStart, onReconnectEnd, onEdgeContextMenu, onEdgeDoubleClick, onEdgeMouseEnter, onEdgeMouseMove, onEdgeMouseLeave, reconnectRadius = 10, onNodesChange, onEdgesChange, noDragClassName = 'nodrag', noWheelClassName = 'nowheel', noPanClassName = 'nopan', fitView, fitViewOptions, connectOnClick, attributionPosition, proOptions, defaultEdgeOptions, elevateNodesOnSelect, elevateEdgesOnSelect, disableKeyboardA11y = false, autoPanOnConnect, autoPanOnNodeDrag, autoPanSpeed, connectionRadius, isValidConnection, onError, style, id, nodeDragThreshold, connectionDragThreshold, viewport, onViewportChange, width, height, colorMode = 'light', debug, onScroll, ariaLabelConfig, ...rest }, ref) {
|
|
3586
|
+
function ReactFlow({ nodes, edges, defaultNodes, defaultEdges, className, nodeTypes, edgeTypes, onNodeClick, onEdgeClick, onInit, onMove, onMoveStart, onMoveEnd, onConnect, onConnectStart, onConnectEnd, onClickConnectStart, onClickConnectEnd, onNodeMouseEnter, onNodeMouseMove, onNodeMouseLeave, onNodeContextMenu, onNodeDoubleClick, onNodeDragStart, onNodeDrag, onNodeDragStop, onNodesDelete, onEdgesDelete, onDelete, onSelectionChange, onSelectionDragStart, onSelectionDrag, onSelectionDragStop, onSelectionContextMenu, onSelectionStart, onSelectionEnd, onBeforeDelete, connectionMode, connectionLineType = ConnectionLineType.Bezier, connectionLineStyle, connectionLineComponent, connectionLineContainerStyle, deleteKeyCode = 'Backspace', selectionKeyCode = 'Shift', selectionOnDrag = false, selectionMode = SelectionMode.Full, panActivationKeyCode = 'Space', multiSelectionKeyCode = isMacOs() ? 'Meta' : 'Control', zoomActivationKeyCode = isMacOs() ? 'Meta' : 'Control', snapToGrid, snapGrid, onlyRenderVisibleElements = false, selectNodesOnDrag, nodesDraggable, autoPanOnNodeFocus, nodesConnectable, nodesFocusable, nodeOrigin = defaultNodeOrigin, edgesFocusable, edgesReconnectable, elementsSelectable = true, defaultViewport: defaultViewport$1 = defaultViewport, minZoom = 0.5, maxZoom = 2, translateExtent = infiniteExtent, preventScrolling = true, nodeExtent, defaultMarkerColor = '#b1b1b7', zoomOnScroll = true, zoomOnPinch = true, panOnScroll = false, panOnScrollSpeed = 0.5, panOnScrollMode = PanOnScrollMode.Free, zoomOnDoubleClick = true, panOnDrag = true, onPaneClick, onPaneMouseEnter, onPaneMouseMove, onPaneMouseLeave, onPaneScroll, onPaneContextMenu, paneClickDistance = 1, nodeClickDistance = 0, children, onReconnect, onReconnectStart, onReconnectEnd, onEdgeContextMenu, onEdgeDoubleClick, onEdgeMouseEnter, onEdgeMouseMove, onEdgeMouseLeave, reconnectRadius = 10, onNodesChange, onEdgesChange, noDragClassName = 'nodrag', noWheelClassName = 'nowheel', noPanClassName = 'nopan', fitView, fitViewOptions, connectOnClick, attributionPosition, proOptions, defaultEdgeOptions, elevateNodesOnSelect = true, elevateEdgesOnSelect = false, disableKeyboardA11y = false, autoPanOnConnect, autoPanOnNodeDrag, autoPanSpeed, connectionRadius, isValidConnection, onError, style, id, nodeDragThreshold, connectionDragThreshold, viewport, onViewportChange, width, height, colorMode = 'light', debug, onScroll, ariaLabelConfig, zIndexMode = 'basic', ...rest }, ref) {
|
|
3558
3587
|
const rfId = id || '1';
|
|
3559
3588
|
const colorModeClassName = useColorModeClass(colorMode);
|
|
3560
3589
|
// Undo scroll events, preventing viewport from shifting when nodes outside of it are focused
|
|
@@ -3562,7 +3591,7 @@ function ReactFlow({ nodes, edges, defaultNodes, defaultEdges, className, nodeTy
|
|
|
3562
3591
|
e.currentTarget.scrollTo({ top: 0, left: 0, behavior: 'instant' });
|
|
3563
3592
|
onScroll?.(e);
|
|
3564
3593
|
}, [onScroll]);
|
|
3565
|
-
return (jsx("div", { "data-testid": "rf__wrapper", ...rest, onScroll: wrapperOnScroll, style: { ...style, ...wrapperStyle }, ref: ref, className: cc(['react-flow', className, colorModeClassName]), id: id, role: "application", children: jsxs(Wrapper, { nodes: nodes, edges: edges, width: width, height: height, fitView: fitView, fitViewOptions: fitViewOptions, minZoom: minZoom, maxZoom: maxZoom, nodeOrigin: nodeOrigin, nodeExtent: nodeExtent, children: [jsx(GraphView, { onInit: onInit, onNodeClick: onNodeClick, onEdgeClick: onEdgeClick, onNodeMouseEnter: onNodeMouseEnter, onNodeMouseMove: onNodeMouseMove, onNodeMouseLeave: onNodeMouseLeave, onNodeContextMenu: onNodeContextMenu, onNodeDoubleClick: onNodeDoubleClick, nodeTypes: nodeTypes, edgeTypes: edgeTypes, connectionLineType: connectionLineType, connectionLineStyle: connectionLineStyle, connectionLineComponent: connectionLineComponent, connectionLineContainerStyle: connectionLineContainerStyle, selectionKeyCode: selectionKeyCode, selectionOnDrag: selectionOnDrag, selectionMode: selectionMode, deleteKeyCode: deleteKeyCode, multiSelectionKeyCode: multiSelectionKeyCode, panActivationKeyCode: panActivationKeyCode, zoomActivationKeyCode: zoomActivationKeyCode, onlyRenderVisibleElements: onlyRenderVisibleElements, defaultViewport: defaultViewport$1, translateExtent: translateExtent, minZoom: minZoom, maxZoom: maxZoom, preventScrolling: preventScrolling, zoomOnScroll: zoomOnScroll, zoomOnPinch: zoomOnPinch, zoomOnDoubleClick: zoomOnDoubleClick, panOnScroll: panOnScroll, panOnScrollSpeed: panOnScrollSpeed, panOnScrollMode: panOnScrollMode, panOnDrag: panOnDrag, onPaneClick: onPaneClick, onPaneMouseEnter: onPaneMouseEnter, onPaneMouseMove: onPaneMouseMove, onPaneMouseLeave: onPaneMouseLeave, onPaneScroll: onPaneScroll, onPaneContextMenu: onPaneContextMenu, paneClickDistance: paneClickDistance, nodeClickDistance: nodeClickDistance, onSelectionContextMenu: onSelectionContextMenu, onSelectionStart: onSelectionStart, onSelectionEnd: onSelectionEnd, onReconnect: onReconnect, onReconnectStart: onReconnectStart, onReconnectEnd: onReconnectEnd, onEdgeContextMenu: onEdgeContextMenu, onEdgeDoubleClick: onEdgeDoubleClick, onEdgeMouseEnter: onEdgeMouseEnter, onEdgeMouseMove: onEdgeMouseMove, onEdgeMouseLeave: onEdgeMouseLeave, reconnectRadius: reconnectRadius, defaultMarkerColor: defaultMarkerColor, noDragClassName: noDragClassName, noWheelClassName: noWheelClassName, noPanClassName: noPanClassName, rfId: rfId, disableKeyboardA11y: disableKeyboardA11y, nodeExtent: nodeExtent, viewport: viewport, onViewportChange: onViewportChange }), jsx(StoreUpdater, { nodes: nodes, edges: edges, defaultNodes: defaultNodes, defaultEdges: defaultEdges, onConnect: onConnect, onConnectStart: onConnectStart, onConnectEnd: onConnectEnd, onClickConnectStart: onClickConnectStart, onClickConnectEnd: onClickConnectEnd, nodesDraggable: nodesDraggable, autoPanOnNodeFocus: autoPanOnNodeFocus, nodesConnectable: nodesConnectable, nodesFocusable: nodesFocusable, edgesFocusable: edgesFocusable, edgesReconnectable: edgesReconnectable, elementsSelectable: elementsSelectable, elevateNodesOnSelect: elevateNodesOnSelect, elevateEdgesOnSelect: elevateEdgesOnSelect, minZoom: minZoom, maxZoom: maxZoom, nodeExtent: nodeExtent, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, snapToGrid: snapToGrid, snapGrid: snapGrid, connectionMode: connectionMode, translateExtent: translateExtent, connectOnClick: connectOnClick, defaultEdgeOptions: defaultEdgeOptions, fitView: fitView, fitViewOptions: fitViewOptions, onNodesDelete: onNodesDelete, onEdgesDelete: onEdgesDelete, onDelete: onDelete, onNodeDragStart: onNodeDragStart, onNodeDrag: onNodeDrag, onNodeDragStop: onNodeDragStop, onSelectionDrag: onSelectionDrag, onSelectionDragStart: onSelectionDragStart, onSelectionDragStop: onSelectionDragStop, onMove: onMove, onMoveStart: onMoveStart, onMoveEnd: onMoveEnd, noPanClassName: noPanClassName, nodeOrigin: nodeOrigin, rfId: rfId, autoPanOnConnect: autoPanOnConnect, autoPanOnNodeDrag: autoPanOnNodeDrag, autoPanSpeed: autoPanSpeed, onError: onError, connectionRadius: connectionRadius, isValidConnection: isValidConnection, selectNodesOnDrag: selectNodesOnDrag, nodeDragThreshold: nodeDragThreshold, connectionDragThreshold: connectionDragThreshold, onBeforeDelete: onBeforeDelete, debug: debug, ariaLabelConfig: ariaLabelConfig }), jsx(SelectionListener, { onSelectionChange: onSelectionChange }), children, jsx(Attribution, { proOptions: proOptions, position: attributionPosition }), jsx(A11yDescriptions, { rfId: rfId, disableKeyboardA11y: disableKeyboardA11y })] }) }));
|
|
3594
|
+
return (jsx("div", { "data-testid": "rf__wrapper", ...rest, onScroll: wrapperOnScroll, style: { ...style, ...wrapperStyle }, ref: ref, className: cc(['react-flow', className, colorModeClassName]), id: id, role: "application", children: jsxs(Wrapper, { nodes: nodes, edges: edges, width: width, height: height, fitView: fitView, fitViewOptions: fitViewOptions, minZoom: minZoom, maxZoom: maxZoom, nodeOrigin: nodeOrigin, nodeExtent: nodeExtent, zIndexMode: zIndexMode, children: [jsx(GraphView, { onInit: onInit, onNodeClick: onNodeClick, onEdgeClick: onEdgeClick, onNodeMouseEnter: onNodeMouseEnter, onNodeMouseMove: onNodeMouseMove, onNodeMouseLeave: onNodeMouseLeave, onNodeContextMenu: onNodeContextMenu, onNodeDoubleClick: onNodeDoubleClick, nodeTypes: nodeTypes, edgeTypes: edgeTypes, connectionLineType: connectionLineType, connectionLineStyle: connectionLineStyle, connectionLineComponent: connectionLineComponent, connectionLineContainerStyle: connectionLineContainerStyle, selectionKeyCode: selectionKeyCode, selectionOnDrag: selectionOnDrag, selectionMode: selectionMode, deleteKeyCode: deleteKeyCode, multiSelectionKeyCode: multiSelectionKeyCode, panActivationKeyCode: panActivationKeyCode, zoomActivationKeyCode: zoomActivationKeyCode, onlyRenderVisibleElements: onlyRenderVisibleElements, defaultViewport: defaultViewport$1, translateExtent: translateExtent, minZoom: minZoom, maxZoom: maxZoom, preventScrolling: preventScrolling, zoomOnScroll: zoomOnScroll, zoomOnPinch: zoomOnPinch, zoomOnDoubleClick: zoomOnDoubleClick, panOnScroll: panOnScroll, panOnScrollSpeed: panOnScrollSpeed, panOnScrollMode: panOnScrollMode, panOnDrag: panOnDrag, onPaneClick: onPaneClick, onPaneMouseEnter: onPaneMouseEnter, onPaneMouseMove: onPaneMouseMove, onPaneMouseLeave: onPaneMouseLeave, onPaneScroll: onPaneScroll, onPaneContextMenu: onPaneContextMenu, paneClickDistance: paneClickDistance, nodeClickDistance: nodeClickDistance, onSelectionContextMenu: onSelectionContextMenu, onSelectionStart: onSelectionStart, onSelectionEnd: onSelectionEnd, onReconnect: onReconnect, onReconnectStart: onReconnectStart, onReconnectEnd: onReconnectEnd, onEdgeContextMenu: onEdgeContextMenu, onEdgeDoubleClick: onEdgeDoubleClick, onEdgeMouseEnter: onEdgeMouseEnter, onEdgeMouseMove: onEdgeMouseMove, onEdgeMouseLeave: onEdgeMouseLeave, reconnectRadius: reconnectRadius, defaultMarkerColor: defaultMarkerColor, noDragClassName: noDragClassName, noWheelClassName: noWheelClassName, noPanClassName: noPanClassName, rfId: rfId, disableKeyboardA11y: disableKeyboardA11y, nodeExtent: nodeExtent, viewport: viewport, onViewportChange: onViewportChange }), jsx(StoreUpdater, { nodes: nodes, edges: edges, defaultNodes: defaultNodes, defaultEdges: defaultEdges, onConnect: onConnect, onConnectStart: onConnectStart, onConnectEnd: onConnectEnd, onClickConnectStart: onClickConnectStart, onClickConnectEnd: onClickConnectEnd, nodesDraggable: nodesDraggable, autoPanOnNodeFocus: autoPanOnNodeFocus, nodesConnectable: nodesConnectable, nodesFocusable: nodesFocusable, edgesFocusable: edgesFocusable, edgesReconnectable: edgesReconnectable, elementsSelectable: elementsSelectable, elevateNodesOnSelect: elevateNodesOnSelect, elevateEdgesOnSelect: elevateEdgesOnSelect, minZoom: minZoom, maxZoom: maxZoom, nodeExtent: nodeExtent, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, snapToGrid: snapToGrid, snapGrid: snapGrid, connectionMode: connectionMode, translateExtent: translateExtent, connectOnClick: connectOnClick, defaultEdgeOptions: defaultEdgeOptions, fitView: fitView, fitViewOptions: fitViewOptions, onNodesDelete: onNodesDelete, onEdgesDelete: onEdgesDelete, onDelete: onDelete, onNodeDragStart: onNodeDragStart, onNodeDrag: onNodeDrag, onNodeDragStop: onNodeDragStop, onSelectionDrag: onSelectionDrag, onSelectionDragStart: onSelectionDragStart, onSelectionDragStop: onSelectionDragStop, onMove: onMove, onMoveStart: onMoveStart, onMoveEnd: onMoveEnd, noPanClassName: noPanClassName, nodeOrigin: nodeOrigin, rfId: rfId, autoPanOnConnect: autoPanOnConnect, autoPanOnNodeDrag: autoPanOnNodeDrag, autoPanSpeed: autoPanSpeed, onError: onError, connectionRadius: connectionRadius, isValidConnection: isValidConnection, selectNodesOnDrag: selectNodesOnDrag, nodeDragThreshold: nodeDragThreshold, connectionDragThreshold: connectionDragThreshold, onBeforeDelete: onBeforeDelete, debug: debug, ariaLabelConfig: ariaLabelConfig, zIndexMode: zIndexMode }), jsx(SelectionListener, { onSelectionChange: onSelectionChange }), children, jsx(Attribution, { proOptions: proOptions, position: attributionPosition }), jsx(A11yDescriptions, { rfId: rfId, disableKeyboardA11y: disableKeyboardA11y })] }) }));
|
|
3566
3595
|
}
|
|
3567
3596
|
/**
|
|
3568
3597
|
* The `<ReactFlow />` component is the heart of your React Flow application.
|
|
@@ -4180,6 +4209,48 @@ function useInternalNode(id) {
|
|
|
4180
4209
|
return node;
|
|
4181
4210
|
}
|
|
4182
4211
|
|
|
4212
|
+
/**
|
|
4213
|
+
* Registers a middleware function to transform node changes.
|
|
4214
|
+
*
|
|
4215
|
+
* @public
|
|
4216
|
+
* @param fn - Middleware function. Should be memoized with useCallback to avoid re-registration.
|
|
4217
|
+
*/
|
|
4218
|
+
function experimental_useOnNodesChangeMiddleware(fn) {
|
|
4219
|
+
const store = useStoreApi();
|
|
4220
|
+
const [symbol] = useState(() => Symbol());
|
|
4221
|
+
useEffect(() => {
|
|
4222
|
+
const { onNodesChangeMiddlewareMap } = store.getState();
|
|
4223
|
+
onNodesChangeMiddlewareMap.set(symbol, fn);
|
|
4224
|
+
}, [fn]);
|
|
4225
|
+
useEffect(() => {
|
|
4226
|
+
const { onNodesChangeMiddlewareMap } = store.getState();
|
|
4227
|
+
return () => {
|
|
4228
|
+
onNodesChangeMiddlewareMap.delete(symbol);
|
|
4229
|
+
};
|
|
4230
|
+
}, []);
|
|
4231
|
+
}
|
|
4232
|
+
|
|
4233
|
+
/**
|
|
4234
|
+
* Registers a middleware function to transform edge changes.
|
|
4235
|
+
*
|
|
4236
|
+
* @public
|
|
4237
|
+
* @param fn - Middleware function. Should be memoized with useCallback to avoid re-registration.
|
|
4238
|
+
*/
|
|
4239
|
+
function experimental_useOnEdgesChangeMiddleware(fn) {
|
|
4240
|
+
const store = useStoreApi();
|
|
4241
|
+
const [symbol] = useState(() => Symbol());
|
|
4242
|
+
useEffect(() => {
|
|
4243
|
+
const { onEdgesChangeMiddlewareMap } = store.getState();
|
|
4244
|
+
onEdgesChangeMiddlewareMap.set(symbol, fn);
|
|
4245
|
+
}, [fn]);
|
|
4246
|
+
useEffect(() => {
|
|
4247
|
+
const { onEdgesChangeMiddlewareMap } = store.getState();
|
|
4248
|
+
return () => {
|
|
4249
|
+
onEdgesChangeMiddlewareMap.delete(symbol);
|
|
4250
|
+
};
|
|
4251
|
+
}, []);
|
|
4252
|
+
}
|
|
4253
|
+
|
|
4183
4254
|
function LinePattern({ dimensions, lineWidth, variant, className }) {
|
|
4184
4255
|
return (jsx("path", { strokeWidth: lineWidth, d: `M${dimensions[0] / 2} 0 V${dimensions[1]} M0 ${dimensions[1] / 2} H${dimensions[0]}`, className: cc(['react-flow__background-pattern', variant, className]) }));
|
|
4185
4256
|
}
|
|
@@ -4429,12 +4500,15 @@ nodeComponent: NodeComponent = MiniMapNode, onClick, }) {
|
|
|
4429
4500
|
}
|
|
4430
4501
|
function NodeComponentWrapperInner({ id, nodeColorFunc, nodeStrokeColorFunc, nodeClassNameFunc, nodeBorderRadius, nodeStrokeWidth, shapeRendering, NodeComponent, onClick, }) {
|
|
4431
4502
|
const { node, x, y, width, height } = useStore((s) => {
|
|
4432
|
-
const
|
|
4433
|
-
|
|
4434
|
-
|
|
4435
|
-
|
|
4503
|
+
const node = s.nodeLookup.get(id);
|
|
4504
|
+
if (!node) {
|
|
4505
|
+
return { node: undefined, x: 0, y: 0, width: 0, height: 0 };
|
|
4506
|
+
}
|
|
4507
|
+
const userNode = node.internals.userNode;
|
|
4508
|
+
const { x, y } = node.internals.positionAbsolute;
|
|
4509
|
+
const { width, height } = getNodeDimensions(userNode);
|
|
4436
4510
|
return {
|
|
4437
|
-
node,
|
|
4511
|
+
node: userNode,
|
|
4438
4512
|
x,
|
|
4439
4513
|
y,
|
|
4440
4514
|
width,
|
|
@@ -4561,7 +4635,7 @@ MiniMapComponent.displayName = 'MiniMap';
|
|
|
4561
4635
|
*
|
|
4562
4636
|
*export default function Flow() {
|
|
4563
4637
|
* return (
|
|
4564
|
-
* <ReactFlow nodes={[...]
|
|
4638
|
+
* <ReactFlow nodes={[...]} edges={[...]}>
|
|
4565
4639
|
* <MiniMap nodeStrokeWidth={3} />
|
|
4566
4640
|
* </ReactFlow>
|
|
4567
4641
|
* );
|
|
@@ -4898,4 +4972,4 @@ function EdgeToolbar({ edgeId, x, y, children, className, style, isVisible, alig
|
|
|
4898
4972
|
}, className: cc(['react-flow__edge-toolbar', className]), "data-id": edge?.id ?? '', ...rest, children: children }) }));
|
|
4899
4973
|
}
|
|
4900
4974
|
|
|
4901
|
-
export { Background, BackgroundVariant, BaseEdge, BezierEdge, ControlButton, Controls, EdgeLabelRenderer, EdgeText, EdgeToolbar, Handle, MiniMap, MiniMapNode, NodeResizeControl, NodeResizer, NodeToolbar, Panel, index as ReactFlow, ReactFlowProvider, SimpleBezierEdge, SmoothStepEdge, StepEdge, StraightEdge, ViewportPortal, applyEdgeChanges, applyNodeChanges, getSimpleBezierPath, isEdge, isNode, useConnection, useEdges, useEdgesState, useHandleConnections, useInternalNode, useKeyPress, useNodeConnections, useNodeId, useNodes, useNodesData, useNodesInitialized, useNodesState, useOnSelectionChange, useOnViewportChange, useReactFlow, useStore, useStoreApi, useUpdateNodeInternals, useViewport };
|
|
4975
|
+
export { Background, BackgroundVariant, BaseEdge, BezierEdge, ControlButton, Controls, EdgeLabelRenderer, EdgeText, EdgeToolbar, Handle, MiniMap, MiniMapNode, NodeResizeControl, NodeResizer, NodeToolbar, Panel, index as ReactFlow, ReactFlowProvider, SimpleBezierEdge, SmoothStepEdge, StepEdge, StraightEdge, ViewportPortal, applyEdgeChanges, applyNodeChanges, experimental_useOnEdgesChangeMiddleware, experimental_useOnNodesChangeMiddleware, getSimpleBezierPath, isEdge, isNode, useConnection, useEdges, useEdgesState, useHandleConnections, useInternalNode, useKeyPress, useNodeConnections, useNodeId, useNodes, useNodesData, useNodesInitialized, useNodesState, useOnSelectionChange, useOnViewportChange, useReactFlow, useStore, useStoreApi, useUpdateNodeInternals, useViewport };
|