Skip to content

Commit 60e31a4

Browse files
authored
feat: fire closed event after closing animation has finished (#9874)
1 parent 1dfbc98 commit 60e31a4

File tree

5 files changed

+37
-0
lines changed

5 files changed

+37
-0
lines changed

packages/context-menu/src/vaadin-context-menu-mixin.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,14 @@ export const ContextMenuMixin = (superClass) =>
209209
this.__forwardFocus();
210210
}
211211

212+
/**
213+
* Runs after overlay's closing animation is finished
214+
* @private
215+
*/
216+
_onVaadinOverlayClosed() {
217+
this.dispatchEvent(new CustomEvent('closed'));
218+
}
219+
212220
/** @private */
213221
_targetOrOpenOnChanged(listenOn, openOn) {
214222
if (this._oldListenOn && this._oldOpenOn) {
@@ -641,4 +649,10 @@ export const ContextMenuMixin = (superClass) =>
641649
this.close();
642650
}
643651
}
652+
653+
/**
654+
* Fired when the context menu is closed.
655+
*
656+
* @event closed
657+
*/
644658
};

packages/context-menu/src/vaadin-context-menu.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ export type ContextMenuItemSelectedEvent<TItem extends ContextMenuItem = Context
3434
value: TItem;
3535
}>;
3636

37+
/**
38+
* Fired when the context menu is closed.
39+
*/
40+
export type ContextMenuClosedEvent = CustomEvent;
41+
3742
export interface ContextMenuCustomEventMap<TItem extends ContextMenuItem = ContextMenuItem> {
3843
'opened-changed': ContextMenuOpenedChangedEvent;
3944

@@ -42,6 +47,8 @@ export interface ContextMenuCustomEventMap<TItem extends ContextMenuItem = Conte
4247
'close-all-menus': Event;
4348

4449
'items-outside-click': Event;
50+
51+
closed: ContextMenuClosedEvent;
4552
}
4653

4754
export interface ContextMenuEventMap<TItem extends ContextMenuItem = ContextMenuItem>
@@ -237,6 +244,7 @@ export interface ContextMenuEventMap<TItem extends ContextMenuItem = ContextMenu
237244
*
238245
* @fires {CustomEvent} opened-changed - Fired when the `opened` property changes.
239246
* @fires {CustomEvent} item-selected - Fired when an item is selected when the context menu is populated using the `items` API.
247+
* @fires {CustomEvent} closed - Fired when the context menu is closed.
240248
*/
241249
declare class ContextMenu<TItem extends ContextMenuItem = ContextMenuItem> extends HTMLElement {
242250
addEventListener<K extends keyof ContextMenuEventMap>(

packages/context-menu/src/vaadin-context-menu.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ import { ContextMenuMixin } from './vaadin-context-menu-mixin.js';
205205
*
206206
* @fires {CustomEvent} opened-changed - Fired when the `opened` property changes.
207207
* @fires {CustomEvent} item-selected - Fired when an item is selected when the context menu is populated using the `items` API.
208+
* @fires {CustomEvent} closed - Fired when the context menu is closed.
208209
*
209210
* @customElement
210211
* @extends HTMLElement
@@ -249,6 +250,7 @@ class ContextMenu extends ContextMenuMixin(
249250
exportparts="backdrop, overlay, content"
250251
@opened-changed="${this._onOverlayOpened}"
251252
@vaadin-overlay-open="${this._onVaadinOverlayOpen}"
253+
@vaadin-overlay-closed="${this._onVaadinOverlayClosed}"
252254
>
253255
<slot name="overlay"></slot>
254256
<slot name="submenu" slot="submenu"></slot>

packages/context-menu/test/overlay.test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,14 @@ describe('overlay', () => {
394394
expect(menu.opened).to.eql(true);
395395
});
396396

397+
it('should dispatch closed event when the overlay is closed', async () => {
398+
const closedSpy = sinon.spy();
399+
menu.addEventListener('closed', closedSpy);
400+
fire(document.body, 'click');
401+
await nextRender();
402+
expect(closedSpy.calledOnce).to.be.true;
403+
});
404+
397405
describe('with shift key', () => {
398406
it('should not close on menu contextmenu', () => {
399407
const e = contextmenu(0, 0, true, overlay);

packages/context-menu/test/typings/context-menu.types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type { ContextMenuItem } from '../../src/vaadin-context-menu-item.js';
77
import type { ContextMenuListBox } from '../../src/vaadin-context-menu-list-box.js';
88
import type {
99
ContextMenu,
10+
ContextMenuClosedEvent,
1011
ContextMenuItem as MenuItem,
1112
ContextMenuItemSelectedEvent,
1213
ContextMenuOpenedChangedEvent,
@@ -36,6 +37,10 @@ menu.addEventListener('item-selected', (event) => {
3637
assertType<MenuItem>(event.detail.value);
3738
});
3839

40+
menu.addEventListener('closed', (event) => {
41+
assertType<ContextMenuClosedEvent>(event);
42+
});
43+
3944
const renderer: ContextMenuRenderer = (root, contextMenu, context) => {
4045
assertType<HTMLElement>(root);
4146
assertType<ContextMenu>(contextMenu);

0 commit comments

Comments
 (0)