Skip to content

Commit 0b94aee

Browse files
committed
feat(cdk/menu): add output event for outside click of menu
this commit exposes an output which emits whenever the user clicks outside open menu fixes #29072
1 parent ec550fd commit 0b94aee

File tree

4 files changed

+24
-1
lines changed

4 files changed

+24
-1
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,18 @@ describe('CdkContextMenuTrigger', () => {
153153
fixture.detectChanges();
154154
expect(getContextMenu()).toBeDefined();
155155
});
156+
157+
it('should emit that menu had click outside of it', () => {
158+
openContextMenu();
159+
expect(getContextMenu()).toBeDefined();
160+
spyOn(fixture.componentInstance.trigger.outsideClicked, 'emit');
161+
162+
fixture.nativeElement.querySelector('#other').click();
163+
fixture.detectChanges();
164+
165+
expect(fixture.componentInstance.trigger.outsideClicked.emit).toHaveBeenCalled();
166+
expect(getContextMenu()).not.toBeDefined();
167+
});
156168
});
157169

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

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,11 @@ export type ContextMenuCoordinates = {x: number; y: number};
7575
{name: 'menuPosition', alias: 'cdkContextMenuPosition'},
7676
{name: 'menuData', alias: 'cdkContextMenuTriggerData'},
7777
],
78-
outputs: ['opened: cdkContextMenuOpened', 'closed: cdkContextMenuClosed'],
78+
outputs: [
79+
'opened: cdkContextMenuOpened',
80+
'closed: cdkContextMenuClosed',
81+
'outsideClicked: cdkContextMenuOutsideClicked',
82+
],
7983
providers: [
8084
{provide: MENU_TRIGGER, useExisting: CdkContextMenuTrigger},
8185
{provide: MENU_STACK, useClass: MenuStack},
@@ -218,6 +222,9 @@ export class CdkContextMenuTrigger extends CdkMenuTriggerBase implements OnDestr
218222
if (!this.disableCloseOnOutsideClick) {
219223
this.menuStack.closeAll();
220224
}
225+
226+
// Emit that we had a click outside the menu.
227+
this.outsideClicked.emit(event);
221228
}
222229
});
223230
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ export abstract class CdkMenuTriggerBase implements OnDestroy {
7373
/** Emits when the attached menu is requested to close */
7474
readonly closed: EventEmitter<void> = new EventEmitter();
7575

76+
/** Emits when the attached menu has click outside of it in open state */
77+
readonly outsideClicked: EventEmitter<MouseEvent> = new EventEmitter();
78+
7679
/** Template reference variable to the menu this trigger opens */
7780
menuTemplateRef: TemplateRef<unknown> | null;
7881

tools/public_api_guard/cdk/menu.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ export abstract class CdkMenuTriggerBase implements OnDestroy {
235235
// (undocumented)
236236
ngOnDestroy(): void;
237237
readonly opened: EventEmitter<void>;
238+
readonly outsideClicked: EventEmitter<MouseEvent>;
238239
protected overlayRef: OverlayRef | null;
239240
registerChildMenu(child: Menu): void;
240241
protected readonly stopOutsideClicksListener: Observable<void>;

0 commit comments

Comments
 (0)