Skip to content

Commit dfb194c

Browse files
committed
feat(cdk/menu): add output event for contextmenu
this commit exposes an output that emits whenever user triggers `contextmenu` event which contains `clientX` and `clientY` position respectively fixes #29072
1 parent 0b94aee commit dfb194c

File tree

4 files changed

+21
-1
lines changed

4 files changed

+21
-1
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,15 @@ describe('CdkContextMenuTrigger', () => {
165165
expect(fixture.componentInstance.trigger.outsideClicked.emit).toHaveBeenCalled();
166166
expect(getContextMenu()).not.toBeDefined();
167167
});
168+
169+
it('should emit that menu was triggered', () => {
170+
fixture.detectChanges();
171+
spyOn(fixture.componentInstance.trigger.triggered, 'emit');
172+
173+
openContextMenu();
174+
175+
expect(fixture.componentInstance.trigger.triggered.emit).toHaveBeenCalled();
176+
});
168177
});
169178

170179
describe('nested context menu triggers', () => {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export type ContextMenuCoordinates = {x: number; y: number};
7979
'opened: cdkContextMenuOpened',
8080
'closed: cdkContextMenuClosed',
8181
'outsideClicked: cdkContextMenuOutsideClicked',
82+
'triggered: cdkContextMenuTriggered',
8283
],
8384
providers: [
8485
{provide: MENU_TRIGGER, useExisting: CdkContextMenuTrigger},
@@ -148,6 +149,9 @@ export class CdkContextMenuTrigger extends CdkMenuTriggerBase implements OnDestr
148149
} else {
149150
this.childMenu?.focusFirstItem('program');
150151
}
152+
153+
// Emit that the user have triggered contextmenu event.
154+
this.triggered.emit({x: event.clientX, y: event.clientY});
151155
}
152156
}
153157

src/cdk/menu/menu-trigger-base.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ export abstract class CdkMenuTriggerBase implements OnDestroy {
7676
/** Emits when the attached menu has click outside of it in open state */
7777
readonly outsideClicked: EventEmitter<MouseEvent> = new EventEmitter();
7878

79+
/** Emits when the user triggers context menu */
80+
readonly triggered: EventEmitter<{x: number; y: number}> = new EventEmitter();
81+
7982
/** Template reference variable to the menu this trigger opens */
8083
menuTemplateRef: TemplateRef<unknown> | null;
8184

tools/public_api_guard/cdk/menu.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export class CdkContextMenuTrigger extends CdkMenuTriggerBase implements OnDestr
4444
open(coordinates: ContextMenuCoordinates): void;
4545
_openOnContextMenu(event: MouseEvent): void;
4646
// (undocumented)
47-
static ɵdir: i0.ɵɵDirectiveDeclaration<CdkContextMenuTrigger, "[cdkContextMenuTriggerFor]", ["cdkContextMenuTriggerFor"], { "menuTemplateRef": { "alias": "cdkContextMenuTriggerFor"; "required": false; }; "menuPosition": { "alias": "cdkContextMenuPosition"; "required": false; }; "menuData": { "alias": "cdkContextMenuTriggerData"; "required": false; }; "disabled": { "alias": "cdkContextMenuDisabled"; "required": false; }; "disableCloseOnOutsideClick": { "alias": "cdkContextMenuDisableCloseOnOutsideClick"; "required": false; }; }, { "opened": "cdkContextMenuOpened"; "closed": "cdkContextMenuClosed"; "outsideClicked": "cdkContextMenuOutsideClicked"; }, never, never, true, never>;
47+
static ɵdir: i0.ɵɵDirectiveDeclaration<CdkContextMenuTrigger, "[cdkContextMenuTriggerFor]", ["cdkContextMenuTriggerFor"], { "menuTemplateRef": { "alias": "cdkContextMenuTriggerFor"; "required": false; }; "menuPosition": { "alias": "cdkContextMenuPosition"; "required": false; }; "menuData": { "alias": "cdkContextMenuTriggerData"; "required": false; }; "disabled": { "alias": "cdkContextMenuDisabled"; "required": false; }; "disableCloseOnOutsideClick": { "alias": "cdkContextMenuDisableCloseOnOutsideClick"; "required": false; }; }, { "opened": "cdkContextMenuOpened"; "closed": "cdkContextMenuClosed"; "outsideClicked": "cdkContextMenuOutsideClicked"; "triggered": "cdkContextMenuTriggered"; }, never, never, true, never>;
4848
// (undocumented)
4949
static ɵfac: i0.ɵɵFactoryDeclaration<CdkContextMenuTrigger, never>;
5050
}
@@ -239,6 +239,10 @@ export abstract class CdkMenuTriggerBase implements OnDestroy {
239239
protected overlayRef: OverlayRef | null;
240240
registerChildMenu(child: Menu): void;
241241
protected readonly stopOutsideClicksListener: Observable<void>;
242+
readonly triggered: EventEmitter<{
243+
x: number;
244+
y: number;
245+
}>;
242246
protected readonly viewContainerRef: ViewContainerRef;
243247
// (undocumented)
244248
static ɵdir: i0.ɵɵDirectiveDeclaration<CdkMenuTriggerBase, never, never, {}, {}, never, never, true, never>;

0 commit comments

Comments
 (0)