Skip to content

Commit 8d8ac4c

Browse files
committed
fix(cdk/tree): enter/space key on child node should not toggle parent node expansion
1 parent 39b80fe commit 8d8ac4c

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
@@ -272,7 +272,7 @@ export class CdkTreeNodeToggle<T, K = T> {
272272
static ngAcceptInputType_recursive: unknown;
273273
recursive: boolean;
274274
// (undocumented)
275-
_toggle(): void;
275+
_toggle(event: Event): void;
276276
// (undocumented)
277277
protected _tree: CdkTree<T, K>;
278278
// (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
})
@@ -34,7 +34,9 @@ export class CdkTreeNodeToggle<T, K = T> {
3434
//
3535
// Focus this node with expanding or collapsing it. This ensures that the active node will always
3636
// be visible when expanding and collapsing.
37-
_toggle(): void {
37+
_toggle(event: Event): void {
38+
event.stopPropagation();
39+
3840
this.recursive
3941
? this._tree.toggleDescendants(this._treeNode.data)
4042
: 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
@@ -966,6 +966,34 @@ describe('CdkTree', () => {
966966
[`topping_3 - cheese_3 + base_3`],
967967
);
968968
});
969+
970+
it('should not collapse parent when child is toggled via keyboard', () => {
971+
component.toggleRecursively = false;
972+
fixture.changeDetectorRef.markForCheck();
973+
let data = dataSource.data;
974+
const child = dataSource.addChild(data[1], false);
975+
dataSource.addChild(child, false);
976+
fixture.detectChanges();
977+
978+
// Expand parent
979+
(getNodes(treeElement)[1] as HTMLElement).click();
980+
fixture.detectChanges();
981+
982+
expect(component.tree.isExpanded(data[1])).toBe(true);
983+
984+
// Focus child node (which is now at index 2)
985+
const childNode = getNodes(treeElement)[2] as HTMLElement;
986+
987+
// Simulate Enter key on child node
988+
const event = createKeyboardEvent('keydown', undefined, 'Enter');
989+
childNode.dispatchEvent(event);
990+
fixture.detectChanges();
991+
992+
// Verify parent is still expanded
993+
expect(component.tree.isExpanded(data[1]))
994+
.withContext('Parent should remain expanded')
995+
.toBe(true);
996+
});
969997
});
970998

971999
describe('nested tree with array data source', () => {

0 commit comments

Comments
 (0)