Skip to content

Commit be4fc91

Browse files
fix(DagreGroupLayout): Keep node order when groups are collapsed (patternfly#231)
1 parent d37a664 commit be4fc91

1 file changed

Lines changed: 18 additions & 8 deletions

File tree

packages/module/src/layouts/DagreGroupsLayout.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as dagre from '@dagrejs/dagre';
2-
import { Edge, Graph, GRAPH_LAYOUT_END_EVENT, Layout, Node } from '../types';
2+
import { Edge, Graph, GRAPH_LAYOUT_END_EVENT, isNode, Layout, Node } from '../types';
33
import { BaseLayout, LAYOUT_DEFAULTS } from './BaseLayout';
44
import { LayoutLink } from './LayoutLink';
55
import { LayoutNode } from './LayoutNode';
@@ -120,7 +120,7 @@ export class DagreGroupsLayout extends BaseLayout implements Layout {
120120
(n) =>
121121
n.element.getParent()?.getId() === parentGroup?.id ||
122122
(!parentGroup && n.element.getParent()?.getId() === graph.getId())
123-
);
123+
) as DagreNode[];
124124
const layerEdges = this.edges.filter(
125125
(edge) =>
126126
(layerGroups.find((n) => n.id === edge.sourceNode.id) ||
@@ -129,20 +129,30 @@ export class DagreGroupsLayout extends BaseLayout implements Layout {
129129
layerNodes.find((n) => n.id === edge.targetNode.id))
130130
);
131131

132+
const dagreNodes: DagreNode[] = [];
133+
132134
// Layout any child groups first
133135
layerGroups.forEach((group) => {
134136
doLayout(group);
135137

136138
// Add the child group node (now with the correct dimensions) to the graph
137139
const dagreNode = new DagreNode(group.element, group.padding);
138-
const updateNode = dagreNode.getUpdatableNode();
139-
dagreGraph.setNode(group.id, updateNode);
140+
dagreNodes.push(dagreNode);
140141
});
141142

142-
layerNodes?.forEach((node) => {
143-
const updateNode = (node as DagreNode).getUpdatableNode();
144-
dagreGraph.setNode(node.id, updateNode);
145-
});
143+
dagreNodes.push(...layerNodes);
144+
145+
// Set the nodes in the graph in the same order give to maintain ordering when groups are collapsed
146+
this.graph
147+
.getController()
148+
.getElements()
149+
.filter((e) => isNode(e))
150+
.forEach((node) => {
151+
const updateNode = dagreNodes.find((dagreNode) => dagreNode.id === node.getId());
152+
if (updateNode) {
153+
dagreGraph.setNode(updateNode.id, updateNode.getUpdatableNode());
154+
}
155+
});
146156

147157
layerEdges?.forEach((dagreEdge) => {
148158
dagreGraph.setEdge(dagreEdge.source.id, dagreEdge.target.id, dagreEdge);

0 commit comments

Comments
 (0)