Skip to content

Commit 3a3852d

Browse files
committed
fix(cdk/tree): enter/space key on child node should not toggle parent node expansion (#33125)
(cherry picked from commit b916ef9)
1 parent 51271c6 commit 3a3852d

3 files changed

Lines changed: 35 additions & 5 deletions

File tree

goldens/cdk/tree/index.api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ export class CdkTreeNodeToggle<T, K = T> {
277277
static ngAcceptInputType_recursive: unknown;
278278
recursive: boolean;
279279
// (undocumented)
280-
_toggle(): void;
280+
_toggle(event: Event): void;
281281
// (undocumented)
282282
protected _tree: CdkTree<T, K>;
283283
// (undocumented)

src/cdk/tree/toggle.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ import {CdkTree, CdkTreeNode} from './tree';
1616
@Directive({
1717
selector: '[cdkTreeNodeToggle]',
1818
host: {
19-
'(click)': '_toggle(); $event.stopPropagation();',
20-
'(keydown.Enter)': '_toggle(); $event.preventDefault();',
21-
'(keydown.Space)': '_toggle(); $event.preventDefault();',
19+
'(click)': '_toggle($event)',
20+
'(keydown.Enter)': '_toggle($event); $event.preventDefault();',
21+
'(keydown.Space)': '_toggle($event); $event.preventDefault();',
2222
'tabindex': '-1',
2323
},
2424
})
@@ -37,7 +37,9 @@ export class CdkTreeNodeToggle<T, K = T> {
3737
//
3838
// Focus this node with expanding or collapsing it. This ensures that the active node will always
3939
// be visible when expanding and collapsing.
40-
_toggle(): void {
40+
_toggle(event: Event): void {
41+
event.stopPropagation();
42+
4143
this.recursive
4244
? this._tree.toggleDescendants(this._treeNode.data)
4345
: this._tree.toggle(this._treeNode.data);

src/cdk/tree/tree.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -965,6 +965,34 @@ describe('CdkTree', () => {
965965
[`topping_3 - cheese_3 + base_3`],
966966
);
967967
});
968+
969+
it('should not collapse parent when child is toggled via keyboard', () => {
970+
component.toggleRecursively = false;
971+
fixture.changeDetectorRef.markForCheck();
972+
let data = dataSource.data;
973+
const child = dataSource.addChild(data[1], false);
974+
dataSource.addChild(child, false);
975+
fixture.detectChanges();
976+
977+
// Expand parent
978+
(getNodes(treeElement)[1] as HTMLElement).click();
979+
fixture.detectChanges();
980+
981+
expect(component.tree.isExpanded(data[1])).toBe(true);
982+
983+
// Focus child node (which is now at index 2)
984+
const childNode = getNodes(treeElement)[2] as HTMLElement;
985+
986+
// Simulate Enter key on child node
987+
const event = createKeyboardEvent('keydown', undefined, 'Enter');
988+
childNode.dispatchEvent(event);
989+
fixture.detectChanges();
990+
991+
// Verify parent is still expanded
992+
expect(component.tree.isExpanded(data[1]))
993+
.withContext('Parent should remain expanded')
994+
.toBe(true);
995+
});
968996
});
969997

970998
describe('with array data source', () => {

0 commit comments

Comments
 (0)