Skip to content

Commit 8e5d748

Browse files
committed
refactor(core): use separate svg container for edges
1 parent 5f7d439 commit 8e5d748

File tree

2 files changed

+35
-30
lines changed

2 files changed

+35
-30
lines changed

packages/core/src/container/EdgeRenderer/EdgeRenderer.vue

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import ConnectionLine from '../../components/ConnectionLine'
66
import type { EdgeComponent, EdgeUpdatable, GraphEdge } from '../../types'
77
import { Slots } from '../../context'
88
import { useVueFlow } from '../../composables'
9-
import { ErrorCode, VueFlowError, groupEdgesByZLevel } from '../../utils'
9+
import { ErrorCode, VueFlowError, getEdgeZIndex } from '../../utils'
1010
import MarkerDefinitions from './MarkerDefinitions.vue'
1111
1212
const slots = inject(Slots)
@@ -15,26 +15,14 @@ const {
1515
edgesUpdatable,
1616
edgesFocusable,
1717
elementsSelectable,
18-
getSelectedNodes,
1918
findNode,
20-
edges,
2119
getEdges,
22-
getNodesInitialized,
2320
getEdgeTypes,
2421
elevateEdgesOnSelect,
2522
dimensions,
2623
emits,
2724
} = useVueFlow()
2825
29-
const groups = controlledComputed(
30-
[
31-
() => edges.value.map((e) => e.zIndex),
32-
() => (elevateEdgesOnSelect.value ? [getSelectedNodes.value.length] : [0]),
33-
() => (elevateEdgesOnSelect.value ? getNodesInitialized.value.map((n) => n.computedPosition.z) : []),
34-
],
35-
() => groupEdgesByZLevel(getEdges.value, findNode, elevateEdgesOnSelect.value),
36-
)
37-
3826
function selectable(edgeSelectable?: boolean) {
3927
return typeof edgeSelectable === 'undefined' ? elementsSelectable.value : edgeSelectable
4028
}
@@ -81,26 +69,25 @@ export default {
8169

8270
<template>
8371
<template v-if="dimensions.width && dimensions.height">
72+
<svg class="vue-flow__edges vue-flow__container">
73+
<MarkerDefinitions />
74+
</svg>
75+
8476
<svg
85-
v-for="group of groups"
86-
:key="group.level"
77+
v-for="edge of getEdges"
78+
:key="edge.id"
8779
class="vue-flow__edges vue-flow__container"
88-
:style="`z-index: ${group.level}`"
80+
:style="{ zIndex: getEdgeZIndex(edge, findNode, elevateEdgesOnSelect) }"
8981
>
90-
<MarkerDefinitions v-if="group.isMaxLevel" />
91-
<g>
92-
<EdgeWrapper
93-
v-for="edge of group.edges"
94-
:id="edge.id"
95-
:key="edge.id"
96-
:edge="edge"
97-
:type="getType(edge.type, edge.template)"
98-
:name="edge.type || 'default'"
99-
:selectable="selectable(edge.selectable)"
100-
:updatable="updatable(edge.updatable)"
101-
:focusable="focusable(edge.focusable)"
102-
/>
103-
</g>
82+
<EdgeWrapper
83+
:id="edge.id"
84+
:edge="edge"
85+
:type="getType(edge.type, edge.template)"
86+
:name="edge.type || 'default'"
87+
:selectable="selectable(edge.selectable)"
88+
:updatable="updatable(edge.updatable)"
89+
:focusable="focusable(edge.focusable)"
90+
/>
10491
</svg>
10592

10693
<ConnectionLine />

packages/core/src/utils/edge.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,21 @@ export function groupEdgesByZLevel(edges: GraphEdge[], findNode: Actions['findNo
170170
}
171171
})
172172
}
173+
174+
export function getEdgeZIndex(edge: GraphEdge, findNode: Actions['findNode'], elevateEdgesOnSelect = false) {
175+
const hasZIndex = isNumber(edge.zIndex)
176+
let z = hasZIndex ? edge.zIndex! : 0
177+
178+
const source = findNode(edge.source)
179+
const target = findNode(edge.target)
180+
181+
if (!source || !target) {
182+
return 0
183+
}
184+
185+
if (elevateEdgesOnSelect) {
186+
z = hasZIndex ? edge.zIndex! : Math.max(source.computedPosition.z || 0, target.computedPosition.z || 0)
187+
}
188+
189+
return z
190+
}

0 commit comments

Comments
 (0)