11import * 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' ;
33import { BaseLayout , LAYOUT_DEFAULTS } from './BaseLayout' ;
44import { LayoutLink } from './LayoutLink' ;
55import { 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