Skip to content

Commit 0f053ff

Browse files
authored
fix(cdk/tree): expandAll not expanding all nodes (#30226)
Fixes that the tree wasn't recursing down and expanding all child nodes when calling `expandAll`. Fixes #29865.
1 parent a6a70f6 commit 0f053ff

File tree

2 files changed

+51
-19
lines changed

2 files changed

+51
-19
lines changed

src/cdk/tree/tree.spec.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1481,6 +1481,32 @@ describe('CdkTree', () => {
14811481
.withContext(`expect an expanded node`)
14821482
.toBe(1);
14831483
});
1484+
1485+
it('should expand/collapse all nested nodes when calling expandAll/collapseAll', () => {
1486+
configureCdkTreeTestingModule([IsExpandableOrderingTest]);
1487+
const fixture = TestBed.createComponent(IsExpandableOrderingTest);
1488+
const component = fixture.componentInstance;
1489+
const data = fixture.componentInstance.dataSource;
1490+
treeElement = fixture.nativeElement.querySelector('cdk-tree');
1491+
1492+
data[0].children[0].children.push(new MinimalTestData('extra'));
1493+
data[0].children[0].children[0].children.push(new MinimalTestData('extra'));
1494+
fixture.detectChanges();
1495+
1496+
component.tree.expandAll();
1497+
fixture.detectChanges();
1498+
expect(getNodes(treeElement).map(n => n.getAttribute('aria-expanded'))).toEqual([
1499+
'true',
1500+
'true',
1501+
'true',
1502+
'true',
1503+
]);
1504+
1505+
component.tree.collapseAll();
1506+
fixture.detectChanges();
1507+
1508+
expect(getNodes(treeElement).map(n => n.getAttribute('aria-expanded'))).toEqual(['false']);
1509+
});
14841510
});
14851511

14861512
export class TestData {
@@ -1698,10 +1724,6 @@ class SimpleCdkTreeApp {
16981724

16991725
@ViewChild(CdkTree) tree: CdkTree<TestData>;
17001726
@ViewChildren(CdkTreeNodePadding) paddingNodes: QueryList<CdkTreeNodePadding<TestData>>;
1701-
1702-
expandAll() {
1703-
this.tree.expandAll();
1704-
}
17051727
}
17061728

17071729
@Component({

src/cdk/tree/tree.ts

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -716,10 +716,7 @@ export class CdkTree<T, K = T>
716716
if (this.treeControl) {
717717
this.treeControl.expandAll();
718718
} else if (this._expansionModel) {
719-
const expansionModel = this._expansionModel;
720-
expansionModel.select(
721-
...this._flattenedNodes.value.map(child => this._getExpansionKey(child)),
722-
);
719+
this._forEachExpansionKey(keys => this._expansionModel?.select(...keys));
723720
}
724721
}
725722

@@ -728,10 +725,7 @@ export class CdkTree<T, K = T>
728725
if (this.treeControl) {
729726
this.treeControl.collapseAll();
730727
} else if (this._expansionModel) {
731-
const expansionModel = this._expansionModel;
732-
expansionModel.deselect(
733-
...this._flattenedNodes.value.map(child => this._getExpansionKey(child)),
734-
);
728+
this._forEachExpansionKey(keys => this._expansionModel?.deselect(...keys));
735729
}
736730
}
737731

@@ -776,13 +770,7 @@ export class CdkTree<T, K = T>
776770
if (!expanded) {
777771
return [];
778772
}
779-
return this._findChildrenByLevel(
780-
levelAccessor,
781-
flattenedNodes,
782-
783-
dataNode,
784-
1,
785-
);
773+
return this._findChildrenByLevel(levelAccessor, flattenedNodes, dataNode, 1);
786774
}),
787775
);
788776
}
@@ -1153,6 +1141,28 @@ export class CdkTree<T, K = T>
11531141
this._ariaSets.set(parentKey, group);
11541142
}
11551143
}
1144+
1145+
/** Invokes a callback with all node expansion keys. */
1146+
private _forEachExpansionKey(callback: (keys: K[]) => void) {
1147+
const toToggle: K[] = [];
1148+
const observables: Observable<T[]>[] = [];
1149+
1150+
this._nodes.value.forEach(node => {
1151+
toToggle.push(this._getExpansionKey(node.data));
1152+
observables.push(this._getDescendants(node.data));
1153+
});
1154+
1155+
if (observables.length > 0) {
1156+
combineLatest(observables)
1157+
.pipe(take(1), takeUntil(this._onDestroy))
1158+
.subscribe(results => {
1159+
results.forEach(inner => inner.forEach(r => toToggle.push(this._getExpansionKey(r))));
1160+
callback(toToggle);
1161+
});
1162+
} else {
1163+
callback(toToggle);
1164+
}
1165+
}
11561166
}
11571167

11581168
/**

0 commit comments

Comments
 (0)