@@ -94,7 +94,7 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
9494 private _dataSubscription : Subscription | null ;
9595
9696 /** Level of nodes */
97- private _levels : Map < T , number > = new Map < T , number > ( ) ;
97+ private _levels : Map < K , number > = new Map < K , number > ( ) ;
9898
9999 /** The mapping between data nodes and the parent node. `null` if no parent. */
100100 private _parents : Map < K , T | null > = new Map < K , T | null > ( ) ;
@@ -351,8 +351,8 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
351351 } else if ( currentIndex == null ) {
352352 viewContainer . remove ( adjustedPreviousIndex ! ) ;
353353 const group = this . _getNodeGroup ( item . item ) ;
354- this . _levels . delete ( item . item ) ;
355- this . _parents . delete ( item . item ) ;
354+ this . _levels . delete ( this . _trackExpansionKey ( item . item ) ) ;
355+ this . _parents . delete ( this . _trackExpansionKey ( item . item ) ) ;
356356 group . splice ( group . indexOf ( item . item ) , 1 ) ;
357357 } else {
358358 const view = viewContainer . get ( adjustedPreviousIndex ! ) ;
@@ -401,21 +401,24 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
401401 const levelAccessor = this . _getLevelAccessor ( ) ;
402402 if ( levelAccessor ) {
403403 context . level = levelAccessor ( nodeData ) ;
404- } else if ( typeof parentData !== 'undefined' && this . _levels . has ( parentData ) ) {
405- context . level = this . _levels . get ( parentData ) ! + 1 ;
404+ } else if (
405+ typeof parentData !== 'undefined' &&
406+ this . _levels . has ( this . _trackExpansionKey ( parentData ) )
407+ ) {
408+ context . level = this . _levels . get ( this . _trackExpansionKey ( parentData ) ) ! + 1 ;
406409 } else {
407410 context . level = 0 ;
408411 }
409- this . _levels . set ( nodeData , context . level ) ;
412+ this . _levels . set ( this . _trackExpansionKey ( nodeData ) , context . level ) ;
410413 const parent = parentData ?? this . _findParentForNode ( nodeData , index ) ;
411- this . _parents . set ( nodeData , parent ) ;
414+ this . _parents . set ( this . _trackExpansionKey ( nodeData ) , parent ) ;
412415
413416 // Determine where to insert this new node into the group, then insert it.
414417 // We do this by looking at the previous node in our flattened node list. If it's in the same
415418 // group, we place the current node after. Otherwise, we place it at the start of the group.
416419 const currentGroup = this . _groups . get ( context . level ) ?? new Map < T | null , T [ ] > ( ) ;
417420 const group = currentGroup . get ( parent ) ?? [ ] ;
418- const previousNode = this . _dataNodes ?. [ index - 1 ] ;
421+ const previousNode = this . _dataNodes . value ?. [ index - 1 ] ;
419422 const groupInsertionIndex = ( previousNode && group . indexOf ( previousNode ) + 1 ) ?? 0 ;
420423 group . splice ( groupInsertionIndex , 0 , nodeData ) ;
421424 currentGroup . set ( parent , group ) ;
@@ -624,13 +627,13 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
624627 this . _nodes . next ( this . _nodes . value ) ;
625628 }
626629
630+ /**
631+ * For the given node, determine the level where this node appears in the tree.
632+ *
633+ * This is intended to be used for `aria-level` but is 0-indexed.
634+ */
627635 _getLevel ( node : T ) {
628- return this . _levels . get ( node ) ;
629- }
630-
631- _getPositionInSet ( dataNode : T ) {
632- const group = this . _getNodeGroup ( dataNode ) ;
633- return group . indexOf ( dataNode ) + 1 ;
636+ return this . _levels . get ( this . _trackExpansionKey ( node ) ) ;
634637 }
635638
636639 /**
@@ -797,8 +800,8 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
797800 }
798801
799802 private _getNodeGroup ( node : T ) {
800- const level = this . _levels . get ( node ) ;
801- const parent = this . _parents . get ( node ) ;
803+ const level = this . _levels . get ( this . _trackExpansionKey ( node ) ) ;
804+ const parent = this . _parents . get ( this . _trackExpansionKey ( node ) ) ;
802805 const group = this . _groups . get ( level ?? 0 ) ?. get ( parent ?? null ) ;
803806 return group ?? [ node ] ;
804807 }
@@ -810,10 +813,10 @@ export class CdkTree<T, K = T> implements AfterContentChecked, CollectionViewer,
810813 if ( ! this . _dataNodes ) {
811814 return null ;
812815 }
813- const currentLevel = this . _levels . get ( node ) ?? 0 ;
816+ const currentLevel = this . _levels . get ( this . _trackExpansionKey ( node ) ) ?? 0 ;
814817 for ( let parentIndex = index ; parentIndex >= 0 ; parentIndex -- ) {
815- const parentNode = this . _dataNodes [ parentIndex ] ;
816- const parentLevel = this . _levels . get ( parentNode ) ?? 0 ;
818+ const parentNode = this . _dataNodes . value [ parentIndex ] ;
819+ const parentLevel = this . _levels . get ( this . _trackExpansionKey ( parentNode ) ) ?? 0 ;
817820
818821 if ( parentLevel < currentLevel ) {
819822 return parentNode ;
0 commit comments