@mediusinc/mng-commons-layout 5.2.0 → 5.3.0-rc.1
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/esm2022/index.mjs +5 -2
- package/esm2022/lib/components/footer.component.mjs +5 -3
- package/esm2022/lib/components/main-layout.component.mjs +11 -13
- package/esm2022/lib/components/menu-item.component.mjs +64 -144
- package/esm2022/lib/components/menu.component.mjs +10 -13
- package/esm2022/lib/components/pages/error/error.page.component.mjs +20 -0
- package/esm2022/lib/components/pages/not-found/not-found.page.component.mjs +20 -0
- package/esm2022/lib/components/settings.component.mjs +89 -0
- package/esm2022/lib/components/sidebar.component.mjs +11 -12
- package/esm2022/lib/components/topbar-user.component.mjs +23 -4
- package/esm2022/lib/components/topbar.component.mjs +4 -4
- package/esm2022/lib/helpers/menu-items.mjs +26 -0
- package/esm2022/lib/models/menu.model.mjs +1 -1
- package/esm2022/lib/provide.mjs +3 -1
- package/esm2022/lib/services/layout-feature-config.token.mjs +1 -1
- package/esm2022/lib/services/layout.service.mjs +166 -0
- package/esm2022/lib/services/menu.service.mjs +37 -37
- package/fesm2022/mediusinc-mng-commons-layout.mjs +437 -287
- package/fesm2022/mediusinc-mng-commons-layout.mjs.map +1 -1
- package/index.d.ts +4 -1
- package/lib/components/footer.component.d.ts +2 -0
- package/lib/components/main-layout.component.d.ts +2 -5
- package/lib/components/menu-item.component.d.ts +15 -27
- package/lib/components/menu.component.d.ts +3 -4
- package/lib/components/pages/error/error.page.component.d.ts +7 -0
- package/lib/components/pages/not-found/not-found.page.component.d.ts +7 -0
- package/lib/components/settings.component.d.ts +30 -0
- package/lib/components/sidebar.component.d.ts +2 -4
- package/lib/components/topbar-user.component.d.ts +5 -0
- package/lib/components/topbar.component.d.ts +2 -2
- package/lib/helpers/menu-items.d.ts +2 -0
- package/lib/models/menu.model.d.ts +2 -2
- package/lib/services/layout-feature-config.token.d.ts +73 -0
- package/lib/services/layout.service.d.ts +46 -0
- package/lib/services/menu.service.d.ts +7 -8
- package/package.json +2 -2
- package/scss/layout/mng/_mng_layout_styles.scss +1 -0
- package/scss/layout/mng/_mng_sidebar_vertical.scss +8 -0
- package/version-info.json +6 -6
- package/esm2022/lib/services/main-layout.component.service.mjs +0 -71
- package/lib/services/main-layout.component.service.d.ts +0 -17
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { DOCUMENT } from '@angular/common';
|
|
2
|
+
import { Injectable, PLATFORM_ID, afterNextRender, computed, effect, inject, signal } from '@angular/core';
|
|
3
|
+
import { Subject } from 'rxjs';
|
|
4
|
+
import { COMMONS_MODULE_CONFIG_IT, CommonsStorageService } from '@mediusinc/mng-commons/core';
|
|
5
|
+
import { COMMONS_LAYOUT_FEATURE_CONFIG_IT } from './layout-feature-config.token';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class LayoutService {
|
|
8
|
+
getInitColorScheme() {
|
|
9
|
+
let colorScheme = this.storageService.getItem(this.typeName, this.storageColorSchemeKey);
|
|
10
|
+
if (colorScheme == null || !['dark', 'light', 'auto'].includes(colorScheme)) {
|
|
11
|
+
colorScheme = this.getDefaultColorScheme();
|
|
12
|
+
}
|
|
13
|
+
return colorScheme;
|
|
14
|
+
}
|
|
15
|
+
getInitActualColorScheme(colorScheme) {
|
|
16
|
+
if (colorScheme === 'auto') {
|
|
17
|
+
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
return colorScheme;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
getDefaultColorScheme() {
|
|
24
|
+
return this.config?.colorScheme ?? this.commonsConfig?.app?.colorScheme ?? 'auto';
|
|
25
|
+
}
|
|
26
|
+
setColorScheme(scheme) {
|
|
27
|
+
const defaultColorScheme = this.getDefaultColorScheme();
|
|
28
|
+
if (scheme === defaultColorScheme) {
|
|
29
|
+
this.storageService.removeItem(this.typeName, this.storageColorSchemeKey);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.storageService.setItem(this.typeName, this.storageColorSchemeKey, scheme);
|
|
33
|
+
}
|
|
34
|
+
this._colorSchemeSetting.set(scheme);
|
|
35
|
+
this._colorScheme.set(this.getInitActualColorScheme(scheme));
|
|
36
|
+
}
|
|
37
|
+
constructor() {
|
|
38
|
+
this.typeName = 'MainLayoutComponentService';
|
|
39
|
+
this.storageMenuModeKey = 'menuMode';
|
|
40
|
+
this.storageColorSchemeKey = 'colorScheme';
|
|
41
|
+
this.platformId = inject(PLATFORM_ID);
|
|
42
|
+
this.document = inject(DOCUMENT);
|
|
43
|
+
this.commonsConfig = inject(COMMONS_MODULE_CONFIG_IT, { optional: true });
|
|
44
|
+
this.config = inject(COMMONS_LAYOUT_FEATURE_CONFIG_IT, { optional: true });
|
|
45
|
+
this.storageService = inject(CommonsStorageService);
|
|
46
|
+
this.state = signal({
|
|
47
|
+
staticMenuDesktopInactive: false,
|
|
48
|
+
overlayMenuActive: false,
|
|
49
|
+
rightMenuActive: false,
|
|
50
|
+
configSidebarVisible: false,
|
|
51
|
+
staticMenuMobileActive: false,
|
|
52
|
+
menuHoverActive: false,
|
|
53
|
+
sidebarActive: false,
|
|
54
|
+
anchored: false
|
|
55
|
+
});
|
|
56
|
+
this.overlayOpen = new Subject();
|
|
57
|
+
this.overlayOpen$ = this.overlayOpen.asObservable();
|
|
58
|
+
// color scheme
|
|
59
|
+
this._colorSchemeSetting = signal(this.getInitColorScheme());
|
|
60
|
+
this.colorSchemeSetting = this._colorSchemeSetting.asReadonly();
|
|
61
|
+
this._colorScheme = signal(this.getInitActualColorScheme(this.colorSchemeSetting()));
|
|
62
|
+
this.colorScheme = this._colorScheme.asReadonly();
|
|
63
|
+
this.colorSchemeIsLight = computed(() => this._colorScheme() === 'light');
|
|
64
|
+
// menu mode
|
|
65
|
+
this.menuModes = this.config?.menuModes ?? ['static', 'overlay', 'reveal', 'drawer', 'slim', 'slim-plus'];
|
|
66
|
+
this._menuMode = signal(this.initMenuMode());
|
|
67
|
+
this.menuMode = this._menuMode.asReadonly();
|
|
68
|
+
// logos
|
|
69
|
+
this.appLogoLight = signal(this.config?.logoPathLight ?? this.commonsConfig?.app?.logoPathLight ?? this.config?.logoPath ?? this.commonsConfig?.app?.logoPath ?? 'assets/layout/images/logo.png');
|
|
70
|
+
this.appLogoDark = signal(this.config?.logoPathLight ?? this.commonsConfig?.app?.logoPathDark ?? this.config?.logoPath ?? this.commonsConfig?.app?.logoPath ?? 'assets/layout/images/logo.png');
|
|
71
|
+
this.appLogo = computed(() => (this.colorSchemeIsLight() ? this.appLogoLight() : this.appLogoDark()));
|
|
72
|
+
this.appLogoNameLight = signal(this.config?.logoNamePathLight ??
|
|
73
|
+
this.commonsConfig?.app?.logoNamePathLight ??
|
|
74
|
+
this.config?.logoNamePath ??
|
|
75
|
+
this.commonsConfig?.app?.logoNamePath ??
|
|
76
|
+
'assets/layout/images/logo-appname.png');
|
|
77
|
+
this.appLogoNameDark = signal(this.config?.logoNamePathDark ??
|
|
78
|
+
this.commonsConfig?.app?.logoNamePathDark ??
|
|
79
|
+
this.config?.logoNamePath ??
|
|
80
|
+
this.commonsConfig?.app?.logoNamePath ??
|
|
81
|
+
'assets/layout/images/logo-appname.png');
|
|
82
|
+
this.appLogoName = computed(() => (this.colorSchemeIsLight() ? this.appLogoNameLight() : this.appLogoNameDark()));
|
|
83
|
+
// overlays
|
|
84
|
+
this.isOverlay = computed(() => this.menuMode() === 'overlay');
|
|
85
|
+
this.isSlim = computed(() => this.menuMode() === 'slim');
|
|
86
|
+
this.isSlimPlus = computed(() => this.menuMode() === 'slim-plus');
|
|
87
|
+
afterNextRender(() => {
|
|
88
|
+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
|
|
89
|
+
if (this.colorSchemeSetting() === 'auto') {
|
|
90
|
+
const newColorScheme = event.matches ? 'dark' : 'light';
|
|
91
|
+
this._colorScheme.set(newColorScheme);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
effect(() => {
|
|
96
|
+
const colorScheme = this._colorScheme();
|
|
97
|
+
const linkElement = this.document.getElementById('app-theme');
|
|
98
|
+
if (colorScheme === 'dark' && linkElement.href.includes('light')) {
|
|
99
|
+
linkElement.href = 'theme-dark.css';
|
|
100
|
+
}
|
|
101
|
+
else if (colorScheme === 'light' && linkElement.href.includes('dark')) {
|
|
102
|
+
linkElement.href = 'theme-light.css';
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
onMenuModeChange(mode) {
|
|
107
|
+
if (!this.menuModes.includes(mode)) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (mode === this.config?.menuMode) {
|
|
111
|
+
this.storageService.removeItem(this.typeName, this.storageMenuModeKey);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
this.storageService.setItem(this.typeName, this.storageMenuModeKey, mode);
|
|
115
|
+
}
|
|
116
|
+
this._menuMode.set(mode);
|
|
117
|
+
}
|
|
118
|
+
onMenuToggle() {
|
|
119
|
+
if (this.isOverlay()) {
|
|
120
|
+
this.state.update(state => ({
|
|
121
|
+
...state,
|
|
122
|
+
overlayMenuActive: !state.overlayMenuActive
|
|
123
|
+
}));
|
|
124
|
+
if (this.state().overlayMenuActive) {
|
|
125
|
+
this.overlayOpen.next(null);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (this.isDesktop()) {
|
|
129
|
+
this.state.update(state => ({
|
|
130
|
+
...state,
|
|
131
|
+
staticMenuDesktopInactive: !state.staticMenuDesktopInactive
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
this.state.update(state => ({
|
|
136
|
+
...state,
|
|
137
|
+
staticMenuMobileActive: !state.staticMenuMobileActive
|
|
138
|
+
}));
|
|
139
|
+
if (this.state().staticMenuMobileActive) {
|
|
140
|
+
this.overlayOpen.next(null);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
onOverlaySubmenuOpen() {
|
|
145
|
+
this.overlayOpen.next(null);
|
|
146
|
+
}
|
|
147
|
+
isDesktop() {
|
|
148
|
+
return window.innerWidth > 991;
|
|
149
|
+
}
|
|
150
|
+
isMobile() {
|
|
151
|
+
return !this.isDesktop();
|
|
152
|
+
}
|
|
153
|
+
initMenuMode() {
|
|
154
|
+
const lsMode = this.storageService.getItem(this.typeName, this.storageMenuModeKey);
|
|
155
|
+
if (lsMode && this.menuModes.includes(lsMode)) {
|
|
156
|
+
return lsMode;
|
|
157
|
+
}
|
|
158
|
+
return this.config?.menuMode ?? 'static';
|
|
159
|
+
}
|
|
160
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
161
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: LayoutService }); }
|
|
162
|
+
}
|
|
163
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: LayoutService, decorators: [{
|
|
164
|
+
type: Injectable
|
|
165
|
+
}], ctorParameters: () => [] });
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2xheW91dC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFN0IsT0FBTyxFQUFDLHdCQUF3QixFQUFFLHFCQUFxQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFHNUYsT0FBTyxFQUFDLGdDQUFnQyxFQUE4QixNQUFNLCtCQUErQixDQUFDOztBQUc1RyxNQUFNLE9BQU8sYUFBYTtJQWdDZCxrQkFBa0I7UUFDdEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQWMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN0RyxJQUFJLFdBQVcsSUFBSSxJQUFJLElBQUksQ0FBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFtQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzdGLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVPLHdCQUF3QixDQUFDLFdBQXdCO1FBQ3JELElBQUksV0FBVyxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLE9BQU8sTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxN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SSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxZQUFZO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFpQixJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25HLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDNUMsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLElBQUksUUFBUSxDQUFDO0lBQzdDLENBQUM7OEdBbExRLGFBQWE7a0hBQWIsYUFBYTs7MkZBQWIsYUFBYTtrQkFEekIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0luamVjdGFibGUsIFBMQVRGT1JNX0lELCBhZnRlck5leHRSZW5kZXIsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtDT01NT05TX01PRFVMRV9DT05GSUdfSVQsIENvbW1vbnNTdG9yYWdlU2VydmljZX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcblxuaW1wb3J0IHtMYXlvdXRTdGF0ZX0gZnJvbSAnLi4vbW9kZWxzL2xheW91dC1zdGF0ZS5tb2RlbCc7XG5pbXBvcnQge0NPTU1PTlNfTEFZT1VUX0ZFQVRVUkVfQ09ORklHX0lULCBDb2xvclNjaGVtZSwgTGF5b3V0TWVudU1vZGV9IGZyb20gJy4vbGF5b3V0LWZlYXR1cmUtY29uZmlnLnRva2VuJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIExheW91dFNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZU5hbWUgPSAnTWFpbkxheW91dENvbXBvbmVudFNlcnZpY2UnO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZU1lbnVNb2RlS2V5ID0gJ21lbnVNb2RlJztcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VDb2xvclNjaGVtZUtleSA9ICdjb2xvclNjaGVtZSc7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbW9uc0NvbmZpZyA9IGluamVjdChDT01NT05TX01PRFVMRV9DT05GSUdfSVQsIHtvcHRpb25hbDogdHJ1ZX0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0KENPTU1PTlNfTEFZT1VUX0ZFQVRVUkVfQ09ORklHX0lULCB7b3B0aW9uYWw6IHRydWV9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlID0gaW5qZWN0KENvbW1vbnNTdG9yYWdlU2VydmljZSk7XG5cbiAgICBwdWJsaWMgc3RhdGUgPSBzaWduYWw8TGF5b3V0U3RhdGU+KHtcbiAgICAgICAgc3RhdGljTWVudURlc2t0b3BJbmFjdGl2ZTogZmFsc2UsXG4gICAgICAgIG92ZXJsYXlNZW51QWN0aXZlOiBmYWxzZSxcbiAgICAgICAgcmlnaHRNZW51QWN0aXZlOiBmYWxzZSxcbiAgICAgICAgY29uZmlnU2lkZWJhclZpc2libGU6IGZhbHNlLFxuICAgICAgICBzdGF0aWNNZW51TW9iaWxlQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgbWVudUhvdmVyQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgc2lkZWJhckFjdGl2ZTogZmFsc2UsXG4gICAgICAgIGFuY2hvcmVkOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBvdmVybGF5T3BlbiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwdWJsaWMgb3ZlcmxheU9wZW4kID0gdGhpcy5vdmVybGF5T3Blbi5hc09ic2VydmFibGUoKTtcblxuICAgIC8vIGNvbG9yIHNjaGVtZVxuICAgIHByaXZhdGUgX2NvbG9yU2NoZW1lU2V0dGluZyA9IHNpZ25hbCh0aGlzLmdldEluaXRDb2xvclNjaGVtZSgpKTtcbiAgICBwdWJsaWMgY29sb3JTY2hlbWVTZXR0aW5nID0gdGhpcy5fY29sb3JTY2hlbWVTZXR0aW5nLmFzUmVhZG9ubHkoKTtcbiAgICBwcml2YXRlIF9jb2xvclNjaGVtZSA9IHNpZ25hbDxFeGNsdWRlPENvbG9yU2NoZW1lLCAnc3lzdGVtJz4+KHRoaXMuZ2V0SW5pdEFjdHVhbENvbG9yU2NoZW1lKHRoaXMuY29sb3JTY2hlbWVTZXR0aW5nKCkpKTtcbiAgICBwdWJsaWMgY29sb3JTY2hlbWUgPSB0aGlzLl9jb2xvclNjaGVtZS5hc1JlYWRvbmx5KCk7XG4gICAgcHVibGljIGNvbG9yU2NoZW1lSXNMaWdodCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2NvbG9yU2NoZW1lKCkgPT09ICdsaWdodCcpO1xuXG4gICAgcHJpdmF0ZSBnZXRJbml0Q29sb3JTY2hlbWUoKTogQ29sb3JTY2hlbWUge1xuICAgICAgICBsZXQgY29sb3JTY2hlbWUgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEl0ZW08Q29sb3JTY2hlbWU+KHRoaXMudHlwZU5hbWUsIHRoaXMuc3RvcmFnZUNvbG9yU2NoZW1lS2V5KTtcbiAgICAgICAgaWYgKGNvbG9yU2NoZW1lID09IG51bGwgfHwgIShbJ2RhcmsnLCAnbGlnaHQnLCAnYXV0byddIGFzIENvbG9yU2NoZW1lW10pLmluY2x1ZGVzKGNvbG9yU2NoZW1lKSkge1xuICAgICAgICAgICAgY29sb3JTY2hlbWUgPSB0aGlzLmdldERlZmF1bHRDb2xvclNjaGVtZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclNjaGVtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluaXRBY3R1YWxDb2xvclNjaGVtZShjb2xvclNjaGVtZTogQ29sb3JTY2hlbWUpOiBFeGNsdWRlPENvbG9yU2NoZW1lLCAnc3lzdGVtJz4ge1xuICAgICAgICBpZiAoY29sb3JTY2hlbWUgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcyA/ICdkYXJrJyA6ICdsaWdodCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29sb3JTY2hlbWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRDb2xvclNjaGVtZSgpOiBDb2xvclNjaGVtZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZz8uY29sb3JTY2hlbWUgPz8gdGhpcy5jb21tb25zQ29uZmlnPy5hcHA/LmNvbG9yU2NoZW1lID8/ICdhdXRvJztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q29sb3JTY2hlbWUoc2NoZW1lOiBDb2xvclNjaGVtZSkge1xuICAgICAgICBjb25zdCBkZWZhdWx0Q29sb3JTY2hlbWUgPSB0aGlzLmdldERlZmF1bHRDb2xvclNjaGVtZSgpO1xuICAgICAgICBpZiAoc2NoZW1lID09PSBkZWZhdWx0Q29sb3JTY2hlbWUpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbSh0aGlzLnR5cGVOYW1lLCB0aGlzLnN0b3JhZ2VDb2xvclNjaGVtZUtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0odGhpcy50eXBlTmFtZSwgdGhpcy5zdG9yYWdlQ29sb3JTY2hlbWVLZXksIHNjaGVtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29sb3JTY2hlbWVTZXR0aW5nLnNldChzY2hlbWUpO1xuICAgICAgICB0aGlzLl9jb2xvclNjaGVtZS5zZXQodGhpcy5nZXRJbml0QWN0dWFsQ29sb3JTY2hlbWUoc2NoZW1lKSk7XG4gICAgfVxuXG4gICAgLy8gbWVudSBtb2RlXG4gICAgcHVibGljIHJlYWRvbmx5IG1lbnVNb2RlczogTGF5b3V0TWVudU1vZGVbXSA9IHRoaXMuY29uZmlnPy5tZW51TW9kZXMgPz8gWydzdGF0aWMnLCAnb3ZlcmxheScsICdyZXZlYWwnLCAnZHJhd2VyJywgJ3NsaW0nLCAnc2xpbS1wbHVzJ107XG4gICAgcHJpdmF0ZSBfbWVudU1vZGUgPSBzaWduYWwodGhpcy5pbml0TWVudU1vZGUoKSk7XG4gICAgcHVibGljIG1lbnVNb2RlID0gdGhpcy5fbWVudU1vZGUuYXNSZWFkb25seSgpO1xuXG4gICAgLy8gbG9nb3NcbiAgICBwcml2YXRlIGFwcExvZ29MaWdodCA9IHNpZ25hbChcbiAgICAgICAgdGhpcy5jb25maWc/LmxvZ29QYXRoTGlnaHQgPz8gdGhpcy5jb21tb25zQ29uZmlnPy5hcHA/LmxvZ29QYXRoTGlnaHQgPz8gdGhpcy5jb25maWc/LmxvZ29QYXRoID8/IHRoaXMuY29tbW9uc0NvbmZpZz8uYXBwPy5sb2dvUGF0aCA/PyAnYXNzZXRzL2xheW91dC9pbWFnZXMvbG9nby5wbmcnXG4gICAgKTtcbiAgICBwcml2YXRlIGFwcExvZ29EYXJrID0gc2lnbmFsKFxuICAgICAgICB0aGlzLmNvbmZpZz8ubG9nb1BhdGhMaWdodCA/PyB0aGlzLmNvbW1vbnNDb25maWc/LmFwcD8ubG9nb1BhdGhEYXJrID8/IHRoaXMuY29uZmlnPy5sb2dvUGF0aCA/PyB0aGlzLmNvbW1vbnNDb25maWc/LmFwcD8ubG9nb1BhdGggPz8gJ2Fzc2V0cy9sYXlvdXQvaW1hZ2VzL2xvZ28ucG5nJ1xuICAgICk7XG4gICAgcHVibGljIGFwcExvZ28gPSBjb21wdXRlZCgoKSA9PiAodGhpcy5jb2xvclNjaGVtZUlzTGlnaHQoKSA/IHRoaXMuYXBwTG9nb0xpZ2h0KCkgOiB0aGlzLmFwcExvZ29EYXJrKCkpKTtcblxuICAgIHByaXZhdGUgYXBwTG9nb05hbWVMaWdodCA9IHNpZ25hbChcbiAgICAgICAgdGhpcy5jb25maWc/LmxvZ29OYW1lUGF0aExpZ2h0ID8/XG4gICAgICAgICAgICB0aGlzLmNvbW1vbnNDb25maWc/LmFwcD8ubG9nb05hbWVQYXRoTGlnaHQgPz9cbiAgICAgICAgICAgIHRoaXMuY29uZmlnPy5sb2dvTmFtZVBhdGggPz9cbiAgICAgICAgICAgIHRoaXMuY29tbW9uc0NvbmZpZz8uYXBwPy5sb2dvTmFtZVBhdGggPz9cbiAgICAgICAgICAgICdhc3NldHMvbGF5b3V0L2ltYWdlcy9sb2dvLWFwcG5hbWUucG5nJ1xuICAgICk7XG4gICAgcHJpdmF0ZSBhcHBMb2dvTmFtZURhcmsgPSBzaWduYWwoXG4gICAgICAgIHRoaXMuY29uZmlnPy5sb2dvTmFtZVBhdGhEYXJrID8/XG4gICAgICAgICAgICB0aGlzLmNvbW1vbnNDb25maWc/LmFwcD8ubG9nb05hbWVQYXRoRGFyayA/P1xuICAgICAgICAgICAgdGhpcy5jb25maWc/LmxvZ29OYW1lUGF0aCA/P1xuICAgICAgICAgICAgdGhpcy5jb21tb25zQ29uZmlnPy5hcHA/LmxvZ29OYW1lUGF0aCA/P1xuICAgICAgICAgICAgJ2Fzc2V0cy9sYXlvdXQvaW1hZ2VzL2xvZ28tYXBwbmFtZS5wbmcnXG4gICAgKTtcbiAgICBwdWJsaWMgYXBwTG9nb05hbWUgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5jb2xvclNjaGVtZUlzTGlnaHQoKSA/IHRoaXMuYXBwTG9nb05hbWVMaWdodCgpIDogdGhpcy5hcHBMb2dvTmFtZURhcmsoKSkpO1xuXG4gICAgLy8gb3ZlcmxheXNcbiAgICBwdWJsaWMgaXNPdmVybGF5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tZW51TW9kZSgpID09PSAnb3ZlcmxheScpO1xuICAgIHB1YmxpYyBpc1NsaW0gPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1lbnVNb2RlKCkgPT09ICdzbGltJyk7XG4gICAgcHVibGljIGlzU2xpbVBsdXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm1lbnVNb2RlKCkgPT09ICdzbGltLXBsdXMnKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuICAgICAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sb3JTY2hlbWVTZXR0aW5nKCkgPT09ICdhdXRvJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDb2xvclNjaGVtZSA9IGV2ZW50Lm1hdGNoZXMgPyAnZGFyaycgOiAnbGlnaHQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2xvclNjaGVtZS5zZXQobmV3Q29sb3JTY2hlbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29sb3JTY2hlbWUgPSB0aGlzLl9jb2xvclNjaGVtZSgpO1xuICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtdGhlbWUnKSBhcyBIVE1MTGlua0VsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoY29sb3JTY2hlbWUgPT09ICdkYXJrJyAmJiBsaW5rRWxlbWVudC5ocmVmLmluY2x1ZGVzKCdsaWdodCcpKSB7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9ICd0aGVtZS1kYXJrLmNzcyc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbG9yU2NoZW1lID09PSAnbGlnaHQnICYmIGxpbmtFbGVtZW50LmhyZWYuaW5jbHVkZXMoJ2RhcmsnKSkge1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSAndGhlbWUtbGlnaHQuY3NzJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25NZW51TW9kZUNoYW5nZShtb2RlOiBMYXlvdXRNZW51TW9kZSkge1xuICAgICAgICBpZiAoIXRoaXMubWVudU1vZGVzLmluY2x1ZGVzKG1vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZGUgPT09IHRoaXMuY29uZmlnPy5tZW51TW9kZSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKHRoaXMudHlwZU5hbWUsIHRoaXMuc3RvcmFnZU1lbnVNb2RlS2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0SXRlbSh0aGlzLnR5cGVOYW1lLCB0aGlzLnN0b3JhZ2VNZW51TW9kZUtleSwgbW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWVudU1vZGUuc2V0KG1vZGUpO1xuICAgIH1cblxuICAgIG9uTWVudVRvZ2dsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPdmVybGF5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHN0YXRlID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgb3ZlcmxheU1lbnVBY3RpdmU6ICFzdGF0ZS5vdmVybGF5TWVudUFjdGl2ZVxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSgpLm92ZXJsYXlNZW51QWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5T3Blbi5uZXh0KG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNEZXNrdG9wKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHN0YXRlID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgc3RhdGljTWVudURlc2t0b3BJbmFjdGl2ZTogIXN0YXRlLnN0YXRpY01lbnVEZXNrdG9wSW5hY3RpdmVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHN0YXRlID0+ICh7XG4gICAgICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICAgICAgc3RhdGljTWVudU1vYmlsZUFjdGl2ZTogIXN0YXRlLnN0YXRpY01lbnVNb2JpbGVBY3RpdmVcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUoKS5zdGF0aWNNZW51TW9iaWxlQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5T3Blbi5uZXh0KG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25PdmVybGF5U3VibWVudU9wZW4oKSB7XG4gICAgICAgIHRoaXMub3ZlcmxheU9wZW4ubmV4dChudWxsKTtcbiAgICB9XG5cbiAgICBpc0Rlc2t0b3AoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aCA+IDk5MTtcbiAgICB9XG5cbiAgICBpc01vYmlsZSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRGVza3RvcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdE1lbnVNb2RlKCk6IExheW91dE1lbnVNb2RlIHtcbiAgICAgICAgY29uc3QgbHNNb2RlID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRJdGVtPExheW91dE1lbnVNb2RlPih0aGlzLnR5cGVOYW1lLCB0aGlzLnN0b3JhZ2VNZW51TW9kZUtleSk7XG4gICAgICAgIGlmIChsc01vZGUgJiYgdGhpcy5tZW51TW9kZXMuaW5jbHVkZXMobHNNb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxzTW9kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWc/Lm1lbnVNb2RlID8/ICdzdGF0aWMnO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { DestroyRef, Injectable, inject } from '@angular/core';
|
|
1
|
+
import { DestroyRef, Injectable, inject, signal } from '@angular/core';
|
|
2
2
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
3
|
import { NavigationEnd, Router } from '@angular/router';
|
|
4
|
-
import { ReplaySubject,
|
|
5
|
-
import { filter } from 'rxjs/operators';
|
|
4
|
+
import { ReplaySubject, startWith, take } from 'rxjs';
|
|
5
|
+
import { filter, map } from 'rxjs/operators';
|
|
6
6
|
import { CommonsRouterService, LoggerService, adjustRouteMenuLazyChildrenRouterLinks, doesUrlMatchRouterLink } from '@mediusinc/mng-commons/core';
|
|
7
|
+
import { prepareMenuItemsToInternal } from '../helpers/menu-items';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
export class MenuService {
|
|
9
10
|
constructor() {
|
|
@@ -11,50 +12,45 @@ export class MenuService {
|
|
|
11
12
|
this.logger = LoggerService.create('MenuService');
|
|
12
13
|
this.router = inject(Router);
|
|
13
14
|
this.commonsRouter = inject(CommonsRouterService);
|
|
14
|
-
this.
|
|
15
|
-
this.
|
|
16
|
-
this.
|
|
17
|
-
this.
|
|
18
|
-
this.menuItems = [];
|
|
15
|
+
this._menuItems = signal([]);
|
|
16
|
+
this.menuItems = this._menuItems.asReadonly();
|
|
17
|
+
this.menuChangeSubject = new ReplaySubject(1);
|
|
18
|
+
this.menuChange$ = this.menuChangeSubject.asObservable();
|
|
19
19
|
this.routeLoadedChildrenSubscriptions = [];
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
this.menuItems = menuItems;
|
|
21
|
+
setItems(menuItems) {
|
|
23
22
|
this.routeLoadedChildrenSubscriptions.forEach(s => s.unsubscribe());
|
|
24
23
|
this.routeLoadedChildrenSubscriptions = [];
|
|
25
|
-
this.
|
|
24
|
+
this._menuItems.set(prepareMenuItemsToInternal(menuItems));
|
|
25
|
+
this.appendListenersToLazyChildren(this._menuItems());
|
|
26
|
+
this.router.events;
|
|
26
27
|
this.router.events
|
|
27
|
-
.pipe(filter(event => event instanceof NavigationEnd), takeUntilDestroyed(this.destroyRef))
|
|
28
|
+
.pipe(startWith(new NavigationEnd(0, this.router.url, this.router.url)), filter(event => event instanceof NavigationEnd), map(e => e), takeUntilDestroyed(this.destroyRef))
|
|
28
29
|
.subscribe(e => {
|
|
29
30
|
this.findAndSetActiveMenuItem(e.urlAfterRedirects);
|
|
30
31
|
});
|
|
31
|
-
this.findAndSetActiveMenuItem(this.router.url);
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
menuItems.forEach(
|
|
35
|
-
if (
|
|
36
|
-
item.index = idx;
|
|
37
|
-
item.key = parentKey ? parentKey + '-' + idx : idx.toString();
|
|
38
|
-
}
|
|
39
|
-
if (item.items) {
|
|
40
|
-
this.generateMenuItemKeys(item.items, item.key);
|
|
41
|
-
}
|
|
42
|
-
else if (item.lazyChildren) {
|
|
33
|
+
appendListenersToLazyChildren(menuItems) {
|
|
34
|
+
menuItems.forEach(item => {
|
|
35
|
+
if (item.lazyChildren()) {
|
|
43
36
|
this.listenToMenuItemLazyChildrenLoad(item);
|
|
44
37
|
}
|
|
38
|
+
else if (item.items()) {
|
|
39
|
+
this.appendListenersToLazyChildren(item.items());
|
|
40
|
+
}
|
|
45
41
|
});
|
|
46
42
|
}
|
|
47
43
|
findAndSetActiveMenuItem(url) {
|
|
48
|
-
const matches = this.findActiveRouteMatches(this.menuItems, url);
|
|
44
|
+
const matches = this.findActiveRouteMatches(this.menuItems(), url);
|
|
49
45
|
if (matches.length === 0) {
|
|
50
46
|
this.reset();
|
|
51
47
|
}
|
|
52
48
|
else {
|
|
53
49
|
const matchKey = matches[0][matches[0].length - 1].key;
|
|
54
50
|
if (matchKey) {
|
|
55
|
-
this.
|
|
51
|
+
this.menuChangeSubject.next({
|
|
56
52
|
key: matchKey,
|
|
57
|
-
|
|
53
|
+
eventType: 'routeChange'
|
|
58
54
|
});
|
|
59
55
|
}
|
|
60
56
|
else {
|
|
@@ -72,13 +68,14 @@ export class MenuService {
|
|
|
72
68
|
.pipe(take(1))
|
|
73
69
|
.subscribe({
|
|
74
70
|
next: routes => {
|
|
75
|
-
|
|
71
|
+
const menuItemsFromRoutes = routes
|
|
76
72
|
.filter(r => Array.isArray(r.data?.menuItems))
|
|
77
73
|
.flatMap(r => r.data.menuItems);
|
|
78
|
-
menuItems = adjustRouteMenuLazyChildrenRouterLinks(menuItem,
|
|
79
|
-
menuItem.items
|
|
80
|
-
menuItem.
|
|
81
|
-
|
|
74
|
+
const menuItems = adjustRouteMenuLazyChildrenRouterLinks(menuItem, menuItemsFromRoutes);
|
|
75
|
+
menuItem.items.set(prepareMenuItemsToInternal(menuItems, menuItem.key));
|
|
76
|
+
this.appendListenersToLazyChildren(menuItem.items());
|
|
77
|
+
menuItem.itemsVisibility.set(menuItem.items()?.map(i => signal(true)));
|
|
78
|
+
menuItem.lazyChildren.set(false);
|
|
82
79
|
this.findAndSetActiveMenuItem(this.router.url);
|
|
83
80
|
}
|
|
84
81
|
}));
|
|
@@ -86,11 +83,12 @@ export class MenuService {
|
|
|
86
83
|
findActiveRouteMatches(menuItems, url) {
|
|
87
84
|
const matches = [];
|
|
88
85
|
for (const menuItem of menuItems) {
|
|
86
|
+
const chidldren = menuItem.items();
|
|
89
87
|
if (menuItem.routerLink) {
|
|
90
88
|
const isActive = doesUrlMatchRouterLink(menuItem.routerLink, url);
|
|
91
89
|
if (isActive) {
|
|
92
|
-
if (Array.isArray(
|
|
93
|
-
const itemsMatches = this.findActiveRouteMatches(
|
|
90
|
+
if (Array.isArray(chidldren)) {
|
|
91
|
+
const itemsMatches = this.findActiveRouteMatches(chidldren, url);
|
|
94
92
|
if (itemsMatches.length > 0) {
|
|
95
93
|
matches.push(...itemsMatches.map(c => [menuItem, ...c]));
|
|
96
94
|
}
|
|
@@ -103,8 +101,8 @@ export class MenuService {
|
|
|
103
101
|
}
|
|
104
102
|
}
|
|
105
103
|
}
|
|
106
|
-
else if (Array.isArray(
|
|
107
|
-
const itemsMatches = this.findActiveRouteMatches(
|
|
104
|
+
else if (Array.isArray(chidldren)) {
|
|
105
|
+
const itemsMatches = this.findActiveRouteMatches(chidldren, url);
|
|
108
106
|
if (itemsMatches.length > 0) {
|
|
109
107
|
matches.push(...itemsMatches.map(c => [menuItem, ...c]));
|
|
110
108
|
}
|
|
@@ -113,7 +111,9 @@ export class MenuService {
|
|
|
113
111
|
return matches;
|
|
114
112
|
}
|
|
115
113
|
reset() {
|
|
116
|
-
this.
|
|
114
|
+
this.menuChangeSubject.next({
|
|
115
|
+
eventType: 'reset'
|
|
116
|
+
});
|
|
117
117
|
}
|
|
118
118
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: MenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
119
119
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: MenuService }); }
|
|
@@ -121,4 +121,4 @@ export class MenuService {
|
|
|
121
121
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: MenuService, decorators: [{
|
|
122
122
|
type: Injectable
|
|
123
123
|
}] });
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9tZW51LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBQyxhQUFhLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdEQsT0FBTyxFQUFDLGFBQWEsRUFBRSxPQUFPLEVBQWdCLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsT0FBTyxFQUFvQyxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsc0NBQXNDLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQzs7QUFLbkwsTUFBTSxPQUFPLFdBQVc7SUFEeEI7UUFFcUIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxXQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3QyxXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLGtCQUFhLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDN0MsZUFBVSxHQUFHLElBQUksYUFBYSxDQUFrQixDQUFDLENBQUMsQ0FBQztRQUNuRCxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFN0MsZ0JBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdDLGlCQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV2QyxjQUFTLEdBQTJCLEVBQUUsQ0FBQztR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QUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDOzhHQTFIUSxXQUFXO2tIQUFYLFdBQVc7OzJGQUFYLFdBQVc7a0JBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rlc3Ryb3lSZWYsIEluamVjdGFibGUsIGluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtOYXZpZ2F0aW9uRW5kLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7UmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0YWtlfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7Q29tbW9uc01lbnVJdGVtLCBDb21tb25zUm91dGVEYXRhLCBDb21tb25zUm91dGVyU2VydmljZSwgTG9nZ2VyU2VydmljZSwgYWRqdXN0Um91dGVNZW51TGF6eUNoaWxkcmVuUm91dGVyTGlua3MsIGRvZXNVcmxNYXRjaFJvdXRlckxpbmt9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5cbmltcG9ydCB7TWVudUNoYW5nZUV2ZW50fSBmcm9tICcuLi9tb2RlbHMvbWVudS5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNZW51U2VydmljZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gTG9nZ2VyU2VydmljZS5jcmVhdGUoJ01lbnVTZXJ2aWNlJyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbW1vbnNSb3V0ZXIgPSBpbmplY3QoQ29tbW9uc1JvdXRlclNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVudVNvdXJjZSA9IG5ldyBSZXBsYXlTdWJqZWN0PE1lbnVDaGFuZ2VFdmVudD4oMSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXNldFNvdXJjZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBtZW51U291cmNlJCA9IHRoaXMubWVudVNvdXJjZS5hc09ic2VydmFibGUoKTtcbiAgICByZXNldFNvdXJjZSQgPSB0aGlzLnJlc2V0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBtZW51SXRlbXM6IEFycmF5PENvbW1vbnNNZW51SXRlbT4gPSBbXTtcbiAgICBwcml2YXRlIHJvdXRlTG9hZGVkQ2hpbGRyZW5TdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgaW5pdGlhbGl6ZShtZW51SXRlbXM6IEFycmF5PENvbW1vbnNNZW51SXRlbT4pIHtcbiAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBtZW51SXRlbXM7XG5cbiAgICAgICAgdGhpcy5yb3V0ZUxvYWRlZENoaWxkcmVuU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5yb3V0ZUxvYWRlZENoaWxkcmVuU3Vic2NyaXB0aW9ucyA9IFtdO1xuXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVNZW51SXRlbUtleXMobWVudUl0ZW1zKTtcblxuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZEFuZFNldEFjdGl2ZU1lbnVJdGVtKChlIGFzIE5hdmlnYXRpb25FbmQpLnVybEFmdGVyUmVkaXJlY3RzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZmluZEFuZFNldEFjdGl2ZU1lbnVJdGVtKHRoaXMucm91dGVyLnVybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZU1lbnVJdGVtS2V5cyhtZW51SXRlbXM6IEFycmF5PENvbW1vbnNNZW51SXRlbT4sIHBhcmVudEtleSA9ICcnKSB7XG4gICAgICAgIG1lbnVJdGVtcy5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXRlbS5pbmRleCkge1xuICAgICAgICAgICAgICAgIGl0ZW0uaW5kZXggPSBpZHg7XG4gICAgICAgICAgICAgICAgaXRlbS5rZXkgPSBwYXJlbnRLZXkgPyBwYXJlbnRLZXkgKyAnLScgKyBpZHggOiBpZHgudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlTWVudUl0ZW1LZXlzKGl0ZW0uaXRlbXMsIGl0ZW0ua2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5sYXp5Q2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlblRvTWVudUl0ZW1MYXp5Q2hpbGRyZW5Mb2FkKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh1cmw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5maW5kQWN0aXZlUm91dGVNYXRjaGVzKHRoaXMubWVudUl0ZW1zLCB1cmwpO1xuICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoS2V5ID0gbWF0Y2hlc1swXVttYXRjaGVzWzBdLmxlbmd0aCAtIDFdLmtleTtcbiAgICAgICAgICAgIGlmIChtYXRjaEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVudVNvdXJjZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBtYXRjaEtleSxcbiAgICAgICAgICAgICAgICAgICAgcm91dGVFdmVudDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBGb3VuZCBhY3RpdmUgbWVudSBpdGVtIGZvciB1cmwgJHt1cmx9LCBidXQgaXRlbSBrZXkgaXMgbm90IHByZXNlbnRgLCBtYXRjaGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBNdWx0aXBsZSBhY3RpdmUgbWVudSBpdGVtcyBmb3VuZCBmb3IgdXJsICR7dXJsfWAsIG1hdGNoZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsaXN0ZW5Ub01lbnVJdGVtTGF6eUNoaWxkcmVuTG9hZChtZW51SXRlbTogQ29tbW9uc01lbnVJdGVtKSB7XG4gICAgICAgIHRoaXMucm91dGVMb2FkZWRDaGlsZHJlblN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuY29tbW9uc1JvdXRlclxuICAgICAgICAgICAgICAgIC5nZXRSb3V0ZUxvYWRlZENoaWxkcmVuJChtZW51SXRlbS5yb3V0ZXJMaW5rID8/ICcvJylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiByb3V0ZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lbnVJdGVtcyA9IHJvdXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIociA9PiBBcnJheS5pc0FycmF5KChyLmRhdGEgYXMgQ29tbW9uc1JvdXRlRGF0YSB8IHVuZGVmaW5lZCk/Lm1lbnVJdGVtcykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAociA9PiAoci5kYXRhIGFzIENvbW1vbnNSb3V0ZURhdGEpLm1lbnVJdGVtcyEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW1zID0gYWRqdXN0Um91dGVNZW51TGF6eUNoaWxkcmVuUm91dGVyTGlua3MobWVudUl0ZW0sIG1lbnVJdGVtcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtLml0ZW1zID0gbWVudUl0ZW1zO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0ubGF6eUNoaWxkcmVuID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVNZW51SXRlbUtleXMobWVudUl0ZW0uaXRlbXMsIG1lbnVJdGVtLmtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh0aGlzLnJvdXRlci51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRBY3RpdmVSb3V0ZU1hdGNoZXMobWVudUl0ZW1zOiBBcnJheTxDb21tb25zTWVudUl0ZW0+LCB1cmw6IHN0cmluZyk6IENvbW1vbnNNZW51SXRlbVtdW10ge1xuICAgICAgICBjb25zdCBtYXRjaGVzOiBDb21tb25zTWVudUl0ZW1bXVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbWVudUl0ZW0gb2YgbWVudUl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAobWVudUl0ZW0ucm91dGVyTGluaykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gZG9lc1VybE1hdGNoUm91dGVyTGluayhtZW51SXRlbS5yb3V0ZXJMaW5rLCB1cmwpO1xuICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtZW51SXRlbS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zTWF0Y2hlcyA9IHRoaXMuZmluZEFjdGl2ZVJvdXRlTWF0Y2hlcyhtZW51SXRlbS5pdGVtcywgdXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtc01hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCguLi5pdGVtc01hdGNoZXMubWFwKGMgPT4gW21lbnVJdGVtLCAuLi5jXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goW21lbnVJdGVtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goW21lbnVJdGVtXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobWVudUl0ZW0uaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXNNYXRjaGVzID0gdGhpcy5maW5kQWN0aXZlUm91dGVNYXRjaGVzKG1lbnVJdGVtLml0ZW1zLCB1cmwpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtc01hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goLi4uaXRlbXNNYXRjaGVzLm1hcChjID0+IFttZW51SXRlbSwgLi4uY10pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfVxuXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMucmVzZXRTb3VyY2UubmV4dCh0cnVlKTtcbiAgICB9XG59XG4iXX0=
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9tZW51LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsYUFBYSxFQUFFLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRELE9BQU8sRUFBQyxhQUFhLEVBQWdCLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBR0gsb0JBQW9CLEVBRXBCLGFBQWEsRUFDYixzQ0FBc0MsRUFDdEMsc0JBQXNCLEVBQ3pCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7O0FBSWpFLE1BQU0sT0FBTyxXQUFXO0lBRHhCO1FBRXFCLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsV0FBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0MsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixrQkFBYSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRXRELGVBQVUsR0FBRyxNQUFNLENBQTRCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELGNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRS9CLHNCQUFpQixHQUFHLElBQUksYUFBYSxDQUFrQixDQUFDLENBQUMsQ0FBQztRQUMzRSxn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O2dCQUNqRSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzFCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztZQUN4QixTQUFTLEVBQUUsT0FBTztTQUNyQixDQUFDLENBQUM7SUFDUCxDQUFDOzhHQXpIUSxXQUFXO2tIQUFYLFdBQVc7OzJGQUFYLFdBQVc7a0JBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rlc3Ryb3lSZWYsIEluamVjdGFibGUsIGluamVjdCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge05hdmlnYXRpb25FbmQsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHN0YXJ0V2l0aCwgdGFrZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gICAgQ29tbW9uc01lbnVJdGVtLFxuICAgIENvbW1vbnNSb3V0ZURhdGEsXG4gICAgQ29tbW9uc1JvdXRlclNlcnZpY2UsXG4gICAgSW50ZXJuYWxDb21tb25zTWVudUl0ZW0sXG4gICAgTG9nZ2VyU2VydmljZSxcbiAgICBhZGp1c3RSb3V0ZU1lbnVMYXp5Q2hpbGRyZW5Sb3V0ZXJMaW5rcyxcbiAgICBkb2VzVXJsTWF0Y2hSb3V0ZXJMaW5rXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5cbmltcG9ydCB7cHJlcGFyZU1lbnVJdGVtc1RvSW50ZXJuYWx9IGZyb20gJy4uL2hlbHBlcnMvbWVudS1pdGVtcyc7XG5pbXBvcnQge01lbnVDaGFuZ2VFdmVudH0gZnJvbSAnLi4vbW9kZWxzL21lbnUubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTWVudVNlcnZpY2Uge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IExvZ2dlclNlcnZpY2UuY3JlYXRlKCdNZW51U2VydmljZScpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tb25zUm91dGVyID0gaW5qZWN0KENvbW1vbnNSb3V0ZXJTZXJ2aWNlKTtcblxuICAgIHByaXZhdGUgX21lbnVJdGVtcyA9IHNpZ25hbDxJbnRlcm5hbENvbW1vbnNNZW51SXRlbVtdPihbXSk7XG4gICAgcHVibGljIG1lbnVJdGVtcyA9IHRoaXMuX21lbnVJdGVtcy5hc1JlYWRvbmx5KCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lbnVDaGFuZ2VTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8TWVudUNoYW5nZUV2ZW50PigxKTtcbiAgICBtZW51Q2hhbmdlJCA9IHRoaXMubWVudUNoYW5nZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIHJvdXRlTG9hZGVkQ2hpbGRyZW5TdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgc2V0SXRlbXMobWVudUl0ZW1zOiBBcnJheTxDb21tb25zTWVudUl0ZW0+KSB7XG4gICAgICAgIHRoaXMucm91dGVMb2FkZWRDaGlsZHJlblN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMucm91dGVMb2FkZWRDaGlsZHJlblN1YnNjcmlwdGlvbnMgPSBbXTtcblxuICAgICAgICB0aGlzLl9tZW51SXRlbXMuc2V0KHByZXBhcmVNZW51SXRlbXNUb0ludGVybmFsKG1lbnVJdGVtcykpO1xuICAgICAgICB0aGlzLmFwcGVuZExpc3RlbmVyc1RvTGF6eUNoaWxkcmVuKHRoaXMuX21lbnVJdGVtcygpKTtcblxuICAgICAgICB0aGlzLnJvdXRlci5ldmVudHM7XG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKG5ldyBOYXZpZ2F0aW9uRW5kKDAsIHRoaXMucm91dGVyLnVybCwgdGhpcy5yb3V0ZXIudXJsKSksXG4gICAgICAgICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXG4gICAgICAgICAgICAgICAgbWFwKGUgPT4gZSBhcyBOYXZpZ2F0aW9uRW5kKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSgoZSBhcyBOYXZpZ2F0aW9uRW5kKS51cmxBZnRlclJlZGlyZWN0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGVuZExpc3RlbmVyc1RvTGF6eUNoaWxkcmVuKG1lbnVJdGVtczogSW50ZXJuYWxDb21tb25zTWVudUl0ZW1bXSkge1xuICAgICAgICBtZW51SXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLmxhenlDaGlsZHJlbigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5Ub01lbnVJdGVtTGF6eUNoaWxkcmVuTG9hZChpdGVtKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5pdGVtcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRMaXN0ZW5lcnNUb0xhenlDaGlsZHJlbihpdGVtLml0ZW1zKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh1cmw6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy5maW5kQWN0aXZlUm91dGVNYXRjaGVzKHRoaXMubWVudUl0ZW1zKCksIHVybCk7XG4gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hLZXkgPSBtYXRjaGVzWzBdW21hdGNoZXNbMF0ubGVuZ3RoIC0gMV0ua2V5O1xuICAgICAgICAgICAgaWYgKG1hdGNoS2V5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZW51Q2hhbmdlU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBtYXRjaEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAncm91dGVDaGFuZ2UnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYEZvdW5kIGFjdGl2ZSBtZW51IGl0ZW0gZm9yIHVybCAke3VybH0sIGJ1dCBpdGVtIGtleSBpcyBub3QgcHJlc2VudGAsIG1hdGNoZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYE11bHRpcGxlIGFjdGl2ZSBtZW51IGl0ZW1zIGZvdW5kIGZvciB1cmwgJHt1cmx9YCwgbWF0Y2hlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxpc3RlblRvTWVudUl0ZW1MYXp5Q2hpbGRyZW5Mb2FkKG1lbnVJdGVtOiBJbnRlcm5hbENvbW1vbnNNZW51SXRlbSkge1xuICAgICAgICB0aGlzLnJvdXRlTG9hZGVkQ2hpbGRyZW5TdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICB0aGlzLmNvbW1vbnNSb3V0ZXJcbiAgICAgICAgICAgICAgICAuZ2V0Um91dGVMb2FkZWRDaGlsZHJlbiQobWVudUl0ZW0ucm91dGVyTGluayA/PyAnLycpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogcm91dGVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbnVJdGVtc0Zyb21Sb3V0ZXMgPSByb3V0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHIgPT4gQXJyYXkuaXNBcnJheSgoci5kYXRhIGFzIENvbW1vbnNSb3V0ZURhdGEgfCB1bmRlZmluZWQpPy5tZW51SXRlbXMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKHIgPT4gKHIuZGF0YSBhcyBDb21tb25zUm91dGVEYXRhKS5tZW51SXRlbXMhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbnVJdGVtcyA9IGFkanVzdFJvdXRlTWVudUxhenlDaGlsZHJlblJvdXRlckxpbmtzKG1lbnVJdGVtLCBtZW51SXRlbXNGcm9tUm91dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0uaXRlbXMuc2V0KHByZXBhcmVNZW51SXRlbXNUb0ludGVybmFsKG1lbnVJdGVtcywgbWVudUl0ZW0ua2V5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZExpc3RlbmVyc1RvTGF6eUNoaWxkcmVuKG1lbnVJdGVtLml0ZW1zKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVudUl0ZW0uaXRlbXNWaXNpYmlsaXR5LnNldChtZW51SXRlbS5pdGVtcygpPy5tYXAoaSA9PiBzaWduYWwodHJ1ZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtLmxhenlDaGlsZHJlbi5zZXQoZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRBbmRTZXRBY3RpdmVNZW51SXRlbSh0aGlzLnJvdXRlci51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRBY3RpdmVSb3V0ZU1hdGNoZXMobWVudUl0ZW1zOiBBcnJheTxJbnRlcm5hbENvbW1vbnNNZW51SXRlbT4sIHVybDogc3RyaW5nKTogSW50ZXJuYWxDb21tb25zTWVudUl0ZW1bXVtdIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlczogSW50ZXJuYWxDb21tb25zTWVudUl0ZW1bXVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbWVudUl0ZW0gb2YgbWVudUl0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlkbGRyZW4gPSBtZW51SXRlbS5pdGVtcygpO1xuICAgICAgICAgICAgaWYgKG1lbnVJdGVtLnJvdXRlckxpbmspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IGRvZXNVcmxNYXRjaFJvdXRlckxpbmsobWVudUl0ZW0ucm91dGVyTGluaywgdXJsKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpZGxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbXNNYXRjaGVzID0gdGhpcy5maW5kQWN0aXZlUm91dGVNYXRjaGVzKGNoaWRsZHJlbiwgdXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtc01hdGNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCguLi5pdGVtc01hdGNoZXMubWFwKGMgPT4gW21lbnVJdGVtLCAuLi5jXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goW21lbnVJdGVtXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goW21lbnVJdGVtXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY2hpZGxkcmVuKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zTWF0Y2hlcyA9IHRoaXMuZmluZEFjdGl2ZVJvdXRlTWF0Y2hlcyhjaGlkbGRyZW4sIHVybCk7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1zTWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaCguLi5pdGVtc01hdGNoZXMubWFwKGMgPT4gW21lbnVJdGVtLCAuLi5jXSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5tZW51Q2hhbmdlU3ViamVjdC5uZXh0KHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3Jlc2V0J1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|