Skip to content

Commit 0b5eaa8

Browse files
authored
feat(cdk-experimental/menu): enable keyboard handling for context menu (#20171)
By default on both Mac and Windows the context menu keyboard trigger is emitted as a contextmenu mouse event automatically, eliminating the need to handle keyboard events specifically for context menus. Therefore, this simply places focus on the first menu item in the opened context menu relying on the existing menu and menu item keyboard handling logic.
1 parent ecb6e38 commit 0b5eaa8

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

src/cdk-experimental/menu/context-menu.spec.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ describe('CdkContextMenuTrigger', () => {
9797

9898
expect(getContextMenu()).toBeDefined();
9999
});
100+
101+
it('should focus the first menuitem when the context menu is opened', () => {
102+
openContextMenu();
103+
expect(document.querySelector(':focus')!.id).toEqual('first_menu_item');
104+
});
100105
});
101106

102107
describe('nested context menu triggers', () => {
@@ -250,7 +255,7 @@ describe('CdkContextMenuTrigger', () => {
250255
251256
<ng-template cdkMenuPanel #context="cdkMenuPanel">
252257
<div cdkMenu [cdkMenuPanel]="context">
253-
<button cdkMenuItem></button>
258+
<button id="first_menu_item" cdkMenuItem></button>
254259
</div>
255260
</ng-template>
256261
`,

src/cdk-experimental/menu/context-menu.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,15 @@ export class CdkContextMenuTrigger implements OnDestroy {
216216

217217
this._contextMenuTracker.update(this);
218218
this.open({x: event.clientX, y: event.clientY});
219+
220+
// A context menu can be triggered via a mouse right click or a keyboard shortcut.
221+
if (event.button === 2) {
222+
this._menuPanel._menu?.focusFirstItem('mouse');
223+
} else if (event.button === 0) {
224+
this._menuPanel._menu?.focusFirstItem('keyboard');
225+
} else {
226+
this._menuPanel._menu?.focusFirstItem('program');
227+
}
219228
}
220229
}
221230

0 commit comments

Comments
 (0)