@exmg/exm-navigation 1.0.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +11 -15
- package/index.js +11 -15
- package/package.json +10 -9
- package/src/exm-navigation-base.d.ts +94 -19
- package/src/exm-navigation-base.js +288 -58
- package/src/exm-navigation-drawer-base.d.ts +8 -23
- package/src/exm-navigation-drawer-base.js +25 -149
- package/src/exm-navigation-drawer-menu-base.d.ts +12 -0
- package/src/exm-navigation-drawer-menu-base.js +45 -0
- package/src/exm-navigation-drawer-menu.d.ts +9 -0
- package/src/exm-navigation-drawer-menu.js +12 -0
- package/src/exm-navigation-drawer-nav-item-base.d.ts +14 -0
- package/src/exm-navigation-drawer-nav-item-base.js +45 -0
- package/src/exm-navigation-drawer-nav-item.d.ts +8 -0
- package/src/exm-navigation-drawer-nav-item.js +10 -0
- package/src/exm-navigation-drawer.d.ts +0 -1
- package/src/exm-navigation-drawer.js +0 -2
- package/src/exm-navigation-icon-base.d.ts +7 -0
- package/src/exm-navigation-icon-base.js +20 -0
- package/src/exm-navigation-icon-button-base.d.ts +9 -0
- package/src/exm-navigation-icon-button-base.js +34 -0
- package/src/exm-navigation-icon-button.d.ts +8 -0
- package/src/exm-navigation-icon-button.js +10 -0
- package/src/exm-navigation-icon.d.ts +8 -0
- package/src/exm-navigation-icon.js +10 -0
- package/src/exm-navigation-menu-button-base.d.ts +7 -0
- package/src/exm-navigation-menu-button.d.ts +9 -0
- package/src/exm-navigation-rail-base.d.ts +8 -0
- package/src/exm-navigation-rail-base.js +46 -1
- package/src/exm-navigation-rail-nav-item-base.d.ts +2 -4
- package/src/exm-navigation-rail-nav-item-base.js +7 -39
- package/src/exm-navigation-rail-nav-item.d.ts +0 -1
- package/src/exm-navigation-rail-nav-item.js +0 -2
- package/src/exm-navigation-rail.d.ts +0 -1
- package/src/exm-navigation-rail.js +0 -2
- package/src/exm-navigation-signals.d.ts +1 -8
- package/src/exm-navigation-sub-menu-base.d.ts +17 -0
- package/src/exm-navigation-sub-menu-base.js +88 -0
- package/src/exm-navigation-sub-menu.d.ts +8 -0
- package/src/exm-navigation-sub-menu.js +10 -0
- package/src/exm-navigation-topbar-base.d.ts +10 -0
- package/src/exm-navigation-topbar-base.js +33 -0
- package/src/exm-navigation-topbar.d.ts +8 -0
- package/src/exm-navigation-topbar.js +10 -0
- package/src/exm-navigation.d.ts +8 -0
- package/src/exm-navigation.js +10 -0
- package/src/mediaQueries.d.ts +7 -0
- package/src/mixins/media-queries.d.ts +7 -0
- package/src/mixins/media-queries.js +45 -0
- package/src/styles/exm-navigate-drawer-nav-item-css.js +4 -0
- package/src/styles/exm-navigation-css.js +4 -0
- package/src/styles/exm-navigation-drawer-css.js +1 -1
- package/src/styles/exm-navigation-drawer-nav-item-css.js +4 -0
- package/src/styles/{exm-navigation-styles.scss → exm-navigation-drawer-nav-item.scss} +11 -21
- package/src/styles/exm-navigation-drawer.scss +14 -19
- package/src/styles/exm-navigation-icon-button-css.d.ts +2 -0
- package/src/styles/exm-navigation-icon-button-css.js +4 -0
- package/src/styles/exm-navigation-icon-button.scss +19 -0
- package/src/styles/exm-navigation-icon-css.d.ts +2 -0
- package/src/styles/exm-navigation-icon-css.js +4 -0
- package/src/styles/exm-navigation-icon.scss +18 -0
- package/src/styles/exm-navigation-rail-css.js +1 -1
- package/src/styles/exm-navigation-rail-nav-item-css.js +1 -1
- package/src/styles/exm-navigation-rail-nav-item.scss +14 -29
- package/src/styles/exm-navigation-rail.scss +14 -5
- package/src/styles/exm-navigation-sub-menu-css.d.ts +2 -0
- package/src/styles/exm-navigation-sub-menu-css.js +4 -0
- package/src/styles/exm-navigation-sub-menu.scss +34 -0
- package/src/styles/exm-navigation-topbar-css.d.ts +2 -0
- package/src/styles/exm-navigation-topbar-css.js +4 -0
- package/src/styles/exm-navigation-topbar.scss +27 -0
- package/src/styles/exm-navigation.scss +52 -0
- package/src/types.d.ts +8 -0
- package/src/types.js +2 -0
- package/src/exm-navigation-drawer-nav.d.ts +0 -9
- package/src/exm-navigation-drawer-nav.js +0 -47
- package/src/exm-navigation-rail-nav-base.d.ts +0 -4
- package/src/exm-navigation-rail-nav-base.js +0 -9
- package/src/exm-navigation-rail-nav.d.ts +0 -9
- package/src/exm-navigation-rail-nav.js +0 -12
- package/src/exm-navigation-signals.js +0 -11
- package/src/exm-navigation-toolbar-base.d.ts +0 -8
- package/src/exm-navigation-toolbar-base.js +0 -33
- package/src/exm-navigation-toolbar.d.ts +0 -9
- package/src/exm-navigation-toolbar.js +0 -12
- package/src/styles/exm-navigation-rail-nav-css.js +0 -4
- package/src/styles/exm-navigation-rail-nav.scss +0 -7
- package/src/styles/exm-navigation-styles-css.js +0 -4
- package/src/styles/exm-navigation-toolbar-css.js +0 -4
- package/src/styles/exm-navigation-toolbar.scss +0 -18
- /package/src/styles/{exm-navigation-rail-nav-css.d.ts → exm-navigate-drawer-nav-item-css.d.ts} +0 -0
- /package/src/styles/{exm-navigation-styles-css.d.ts → exm-navigation-css.d.ts} +0 -0
- /package/src/styles/{exm-navigation-toolbar-css.d.ts → exm-navigation-drawer-nav-item-css.d.ts} +0 -0
package/index.d.ts
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { ExmNavigationRailNav } from './src/exm-navigation-rail-nav.js';
|
|
3
|
-
export { ExmNavigationRailBase } from './src/exm-navigation-rail-base.js';
|
|
4
|
-
export { ExmNavigationRail } from './src/exm-navigation-rail.js';
|
|
5
|
-
export { ExmNavigationDrawerBase } from './src/exm-navigation-drawer-base.js';
|
|
6
|
-
export { ExmNavigationDrawer } from './src/exm-navigation-drawer.js';
|
|
7
|
-
export { ExmNavigationToolbarBase } from './src/exm-navigation-toolbar-base.js';
|
|
1
|
+
export { ExmNavigation } from './src/exm-navigation.js';
|
|
8
2
|
export { ExmNavigationBase } from './src/exm-navigation-base.js';
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
3
|
+
export { ExmNavigationDrawerBase } from './src/exm-navigation-drawer-base.js';
|
|
4
|
+
export { ExmNavigationDrawerMenuBase } from './src/exm-navigation-drawer-menu-base.js';
|
|
5
|
+
export { ExmNavigationDrawerNavItemBase } from './src/exm-navigation-drawer-nav-item-base.js';
|
|
6
|
+
export { ExmNavigationIconBase } from './src/exm-navigation-icon-base.js';
|
|
7
|
+
export { ExmNavigationIconButtonBase } from './src/exm-navigation-icon-button-base.js';
|
|
8
|
+
export { ExmNavigationRailBase } from './src/exm-navigation-rail-base.js';
|
|
9
|
+
export { ExmNavigationRailNavItemBase } from './src/exm-navigation-rail-nav-item-base.js';
|
|
10
|
+
export { ExmNavigationSubMenuBase } from './src/exm-navigation-sub-menu-base.js';
|
|
11
|
+
export { ExmNavigationTopbarBase } from './src/exm-navigation-topbar-base.js';
|
|
12
|
+
export { style as exmgNavigationStyles } from './src/styles/exm-navigation-css.js';
|
package/index.js
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { ExmNavigationRailNav } from './src/exm-navigation-rail-nav.js';
|
|
3
|
-
export { ExmNavigationRailBase } from './src/exm-navigation-rail-base.js';
|
|
4
|
-
export { ExmNavigationRail } from './src/exm-navigation-rail.js';
|
|
5
|
-
export { ExmNavigationDrawerBase } from './src/exm-navigation-drawer-base.js';
|
|
6
|
-
export { ExmNavigationDrawer } from './src/exm-navigation-drawer.js';
|
|
7
|
-
export { ExmNavigationToolbarBase } from './src/exm-navigation-toolbar-base.js';
|
|
1
|
+
export { ExmNavigation } from './src/exm-navigation.js';
|
|
8
2
|
export { ExmNavigationBase } from './src/exm-navigation-base.js';
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
3
|
+
export { ExmNavigationDrawerBase } from './src/exm-navigation-drawer-base.js';
|
|
4
|
+
export { ExmNavigationDrawerMenuBase } from './src/exm-navigation-drawer-menu-base.js';
|
|
5
|
+
export { ExmNavigationDrawerNavItemBase } from './src/exm-navigation-drawer-nav-item-base.js';
|
|
6
|
+
export { ExmNavigationIconBase } from './src/exm-navigation-icon-base.js';
|
|
7
|
+
export { ExmNavigationIconButtonBase } from './src/exm-navigation-icon-button-base.js';
|
|
8
|
+
export { ExmNavigationRailBase } from './src/exm-navigation-rail-base.js';
|
|
9
|
+
export { ExmNavigationRailNavItemBase } from './src/exm-navigation-rail-nav-item-base.js';
|
|
10
|
+
export { ExmNavigationSubMenuBase } from './src/exm-navigation-sub-menu-base.js';
|
|
11
|
+
export { ExmNavigationTopbarBase } from './src/exm-navigation-topbar-base.js';
|
|
12
|
+
export { style as exmgNavigationStyles } from './src/styles/exm-navigation-css.js';
|
|
17
13
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exmg/exm-navigation",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "index.js",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": "./index.js",
|
|
9
|
+
"./exm-navigation.js": "./src/exm-navigation.js",
|
|
10
|
+
"./exm-navigation-drawer.js": "./src/exm-navigation-drawer.js",
|
|
11
|
+
"./exm-navigation-drawer-menu.js": "./src/exm-navigation-drawer-menu.js",
|
|
12
|
+
"./exm-navigation-drawer-nav-item.js": "./src/exm-navigation-drawer-nav-item.js",
|
|
13
|
+
"./exm-navigation-icon.js": "./src/exm-navigation-icon.js",
|
|
14
|
+
"./exm-navigation-icon-button.js": "./src/exm-navigation-icon-button.js",
|
|
9
15
|
"./exm-navigation-rail.js": "./src/exm-navigation-rail.js",
|
|
10
|
-
"./exm-navigation-rail-nav.js": "./src/exm-navigation-rail-nav.js",
|
|
11
16
|
"./exm-navigation-rail-nav-item.js": "./src/exm-navigation-rail-nav-item.js",
|
|
12
|
-
"./exm-navigation-
|
|
13
|
-
"./exm-navigation-toolbar.js": "./src/exm-navigation-toolbar.js",
|
|
14
|
-
"./exm-navigation-drawer-nav.js": "./src/exm-navigation-drawer-nav.js",
|
|
17
|
+
"./exm-navigation-topbar.js": "./src/exm-navigation-topbar.js",
|
|
15
18
|
"./exm-navigation-base.js": "./src/ExmNavigationBase.js"
|
|
16
19
|
},
|
|
17
20
|
"dependencies": {
|
|
18
21
|
"@exmg/lit-base": "^3.0.0",
|
|
19
|
-
"@lit-labs/observers": "^2.0.2",
|
|
20
|
-
"@lit-labs/preact-signals": "^1.0.1",
|
|
21
22
|
"@material/mwc-drawer": "^0.27.0",
|
|
22
23
|
"@material/mwc-top-app-bar-fixed": "^0.27.0",
|
|
23
24
|
"@material/web": "^2.2.0",
|
|
@@ -50,5 +51,5 @@
|
|
|
50
51
|
"publishConfig": {
|
|
51
52
|
"access": "public"
|
|
52
53
|
},
|
|
53
|
-
"gitHead": "
|
|
54
|
-
}
|
|
54
|
+
"gitHead": "1973df6ecaaf0a57b688f5eb8852516295bc04d6"
|
|
55
|
+
}
|
|
@@ -1,30 +1,105 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PropertyValues } from 'lit';
|
|
2
|
+
import { ExmgElement } from '@exmg/lit-base/index.js';
|
|
3
|
+
import { MenuItem } from './types.js';
|
|
2
4
|
import { ExmNavigationDrawer } from './exm-navigation-drawer.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
import './exm-navigation-icon-button.js';
|
|
6
|
+
import './exm-navigation-topbar.js';
|
|
7
|
+
import './exm-navigation-rail.js';
|
|
8
|
+
import './exm-navigation-sub-menu.js';
|
|
9
|
+
import './exm-navigation-drawer-menu.js';
|
|
10
|
+
import './exm-navigation-drawer.js';
|
|
11
|
+
declare const ExmNavigationBase_base: (new (...args: any[]) => {
|
|
12
|
+
media: "mobile" | "tablet" | "desktop";
|
|
13
|
+
}) & typeof ExmgElement;
|
|
12
14
|
export declare class ExmNavigationBase extends ExmNavigationBase_base {
|
|
13
|
-
|
|
15
|
+
items: MenuItem[];
|
|
16
|
+
path: string[];
|
|
17
|
+
drawerWidth: number;
|
|
14
18
|
drawer?: ExmNavigationDrawer;
|
|
19
|
+
navContent?: HTMLDivElement;
|
|
20
|
+
persistent: boolean;
|
|
21
|
+
selectedItem: string[];
|
|
22
|
+
activeItem: string[];
|
|
23
|
+
railOpen: boolean;
|
|
24
|
+
drawerOpen: boolean;
|
|
25
|
+
drawerHover: boolean;
|
|
26
|
+
navigationHasSubmenu: Record<string, boolean>;
|
|
27
|
+
static styles: import("lit").CSSResult[];
|
|
15
28
|
menu: MenuItem[];
|
|
16
29
|
expandedItems: {
|
|
17
30
|
[k: string]: boolean;
|
|
18
31
|
};
|
|
32
|
+
unSubscribeSelected: () => void;
|
|
33
|
+
protected updated(changedProperties: PropertyValues): void;
|
|
34
|
+
protected firstUpdated(changedProperties: PropertyValues): void;
|
|
19
35
|
connectedCallback(): void;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
loadPage(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Set the correct values when the media changes.
|
|
38
|
+
*/
|
|
39
|
+
handleMediaTypeChange(): void;
|
|
40
|
+
loadPage(path: string[]): void;
|
|
41
|
+
/**
|
|
42
|
+
* Handle Rail item click or Drawer sub menu click.
|
|
43
|
+
* If the selected menu item has children, we add the first item to the list (as per Google implementation).
|
|
44
|
+
* In this case we also do not close the drawer in non persistent mode, so the user is able to select a next level in the menu
|
|
45
|
+
*/
|
|
46
|
+
handleRailItemClick({ detail }: CustomEvent<string>): void;
|
|
47
|
+
/**
|
|
48
|
+
* Handle the mouse enter of the rail item.
|
|
49
|
+
*/
|
|
50
|
+
private handleRailItemMouseEnter;
|
|
51
|
+
/**
|
|
52
|
+
* Handle the mouse leave of the rail item.
|
|
53
|
+
* If the item has no submenu and the current selected item has no submenu, it is safe to close the drawer
|
|
54
|
+
*/
|
|
55
|
+
private handleRailItemMouseLeave;
|
|
56
|
+
/**
|
|
57
|
+
* Handle drawer mouse leave. Should close the drawer
|
|
58
|
+
*/
|
|
59
|
+
private handleDrawerMouseLeave;
|
|
60
|
+
/**
|
|
61
|
+
* Handle the click on a sub menu item
|
|
62
|
+
* @param param Contains detail. This has the new path to go to.
|
|
63
|
+
* If the rail is hidden and the selected item has no children, we close the drawer
|
|
64
|
+
*/
|
|
65
|
+
private handleSubMenuClick;
|
|
66
|
+
/**
|
|
67
|
+
* Handle the topbar menu click.
|
|
68
|
+
* Clicking the menu button in the topbar wil toggle the drawer
|
|
69
|
+
*/
|
|
70
|
+
private handleTopbarMenuClick;
|
|
71
|
+
/**
|
|
72
|
+
* Handle the drawer back button click.
|
|
73
|
+
* This should reset the active item, so the root-level menu gets triggered
|
|
74
|
+
*/
|
|
75
|
+
private handleDrawerBackClick;
|
|
76
|
+
/**
|
|
77
|
+
* Check if the passed paths last item has children yes or no
|
|
78
|
+
* @param path Path array
|
|
79
|
+
* @returns True if the given path has children
|
|
80
|
+
*/
|
|
81
|
+
private currentSelectedHasChildren;
|
|
82
|
+
/**
|
|
83
|
+
* When the rail is not open, show the menu button on top of the drawer to close it
|
|
84
|
+
*/
|
|
85
|
+
private renderDrawerMenuButton;
|
|
86
|
+
/**
|
|
87
|
+
* When no menu item selected, ot only toplevel without children, show the start menu (same as in the rail)
|
|
88
|
+
* If more levels deep, show the back button
|
|
89
|
+
*/
|
|
90
|
+
private renderStartMenu;
|
|
91
|
+
/**
|
|
92
|
+
* return the sub menus. More then 1 level deep
|
|
93
|
+
*/
|
|
94
|
+
private renderDrawerSubMenu;
|
|
95
|
+
/**
|
|
96
|
+
* Return the Rail
|
|
97
|
+
*/
|
|
98
|
+
private renderRail;
|
|
99
|
+
/**
|
|
100
|
+
* Render the topbar. This is displayed on mobile and contains the menu button and a slot for the title
|
|
101
|
+
*/
|
|
102
|
+
private renderTopbar;
|
|
28
103
|
render(): import("lit-html").TemplateResult<1>;
|
|
29
104
|
}
|
|
30
105
|
export {};
|
|
@@ -1,85 +1,315 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
import { html, nothing } from 'lit';
|
|
3
|
+
import { ExmgElement } from '@exmg/lit-base/index.js';
|
|
4
|
+
import { property, query, state } from 'lit/decorators.js';
|
|
5
|
+
import { styleMap } from 'lit/directives/style-map.js';
|
|
6
|
+
import { MediaQueries } from './mixins/media-queries.js';
|
|
7
|
+
import { classMap } from 'lit/directives/class-map.js';
|
|
8
|
+
import { style } from './styles/exm-navigation-css.js';
|
|
9
|
+
import './exm-navigation-icon-button.js';
|
|
10
|
+
import './exm-navigation-topbar.js';
|
|
11
|
+
import './exm-navigation-rail.js';
|
|
12
|
+
import './exm-navigation-sub-menu.js';
|
|
13
|
+
import './exm-navigation-drawer-menu.js';
|
|
14
|
+
import './exm-navigation-drawer.js';
|
|
15
|
+
// eslint-disable-next-line new-cap
|
|
16
|
+
export class ExmNavigationBase extends MediaQueries(ExmgElement) {
|
|
8
17
|
constructor() {
|
|
9
18
|
super(...arguments);
|
|
10
|
-
this.
|
|
19
|
+
this.items = [];
|
|
20
|
+
this.path = ['chat'];
|
|
21
|
+
this.drawerWidth = 319;
|
|
22
|
+
this.persistent = true;
|
|
23
|
+
this.selectedItem = [];
|
|
24
|
+
this.activeItem = [];
|
|
25
|
+
this.railOpen = true;
|
|
26
|
+
this.drawerOpen = false;
|
|
27
|
+
this.drawerHover = false;
|
|
28
|
+
this.navigationHasSubmenu = {};
|
|
11
29
|
this.menu = [];
|
|
12
30
|
this.expandedItems = {};
|
|
31
|
+
this.unSubscribeSelected = () => { };
|
|
32
|
+
}
|
|
33
|
+
updated(changedProperties) {
|
|
34
|
+
if (changedProperties.has('media')) {
|
|
35
|
+
this.handleMediaTypeChange.bind(this)();
|
|
36
|
+
}
|
|
37
|
+
if (changedProperties.has('items')) {
|
|
38
|
+
for (const item of this.items) {
|
|
39
|
+
this.navigationHasSubmenu[item.id] = (item.items || []).length > 0;
|
|
40
|
+
}
|
|
41
|
+
if (this.navigationHasSubmenu[this.path[0]] && this.persistent) {
|
|
42
|
+
this.drawerOpen = true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
firstUpdated(changedProperties) {
|
|
47
|
+
if (changedProperties.has('media')) {
|
|
48
|
+
this.handleMediaTypeChange.bind(this)();
|
|
49
|
+
}
|
|
13
50
|
}
|
|
14
51
|
connectedCallback() {
|
|
15
52
|
super.connectedCallback();
|
|
16
|
-
|
|
17
|
-
|
|
53
|
+
this.selectedItem = [...this.path];
|
|
54
|
+
this.activeItem = [...this.path];
|
|
18
55
|
}
|
|
19
|
-
|
|
20
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Set the correct values when the media changes.
|
|
58
|
+
*/
|
|
59
|
+
handleMediaTypeChange() {
|
|
60
|
+
this.persistent = this.media === 'desktop';
|
|
61
|
+
this.drawerOpen = this.media === 'desktop' && this.navigationHasSubmenu[this.selectedItem[0]];
|
|
62
|
+
this.railOpen = this.media !== 'mobile';
|
|
21
63
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.
|
|
25
|
-
this.requestUpdate();
|
|
64
|
+
loadPage(path) {
|
|
65
|
+
this.path = path;
|
|
66
|
+
this.selectedItem = path;
|
|
26
67
|
}
|
|
27
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Handle Rail item click or Drawer sub menu click.
|
|
70
|
+
* If the selected menu item has children, we add the first item to the list (as per Google implementation).
|
|
71
|
+
* In this case we also do not close the drawer in non persistent mode, so the user is able to select a next level in the menu
|
|
72
|
+
*/
|
|
73
|
+
handleRailItemClick({ detail }) {
|
|
28
74
|
var _a;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
75
|
+
if (this.selectedItem[0] !== detail) {
|
|
76
|
+
const items = ((_a = this.items.find((item) => item.id === detail)) === null || _a === void 0 ? void 0 : _a.items) || [];
|
|
77
|
+
if (items.length) {
|
|
78
|
+
this.selectedItem = [detail, items[0].id];
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this.selectedItem = [detail];
|
|
82
|
+
}
|
|
83
|
+
// copy the selected item to the active item
|
|
84
|
+
this.activeItem = this.selectedItem;
|
|
85
|
+
/**
|
|
86
|
+
* If persistent menu close the drawer when a item is clicked and does not has children items
|
|
87
|
+
*/
|
|
88
|
+
if (this.persistent) {
|
|
89
|
+
this.drawerOpen = items.length > 0 || this.navigationHasSubmenu[detail];
|
|
90
|
+
}
|
|
91
|
+
else if (items.length === 0) {
|
|
92
|
+
this.drawerOpen = false;
|
|
93
|
+
}
|
|
94
|
+
this.loadPage(this.selectedItem);
|
|
38
95
|
}
|
|
39
|
-
return parentId;
|
|
40
96
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
97
|
+
/**
|
|
98
|
+
* Handle the mouse enter of the rail item.
|
|
99
|
+
*/
|
|
100
|
+
handleRailItemMouseEnter({ detail }) {
|
|
101
|
+
if (this.navigationHasSubmenu[detail]) {
|
|
102
|
+
this.drawerOpen = true;
|
|
103
|
+
if (detail !== this.selectedItem[0]) {
|
|
104
|
+
this.activeItem = [detail];
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (this.navigationHasSubmenu[this.selectedItem[0]] && this.persistent) {
|
|
109
|
+
this.activeItem = this.selectedItem;
|
|
110
|
+
this.drawerOpen = true;
|
|
51
111
|
}
|
|
52
112
|
else {
|
|
53
|
-
|
|
54
|
-
this.
|
|
113
|
+
this.activeItem = this.selectedItem;
|
|
114
|
+
this.drawerOpen = false;
|
|
55
115
|
}
|
|
116
|
+
this.activeItem = this.selectedItem;
|
|
56
117
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Handle the mouse leave of the rail item.
|
|
120
|
+
* If the item has no submenu and the current selected item has no submenu, it is safe to close the drawer
|
|
121
|
+
*/
|
|
122
|
+
handleRailItemMouseLeave({ detail }) {
|
|
123
|
+
if (!this.navigationHasSubmenu[detail] && !this.navigationHasSubmenu[this.selectedItem[0]]) {
|
|
124
|
+
this.drawerOpen = false;
|
|
125
|
+
}
|
|
126
|
+
if (!this.persistent && !this.navigationHasSubmenu[detail]) {
|
|
127
|
+
this.drawerOpen = false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Handle drawer mouse leave. Should close the drawer
|
|
132
|
+
*/
|
|
133
|
+
handleDrawerMouseLeave() {
|
|
134
|
+
if (!this.navigationHasSubmenu[this.selectedItem[0]] || !this.persistent) {
|
|
135
|
+
this.drawerOpen = false;
|
|
73
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* On mouse leave the drawer we want to set the active item to the selected item.
|
|
139
|
+
* If not, it will show the active item on every hover and will make navigating in the selected item impossible
|
|
140
|
+
*/
|
|
141
|
+
this.activeItem = this.selectedItem;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Handle the click on a sub menu item
|
|
145
|
+
* @param param Contains detail. This has the new path to go to.
|
|
146
|
+
* If the rail is hidden and the selected item has no children, we close the drawer
|
|
147
|
+
*/
|
|
148
|
+
handleSubMenuClick({ detail }) {
|
|
149
|
+
this.selectedItem = detail;
|
|
150
|
+
this.activeItem = detail;
|
|
151
|
+
if ((!this.railOpen || !this.persistent) && !this.currentSelectedHasChildren(detail)) {
|
|
152
|
+
this.drawerOpen = false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Handle the topbar menu click.
|
|
157
|
+
* Clicking the menu button in the topbar wil toggle the drawer
|
|
158
|
+
*/
|
|
159
|
+
handleTopbarMenuClick() {
|
|
160
|
+
this.drawerOpen = !this.drawerOpen;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Handle the drawer back button click.
|
|
164
|
+
* This should reset the active item, so the root-level menu gets triggered
|
|
165
|
+
*/
|
|
166
|
+
handleDrawerBackClick() {
|
|
167
|
+
this.activeItem = [];
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Check if the passed paths last item has children yes or no
|
|
171
|
+
* @param path Path array
|
|
172
|
+
* @returns True if the given path has children
|
|
173
|
+
*/
|
|
174
|
+
currentSelectedHasChildren(path) {
|
|
175
|
+
let currentItems = this.items;
|
|
176
|
+
return path.reduce((_, pathSection) => {
|
|
177
|
+
const item = currentItems.find((currentItem) => currentItem.id === pathSection);
|
|
178
|
+
currentItems = (item === null || item === void 0 ? void 0 : item.items) || [];
|
|
179
|
+
return ((item === null || item === void 0 ? void 0 : item.items) || []).length > 0;
|
|
180
|
+
}, false);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* When the rail is not open, show the menu button on top of the drawer to close it
|
|
184
|
+
*/
|
|
185
|
+
renderDrawerMenuButton() {
|
|
186
|
+
return !this.railOpen
|
|
187
|
+
? html `
|
|
188
|
+
<section>
|
|
189
|
+
<exm-navigation-icon-button
|
|
190
|
+
icon=${this.drawerOpen ? 'menu_open' : 'menu'}
|
|
191
|
+
@navigation-icon-button-click=${this.handleTopbarMenuClick}
|
|
192
|
+
></exm-navigation-icon-button>
|
|
193
|
+
</section>
|
|
194
|
+
`
|
|
195
|
+
: nothing;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* When no menu item selected, ot only toplevel without children, show the start menu (same as in the rail)
|
|
199
|
+
* If more levels deep, show the back button
|
|
200
|
+
*/
|
|
201
|
+
renderStartMenu() {
|
|
202
|
+
return !this.railOpen &&
|
|
203
|
+
(this.activeItem.length === 0 ||
|
|
204
|
+
(this.activeItem.length === 1 && !this.currentSelectedHasChildren(this.activeItem)))
|
|
205
|
+
? html `<exm-navigation-drawer-menu
|
|
206
|
+
.items=${this.items}
|
|
207
|
+
.path=${this.activeItem}
|
|
208
|
+
@drawer-menu-item-click=${this.handleRailItemClick}
|
|
209
|
+
></exm-navigation-drawer-menu>`
|
|
210
|
+
: !this.railOpen
|
|
211
|
+
? html `
|
|
212
|
+
<section>
|
|
213
|
+
<exm-navigation-icon-button
|
|
214
|
+
icon="arrow_back"
|
|
215
|
+
label="Main menu"
|
|
216
|
+
@navigation-icon-button-click=${this.handleDrawerBackClick}
|
|
217
|
+
></exm-navigation-icon-button>
|
|
218
|
+
</section>
|
|
219
|
+
`
|
|
220
|
+
: nothing;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* return the sub menus. More then 1 level deep
|
|
224
|
+
*/
|
|
225
|
+
renderDrawerSubMenu() {
|
|
226
|
+
return html `
|
|
227
|
+
<exm-navigation-sub-menu
|
|
228
|
+
.items=${this.items}
|
|
229
|
+
.path=${this.activeItem}
|
|
230
|
+
@sub-menu-item-click=${this.handleSubMenuClick}
|
|
231
|
+
></exm-navigation-sub-menu>
|
|
232
|
+
`;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Return the Rail
|
|
236
|
+
*/
|
|
237
|
+
renderRail() {
|
|
238
|
+
return html `<exm-navigation-rail
|
|
239
|
+
.items=${this.items}
|
|
240
|
+
.selected=${this.selectedItem}
|
|
241
|
+
@rail-item-click=${this.handleRailItemClick}
|
|
242
|
+
@rail-item-mouseenter=${this.handleRailItemMouseEnter}
|
|
243
|
+
@rail-item-mouseleave=${this.handleRailItemMouseLeave}
|
|
244
|
+
></exm-navigation-rail>`;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Render the topbar. This is displayed on mobile and contains the menu button and a slot for the title
|
|
248
|
+
*/
|
|
249
|
+
renderTopbar() {
|
|
250
|
+
return html `<exm-navigation-topbar ?drawer-open=${this.drawerOpen} @topbar-menu-click=${this.handleTopbarMenuClick}>
|
|
251
|
+
<slot name="topbar-title" slot="topbar-title"></slot>
|
|
252
|
+
</exm-navigation-topbar>`;
|
|
74
253
|
}
|
|
75
254
|
render() {
|
|
76
|
-
|
|
255
|
+
var _a;
|
|
256
|
+
const containerStyle = {
|
|
257
|
+
'--exm-drawer-width': `${(((_a = this.items.find((item) => item.id === this.selectedItem[0])) === null || _a === void 0 ? void 0 : _a.items) || []).length > 0 && this.persistent ? this.drawerWidth : 0}px`,
|
|
258
|
+
};
|
|
259
|
+
const containerClass = { 'show-topbar': !this.railOpen };
|
|
260
|
+
return html `
|
|
261
|
+
<section
|
|
262
|
+
class="navigation-container ${classMap(containerClass)}"
|
|
263
|
+
id="navigation-container"
|
|
264
|
+
style=${styleMap(containerStyle)}
|
|
265
|
+
>
|
|
266
|
+
${this.railOpen ? this.renderRail() : this.renderTopbar()}
|
|
267
|
+
<exm-navigation-drawer ?open=${this.drawerOpen} @drawer-mouseleave=${this.handleDrawerMouseLeave}>
|
|
268
|
+
${[this.renderDrawerMenuButton(), this.renderStartMenu(), this.renderDrawerSubMenu()]}
|
|
269
|
+
</exm-navigation-drawer>
|
|
270
|
+
<section class="content">
|
|
271
|
+
<slot></slot>
|
|
272
|
+
</section>
|
|
273
|
+
</section>
|
|
274
|
+
<slot></slot>
|
|
275
|
+
`;
|
|
77
276
|
}
|
|
78
277
|
}
|
|
278
|
+
ExmNavigationBase.styles = [style];
|
|
79
279
|
__decorate([
|
|
80
|
-
property({ type:
|
|
81
|
-
], ExmNavigationBase.prototype, "
|
|
280
|
+
property({ type: Array })
|
|
281
|
+
], ExmNavigationBase.prototype, "items", void 0);
|
|
82
282
|
__decorate([
|
|
83
|
-
|
|
283
|
+
property({ type: Array })
|
|
284
|
+
], ExmNavigationBase.prototype, "path", void 0);
|
|
285
|
+
__decorate([
|
|
286
|
+
property({ type: Number, attribute: 'drawer-width' })
|
|
287
|
+
], ExmNavigationBase.prototype, "drawerWidth", void 0);
|
|
288
|
+
__decorate([
|
|
289
|
+
query('exm-navigation-drawer')
|
|
84
290
|
], ExmNavigationBase.prototype, "drawer", void 0);
|
|
291
|
+
__decorate([
|
|
292
|
+
query('#navigation-container')
|
|
293
|
+
], ExmNavigationBase.prototype, "navContent", void 0);
|
|
294
|
+
__decorate([
|
|
295
|
+
state()
|
|
296
|
+
], ExmNavigationBase.prototype, "persistent", void 0);
|
|
297
|
+
__decorate([
|
|
298
|
+
state()
|
|
299
|
+
], ExmNavigationBase.prototype, "selectedItem", void 0);
|
|
300
|
+
__decorate([
|
|
301
|
+
state()
|
|
302
|
+
], ExmNavigationBase.prototype, "activeItem", void 0);
|
|
303
|
+
__decorate([
|
|
304
|
+
state()
|
|
305
|
+
], ExmNavigationBase.prototype, "railOpen", void 0);
|
|
306
|
+
__decorate([
|
|
307
|
+
state()
|
|
308
|
+
], ExmNavigationBase.prototype, "drawerOpen", void 0);
|
|
309
|
+
__decorate([
|
|
310
|
+
state()
|
|
311
|
+
], ExmNavigationBase.prototype, "drawerHover", void 0);
|
|
312
|
+
__decorate([
|
|
313
|
+
state()
|
|
314
|
+
], ExmNavigationBase.prototype, "navigationHasSubmenu", void 0);
|
|
85
315
|
//# sourceMappingURL=exm-navigation-base.js.map
|
|
@@ -1,29 +1,14 @@
|
|
|
1
|
-
import { LitElement } from 'lit';
|
|
2
|
-
import '@material/mwc-drawer';
|
|
3
1
|
import { Drawer } from '@material/mwc-drawer';
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { ExmgElement } from '@exmg/lit-base';
|
|
3
|
+
import '@material/mwc-drawer';
|
|
4
|
+
export declare class ExmNavigationDrawerBase extends ExmgElement {
|
|
6
5
|
open: boolean;
|
|
7
|
-
drawer?: Drawer;
|
|
8
6
|
persistent: boolean;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
private
|
|
13
|
-
private
|
|
14
|
-
private _asideElement?;
|
|
15
|
-
private _observer;
|
|
16
|
-
hasActiveSubmenu(): boolean;
|
|
17
|
-
updateInlineStyles(): void;
|
|
18
|
-
constructor();
|
|
19
|
-
disconnectedCallback(): void;
|
|
20
|
-
toggle(): void;
|
|
21
|
-
_handleClose(): void;
|
|
22
|
-
_hoverIn(): void;
|
|
23
|
-
_hoverOut(): void;
|
|
24
|
-
hidemenu(): void;
|
|
25
|
-
protected updated(): void;
|
|
7
|
+
drawer?: Drawer;
|
|
8
|
+
static styles: import("lit").CSSResult[];
|
|
9
|
+
private handleMouseEnter;
|
|
10
|
+
private handleMouseLeave;
|
|
11
|
+
private handleDrawerClose;
|
|
26
12
|
protected firstUpdated(): Promise<void>;
|
|
27
13
|
render(): import("lit-html").TemplateResult<1>;
|
|
28
14
|
}
|
|
29
|
-
export {};
|