Skip to content

Commit 4cc5a18

Browse files
feat(cdk/menu): add setActiveMenuItem to cdkMenu
closes #31370+
1 parent c771a01 commit 4cc5a18

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

src/cdk/menu/menu-base.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,20 @@ export abstract class CdkMenuBase
141141
this.keyManager.setLastItemActive();
142142
}
143143

144+
/**
145+
* Sets the active item to the item at the specified index and focuses the newly active item.
146+
* @param item The index of the item to be set as active, or the CdkMenuItem instance.
147+
*/
148+
setActiveMenuItem(item: number | CdkMenuItem) {
149+
if (this.keyManager) {
150+
if (typeof item === 'number') {
151+
this.keyManager.setActiveItem(item);
152+
} else {
153+
this.keyManager.setActiveItem(item);
154+
}
155+
}
156+
}
157+
144158
/** Gets the tabindex for this menu. */
145159
_getTabIndex() {
146160
return this._tabIndexSignal();

src/cdk/menu/menu.spec.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,33 @@ describe('Menu', () => {
502502
}));
503503
});
504504
});
505+
506+
describe('menu with active item', () => {
507+
let fixture: ComponentFixture<MenuWithActiveItem>;
508+
let nativeMenu: HTMLElement;
509+
let nativeMenuItems: HTMLElement[];
510+
511+
beforeEach(waitForAsync(() => {
512+
TestBed.configureTestingModule({
513+
imports: [CdkMenuModule, MenuWithActiveItem],
514+
});
515+
}));
516+
517+
beforeEach(() => {
518+
fixture = TestBed.createComponent(MenuWithActiveItem);
519+
fixture.detectChanges();
520+
521+
nativeMenu = fixture.debugElement.query(By.directive(CdkMenu)).nativeElement;
522+
nativeMenuItems = fixture.debugElement
523+
.queryAll(By.directive(CdkMenuItem))
524+
.map(e => e.nativeElement);
525+
});
526+
527+
it('should set the active item with setActiveMenuItem', () => {
528+
fixture.componentInstance.menu.setActiveMenuItem(2);
529+
expect(document.activeElement).toEqual(nativeMenuItems[2]);
530+
});
531+
});
505532
});
506533

507534
@Component({
@@ -655,3 +682,18 @@ class WithComplexNestedMenusOnBottom {
655682

656683
@ViewChildren(CdkMenu) menus: QueryList<CdkMenu>;
657684
}
685+
686+
@Component({
687+
template: `
688+
<div cdkMenu>
689+
<button cdkMenuItem>Inbox</button>
690+
<button cdkMenuItem>Starred</button>
691+
<button cdkMenuItem>Foo</button>
692+
<button cdkMenuItem>Bar</button>
693+
</div>
694+
`,
695+
imports: [CdkMenuModule],
696+
})
697+
class MenuWithActiveItem {
698+
@ViewChild(CdkMenu) menu: CdkMenu;
699+
}

0 commit comments

Comments
 (0)