Skip to content

Commit 2cc42b7

Browse files
authored
refactor: move context-menu and menu-bar overlay to the template (#9854)
1 parent 8fd58b4 commit 2cc42b7

File tree

6 files changed

+66
-110
lines changed

6 files changed

+66
-110
lines changed

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

Lines changed: 7 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export const ContextMenuMixin = (superClass) =>
3232
opened: {
3333
type: Boolean,
3434
reflectToAttribute: true,
35+
observer: '_openedChanged',
3536
value: false,
3637
notify: true,
3738
readOnly: true,
@@ -124,22 +125,15 @@ export const ContextMenuMixin = (superClass) =>
124125

125126
static get observers() {
126127
return [
127-
'_openedChanged(opened)',
128128
'_targetOrOpenOnChanged(listenOn, openOn)',
129129
'_rendererChanged(renderer, items)',
130130
'_fullscreenChanged(_fullscreen)',
131-
'_overlayContextChanged(_overlayElement, _context)',
132-
'_overlayModelessChanged(_overlayElement, _modeless)',
133-
'_overlayPhoneChanged(_overlayElement, _phone)',
134-
'_overlayThemeChanged(_overlayElement, _theme)',
135131
];
136132
}
137133

138134
constructor() {
139135
super();
140136

141-
this._createOverlay();
142-
143137
this._boundOpen = this.open.bind(this);
144138
this._boundClose = this.close.bind(this);
145139
this._boundPreventDefault = this._preventDefault.bind(this);
@@ -171,8 +165,10 @@ export const ContextMenuMixin = (superClass) =>
171165
}
172166

173167
/** @protected */
174-
ready() {
175-
super.ready();
168+
firstUpdated() {
169+
super.firstUpdated();
170+
171+
this._overlayElement = this.$.overlay;
176172

177173
this.addController(
178174
new MediaQueryController(this._fullscreenMediaQuery, (matches) => {
@@ -181,33 +177,6 @@ export const ContextMenuMixin = (superClass) =>
181177
);
182178
}
183179

184-
/** @private */
185-
_createOverlay() {
186-
// Create an overlay in the constructor to use in observers before `ready()`
187-
const overlay = document.createElement(`${this._tagNamePrefix}-overlay`);
188-
overlay.owner = this;
189-
overlay.setAttribute('exportparts', 'backdrop, overlay, content');
190-
191-
overlay.addEventListener('opened-changed', (e) => {
192-
this._onOverlayOpened(e);
193-
});
194-
195-
overlay.addEventListener('vaadin-overlay-open', (e) => {
196-
this._onVaadinOverlayOpen(e);
197-
});
198-
199-
const overlaySlot = document.createElement('slot');
200-
overlaySlot.name = 'overlay';
201-
overlay.append(overlaySlot);
202-
203-
const subMenuSlot = document.createElement('slot');
204-
subMenuSlot.name = 'submenu';
205-
subMenuSlot.slot = 'submenu';
206-
overlay.append(subMenuSlot);
207-
208-
this._overlayElement = overlay;
209-
}
210-
211180
/**
212181
* Runs before overlay is fully rendered
213182
* @private
@@ -240,39 +209,6 @@ export const ContextMenuMixin = (superClass) =>
240209
this.__forwardFocus();
241210
}
242211

243-
/** @private */
244-
_overlayContextChanged(overlay, context) {
245-
if (overlay) {
246-
overlay.model = context;
247-
}
248-
}
249-
250-
/** @private */
251-
_overlayModelessChanged(overlay, modeless) {
252-
if (overlay) {
253-
overlay.modeless = modeless;
254-
}
255-
}
256-
257-
/** @private */
258-
_overlayPhoneChanged(overlay, phone) {
259-
if (overlay) {
260-
overlay.toggleAttribute('phone', phone);
261-
overlay.withBackdrop = phone;
262-
}
263-
}
264-
265-
/** @private */
266-
_overlayThemeChanged(overlay, theme) {
267-
if (overlay) {
268-
if (theme) {
269-
overlay.setAttribute('theme', theme);
270-
} else {
271-
overlay.removeAttribute('theme');
272-
}
273-
}
274-
}
275-
276212
/** @private */
277213
_targetOrOpenOnChanged(listenOn, openOn) {
278214
if (this._oldListenOn && this._oldOpenOn) {
@@ -339,17 +275,14 @@ export const ContextMenuMixin = (superClass) =>
339275
}
340276

341277
/** @private */
342-
_openedChanged(opened) {
278+
_openedChanged(opened, oldOpened) {
343279
if (opened) {
344280
document.documentElement.addEventListener('contextmenu', this._boundOnGlobalContextMenu, true);
345-
} else {
281+
} else if (oldOpened) {
346282
document.documentElement.removeEventListener('contextmenu', this._boundOnGlobalContextMenu, true);
347283
}
348284

349285
this.__setListenOnUserSelect(opened);
350-
351-
// Has to be set after instance has been created
352-
this._overlayElement.opened = opened;
353286
}
354287

355288
/**
@@ -383,11 +316,7 @@ export const ContextMenuMixin = (superClass) =>
383316
if (this.closeOn === 'click') {
384317
this.closeOn = '';
385318
}
386-
387-
renderer = this.__itemsRenderer;
388319
}
389-
390-
this._overlayElement.renderer = renderer;
391320
}
392321

393322
/**

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

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import './vaadin-context-menu-item.js';
88
import './vaadin-context-menu-list-box.js';
99
import './vaadin-context-menu-overlay.js';
1010
import { css, html, LitElement } from 'lit';
11+
import { ifDefined } from 'lit/directives/if-defined.js';
1112
import { defineCustomElement } from '@vaadin/component-base/src/define.js';
1213
import { ElementMixin } from '@vaadin/component-base/src/element-mixin.js';
1314
import { OverlayClassMixin } from '@vaadin/component-base/src/overlay-class-mixin.js';
@@ -233,17 +234,26 @@ class ContextMenu extends ContextMenuMixin(
233234

234235
/** @protected */
235236
render() {
236-
return html`<slot id="slot"></slot>`;
237-
}
238-
239-
/**
240-
* @protected
241-
* @override
242-
*/
243-
createRenderRoot() {
244-
const root = super.createRenderRoot();
245-
root.appendChild(this._overlayElement);
246-
return root;
237+
return html`
238+
<slot id="slot"></slot>
239+
<vaadin-context-menu-overlay
240+
id="overlay"
241+
.owner="${this}"
242+
.opened="${this.opened}"
243+
.model="${this._context}"
244+
.modeless="${this._modeless}"
245+
.renderer="${this.items ? this.__itemsRenderer : this.renderer}"
246+
.withBackdrop="${this._phone}"
247+
?phone="${this._phone}"
248+
theme="${ifDefined(this._theme)}"
249+
exportparts="backdrop, overlay, content"
250+
@opened-changed="${this._onOverlayOpened}"
251+
@vaadin-overlay-open="${this._onVaadinOverlayOpen}"
252+
>
253+
<slot name="overlay"></slot>
254+
<slot name="submenu" slot="submenu"></slot>
255+
</vaadin-context-menu-overlay>
256+
`;
247257
}
248258

249259
/**

packages/context-menu/test/dom/__snapshots__/context-menu.test.snap.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* @web/test-runner snapshot v1 */
22
export const snapshots = {};
3-
snapshots["context-menu items"] =
3+
4+
snapshots["context-menu items"] =
45
`<vaadin-context-menu opened="">
56
<div>
67
Target
@@ -64,7 +65,7 @@ snapshots["context-menu items"] =
6465
`;
6566
/* end snapshot context-menu items */
6667

67-
snapshots["context-menu items nested"] =
68+
snapshots["context-menu items nested"] =
6869
`<vaadin-context-menu
6970
modeless=""
7071
opened=""
@@ -153,10 +154,11 @@ snapshots["context-menu items nested"] =
153154
`;
154155
/* end snapshot context-menu items nested */
155156

156-
snapshots["context-menu overlay class"] =
157+
snapshots["context-menu overlay class"] =
157158
`<vaadin-context-menu-overlay
158159
class="context-menu-overlay custom"
159160
exportparts="backdrop, overlay, content"
161+
id="overlay"
160162
opened=""
161163
popover="manual"
162164
>
@@ -171,10 +173,11 @@ snapshots["context-menu overlay class"] =
171173
`;
172174
/* end snapshot context-menu overlay class */
173175

174-
snapshots["context-menu overlay class nested"] =
176+
snapshots["context-menu overlay class nested"] =
175177
`<vaadin-context-menu-overlay
176178
class="context-menu-overlay custom"
177179
exportparts="backdrop, overlay, content"
180+
id="overlay"
178181
modeless=""
179182
opened=""
180183
popover="manual"
@@ -191,3 +194,4 @@ snapshots["context-menu overlay class nested"] =
191194
</vaadin-context-menu-overlay>
192195
`;
193196
/* end snapshot context-menu overlay class nested */
197+

packages/menu-bar/src/vaadin-menu-bar-submenu-mixin.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ export const SubMenuMixin = (superClass) =>
3131
/**
3232
* Overriding the observer to not add global "contextmenu" listener.
3333
*/
34-
_openedChanged(opened) {
35-
this._overlayElement.opened = opened;
34+
_openedChanged() {
35+
// Do nothing
3636
}
3737

3838
/**

packages/menu-bar/src/vaadin-menu-bar-submenu.js

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import './vaadin-menu-bar-item.js';
77
import './vaadin-menu-bar-list-box.js';
88
import './vaadin-menu-bar-overlay.js';
99
import { css, html, LitElement } from 'lit';
10+
import { ifDefined } from 'lit/directives/if-defined.js';
1011
import { defineCustomElement } from '@vaadin/component-base/src/define.js';
1112
import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
1213
import { ThemePropertyMixin } from '@vaadin/vaadin-themable-mixin/vaadin-theme-property-mixin.js';
@@ -40,17 +41,25 @@ class MenuBarSubmenu extends SubMenuMixin(ThemePropertyMixin(PolylitMixin(LitEle
4041

4142
/** @protected */
4243
render() {
43-
return html`<slot id="slot"></slot>`;
44-
}
45-
46-
/**
47-
* @protected
48-
* @override
49-
*/
50-
createRenderRoot() {
51-
const root = super.createRenderRoot();
52-
root.appendChild(this._overlayElement);
53-
return root;
44+
return html`
45+
<vaadin-menu-bar-overlay
46+
id="overlay"
47+
.owner="${this}"
48+
.opened="${this.opened}"
49+
.model="${this._context}"
50+
.modeless="${this._modeless}"
51+
.renderer="${this.__itemsRenderer}"
52+
.withBackdrop="${this._phone}"
53+
?phone="${this._phone}"
54+
theme="${ifDefined(this._theme)}"
55+
exportparts="backdrop, overlay, content"
56+
@opened-changed="${this._onOverlayOpened}"
57+
@vaadin-overlay-open="${this._onVaadinOverlayOpen}"
58+
>
59+
<slot name="overlay"></slot>
60+
<slot name="submenu" slot="submenu"></slot>
61+
</vaadin-menu-bar-overlay>
62+
`;
5463
}
5564
}
5665

packages/menu-bar/test/dom/__snapshots__/menu-bar.test.snap.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* @web/test-runner snapshot v1 */
22
export const snapshots = {};
3-
snapshots["menu-bar basic"] =
3+
4+
snapshots["menu-bar basic"] =
45
`<vaadin-menu-bar role="menubar">
56
<vaadin-menu-bar-submenu
67
is-root=""
@@ -65,7 +66,7 @@ snapshots["menu-bar basic"] =
6566
`;
6667
/* end snapshot menu-bar basic */
6768

68-
snapshots["menu-bar opened"] =
69+
snapshots["menu-bar opened"] =
6970
`<vaadin-menu-bar
7071
role="menubar"
7172
style="pointer-events: auto;"
@@ -165,9 +166,10 @@ snapshots["menu-bar opened"] =
165166
`;
166167
/* end snapshot menu-bar opened */
167168

168-
snapshots["menu-bar overlay"] =
169+
snapshots["menu-bar overlay"] =
169170
`<vaadin-menu-bar-overlay
170171
exportparts="backdrop, overlay, content"
172+
id="overlay"
171173
opened=""
172174
popover="manual"
173175
start-aligned=""
@@ -184,10 +186,11 @@ snapshots["menu-bar overlay"] =
184186
`;
185187
/* end snapshot menu-bar overlay */
186188

187-
snapshots["menu-bar overlay class"] =
189+
snapshots["menu-bar overlay class"] =
188190
`<vaadin-menu-bar-overlay
189191
class="custom menu-bar-overlay"
190192
exportparts="backdrop, overlay, content"
193+
id="overlay"
191194
opened=""
192195
popover="manual"
193196
start-aligned=""
@@ -203,3 +206,4 @@ snapshots["menu-bar overlay class"] =
203206
</vaadin-menu-bar-overlay>
204207
`;
205208
/* end snapshot menu-bar overlay class */
209+

0 commit comments

Comments
 (0)