diff --git a/src/container/EdgeRenderer/index.tsx b/src/container/EdgeRenderer/index.tsx index 32b4b479..cf85c8ce 100644 --- a/src/container/EdgeRenderer/index.tsx +++ b/src/container/EdgeRenderer/index.tsx @@ -37,6 +37,7 @@ interface EdgeRendererProps { onEdgeUpdateEnd?: (event: MouseEvent, edge: Edge, handleType: HandleType) => void; edgeUpdaterRadius?: number; noPanClassName?: string; + isEdgeAutoZIndex: boolean; } const selector = (s: ReactFlowState) => ({ @@ -65,7 +66,7 @@ const EdgeRenderer = (props: EdgeRendererProps) => { connectionMode, nodeInternals, } = useStore(selector, shallow); - const edgeTree = useVisibleEdges(props.onlyRenderVisibleElements, nodeInternals); + const edgeTree = useVisibleEdges(props.onlyRenderVisibleElements, nodeInternals, props.isEdgeAutoZIndex); if (!width) { return null; diff --git a/src/container/GraphView/index.tsx b/src/container/GraphView/index.tsx index 01580e77..2ac91e8f 100644 --- a/src/container/GraphView/index.tsx +++ b/src/container/GraphView/index.tsx @@ -82,6 +82,7 @@ const GraphView = ({ noDragClassName, noWheelClassName, noPanClassName, + isEdgeAutoZIndex, }: GraphViewProps) => { useOnInitHandler(onInit); @@ -135,6 +136,7 @@ const GraphView = ({ edgeUpdaterRadius={edgeUpdaterRadius} defaultMarkerColor={defaultMarkerColor} noPanClassName={noPanClassName} + isEdgeAutoZIndex={!!isEdgeAutoZIndex} /> ( attributionPosition, proOptions, defaultEdgeOptions, + isEdgeAutoZIndex = false, ...rest }, ref @@ -204,6 +205,7 @@ const ReactFlow = forwardRef( noDragClassName={noDragClassName} noWheelClassName={noWheelClassName} noPanClassName={noPanClassName} + isEdgeAutoZIndex={isEdgeAutoZIndex} /> >((tree, edge) => { - const z = isNumeric(edge.zIndex) - ? edge.zIndex - : Math.max(nodeInternals.get(edge.source)?.z || 0, nodeInternals.get(edge.target)?.z || 0); + const hasZIndex = isNumeric(edge.zIndex); + let z = hasZIndex ? edge.zIndex! : 0; + + if (isEdgeAutoZIndex) { + z = hasZIndex + ? edge.zIndex! + : Math.max(nodeInternals.get(edge.source)?.z || 0, nodeInternals.get(edge.target)?.z || 0); + } + if (tree[z]) { tree[z].push(edge); } else { @@ -42,7 +48,7 @@ function groupEdgesByZLevel(edges: Edge[], nodeInternals: NodeInternals) { return edgeTree; } -function useVisibleEdges(onlyRenderVisible: boolean, nodeInternals: NodeInternals) { +function useVisibleEdges(onlyRenderVisible: boolean, nodeInternals: NodeInternals, isEdgeAutoZIndex: boolean) { const edges = useStore( useCallback( (s: ReactFlowState) => { @@ -77,7 +83,7 @@ function useVisibleEdges(onlyRenderVisible: boolean, nodeInternals: NodeInternal ) ); - return groupEdgesByZLevel(edges, nodeInternals); + return groupEdgesByZLevel(edges, nodeInternals, isEdgeAutoZIndex); } export default useVisibleEdges; diff --git a/src/types/component-props.ts b/src/types/component-props.ts index f38d990e..0c8f1c9c 100644 --- a/src/types/component-props.ts +++ b/src/types/component-props.ts @@ -118,6 +118,7 @@ export interface ReactFlowProps extends HTMLAttributes { connectOnClick?: boolean; attributionPosition?: AttributionPosition; proOptions?: ProOptions; + isEdgeAutoZIndex?: boolean; } export type ReactFlowRefType = HTMLDivElement;