Skip to content

Commit 642df30

Browse files
refactor: extract common sub-menu logic into reusable mixin (#8273) (#8274)
Co-authored-by: Serhii Kulykov <iamkulykov@gmail.com>
1 parent 342868b commit 642df30

File tree

3 files changed

+55
-78
lines changed

3 files changed

+55
-78
lines changed

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

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,20 @@ import './vaadin-lit-menu-bar-list-box.js';
88
import './vaadin-lit-menu-bar-overlay.js';
99
import { css, html, LitElement } from 'lit';
1010
import { defineCustomElement } from '@vaadin/component-base/src/define.js';
11-
import { OverlayClassMixin } from '@vaadin/component-base/src/overlay-class-mixin.js';
1211
import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
13-
import { ContextMenuMixin } from '@vaadin/context-menu/src/vaadin-context-menu-mixin.js';
1412
import { ThemePropertyMixin } from '@vaadin/vaadin-themable-mixin/vaadin-theme-property-mixin.js';
13+
import { SubMenuMixin } from './vaadin-menu-bar-submenu-mixin.js';
1514

1615
/**
1716
* An element used internally by `<vaadin-menu-bar>`. Not intended to be used separately.
1817
*
1918
* @customElement
2019
* @extends HTMLElement
21-
* @mixes ContextMenuMixin
22-
* @mixes OverlayClassMixin
20+
* @mixes SubMenuMixin
2321
* @mixes ThemePropertyMixin
2422
* @protected
2523
*/
26-
class MenuBarSubmenu extends ContextMenuMixin(OverlayClassMixin(ThemePropertyMixin(PolylitMixin(LitElement)))) {
24+
class MenuBarSubmenu extends SubMenuMixin(ThemePropertyMixin(PolylitMixin(LitElement))) {
2725
static get is() {
2826
return 'vaadin-menu-bar-submenu';
2927
}
@@ -40,21 +38,6 @@ class MenuBarSubmenu extends ContextMenuMixin(OverlayClassMixin(ThemePropertyMix
4038
`;
4139
}
4240

43-
constructor() {
44-
super();
45-
46-
this.openOn = 'opensubmenu';
47-
}
48-
49-
/**
50-
* Tag name prefix used by overlay, list-box and items.
51-
* @protected
52-
* @return {string}
53-
*/
54-
get _tagNamePrefix() {
55-
return 'vaadin-menu-bar';
56-
}
57-
5841
/** @protected */
5942
render() {
6043
return html`<slot id="slot"></slot>`;
@@ -69,25 +52,6 @@ class MenuBarSubmenu extends ContextMenuMixin(OverlayClassMixin(ThemePropertyMix
6952
root.appendChild(this._overlayElement);
7053
return root;
7154
}
72-
73-
/**
74-
* Overriding the observer to not add global "contextmenu" listener.
75-
*/
76-
_openedChanged(opened) {
77-
this._overlayElement.opened = opened;
78-
}
79-
80-
/**
81-
* Overriding the public method to reset expanded button state.
82-
*/
83-
close() {
84-
super.close();
85-
86-
// Only handle 1st level submenu
87-
if (this.hasAttribute('is-root')) {
88-
this.getRootNode().host._close();
89-
}
90-
}
9155
}
9256

9357
defineCustomElement(MenuBarSubmenu);
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* @license
3+
* Copyright (c) 2019 - 2024 Vaadin Ltd.
4+
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5+
*/
6+
import { OverlayClassMixin } from '@vaadin/component-base/src/overlay-class-mixin.js';
7+
import { ContextMenuMixin } from '@vaadin/context-menu/src/vaadin-context-menu-mixin.js';
8+
9+
/**
10+
* @polymerMixin
11+
* @mixes ContextMenuMixin
12+
* @mixes OverlayClassMixin
13+
*/
14+
export const SubMenuMixin = (superClass) =>
15+
class SubMenuMixinClass extends ContextMenuMixin(OverlayClassMixin(superClass)) {
16+
constructor() {
17+
super();
18+
19+
this.openOn = 'opensubmenu';
20+
}
21+
22+
/**
23+
* Tag name prefix used by overlay, list-box and items.
24+
* @protected
25+
* @return {string}
26+
*/
27+
get _tagNamePrefix() {
28+
return 'vaadin-menu-bar';
29+
}
30+
31+
/**
32+
* Overriding the observer to not add global "contextmenu" listener.
33+
*/
34+
_openedChanged(opened) {
35+
this._overlayElement.opened = opened;
36+
}
37+
38+
/**
39+
* Overriding the public method to reset expanded button state.
40+
*/
41+
close() {
42+
super.close();
43+
44+
// Only handle 1st level submenu
45+
if (this.hasAttribute('is-root')) {
46+
this.getRootNode().host._close();
47+
}
48+
}
49+
};

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

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,20 @@ import './vaadin-menu-bar-overlay.js';
99
import { html, PolymerElement } from '@polymer/polymer/polymer-element.js';
1010
import { ControllerMixin } from '@vaadin/component-base/src/controller-mixin.js';
1111
import { defineCustomElement } from '@vaadin/component-base/src/define.js';
12-
import { OverlayClassMixin } from '@vaadin/component-base/src/overlay-class-mixin.js';
13-
import { ContextMenuMixin } from '@vaadin/context-menu/src/vaadin-context-menu-mixin.js';
1412
import { ThemePropertyMixin } from '@vaadin/vaadin-themable-mixin/vaadin-theme-property-mixin.js';
13+
import { SubMenuMixin } from './vaadin-menu-bar-submenu-mixin.js';
1514

1615
/**
1716
* An element used internally by `<vaadin-menu-bar>`. Not intended to be used separately.
1817
*
1918
* @customElement
2019
* @extends HTMLElement
21-
* @mixes ContextMenuMixin
2220
* @mixes ControllerMixin
23-
* @mixes OverlayClassMixin
21+
* @mixes SubMenuMixin
2422
* @mixes ThemePropertyMixin
2523
* @protected
2624
*/
27-
class MenuBarSubmenu extends ContextMenuMixin(OverlayClassMixin(ControllerMixin(ThemePropertyMixin(PolymerElement)))) {
25+
class MenuBarSubmenu extends SubMenuMixin(ControllerMixin(ThemePropertyMixin(PolymerElement))) {
2826
static get is() {
2927
return 'vaadin-menu-bar-submenu';
3028
}
@@ -45,21 +43,6 @@ class MenuBarSubmenu extends ContextMenuMixin(OverlayClassMixin(ControllerMixin(
4543
`;
4644
}
4745

48-
constructor() {
49-
super();
50-
51-
this.openOn = 'opensubmenu';
52-
}
53-
54-
/**
55-
* Tag name prefix used by overlay, list-box and items.
56-
* @protected
57-
* @return {string}
58-
*/
59-
get _tagNamePrefix() {
60-
return 'vaadin-menu-bar';
61-
}
62-
6346
/**
6447
* @param {DocumentFragment} dom
6548
* @return {ShadowRoot}
@@ -72,25 +55,6 @@ class MenuBarSubmenu extends ContextMenuMixin(OverlayClassMixin(ControllerMixin(
7255
root.appendChild(this._overlayElement);
7356
return root;
7457
}
75-
76-
/**
77-
* Overriding the observer to not add global "contextmenu" listener.
78-
*/
79-
_openedChanged(opened) {
80-
this._overlayElement.opened = opened;
81-
}
82-
83-
/**
84-
* Overriding the public method to reset expanded button state.
85-
*/
86-
close() {
87-
super.close();
88-
89-
// Only handle 1st level submenu
90-
if (this.hasAttribute('is-root')) {
91-
this.getRootNode().host._close();
92-
}
93-
}
9458
}
9559

9660
defineCustomElement(MenuBarSubmenu);

0 commit comments

Comments
 (0)