@yuuvis/client-shell 2.0.0-beta.0 → 2.0.0-beta.2
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/fesm2022/yuuvis-client-shell-dashboard.component-DWdP5HSx.mjs +14 -0
- package/fesm2022/yuuvis-client-shell-dashboard.component-DWdP5HSx.mjs.map +1 -0
- package/fesm2022/yuuvis-client-shell-settings.component-R-GCMuxK.mjs +84 -0
- package/fesm2022/yuuvis-client-shell-settings.component-R-GCMuxK.mjs.map +1 -0
- package/fesm2022/yuuvis-client-shell-web-share-target.component-BQiQkEd_.mjs +21 -0
- package/fesm2022/yuuvis-client-shell-web-share-target.component-BQiQkEd_.mjs.map +1 -0
- package/fesm2022/yuuvis-client-shell.mjs +144 -143
- package/fesm2022/yuuvis-client-shell.mjs.map +1 -1
- package/lib/actions/manage-flavors/manage-flavors.component.d.ts +1 -0
- package/lib/assets/i18n/de.json +3 -3
- package/lib/assets/i18n/en.json +3 -3
- package/lib/client-shell.component.d.ts +4 -2
- package/lib/components/sidebar-nav/sidebar-nav.component.d.ts +8 -0
- package/lib/pages/dashboard/dashboard.component.d.ts +1 -1
- package/lib/pages/notifications/notifications.component.d.ts +0 -2
- package/lib/pages/settings/settings.component.d.ts +1 -0
- package/package.json +7 -18
- package/esm2022/index.mjs +0 -6
- package/esm2022/lib/actions/manage-flavors/manage-flavors.action.mjs +0 -39
- package/esm2022/lib/actions/manage-flavors/manage-flavors.component.mjs +0 -69
- package/esm2022/lib/client-shell.component.mjs +0 -191
- package/esm2022/lib/components/app-logo/app-logo.component.mjs +0 -18
- package/esm2022/lib/directives/inert.directive.mjs +0 -26
- package/esm2022/lib/lib.routes.mjs +0 -15
- package/esm2022/lib/pages/dashboard/dashboard.component.mjs +0 -11
- package/esm2022/lib/pages/notifications/notifications.component.mjs +0 -82
- package/esm2022/lib/pages/settings/settings.component.mjs +0 -71
- package/esm2022/lib/pages/web-share-target/web-share-target.component.mjs +0 -18
- package/esm2022/widget-dashboard/index.mjs +0 -3
- package/esm2022/widget-dashboard/lib/widget-dashboard.component.mjs +0 -46
- package/esm2022/widget-dashboard/lib/widget-dashboard.config.mjs +0 -3
- package/esm2022/widget-dashboard/lib/widget-dashboard.module.mjs +0 -49
- package/esm2022/widget-dashboard/yuuvis-client-shell-widget-dashboard.mjs +0 -5
- package/esm2022/yuuvis-client-shell.mjs +0 -5
- package/fesm2022/yuuvis-client-shell-widget-dashboard.mjs +0 -98
- package/fesm2022/yuuvis-client-shell-widget-dashboard.mjs.map +0 -1
- package/widget-dashboard/README.md +0 -19
- package/widget-dashboard/index.d.ts +0 -2
- package/widget-dashboard/lib/widget-dashboard.component.d.ts +0 -16
- package/widget-dashboard/lib/widget-dashboard.config.d.ts +0 -7
- package/widget-dashboard/lib/widget-dashboard.module.d.ts +0 -13
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import { AsyncPipe, NgIf } from '@angular/common';
|
|
2
|
-
import { Component, HostListener, effect, inject, input, signal } from '@angular/core';
|
|
3
|
-
import { toSignal } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { NavigationEnd, Router, RouterModule } from '@angular/router';
|
|
5
|
-
import { SwPush } from '@angular/service-worker';
|
|
6
|
-
import { AuthService, DeviceService, TranslateModule, TranslateService, UserRoles, UserService, Utils } from '@yuuvis/client-core';
|
|
7
|
-
import { MetadataDefaultTemplatesComponent } from '@yuuvis/client-framework/metadata-form';
|
|
8
|
-
import { CommandPaletteService, ShellNotificationsService, ShellService } from '@yuuvis/client-shell-core';
|
|
9
|
-
import { YvcIconModule } from '@yuuvis/components/icon';
|
|
10
|
-
import { of } from 'rxjs';
|
|
11
|
-
import { catchError, filter, map, switchMap, tap } from 'rxjs/operators';
|
|
12
|
-
import { clientShellRoutes } from './lib.routes';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@yuuvis/client-core";
|
|
15
|
-
import * as i2 from "@angular/router";
|
|
16
|
-
import * as i3 from "@yuuvis/components/icon";
|
|
17
|
-
export class ClientShellComponent {
|
|
18
|
-
#shell;
|
|
19
|
-
#device;
|
|
20
|
-
#swPush;
|
|
21
|
-
onFocusChange(event) {
|
|
22
|
-
// console.log('focused: ', document.activeElement);
|
|
23
|
-
}
|
|
24
|
-
onDragOver(event) {
|
|
25
|
-
event.stopPropagation();
|
|
26
|
-
event.preventDefault();
|
|
27
|
-
this.showUploadOverlay = !!this._dragContainsFiles(event);
|
|
28
|
-
}
|
|
29
|
-
#appsEffect;
|
|
30
|
-
#shellConfigEffect;
|
|
31
|
-
constructor() {
|
|
32
|
-
this.router = inject(Router);
|
|
33
|
-
this.auth = inject(AuthService);
|
|
34
|
-
this.userService = inject(UserService);
|
|
35
|
-
this.#shell = inject(ShellService);
|
|
36
|
-
this.shellNotifications = inject(ShellNotificationsService);
|
|
37
|
-
this.translate = inject(TranslateService);
|
|
38
|
-
this.commandPalette = inject(CommandPaletteService);
|
|
39
|
-
this.#device = inject(DeviceService);
|
|
40
|
-
this.#swPush = inject(SwPush);
|
|
41
|
-
this.APP_LOGOUT_EVENT_KEY = 'yuv.app.event.logout';
|
|
42
|
-
this._levels = {
|
|
43
|
-
info: 0,
|
|
44
|
-
success: 1,
|
|
45
|
-
warning: 2,
|
|
46
|
-
alert: 3
|
|
47
|
-
};
|
|
48
|
-
this.showUploadOverlay = false;
|
|
49
|
-
this.busy$ = this.#shell.isBusy$;
|
|
50
|
-
this.showNotifications = signal(false);
|
|
51
|
-
this.newNotifications = toSignal(this.shellNotifications.shellNotifications$.pipe(tap((n) => this.showNotifications.set(n.length > 0)), map((notifications) => {
|
|
52
|
-
let maxLevel = 'info';
|
|
53
|
-
const count = notifications.filter((n) => !n.seen).length;
|
|
54
|
-
notifications.forEach((n) => (maxLevel = n.level && this._levels[n.level] > this._levels[maxLevel] ? n.level : maxLevel));
|
|
55
|
-
return count > 0 ? { maxLevel, count } : undefined;
|
|
56
|
-
})));
|
|
57
|
-
this.apps = input.required();
|
|
58
|
-
this.#appsEffect = effect(() => this.#shell.setAppBaseRoutes(this.apps()));
|
|
59
|
-
this.checkedForInitialRoute = false;
|
|
60
|
-
this.enableTenantSwitch = false;
|
|
61
|
-
this.config = input();
|
|
62
|
-
this.#shellConfigEffect = effect(() => {
|
|
63
|
-
const cfg = this.config();
|
|
64
|
-
if (cfg) {
|
|
65
|
-
this.#shell.setShellConfig(cfg);
|
|
66
|
-
}
|
|
67
|
-
}, {
|
|
68
|
-
allowSignalWrites: true
|
|
69
|
-
});
|
|
70
|
-
this.shellConfig = this.#shell.shellConfig;
|
|
71
|
-
this.translate.onLangChange.subscribe(() => this._setCommands(true));
|
|
72
|
-
// this.router.events.pipe(
|
|
73
|
-
// // filter(e => e instanceof NavigationStart)
|
|
74
|
-
// ).subscribe((e) => {
|
|
75
|
-
// console.log(e);
|
|
76
|
-
// });
|
|
77
|
-
this.router.events
|
|
78
|
-
.pipe(filter((e) => e instanceof NavigationEnd), map((e) => e))
|
|
79
|
-
.subscribe((e) => this._processRouterNavigationEnd(e));
|
|
80
|
-
this.#device.init();
|
|
81
|
-
this.userService.user$.subscribe((user) => {
|
|
82
|
-
if (user) {
|
|
83
|
-
this.checkedForInitialRoute = !(!this.user || this.user.id !== user.id);
|
|
84
|
-
this.enableTenantSwitch = user.authorities.includes(UserRoles.MULTI_TENANT);
|
|
85
|
-
}
|
|
86
|
-
this.user = user;
|
|
87
|
-
});
|
|
88
|
-
window.addEventListener('storage', (evt) => {
|
|
89
|
-
if (evt.key === this.APP_LOGOUT_EVENT_KEY) {
|
|
90
|
-
this.appLogout(true);
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
openNotifications() {
|
|
95
|
-
this.router.navigate([{}]);
|
|
96
|
-
}
|
|
97
|
-
// getNotifications(id: string) {
|
|
98
|
-
// return this.shellNotifications.getNotifications(id);
|
|
99
|
-
// }
|
|
100
|
-
_dragContainsFiles(event) {
|
|
101
|
-
// do not allow to drop files/images from iframes
|
|
102
|
-
if (event.relatedTarget?.tagName.toLowerCase() === 'iframe')
|
|
103
|
-
return 0;
|
|
104
|
-
return event.dataTransfer ? Array.from(event.dataTransfer.items || []).filter((i) => i.kind === 'file' && i.type).length : 0;
|
|
105
|
-
}
|
|
106
|
-
_setCommands(update) {
|
|
107
|
-
const commands = this.apps().map((a, i) => ({
|
|
108
|
-
id: `nav.app.${i}`,
|
|
109
|
-
label: this.translate.instant('yuv.shell.cmd.app.open', { title: a.title }),
|
|
110
|
-
callback: () => this.router.navigate([a.path])
|
|
111
|
-
}));
|
|
112
|
-
commands.push({
|
|
113
|
-
id: `nav.shell.settings`,
|
|
114
|
-
label: this.translate.instant('yuv.shell.cmd.open.settings'),
|
|
115
|
-
callback: () => this.router.navigate(['settings'])
|
|
116
|
-
});
|
|
117
|
-
commands.push({
|
|
118
|
-
id: `nav.shell.logout`,
|
|
119
|
-
label: this.translate.instant('yuv.shell.cmd.logout'),
|
|
120
|
-
callback: () => this.appLogout()
|
|
121
|
-
});
|
|
122
|
-
if (update)
|
|
123
|
-
this.commandPalette.updateCommands(commands);
|
|
124
|
-
else
|
|
125
|
-
this.commandPalette.registerCommands(commands);
|
|
126
|
-
}
|
|
127
|
-
requestSubscription() {
|
|
128
|
-
if (!this.#swPush.isEnabled) {
|
|
129
|
-
console.log('Notification is not enabled.');
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
this.#swPush.messages
|
|
133
|
-
.pipe(tap((msg) => console.log({ msg })), catchError((error) => {
|
|
134
|
-
console.log({ error });
|
|
135
|
-
return of(null);
|
|
136
|
-
}))
|
|
137
|
-
.subscribe();
|
|
138
|
-
}
|
|
139
|
-
appLogout(triggeredFromOtherTab) {
|
|
140
|
-
if (!triggeredFromOtherTab) {
|
|
141
|
-
// send storage event to logout all other open tabs
|
|
142
|
-
window.localStorage.setItem(this.APP_LOGOUT_EVENT_KEY, `${Date.now()}`);
|
|
143
|
-
}
|
|
144
|
-
this.userService.logout('');
|
|
145
|
-
}
|
|
146
|
-
_processRouterNavigationEnd(e) {
|
|
147
|
-
if (!this.checkedForInitialRoute) {
|
|
148
|
-
this.checkedForInitialRoute = true;
|
|
149
|
-
// redirect to the page the user logged out from the last time
|
|
150
|
-
// but only if current route is not a deep link
|
|
151
|
-
const ignoreRoutes = ['', 'dashboard', 'index.html'].map((s) => `${Utils.getBaseHref()}${s}`.replace('//', '/'));
|
|
152
|
-
const currentRoute = this.routeWithBaseHref(this.router.routerState.snapshot.url);
|
|
153
|
-
if (this.userService.getCurrentUser() && !ignoreRoutes.includes(currentRoute)) {
|
|
154
|
-
// get persisted routes to decide where to redirect the logged in user to
|
|
155
|
-
this.auth
|
|
156
|
-
.getInitialRequestUri()
|
|
157
|
-
.pipe(switchMap((res) => this.auth.resetInitialRequestUri().pipe(map((_) => res))))
|
|
158
|
-
.subscribe((res) => {
|
|
159
|
-
const loginRes = res && !ignoreRoutes.includes(res.uri) ? res : null;
|
|
160
|
-
if (loginRes)
|
|
161
|
-
this.router.navigateByUrl(loginRes.uri);
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
routeWithBaseHref(r) {
|
|
167
|
-
return `${Utils.getBaseHref()}${r}`.replace('//', '/');
|
|
168
|
-
}
|
|
169
|
-
ngOnInit() {
|
|
170
|
-
this.#shell._init();
|
|
171
|
-
clientShellRoutes.forEach((route) => {
|
|
172
|
-
this.router.config.push(route);
|
|
173
|
-
});
|
|
174
|
-
this.router.resetConfig(this.router.config);
|
|
175
|
-
this._setCommands();
|
|
176
|
-
this.requestSubscription();
|
|
177
|
-
}
|
|
178
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ClientShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
179
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ClientShellComponent, isStandalone: true, selector: "yuv-client-shell", inputs: { apps: { classPropertyName: "apps", publicName: "apps", isSignal: true, isRequired: true, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "document:focusin": "onFocusChange($event)", "dragover": "onDragOver($event)" } }, ngImport: i0, template: "<yuv-metadata-default-templates></yuv-metadata-default-templates>\n<!-- <yuv-focus-indicator /> -->\n\n<!-- gloabl busy indicator -->\n@if (busy$ | async) {\n <div class=\"yuv-loader-linear\"></div>\n}\n<nav class=\"apps\" [inert]=\"asideOutlet.isActivated\" [attr.aria-label]=\"'yuv.shell.naviagtion.aria.label' | translate\">\n <div class=\"app-icon\">\n <button routerLink=\"/\" routerLinkActive=\"active\" [attr.aria-label]=\"'yuv.shell.logo.aria.label' | translate\">\n <yvc-icon [svg]=\"shellConfig().icons!.appIcon!\"></yvc-icon>\n </button>\n </div>\n <ul class=\"apps\">\n @for (a of apps(); track a.path) {\n <li>\n <button routerLinkActive=\"active\" [routerLink]=\"a.path\" title=\"{{ a.title }}\">\n <yvc-icon [svg]=\"a.icon\" title=\"{{ a.title }}\" *ngIf=\"a.icon\"></yvc-icon>\n <!-- @if (getNotifications(a.id)) {\n <div [ngClass]=\"'badge ' + getNotifications(a.id).maxLevel\">{{ getNotifications(a.id).count }}</div>\n } -->\n </button>\n </li>\n }\n </ul>\n\n <section class=\"actions\">\n @if (showNotifications()) {\n <button [routerLink]=\"[{ outlets: { aside: 'notifications' } }]\" routerLinkActive=\"active\" title=\"{{ 'yuv.shell.notifications.title' | translate }}\">\n <yvc-icon [svg]=\"shellConfig().icons!.notifications!\"></yvc-icon>\n @if (newNotifications(); as note) {\n <div class=\"badge {{ note.maxLevel }}\">{{ note.count }}</div>\n }\n </button>\n }\n <button [routerLink]=\"['/settings']\" routerLinkActive=\"active\" title=\"{{ 'yuv.shell.settings.title' | translate }}\">\n <yvc-icon [svg]=\"shellConfig().icons!.settings!\"></yvc-icon>\n </button>\n <button (click)=\"appLogout()\" title=\"{{ 'yuv.shell.cmd.logout' | translate }}\"><yvc-icon [svg]=\"shellConfig().icons!.logout!\"></yvc-icon></button>\n </section>\n</nav>\n<main id=\"main-shell_content\" aria-label=\"main shell content\" [inert]=\"asideOutlet.isActivated\">\n <router-outlet></router-outlet>\n</main>\n\n<!-- outlet for aside modals like notifications -->\n<div class=\"asideOutlet\" [hidden]=\"!asideOutlet.isActivated\">\n <router-outlet name=\"aside\" #asideOutlet=\"outlet\"></router-outlet>\n</div>\n\n<div id=\"fi\" inert></div>\n", styles: [":host{--client-shell-background-color: var(--main-background);--client-shell-bar-background-color: var(--panel-background);--client-shell-bar-icon-size: 24px;--client-shell-bar-button-padding: calc(var(--app-pane-padding) * .75);--client-shell-bar-width: calc(var(--client-shell-bar-icon-size) + var(--client-shell-bar-button-padding) * 2 + 1px);position:absolute;inset:0;overflow:hidden;display:flex;background-color:var(--client-shell-background-color)}:host .yuv-loader-linear{position:absolute}:host nav{background-color:var(--client-shell-bar-background-color);height:100%;overflow-y:auto;border-inline-end:1px solid var(--panel-divider-color);flex:0 0 auto;display:var(--nav-display, grid);grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"appIcon\" \"apps\" \"actions\"}:host nav button{padding:var(--client-shell-bar-button-padding);border-radius:0;border:0}:host nav button yvc-icon{--icon-size: var(--client-shell-bar-icon-size)}:host nav button.active{color:var(--color-accent)}:host nav .app-icon{grid-area:appIcon}:host nav ul.apps{grid-area:apps;list-style:none;margin:0;padding:0;overflow-y:auto}:host nav ul.apps button{position:relative}:host nav ul.apps button .badge{--badge-color: var(--color-accent);--badge-color-tone: var(--color-accent-tone);position:absolute;background-color:var(--badge-color);color:var(--badge-color-tone);font-size:10px;display:block;padding:1px 2px;border-radius:.25em;line-height:1em;top:calc(var(--app-pane-padding) / 4);right:calc(var(--app-pane-padding) / 4)}:host nav ul.apps button .badge.success{--badge-color: var(--color-success);--badge-color-tone: #fff}:host nav ul.apps button .badge.warning{--badge-color: var(--color-warning);--badge-color-tone: #fff}:host nav ul.apps button .badge.alert{--badge-color: var(--color-error);--badge-color-tone: #fff}:host nav ul.apps li a{display:block;padding:var(--app-pane-padding)}:host nav section.actions{grid-area:actions}:host nav section.actions button{position:relative}:host nav section.actions button .badge{--badge-color: var(--color-accent);--badge-color-tone: var(--color-accent-tone);position:absolute;background-color:var(--badge-color);color:var(--badge-color-tone);font-size:10px;display:block;padding:1px 2px;border-radius:.25em;line-height:1em;top:calc(var(--app-pane-padding) / 4);right:calc(var(--app-pane-padding) / 4)}:host nav section.actions button .badge.success{--badge-color: var(--color-success);--badge-color-tone: #fff}:host nav section.actions button .badge.warning{--badge-color: var(--color-warning);--badge-color-tone: #fff}:host nav section.actions button .badge.alert{--badge-color: var(--color-error);--badge-color-tone: #fff}:host main{flex:1;color:var(--text-color-body)}:host .asideOutlet{position:absolute;inset:0;padding-inline-start:var(--client-shell-bar-width)}:host-context([data-screen-size=s][data-screen-orientation=portrait]){flex-flow:column-reverse}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav{height:auto;grid-template-rows:1fr;grid-template-columns:auto 1fr auto;grid-template-areas:\"appIcon apps actions\";border:0;border-block-start:1px solid var(--panel-divider-color)}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav .app-icon{display:none}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav ul.apps,:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav section.actions{display:flex}:host-context([data-screen-size=s][data-screen-orientation=portrait]) main{overflow:hidden}:host-context([data-screen-size=s][data-screen-orientation=portrait]) .asideOutlet{padding-inline-start:0}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i3.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }, { kind: "component", type: MetadataDefaultTemplatesComponent, selector: "yuv-metadata-default-templates" }] }); }
|
|
180
|
-
}
|
|
181
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ClientShellComponent, decorators: [{
|
|
182
|
-
type: Component,
|
|
183
|
-
args: [{ selector: 'yuv-client-shell', standalone: true, imports: [NgIf, AsyncPipe, TranslateModule, RouterModule, YvcIconModule, MetadataDefaultTemplatesComponent], template: "<yuv-metadata-default-templates></yuv-metadata-default-templates>\n<!-- <yuv-focus-indicator /> -->\n\n<!-- gloabl busy indicator -->\n@if (busy$ | async) {\n <div class=\"yuv-loader-linear\"></div>\n}\n<nav class=\"apps\" [inert]=\"asideOutlet.isActivated\" [attr.aria-label]=\"'yuv.shell.naviagtion.aria.label' | translate\">\n <div class=\"app-icon\">\n <button routerLink=\"/\" routerLinkActive=\"active\" [attr.aria-label]=\"'yuv.shell.logo.aria.label' | translate\">\n <yvc-icon [svg]=\"shellConfig().icons!.appIcon!\"></yvc-icon>\n </button>\n </div>\n <ul class=\"apps\">\n @for (a of apps(); track a.path) {\n <li>\n <button routerLinkActive=\"active\" [routerLink]=\"a.path\" title=\"{{ a.title }}\">\n <yvc-icon [svg]=\"a.icon\" title=\"{{ a.title }}\" *ngIf=\"a.icon\"></yvc-icon>\n <!-- @if (getNotifications(a.id)) {\n <div [ngClass]=\"'badge ' + getNotifications(a.id).maxLevel\">{{ getNotifications(a.id).count }}</div>\n } -->\n </button>\n </li>\n }\n </ul>\n\n <section class=\"actions\">\n @if (showNotifications()) {\n <button [routerLink]=\"[{ outlets: { aside: 'notifications' } }]\" routerLinkActive=\"active\" title=\"{{ 'yuv.shell.notifications.title' | translate }}\">\n <yvc-icon [svg]=\"shellConfig().icons!.notifications!\"></yvc-icon>\n @if (newNotifications(); as note) {\n <div class=\"badge {{ note.maxLevel }}\">{{ note.count }}</div>\n }\n </button>\n }\n <button [routerLink]=\"['/settings']\" routerLinkActive=\"active\" title=\"{{ 'yuv.shell.settings.title' | translate }}\">\n <yvc-icon [svg]=\"shellConfig().icons!.settings!\"></yvc-icon>\n </button>\n <button (click)=\"appLogout()\" title=\"{{ 'yuv.shell.cmd.logout' | translate }}\"><yvc-icon [svg]=\"shellConfig().icons!.logout!\"></yvc-icon></button>\n </section>\n</nav>\n<main id=\"main-shell_content\" aria-label=\"main shell content\" [inert]=\"asideOutlet.isActivated\">\n <router-outlet></router-outlet>\n</main>\n\n<!-- outlet for aside modals like notifications -->\n<div class=\"asideOutlet\" [hidden]=\"!asideOutlet.isActivated\">\n <router-outlet name=\"aside\" #asideOutlet=\"outlet\"></router-outlet>\n</div>\n\n<div id=\"fi\" inert></div>\n", styles: [":host{--client-shell-background-color: var(--main-background);--client-shell-bar-background-color: var(--panel-background);--client-shell-bar-icon-size: 24px;--client-shell-bar-button-padding: calc(var(--app-pane-padding) * .75);--client-shell-bar-width: calc(var(--client-shell-bar-icon-size) + var(--client-shell-bar-button-padding) * 2 + 1px);position:absolute;inset:0;overflow:hidden;display:flex;background-color:var(--client-shell-background-color)}:host .yuv-loader-linear{position:absolute}:host nav{background-color:var(--client-shell-bar-background-color);height:100%;overflow-y:auto;border-inline-end:1px solid var(--panel-divider-color);flex:0 0 auto;display:var(--nav-display, grid);grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"appIcon\" \"apps\" \"actions\"}:host nav button{padding:var(--client-shell-bar-button-padding);border-radius:0;border:0}:host nav button yvc-icon{--icon-size: var(--client-shell-bar-icon-size)}:host nav button.active{color:var(--color-accent)}:host nav .app-icon{grid-area:appIcon}:host nav ul.apps{grid-area:apps;list-style:none;margin:0;padding:0;overflow-y:auto}:host nav ul.apps button{position:relative}:host nav ul.apps button .badge{--badge-color: var(--color-accent);--badge-color-tone: var(--color-accent-tone);position:absolute;background-color:var(--badge-color);color:var(--badge-color-tone);font-size:10px;display:block;padding:1px 2px;border-radius:.25em;line-height:1em;top:calc(var(--app-pane-padding) / 4);right:calc(var(--app-pane-padding) / 4)}:host nav ul.apps button .badge.success{--badge-color: var(--color-success);--badge-color-tone: #fff}:host nav ul.apps button .badge.warning{--badge-color: var(--color-warning);--badge-color-tone: #fff}:host nav ul.apps button .badge.alert{--badge-color: var(--color-error);--badge-color-tone: #fff}:host nav ul.apps li a{display:block;padding:var(--app-pane-padding)}:host nav section.actions{grid-area:actions}:host nav section.actions button{position:relative}:host nav section.actions button .badge{--badge-color: var(--color-accent);--badge-color-tone: var(--color-accent-tone);position:absolute;background-color:var(--badge-color);color:var(--badge-color-tone);font-size:10px;display:block;padding:1px 2px;border-radius:.25em;line-height:1em;top:calc(var(--app-pane-padding) / 4);right:calc(var(--app-pane-padding) / 4)}:host nav section.actions button .badge.success{--badge-color: var(--color-success);--badge-color-tone: #fff}:host nav section.actions button .badge.warning{--badge-color: var(--color-warning);--badge-color-tone: #fff}:host nav section.actions button .badge.alert{--badge-color: var(--color-error);--badge-color-tone: #fff}:host main{flex:1;color:var(--text-color-body)}:host .asideOutlet{position:absolute;inset:0;padding-inline-start:var(--client-shell-bar-width)}:host-context([data-screen-size=s][data-screen-orientation=portrait]){flex-flow:column-reverse}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav{height:auto;grid-template-rows:1fr;grid-template-columns:auto 1fr auto;grid-template-areas:\"appIcon apps actions\";border:0;border-block-start:1px solid var(--panel-divider-color)}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav .app-icon{display:none}:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav ul.apps,:host-context([data-screen-size=s][data-screen-orientation=portrait]) nav section.actions{display:flex}:host-context([data-screen-size=s][data-screen-orientation=portrait]) main{overflow:hidden}:host-context([data-screen-size=s][data-screen-orientation=portrait]) .asideOutlet{padding-inline-start:0}\n"] }]
|
|
184
|
-
}], ctorParameters: () => [], propDecorators: { onFocusChange: [{
|
|
185
|
-
type: HostListener,
|
|
186
|
-
args: ['document:focusin', ['$event']]
|
|
187
|
-
}], onDragOver: [{
|
|
188
|
-
type: HostListener,
|
|
189
|
-
args: ['dragover', ['$event']]
|
|
190
|
-
}] } });
|
|
191
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXNoZWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC9zcmMvbGliL2NsaWVudC1zaGVsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvc3JjL2xpYi9jbGllbnQtc2hlbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBa0IsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFTLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDNUksT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDM0YsT0FBTyxFQUlMLHFCQUFxQixFQUVyQix5QkFBeUIsRUFDekIsWUFBWSxFQUNiLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7O0FBU2pELE1BQU0sT0FBTyxvQkFBb0I7SUFJL0IsTUFBTSxDQUF3QjtJQUlyQixPQUFPLENBQXlCO0lBQ2hDLE9BQU8sQ0FBa0I7SUFtQ2xDLGFBQWEsQ0FBQyxLQUFpQjtRQUM3QixvREFBb0Q7SUFDdEQsQ0FBQztJQUdELFVBQVUsQ0FBQyxLQUFnQjtRQUN6QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFHRCxXQUFXLENBQTJEO0lBTXRFLGtCQUFrQixDQVVoQjtJQUdGO1FBM0VRLFdBQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxXQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RCLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3ZELGNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyQyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzlDLFlBQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUxQix5QkFBb0IsR0FBRyxzQkFBc0IsQ0FBQztRQUU5QyxZQUFPLEdBQTJDO1lBQ3hELElBQUksRUFBRSxDQUFDO1lBQ1AsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQztZQUNWLEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQztRQUVGLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixVQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFHNUIsc0JBQWlCLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzNDLHFCQUFnQixHQU1aLFFBQVEsQ0FDVixJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUM5QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUNwRCxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUNwQixJQUFJLFFBQVEsR0FBMkIsTUFBTSxDQUFDO1lBQzlDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUMxRCxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDMUgsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQztRQWVGLFNBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFTLENBQUM7UUFDL0IsZ0JBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXRFLDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQUMvQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFFM0IsV0FBTSxHQUFHLEtBQUssRUFBcUIsQ0FBQztRQUNwQyx1QkFBa0IsR0FBRyxNQUFNLENBQ3pCLEdBQUcsRUFBRTtZQUNILE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7UUFDSCxDQUFDLEVBQ0Q7WUFDRSxpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQ0YsQ0FBQztRQUNGLGdCQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFHcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRSwyQkFBMkI7UUFDM0IsaURBQWlEO1FBQ2pELHVCQUF1QjtRQUN2QixvQkFBb0I7UUFDcEIsTUFBTTtRQUVOLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTthQUNmLElBQUksQ0FDSCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxhQUFhLENBQUMsRUFDekMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFrQixDQUFDLENBQy9CO2FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUF5QixFQUFFLEVBQUU7WUFDN0QsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDOUUsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3pDLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMseURBQXlEO0lBQ3pELElBQUk7SUFFSSxrQkFBa0IsQ0FBQyxLQUFnQjtRQUN6QyxpREFBaUQ7UUFDakQsSUFBSyxLQUFLLENBQUMsYUFBeUIsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25GLE9BQU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvSCxDQUFDO0lBRU8sWUFBWSxDQUFDLE1BQWdCO1FBQ25DLE1BQU0sUUFBUSxHQUE0QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7WUFDbEIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFlLEVBQUUsQ0FBQztZQUNyRixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0MsQ0FBQyxDQUFDLENBQUM7UUFDSixRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ1osRUFBRSxFQUFFLG9CQUFvQjtZQUN4QixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUM7WUFDNUQsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbkQsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNaLEVBQUUsRUFBRSxrQkFBa0I7WUFDdEIsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDO1lBQ3JELFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1NBQ2pDLENBQUMsQ0FBQztRQUVILElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDOztZQUNwRCxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzVDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO2FBQ2xCLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQ2xDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELFNBQVMsQ0FBQyxxQkFBK0I7UUFDdkMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDM0IsbURBQW1EO1lBQ25ELE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxDQUFnQjtRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztZQUNuQyw4REFBOEQ7WUFDOUQsK0NBQStDO1lBQy9DLE1BQU0sWUFBWSxHQUFHLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWxGLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDOUUseUVBQXlFO2dCQUN6RSxJQUFJLENBQUMsSUFBSTtxQkFDTixvQkFBb0IsRUFBRTtxQkFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbEYsU0FBUyxDQUFDLENBQUMsR0FBdUMsRUFBRSxFQUFFO29CQUNyRCxNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ3JFLElBQUksUUFBUTt3QkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hELENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQUMsQ0FBUztRQUNqQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7K0dBek1VLG9CQUFvQjttR0FBcEIsb0JBQW9CLCthQzVCakMsNHZFQW1EQSx5b0hEM0JZLElBQUksd0ZBQUUsU0FBUyw2Q0FBRSxlQUFlLDJGQUFFLFlBQVksMHBCQUFFLGFBQWEsK0hBQUUsaUNBQWlDOzs0RkFJL0Ysb0JBQW9CO2tCQVBoQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1AsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGlDQUFpQyxDQUFDO3dEQWdEM0csYUFBYTtzQkFEWixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU01QyxVQUFVO3NCQURULFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkluaXQsIFNpZ25hbCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGUsIFJvdXRlciwgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN3UHVzaCB9IGZyb20gJ0Bhbmd1bGFyL3NlcnZpY2Utd29ya2VyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlLCBEZXZpY2VTZXJ2aWNlLCBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UsIFVzZXJSb2xlcywgVXNlclNlcnZpY2UsIFV0aWxzLCBZdXZVc2VyIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBNZXRhZGF0YURlZmF1bHRUZW1wbGF0ZXNDb21wb25lbnQgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvbWV0YWRhdGEtZm9ybSc7XG5pbXBvcnQge1xuICBBcHAsXG4gIENsaWVudFNoZWxsQ29uZmlnLFxuICBDb21tYW5kUGFsZXR0ZUNvbW1hbmQsXG4gIENvbW1hbmRQYWxldHRlU2VydmljZSxcbiAgU2hlbGxOb3RpZmljYXRpb25MZXZlbCxcbiAgU2hlbGxOb3RpZmljYXRpb25zU2VydmljZSxcbiAgU2hlbGxTZXJ2aWNlXG59IGZyb20gJ0B5dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUnO1xuaW1wb3J0IHsgWXZjSWNvbk1vZHVsZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjbGllbnRTaGVsbFJvdXRlcyB9IGZyb20gJy4vbGliLnJvdXRlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3l1di1jbGllbnQtc2hlbGwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdJZiwgQXN5bmNQaXBlLCBUcmFuc2xhdGVNb2R1bGUsIFJvdXRlck1vZHVsZSwgWXZjSWNvbk1vZHVsZSwgTWV0YWRhdGFEZWZhdWx0VGVtcGxhdGVzQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NsaWVudC1zaGVsbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NsaWVudC1zaGVsbC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENsaWVudFNoZWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB1c2VyU2VydmljZSA9IGluamVjdChVc2VyU2VydmljZSk7XG4gICNzaGVsbCA9IGluamVjdChTaGVsbFNlcnZpY2UpO1xuICBwcml2YXRlIHNoZWxsTm90aWZpY2F0aW9ucyA9IGluamVjdChTaGVsbE5vdGlmaWNhdGlvbnNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgY29tbWFuZFBhbGV0dGUgPSBpbmplY3QoQ29tbWFuZFBhbGV0dGVTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI2RldmljZSA9IGluamVjdChEZXZpY2VTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI3N3UHVzaCA9IGluamVjdChTd1B1c2gpO1xuXG4gIHByaXZhdGUgQVBQX0xPR09VVF9FVkVOVF9LRVkgPSAneXV2LmFwcC5ldmVudC5sb2dvdXQnO1xuXG4gIHByaXZhdGUgX2xldmVsczogUmVjb3JkPFNoZWxsTm90aWZpY2F0aW9uTGV2ZWwsIG51bWJlcj4gPSB7XG4gICAgaW5mbzogMCxcbiAgICBzdWNjZXNzOiAxLFxuICAgIHdhcm5pbmc6IDIsXG4gICAgYWxlcnQ6IDNcbiAgfTtcblxuICBzaG93VXBsb2FkT3ZlcmxheSA9IGZhbHNlO1xuICBidXN5JCA9IHRoaXMuI3NoZWxsLmlzQnVzeSQ7XG4gIGNvbnRleHQ/OiBzdHJpbmc7XG5cbiAgc2hvd05vdGlmaWNhdGlvbnMgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBuZXdOb3RpZmljYXRpb25zOiBTaWduYWw8XG4gICAgfCB7XG4gICAgICAgIGNvdW50OiBudW1iZXI7XG4gICAgICAgIG1heExldmVsOiBTaGVsbE5vdGlmaWNhdGlvbkxldmVsO1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkXG4gID4gPSB0b1NpZ25hbChcbiAgICB0aGlzLnNoZWxsTm90aWZpY2F0aW9ucy5zaGVsbE5vdGlmaWNhdGlvbnMkLnBpcGUoXG4gICAgICB0YXAoKG4pID0+IHRoaXMuc2hvd05vdGlmaWNhdGlvbnMuc2V0KG4ubGVuZ3RoID4gMCkpLFxuICAgICAgbWFwKChub3RpZmljYXRpb25zKSA9PiB7XG4gICAgICAgIGxldCBtYXhMZXZlbDogU2hlbGxOb3RpZmljYXRpb25MZXZlbCA9ICdpbmZvJztcbiAgICAgICAgY29uc3QgY291bnQgPSBub3RpZmljYXRpb25zLmZpbHRlcigobikgPT4gIW4uc2VlbikubGVuZ3RoO1xuICAgICAgICBub3RpZmljYXRpb25zLmZvckVhY2goKG4pID0+IChtYXhMZXZlbCA9IG4ubGV2ZWwgJiYgdGhpcy5fbGV2ZWxzW24ubGV2ZWxdID4gdGhpcy5fbGV2ZWxzW21heExldmVsXSA/IG4ubGV2ZWwgOiBtYXhMZXZlbCkpO1xuICAgICAgICByZXR1cm4gY291bnQgPiAwID8geyBtYXhMZXZlbCwgY291bnQgfSA6IHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgKVxuICApO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmZvY3VzaW4nLCBbJyRldmVudCddKVxuICBvbkZvY3VzQ2hhbmdlKGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2ZvY3VzZWQ6ICcsIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKVxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5zaG93VXBsb2FkT3ZlcmxheSA9ICEhdGhpcy5fZHJhZ0NvbnRhaW5zRmlsZXMoZXZlbnQpO1xuICB9XG5cbiAgYXBwcyA9IGlucHV0LnJlcXVpcmVkPEFwcFtdPigpO1xuICAjYXBwc0VmZmVjdCA9IGVmZmVjdCgoKSA9PiB0aGlzLiNzaGVsbC5zZXRBcHBCYXNlUm91dGVzKHRoaXMuYXBwcygpKSk7XG4gIHVzZXI/OiBZdXZVc2VyO1xuICBjaGVja2VkRm9ySW5pdGlhbFJvdXRlID0gZmFsc2U7XG4gIGVuYWJsZVRlbmFudFN3aXRjaCA9IGZhbHNlO1xuXG4gIGNvbmZpZyA9IGlucHV0PENsaWVudFNoZWxsQ29uZmlnPigpO1xuICAjc2hlbGxDb25maWdFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgY2ZnID0gdGhpcy5jb25maWcoKTtcbiAgICAgIGlmIChjZmcpIHtcbiAgICAgICAgdGhpcy4jc2hlbGwuc2V0U2hlbGxDb25maWcoY2ZnKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlXG4gICAgfVxuICApO1xuICBzaGVsbENvbmZpZyA9IHRoaXMuI3NoZWxsLnNoZWxsQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fc2V0Q29tbWFuZHModHJ1ZSkpO1xuICAgIC8vIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxuICAgIC8vICAgLy8gZmlsdGVyKGUgPT4gZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydClcbiAgICAvLyApLnN1YnNjcmliZSgoZSkgPT4ge1xuICAgIC8vICAgY29uc29sZS5sb2coZSk7XG4gICAgLy8gfSk7XG5cbiAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKGUpID0+IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcbiAgICAgICAgbWFwKChlKSA9PiBlIGFzIE5hdmlnYXRpb25FbmQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChlOiBOYXZpZ2F0aW9uRW5kKSA9PiB0aGlzLl9wcm9jZXNzUm91dGVyTmF2aWdhdGlvbkVuZChlKSk7XG5cbiAgICB0aGlzLiNkZXZpY2UuaW5pdCgpO1xuXG4gICAgdGhpcy51c2VyU2VydmljZS51c2VyJC5zdWJzY3JpYmUoKHVzZXI6IFl1dlVzZXIgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgIHRoaXMuY2hlY2tlZEZvckluaXRpYWxSb3V0ZSA9ICEoIXRoaXMudXNlciB8fCB0aGlzLnVzZXIuaWQgIT09IHVzZXIuaWQpO1xuICAgICAgICB0aGlzLmVuYWJsZVRlbmFudFN3aXRjaCA9IHVzZXIuYXV0aG9yaXRpZXMuaW5jbHVkZXMoVXNlclJvbGVzLk1VTFRJX1RFTkFOVCk7XG4gICAgICB9XG4gICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgIH0pO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCAoZXZ0KSA9PiB7XG4gICAgICBpZiAoZXZ0LmtleSA9PT0gdGhpcy5BUFBfTE9HT1VUX0VWRU5UX0tFWSkge1xuICAgICAgICB0aGlzLmFwcExvZ291dCh0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9wZW5Ob3RpZmljYXRpb25zKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt7fV0pO1xuICB9XG5cbiAgLy8gZ2V0Tm90aWZpY2F0aW9ucyhpZDogc3RyaW5nKSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuc2hlbGxOb3RpZmljYXRpb25zLmdldE5vdGlmaWNhdGlvbnMoaWQpO1xuICAvLyB9XG5cbiAgcHJpdmF0ZSBfZHJhZ0NvbnRhaW5zRmlsZXMoZXZlbnQ6IERyYWdFdmVudCk6IG51bWJlciB7XG4gICAgLy8gZG8gbm90IGFsbG93IHRvIGRyb3AgZmlsZXMvaW1hZ2VzIGZyb20gaWZyYW1lc1xuICAgIGlmICgoZXZlbnQucmVsYXRlZFRhcmdldCBhcyBFbGVtZW50KT8udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaWZyYW1lJykgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGV2ZW50LmRhdGFUcmFuc2ZlciA/IEFycmF5LmZyb20oZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zIHx8IFtdKS5maWx0ZXIoKGkpID0+IGkua2luZCA9PT0gJ2ZpbGUnICYmIGkudHlwZSkubGVuZ3RoIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgX3NldENvbW1hbmRzKHVwZGF0ZT86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb21tYW5kczogQ29tbWFuZFBhbGV0dGVDb21tYW5kW10gPSB0aGlzLmFwcHMoKS5tYXAoKGE6IEFwcCwgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgaWQ6IGBuYXYuYXBwLiR7aX1gLFxuICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3l1di5zaGVsbC5jbWQuYXBwLm9wZW4nLCB7IHRpdGxlOiBhLnRpdGxlIGFzIHN0cmluZyB9KSxcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYS5wYXRoXSlcbiAgICB9KSk7XG4gICAgY29tbWFuZHMucHVzaCh7XG4gICAgICBpZDogYG5hdi5zaGVsbC5zZXR0aW5nc2AsXG4gICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LnNoZWxsLmNtZC5vcGVuLnNldHRpbmdzJyksXG4gICAgICBjYWxsYmFjazogKCkgPT4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydzZXR0aW5ncyddKVxuICAgIH0pO1xuICAgIGNvbW1hbmRzLnB1c2goe1xuICAgICAgaWQ6IGBuYXYuc2hlbGwubG9nb3V0YCxcbiAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCd5dXYuc2hlbGwuY21kLmxvZ291dCcpLFxuICAgICAgY2FsbGJhY2s6ICgpID0+IHRoaXMuYXBwTG9nb3V0KClcbiAgICB9KTtcblxuICAgIGlmICh1cGRhdGUpIHRoaXMuY29tbWFuZFBhbGV0dGUudXBkYXRlQ29tbWFuZHMoY29tbWFuZHMpO1xuICAgIGVsc2UgdGhpcy5jb21tYW5kUGFsZXR0ZS5yZWdpc3RlckNvbW1hbmRzKGNvbW1hbmRzKTtcbiAgfVxuXG4gIHJlcXVlc3RTdWJzY3JpcHRpb24oKSB7XG4gICAgaWYgKCF0aGlzLiNzd1B1c2guaXNFbmFibGVkKSB7XG4gICAgICBjb25zb2xlLmxvZygnTm90aWZpY2F0aW9uIGlzIG5vdCBlbmFibGVkLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuI3N3UHVzaC5tZXNzYWdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgobXNnKSA9PiBjb25zb2xlLmxvZyh7IG1zZyB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coeyBlcnJvciB9KTtcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBhcHBMb2dvdXQodHJpZ2dlcmVkRnJvbU90aGVyVGFiPzogYm9vbGVhbikge1xuICAgIGlmICghdHJpZ2dlcmVkRnJvbU90aGVyVGFiKSB7XG4gICAgICAvLyBzZW5kIHN0b3JhZ2UgZXZlbnQgdG8gbG9nb3V0IGFsbCBvdGhlciBvcGVuIHRhYnNcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLkFQUF9MT0dPVVRfRVZFTlRfS0VZLCBgJHtEYXRlLm5vdygpfWApO1xuICAgIH1cbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmxvZ291dCgnJyk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzUm91dGVyTmF2aWdhdGlvbkVuZChlOiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgaWYgKCF0aGlzLmNoZWNrZWRGb3JJbml0aWFsUm91dGUpIHtcbiAgICAgIHRoaXMuY2hlY2tlZEZvckluaXRpYWxSb3V0ZSA9IHRydWU7XG4gICAgICAvLyByZWRpcmVjdCB0byB0aGUgcGFnZSB0aGUgdXNlciBsb2dnZWQgb3V0IGZyb20gdGhlIGxhc3QgdGltZVxuICAgICAgLy8gYnV0IG9ubHkgaWYgY3VycmVudCByb3V0ZSBpcyBub3QgYSBkZWVwIGxpbmtcbiAgICAgIGNvbnN0IGlnbm9yZVJvdXRlcyA9IFsnJywgJ2Rhc2hib2FyZCcsICdpbmRleC5odG1sJ10ubWFwKChzKSA9PiBgJHtVdGlscy5nZXRCYXNlSHJlZigpfSR7c31gLnJlcGxhY2UoJy8vJywgJy8nKSk7XG4gICAgICBjb25zdCBjdXJyZW50Um91dGUgPSB0aGlzLnJvdXRlV2l0aEJhc2VIcmVmKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCk7XG5cbiAgICAgIGlmICh0aGlzLnVzZXJTZXJ2aWNlLmdldEN1cnJlbnRVc2VyKCkgJiYgIWlnbm9yZVJvdXRlcy5pbmNsdWRlcyhjdXJyZW50Um91dGUpKSB7XG4gICAgICAgIC8vIGdldCBwZXJzaXN0ZWQgcm91dGVzIHRvIGRlY2lkZSB3aGVyZSB0byByZWRpcmVjdCB0aGUgbG9nZ2VkIGluIHVzZXIgdG9cbiAgICAgICAgdGhpcy5hdXRoXG4gICAgICAgICAgLmdldEluaXRpYWxSZXF1ZXN0VXJpKClcbiAgICAgICAgICAucGlwZShzd2l0Y2hNYXAoKHJlcykgPT4gdGhpcy5hdXRoLnJlc2V0SW5pdGlhbFJlcXVlc3RVcmkoKS5waXBlKG1hcCgoXykgPT4gcmVzKSkpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlczogeyB1cmk6IHN0cmluZzsgdGltZXN0YW1wOiBudW1iZXIgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9naW5SZXMgPSByZXMgJiYgIWlnbm9yZVJvdXRlcy5pbmNsdWRlcyhyZXMudXJpKSA/IHJlcyA6IG51bGw7XG4gICAgICAgICAgICBpZiAobG9naW5SZXMpIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwobG9naW5SZXMudXJpKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJvdXRlV2l0aEJhc2VIcmVmKHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1V0aWxzLmdldEJhc2VIcmVmKCl9JHtyfWAucmVwbGFjZSgnLy8nLCAnLycpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy4jc2hlbGwuX2luaXQoKTtcbiAgICBjbGllbnRTaGVsbFJvdXRlcy5mb3JFYWNoKChyb3V0ZTogUm91dGUpID0+IHtcbiAgICAgIHRoaXMucm91dGVyLmNvbmZpZy5wdXNoKHJvdXRlKTtcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlci5yZXNldENvbmZpZyh0aGlzLnJvdXRlci5jb25maWcpO1xuICAgIHRoaXMuX3NldENvbW1hbmRzKCk7XG4gICAgdGhpcy5yZXF1ZXN0U3Vic2NyaXB0aW9uKCk7XG4gIH1cbn1cbiIsIjx5dXYtbWV0YWRhdGEtZGVmYXVsdC10ZW1wbGF0ZXM+PC95dXYtbWV0YWRhdGEtZGVmYXVsdC10ZW1wbGF0ZXM+XG48IS0tIDx5dXYtZm9jdXMtaW5kaWNhdG9yIC8+IC0tPlxuXG48IS0tIGdsb2FibCBidXN5IGluZGljYXRvciAtLT5cbkBpZiAoYnVzeSQgfCBhc3luYykge1xuICA8ZGl2IGNsYXNzPVwieXV2LWxvYWRlci1saW5lYXJcIj48L2Rpdj5cbn1cbjxuYXYgY2xhc3M9XCJhcHBzXCIgW2luZXJ0XT1cImFzaWRlT3V0bGV0LmlzQWN0aXZhdGVkXCIgW2F0dHIuYXJpYS1sYWJlbF09XCIneXV2LnNoZWxsLm5hdmlhZ3Rpb24uYXJpYS5sYWJlbCcgfCB0cmFuc2xhdGVcIj5cbiAgPGRpdiBjbGFzcz1cImFwcC1pY29uXCI+XG4gICAgPGJ1dHRvbiByb3V0ZXJMaW5rPVwiL1wiIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmVcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIid5dXYuc2hlbGwubG9nby5hcmlhLmxhYmVsJyB8IHRyYW5zbGF0ZVwiPlxuICAgICAgPHl2Yy1pY29uIFtzdmddPVwic2hlbGxDb25maWcoKS5pY29ucyEuYXBwSWNvbiFcIj48L3l2Yy1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPHVsIGNsYXNzPVwiYXBwc1wiPlxuICAgIEBmb3IgKGEgb2YgYXBwcygpOyB0cmFjayBhLnBhdGgpIHtcbiAgICAgIDxsaT5cbiAgICAgICAgPGJ1dHRvbiByb3V0ZXJMaW5rQWN0aXZlPVwiYWN0aXZlXCIgW3JvdXRlckxpbmtdPVwiYS5wYXRoXCIgdGl0bGU9XCJ7eyBhLnRpdGxlIH19XCI+XG4gICAgICAgICAgPHl2Yy1pY29uIFtzdmddPVwiYS5pY29uXCIgdGl0bGU9XCJ7eyBhLnRpdGxlIH19XCIgKm5nSWY9XCJhLmljb25cIj48L3l2Yy1pY29uPlxuICAgICAgICAgIDwhLS0gQGlmIChnZXROb3RpZmljYXRpb25zKGEuaWQpKSB7XG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cIidiYWRnZSAnICsgZ2V0Tm90aWZpY2F0aW9ucyhhLmlkKS5tYXhMZXZlbFwiPnt7IGdldE5vdGlmaWNhdGlvbnMoYS5pZCkuY291bnQgfX08L2Rpdj5cbiAgICAgICAgICB9IC0tPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbGk+XG4gICAgfVxuICA8L3VsPlxuXG4gIDxzZWN0aW9uIGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgIEBpZiAoc2hvd05vdGlmaWNhdGlvbnMoKSkge1xuICAgICAgPGJ1dHRvbiBbcm91dGVyTGlua109XCJbeyBvdXRsZXRzOiB7IGFzaWRlOiAnbm90aWZpY2F0aW9ucycgfSB9XVwiIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmVcIiB0aXRsZT1cInt7ICd5dXYuc2hlbGwubm90aWZpY2F0aW9ucy50aXRsZScgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgPHl2Yy1pY29uIFtzdmddPVwic2hlbGxDb25maWcoKS5pY29ucyEubm90aWZpY2F0aW9ucyFcIj48L3l2Yy1pY29uPlxuICAgICAgICBAaWYgKG5ld05vdGlmaWNhdGlvbnMoKTsgYXMgbm90ZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZSB7eyBub3RlLm1heExldmVsIH19XCI+e3sgbm90ZS5jb3VudCB9fTwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gICAgPGJ1dHRvbiBbcm91dGVyTGlua109XCJbJy9zZXR0aW5ncyddXCIgcm91dGVyTGlua0FjdGl2ZT1cImFjdGl2ZVwiIHRpdGxlPVwie3sgJ3l1di5zaGVsbC5zZXR0aW5ncy50aXRsZScgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgIDx5dmMtaWNvbiBbc3ZnXT1cInNoZWxsQ29uZmlnKCkuaWNvbnMhLnNldHRpbmdzIVwiPjwveXZjLWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiYXBwTG9nb3V0KClcIiB0aXRsZT1cInt7ICd5dXYuc2hlbGwuY21kLmxvZ291dCcgfCB0cmFuc2xhdGUgfX1cIj48eXZjLWljb24gW3N2Z109XCJzaGVsbENvbmZpZygpLmljb25zIS5sb2dvdXQhXCI+PC95dmMtaWNvbj48L2J1dHRvbj5cbiAgPC9zZWN0aW9uPlxuPC9uYXY+XG48bWFpbiBpZD1cIm1haW4tc2hlbGxfY29udGVudFwiIGFyaWEtbGFiZWw9XCJtYWluIHNoZWxsIGNvbnRlbnRcIiBbaW5lcnRdPVwiYXNpZGVPdXRsZXQuaXNBY3RpdmF0ZWRcIj5cbiAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuPC9tYWluPlxuXG48IS0tIG91dGxldCBmb3IgYXNpZGUgbW9kYWxzIGxpa2Ugbm90aWZpY2F0aW9ucyAtLT5cbjxkaXYgY2xhc3M9XCJhc2lkZU91dGxldFwiIFtoaWRkZW5dPVwiIWFzaWRlT3V0bGV0LmlzQWN0aXZhdGVkXCI+XG4gIDxyb3V0ZXItb3V0bGV0IG5hbWU9XCJhc2lkZVwiICNhc2lkZU91dGxldD1cIm91dGxldFwiPjwvcm91dGVyLW91dGxldD5cbjwvZGl2PlxuXG48ZGl2IGlkPVwiZmlcIiBpbmVydD48L2Rpdj5cbiJdfQ==
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Component, input } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { YvcIconModule } from '@yuuvis/components/icon';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@yuuvis/components/icon";
|
|
6
|
-
export class AppLogoComponent {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.icon = input();
|
|
9
|
-
this.label = input.required();
|
|
10
|
-
}
|
|
11
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
12
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AppLogoComponent, isStandalone: true, selector: "yuv-app-logo", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@let ico = icon();\n@if(ico){\n<yvc-icon [svg]=\"ico\"></yvc-icon>\n}<span class=\"label\">{{label()}}</span>", styles: [":host{--band-color: var(--text-color-body);--band-height: var(--client-shell-bar-icon-size);--band-icon-size: 32px;--text-color: var(--main-background);--icon-color: var(--text-color);--icon-background-color: transparent;display:flex;align-items:center;padding:0 calc(var(--app-pane-padding) / 1) 0 calc(var(--app-pane-padding) / 2);height:calc(var(--client-shell-bar-icon-size));font-size:var(--font-caption);line-height:1em;cursor:pointer;background-color:var(--band-color);color:var(--text-color)}:host yvc-icon{--icon-size: var(--band-icon-size);grid-column:2;grid-row:1;border-radius:4px;margin-inline-end:calc(var(--app-pane-padding) / 2);opacity:.5;color:var(--icon-color);background-color:var(--icon-background-color)}:host .label{line-height:1em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i1.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }] }); }
|
|
13
|
-
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppLogoComponent, decorators: [{
|
|
15
|
-
type: Component,
|
|
16
|
-
args: [{ selector: 'yuv-app-logo', standalone: true, imports: [CommonModule, YvcIconModule], template: "@let ico = icon();\n@if(ico){\n<yvc-icon [svg]=\"ico\"></yvc-icon>\n}<span class=\"label\">{{label()}}</span>", styles: [":host{--band-color: var(--text-color-body);--band-height: var(--client-shell-bar-icon-size);--band-icon-size: 32px;--text-color: var(--main-background);--icon-color: var(--text-color);--icon-background-color: transparent;display:flex;align-items:center;padding:0 calc(var(--app-pane-padding) / 1) 0 calc(var(--app-pane-padding) / 2);height:calc(var(--client-shell-bar-icon-size));font-size:var(--font-caption);line-height:1em;cursor:pointer;background-color:var(--band-color);color:var(--text-color)}:host yvc-icon{--icon-size: var(--band-icon-size);grid-column:2;grid-row:1;border-radius:4px;margin-inline-end:calc(var(--app-pane-padding) / 2);opacity:.5;color:var(--icon-color);background-color:var(--icon-background-color)}:host .label{line-height:1em}\n"] }]
|
|
17
|
-
}] });
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWxvZ28uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvY29tcG9uZW50cy9hcHAtbG9nby9hcHAtbG9nby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvc3JjL2xpYi9jb21wb25lbnRzL2FwcC1sb2dvL2FwcC1sb2dvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7OztBQVN4RCxNQUFNLE9BQU8sZ0JBQWdCO0lBUDdCO1FBUUUsU0FBSSxHQUFHLEtBQUssRUFBVSxDQUFDO1FBQ3ZCLFVBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFVLENBQUM7S0FDbEM7K0dBSFksZ0JBQWdCO21HQUFoQixnQkFBZ0IsZ1VDWDdCLCtHQUd1Qyw4eUJESTNCLFlBQVksOEJBQUUsYUFBYTs7NEZBSTFCLGdCQUFnQjtrQkFQNUIsU0FBUzsrQkFDRSxjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBZdmNJY29uTW9kdWxlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL2ljb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd5dXYtYXBwLWxvZ28nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBZdmNJY29uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcC1sb2dvLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2FwcC1sb2dvLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBBcHBMb2dvQ29tcG9uZW50IHtcbiAgaWNvbiA9IGlucHV0PHN0cmluZz4oKTtcbiAgbGFiZWwgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG59XG4iLCJAbGV0IGljbyA9IGljb24oKTtcbkBpZihpY28pe1xuPHl2Yy1pY29uIFtzdmddPVwiaWNvXCI+PC95dmMtaWNvbj5cbn08c3BhbiBjbGFzcz1cImxhYmVsXCI+e3tsYWJlbCgpfX08L3NwYW4+Il19
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Directive, ElementRef, effect, inject, input } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class InertDirective {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.elRef = inject(ElementRef);
|
|
6
|
-
this.inert = input(false);
|
|
7
|
-
effect(() => {
|
|
8
|
-
const el = this.elRef.nativeElement;
|
|
9
|
-
if (this.inert())
|
|
10
|
-
el.setAttribute('inert', 'true');
|
|
11
|
-
else
|
|
12
|
-
el.removeAttribute('inert');
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InertDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
16
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: InertDirective, isStandalone: true, selector: "[inert]", inputs: { inert: { classPropertyName: "inert", publicName: "inert", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
17
|
-
}
|
|
18
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InertDirective, decorators: [{
|
|
19
|
-
type: Directive,
|
|
20
|
-
args: [{
|
|
21
|
-
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
22
|
-
selector: '[inert]',
|
|
23
|
-
standalone: true
|
|
24
|
-
}]
|
|
25
|
-
}], ctorParameters: () => [] });
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5lcnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvZGlyZWN0aXZlcy9pbmVydC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBTzdFLE1BQU0sT0FBTyxjQUFjO0lBS3pCO1FBSlEsVUFBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuQyxVQUFLLEdBQUcsS0FBSyxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRzVCLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLEVBQUUsR0FBZ0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUE0QixDQUFDO1lBQ2hFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQzs7Z0JBQzlDLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQVhVLGNBQWM7bUdBQWQsY0FBYzs7NEZBQWQsY0FBYztrQkFMMUIsU0FBUzttQkFBQztvQkFDVCw4REFBOEQ7b0JBQzlELFFBQVEsRUFBRSxTQUFTO29CQUNuQixVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbaW5lcnRdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJbmVydERpcmVjdGl2ZSB7XG4gIHByaXZhdGUgZWxSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG5cbiAgaW5lcnQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGlmICh0aGlzLmluZXJ0KCkpIGVsLnNldEF0dHJpYnV0ZSgnaW5lcnQnLCAndHJ1ZScpO1xuICAgICAgZWxzZSBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2luZXJ0Jyk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { DashboardPageComponent } from './pages/dashboard/dashboard.component';
|
|
2
|
-
import { SettingsPageComponent } from './pages/settings/settings.component';
|
|
3
|
-
import { NotificationsPageComponent } from './pages/notifications/notifications.component';
|
|
4
|
-
import { WebShareTargetPageComponent } from './pages/web-share-target/web-share-target.component';
|
|
5
|
-
export const clientShellRoutes = [
|
|
6
|
-
{ path: 'dashboard', component: DashboardPageComponent },
|
|
7
|
-
{ path: 'notifications', component: NotificationsPageComponent, outlet: 'aside' },
|
|
8
|
-
{ path: 'settings', component: SettingsPageComponent },
|
|
9
|
-
{ path: 'web-share-target', component: WebShareTargetPageComponent },
|
|
10
|
-
// default route
|
|
11
|
-
{ path: '', redirectTo: '/dashboard', pathMatch: 'full' },
|
|
12
|
-
// redirecting route
|
|
13
|
-
{ path: '**', redirectTo: '/' }
|
|
14
|
-
];
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliLnJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC9zcmMvbGliL2xpYi5yb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDM0YsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFFbEcsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQVk7SUFDeEMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRTtJQUN4RCxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7SUFDakYsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRTtJQUN0RCxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsMkJBQTJCLEVBQUU7SUFDcEUsZ0JBQWdCO0lBQ2hCLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7SUFDekQsb0JBQW9CO0lBQ3BCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFO0NBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEYXNoYm9hcmRQYWdlQ29tcG9uZW50IH0gZnJvbSAnLi9wYWdlcy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZXR0aW5nc1BhZ2VDb21wb25lbnQgfSBmcm9tICcuL3BhZ2VzL3NldHRpbmdzL3NldHRpbmdzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25zUGFnZUNvbXBvbmVudCB9IGZyb20gJy4vcGFnZXMvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb25zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXZWJTaGFyZVRhcmdldFBhZ2VDb21wb25lbnQgfSBmcm9tICcuL3BhZ2VzL3dlYi1zaGFyZS10YXJnZXQvd2ViLXNoYXJlLXRhcmdldC5jb21wb25lbnQnO1xuXG5leHBvcnQgY29uc3QgY2xpZW50U2hlbGxSb3V0ZXM6IFJvdXRlW10gPSBbXG4gIHsgcGF0aDogJ2Rhc2hib2FyZCcsIGNvbXBvbmVudDogRGFzaGJvYXJkUGFnZUNvbXBvbmVudCB9LFxuICB7IHBhdGg6ICdub3RpZmljYXRpb25zJywgY29tcG9uZW50OiBOb3RpZmljYXRpb25zUGFnZUNvbXBvbmVudCwgb3V0bGV0OiAnYXNpZGUnIH0sXG4gIHsgcGF0aDogJ3NldHRpbmdzJywgY29tcG9uZW50OiBTZXR0aW5nc1BhZ2VDb21wb25lbnQgfSxcbiAgeyBwYXRoOiAnd2ViLXNoYXJlLXRhcmdldCcsIGNvbXBvbmVudDogV2ViU2hhcmVUYXJnZXRQYWdlQ29tcG9uZW50IH0sXG4gIC8vIGRlZmF1bHQgcm91dGVcbiAgeyBwYXRoOiAnJywgcmVkaXJlY3RUbzogJy9kYXNoYm9hcmQnLCBwYXRoTWF0Y2g6ICdmdWxsJyB9LFxuICAvLyByZWRpcmVjdGluZyByb3V0ZVxuICB7IHBhdGg6ICcqKicsIHJlZGlyZWN0VG86ICcvJyB9XG5dO1xuIl19
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class DashboardPageComponent {
|
|
4
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DashboardPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DashboardPageComponent, selector: "yuv-dashboard", ngImport: i0, template: "yuuvis Momentum\n", styles: [":host{display:grid;align-items:center;justify-content:center;height:100%;overflow:hidden;color:var(--text-color-hint);font-size:var(--font-display)}\n"] }); }
|
|
6
|
-
}
|
|
7
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DashboardPageComponent, decorators: [{
|
|
8
|
-
type: Component,
|
|
9
|
-
args: [{ selector: 'yuv-dashboard', template: "yuuvis Momentum\n", styles: [":host{display:grid;align-items:center;justify-content:center;height:100%;overflow:hidden;color:var(--text-color-hint);font-size:var(--font-display)}\n"] }]
|
|
10
|
-
}] });
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC9zcmMvbGliL3BhZ2VzL2Rhc2hib2FyZC9kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvcGFnZXMvZGFzaGJvYXJkL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU8xQyxNQUFNLE9BQU8sc0JBQXNCOytHQUF0QixzQkFBc0I7bUdBQXRCLHNCQUFzQixxRENQbkMsbUJBQ0E7OzRGRE1hLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3l1di1kYXNoYm9hcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGFzaGJvYXJkLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkUGFnZUNvbXBvbmVudCB7fVxuIiwieXV1dmlzIE1vbWVudHVtXG4iXX0=
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { CdkTrapFocus } from '@angular/cdk/a11y';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { Component, ElementRef, HostListener, effect, inject } from '@angular/core';
|
|
4
|
-
import { toSignal } from '@angular/core/rxjs-interop';
|
|
5
|
-
import { Router } from '@angular/router';
|
|
6
|
-
import { LocaleDatePipe, TranslateModule, Utils } from '@yuuvis/client-core';
|
|
7
|
-
import { LightDismissDirective } from '@yuuvis/client-framework/common';
|
|
8
|
-
import { YUV_ICONS } from '@yuuvis/client-framework/icons';
|
|
9
|
-
import { ListComponent, ListItemDirective } from '@yuuvis/client-framework/list';
|
|
10
|
-
import { ShellNotificationsService } from '@yuuvis/client-shell-core';
|
|
11
|
-
import { ICONS, YvcIconModule } from '@yuuvis/components/icon';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/common";
|
|
14
|
-
import * as i2 from "@yuuvis/components/icon";
|
|
15
|
-
import * as i3 from "@yuuvis/client-core";
|
|
16
|
-
export class NotificationsPageComponent {
|
|
17
|
-
constructor() {
|
|
18
|
-
this.router = inject(Router);
|
|
19
|
-
this.shellNotifications = inject(ShellNotificationsService);
|
|
20
|
-
this.elRef = inject(ElementRef);
|
|
21
|
-
this._focusedIndex = -1;
|
|
22
|
-
this._notificationIDs = [];
|
|
23
|
-
this.notifications = toSignal(this.shellNotifications.shellNotifications$);
|
|
24
|
-
this.notificationsIdEffect = effect(() => (this._notificationIDs = (this.notifications() || []).map((n) => n.id)));
|
|
25
|
-
this.icons = {
|
|
26
|
-
close: ICONS.clear,
|
|
27
|
-
trash: YUV_ICONS.trash,
|
|
28
|
-
note: YUV_ICONS.notification
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
onKeydown(event) {
|
|
32
|
-
switch (event.code) {
|
|
33
|
-
case 'Delete': {
|
|
34
|
-
if (this._focusedIndex >= 0)
|
|
35
|
-
this.remove(this._notificationIDs[this._focusedIndex]);
|
|
36
|
-
break;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
async itemSelected(idx) {
|
|
41
|
-
const n = this.shellNotifications.getNotificationById(this._notificationIDs[idx[0]]);
|
|
42
|
-
if (n?.targetRoute) {
|
|
43
|
-
await this.close();
|
|
44
|
-
this.router.navigateByUrl(n.targetRoute, { replaceUrl: true });
|
|
45
|
-
if (n.removeOnTargetRouteNavigated)
|
|
46
|
-
this.remove(n.id);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
itemFocused(index) {
|
|
50
|
-
this._focusedIndex = index;
|
|
51
|
-
}
|
|
52
|
-
remove(id) {
|
|
53
|
-
if (id)
|
|
54
|
-
this.shellNotifications.remove(id);
|
|
55
|
-
}
|
|
56
|
-
removeAll() {
|
|
57
|
-
this.shellNotifications.removeAll();
|
|
58
|
-
}
|
|
59
|
-
close() {
|
|
60
|
-
return this.router.navigate([{ outlets: { aside: null } }], {
|
|
61
|
-
replaceUrl: true
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
ngOnInit() {
|
|
65
|
-
this.shellNotifications.markAllAsSeen();
|
|
66
|
-
setTimeout(() => {
|
|
67
|
-
const fc = Utils.getFocusableChildren(this.elRef.nativeElement);
|
|
68
|
-
if (fc.length)
|
|
69
|
-
fc[0].focus();
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NotificationsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
73
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: NotificationsPageComponent, isStandalone: true, selector: "yuv-notifications", host: { listeners: { "keydown": "onKeydown($event)" } }, ngImport: i0, template: "<div class=\"notifications\" (yuvLightDismiss)=\"close()\" cdkTrapFocus>\n <h2>{{ 'yuv.shell.notifications.title' | translate }}</h2>\n\n @if (notifications()?.length) {\n <yuv-list (itemSelect)=\"itemSelected($event)\" (itemFocus)=\"itemFocused($event)\">\n @for (n of notifications(); track n.id) {\n <div class=\"note {{ n.level }}\" [ngClass]=\"{ withRoute: n.targetRoute }\" yuvListItem>\n <div class=\"icon\"><yvc-icon [svg]=\"n.icon || icons.note\"></yvc-icon></div>\n <div class=\"received\">{{ n.timestamp | localeDate }}</div>\n <div class=\"title\">{{ n.title }}</div>\n <div class=\"description\">{{ n.description }}</div>\n <div class=\"meta\"></div>\n\n <div class=\"actions\">\n <button (click)=\"remove(n.id)\">\n <yvc-icon [svg]=\"icons.trash\"></yvc-icon>\n </button>\n </div>\n </div>\n }\n </yuv-list>\n\n <div class=\"actions\">\n <button [hidden]=\"!notifications()?.length\" class=\"icon secondary\" (click)=\"removeAll()\">\n {{ 'yuv.shell.notifications.button.remove.all' | translate }}<yvc-icon [svg]=\"icons.trash\"></yvc-icon>\n </button>\n </div>\n } @else {\n <div class=\"empty\">\n <p>{{ 'yuv.shell.notifications.empty' | translate }}</p>\n </div>\n }\n\n <button class=\"icon close\" (click)=\"close()\">\n <yvc-icon [svg]=\"icons.close\"></yvc-icon>\n </button>\n</div>\n", styles: [":host{height:100%;display:flex}:host .notifications{background-color:var(--panel-background-lightgrey);border-inline-end:1px solid var(--panel-divider-color);height:100%;overflow:hidden;box-sizing:border-box;padding:var(--app-pane-padding);display:grid;grid-template-rows:auto auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"title close\" \"actions actions\" \"list list\";gap:var(--app-pane-padding);max-width:30vw;min-width:300px;box-shadow:8px 0 8px #0000001a;animation:dialogAppear .2s ease-in-out}:host .notifications h2{color:var(--text-color-caption);grid-area:title;margin:0;padding:0;align-self:center;font-size:var(--font-title);font-weight:400;text-overflow:ellipsis;overflow:hidden}:host .notifications .actions{grid-area:actions;display:flex;justify-content:end;--icon-size: 18px}:host .notifications .actions button{border-radius:.4em}:host .notifications .close{grid-area:close;--icon-size: 18px}:host .notifications yuv-list,:host .notifications .empty{grid-area:list}:host .notifications .empty{display:grid;align-items:center;justify-content:center;color:var(--text-color-caption)}:host .notifications .note{--level-color: transparent;display:grid;grid-template-rows:auto auto auto auto;grid-template-columns:auto 1fr auto;grid-template-areas:\"icon received actions\" \"icon title title\" \"icon description description\" \"icon meta meta\";row-gap:calc(var(--app-pane-padding) / 4);column-gap:calc(var(--app-pane-padding) / 2);align-items:center;padding:calc(var(--app-pane-padding) / 2);padding-inline-start:var(--app-pane-padding);margin-block-end:calc(var(--app-pane-padding) / 2);background-color:var(--panel-background);outline:1px solid var(--panel-divider-color);outline-offset:-1px;position:relative;cursor:default}:host .notifications .note.withRoute{cursor:pointer}:host .notifications .note:before{content:\"\";width:4px;position:absolute;left:2px;top:2px;bottom:2px;border-radius:2px;background-color:var(--level-color)}:host .notifications .note.alert{--level-color: var(--color-error)}:host .notifications .note.warning{--level-color: var(--color-warning)}:host .notifications .note.success{--level-color: var(--color-success)}:host .notifications .note:hover,:host .notifications .note[aria-current=true]{background-color:var(--item-focus-background-color)}:host .notifications .note:hover button,:host .notifications .note[aria-current=true] button{opacity:1}:host .notifications .note .icon{grid-area:icon;color:var(--text-color-caption)}:host .notifications .note .title{overflow:hidden;text-overflow:ellipsis;font-weight:700;grid-area:title;color:var(--text-color-body)}:host .notifications .note .description{grid-area:description;overflow:hidden;text-overflow:ellipsis}:host .notifications .note .meta{grid-area:meta}:host .notifications .note .received{grid-area:received;color:var(--text-color-caption)}:host .notifications .note button{grid-area:actions;padding:0;opacity:0}:host .notifications .note button yvc-icon{width:18px;height:18px}@keyframes dialogAppear{0%{opacity:0;transform:translate(calc(var(--app-pane-padding) * -1))}to{opacity:1;transform:translate(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: LightDismissDirective, selector: "[yuvLightDismiss]", outputs: ["yuvLightDismiss"] }, { kind: "pipe", type: LocaleDatePipe, name: "localeDate" }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i2.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: ListComponent, selector: "yuv-list", inputs: ["multiselect", "selfHandleSelection", "disableSelection"], outputs: ["itemSelect", "itemFocus"] }, { kind: "directive", type: ListItemDirective, selector: "[yuvListItem]", inputs: ["disabled", "active", "selected"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] }); }
|
|
74
|
-
}
|
|
75
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NotificationsPageComponent, decorators: [{
|
|
76
|
-
type: Component,
|
|
77
|
-
args: [{ selector: 'yuv-notifications', standalone: true, imports: [CommonModule, LightDismissDirective, LocaleDatePipe, YvcIconModule, CdkTrapFocus, ListComponent, ListItemDirective, TranslateModule], template: "<div class=\"notifications\" (yuvLightDismiss)=\"close()\" cdkTrapFocus>\n <h2>{{ 'yuv.shell.notifications.title' | translate }}</h2>\n\n @if (notifications()?.length) {\n <yuv-list (itemSelect)=\"itemSelected($event)\" (itemFocus)=\"itemFocused($event)\">\n @for (n of notifications(); track n.id) {\n <div class=\"note {{ n.level }}\" [ngClass]=\"{ withRoute: n.targetRoute }\" yuvListItem>\n <div class=\"icon\"><yvc-icon [svg]=\"n.icon || icons.note\"></yvc-icon></div>\n <div class=\"received\">{{ n.timestamp | localeDate }}</div>\n <div class=\"title\">{{ n.title }}</div>\n <div class=\"description\">{{ n.description }}</div>\n <div class=\"meta\"></div>\n\n <div class=\"actions\">\n <button (click)=\"remove(n.id)\">\n <yvc-icon [svg]=\"icons.trash\"></yvc-icon>\n </button>\n </div>\n </div>\n }\n </yuv-list>\n\n <div class=\"actions\">\n <button [hidden]=\"!notifications()?.length\" class=\"icon secondary\" (click)=\"removeAll()\">\n {{ 'yuv.shell.notifications.button.remove.all' | translate }}<yvc-icon [svg]=\"icons.trash\"></yvc-icon>\n </button>\n </div>\n } @else {\n <div class=\"empty\">\n <p>{{ 'yuv.shell.notifications.empty' | translate }}</p>\n </div>\n }\n\n <button class=\"icon close\" (click)=\"close()\">\n <yvc-icon [svg]=\"icons.close\"></yvc-icon>\n </button>\n</div>\n", styles: [":host{height:100%;display:flex}:host .notifications{background-color:var(--panel-background-lightgrey);border-inline-end:1px solid var(--panel-divider-color);height:100%;overflow:hidden;box-sizing:border-box;padding:var(--app-pane-padding);display:grid;grid-template-rows:auto auto 1fr;grid-template-columns:1fr auto;grid-template-areas:\"title close\" \"actions actions\" \"list list\";gap:var(--app-pane-padding);max-width:30vw;min-width:300px;box-shadow:8px 0 8px #0000001a;animation:dialogAppear .2s ease-in-out}:host .notifications h2{color:var(--text-color-caption);grid-area:title;margin:0;padding:0;align-self:center;font-size:var(--font-title);font-weight:400;text-overflow:ellipsis;overflow:hidden}:host .notifications .actions{grid-area:actions;display:flex;justify-content:end;--icon-size: 18px}:host .notifications .actions button{border-radius:.4em}:host .notifications .close{grid-area:close;--icon-size: 18px}:host .notifications yuv-list,:host .notifications .empty{grid-area:list}:host .notifications .empty{display:grid;align-items:center;justify-content:center;color:var(--text-color-caption)}:host .notifications .note{--level-color: transparent;display:grid;grid-template-rows:auto auto auto auto;grid-template-columns:auto 1fr auto;grid-template-areas:\"icon received actions\" \"icon title title\" \"icon description description\" \"icon meta meta\";row-gap:calc(var(--app-pane-padding) / 4);column-gap:calc(var(--app-pane-padding) / 2);align-items:center;padding:calc(var(--app-pane-padding) / 2);padding-inline-start:var(--app-pane-padding);margin-block-end:calc(var(--app-pane-padding) / 2);background-color:var(--panel-background);outline:1px solid var(--panel-divider-color);outline-offset:-1px;position:relative;cursor:default}:host .notifications .note.withRoute{cursor:pointer}:host .notifications .note:before{content:\"\";width:4px;position:absolute;left:2px;top:2px;bottom:2px;border-radius:2px;background-color:var(--level-color)}:host .notifications .note.alert{--level-color: var(--color-error)}:host .notifications .note.warning{--level-color: var(--color-warning)}:host .notifications .note.success{--level-color: var(--color-success)}:host .notifications .note:hover,:host .notifications .note[aria-current=true]{background-color:var(--item-focus-background-color)}:host .notifications .note:hover button,:host .notifications .note[aria-current=true] button{opacity:1}:host .notifications .note .icon{grid-area:icon;color:var(--text-color-caption)}:host .notifications .note .title{overflow:hidden;text-overflow:ellipsis;font-weight:700;grid-area:title;color:var(--text-color-body)}:host .notifications .note .description{grid-area:description;overflow:hidden;text-overflow:ellipsis}:host .notifications .note .meta{grid-area:meta}:host .notifications .note .received{grid-area:received;color:var(--text-color-caption)}:host .notifications .note button{grid-area:actions;padding:0;opacity:0}:host .notifications .note button yvc-icon{width:18px;height:18px}@keyframes dialogAppear{0%{opacity:0;transform:translate(calc(var(--app-pane-padding) * -1))}to{opacity:1;transform:translate(0)}}\n"] }]
|
|
78
|
-
}], propDecorators: { onKeydown: [{
|
|
79
|
-
type: HostListener,
|
|
80
|
-
args: ['keydown', ['$event']]
|
|
81
|
-
}] } });
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvc3JjL2xpYi9wYWdlcy9ub3RpZmljYXRpb25zL25vdGlmaWNhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvcGFnZXMvbm90aWZpY2F0aW9ucy9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7O0FBUy9ELE1BQU0sT0FBTywwQkFBMEI7SUFQ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Q0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTFEVSwwQkFBMEI7bUdBQTFCLDBCQUEwQixzSUNuQnZDLHM4Q0FxQ0EsbW5HRHRCWSxZQUFZLDZIQUFFLHFCQUFxQix1RkFBRSxjQUFjLGtEQUFFLGFBQWEsK0hBQUUsWUFBWSw0SUFBRSxhQUFhLCtKQUFFLGlCQUFpQixxR0FBRSxlQUFlOzs0RkFJbEksMEJBQTBCO2tCQVB0QyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsQ0FBQzs4QkFvQnpHLFNBQVM7c0JBQTdDLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVHJhcEZvY3VzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPbkluaXQsIGVmZmVjdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMb2NhbGVEYXRlUGlwZSwgVHJhbnNsYXRlTW9kdWxlLCBVdGlscyB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgTGlnaHREaXNtaXNzRGlyZWN0aXZlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtZnJhbWV3b3JrL2NvbW1vbic7XG5pbXBvcnQgeyBZVVZfSUNPTlMgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvaWNvbnMnO1xuaW1wb3J0IHsgTGlzdENvbXBvbmVudCwgTGlzdEl0ZW1EaXJlY3RpdmUgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvbGlzdCc7XG5pbXBvcnQgeyBTaGVsbE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtc2hlbGwtY29yZSc7XG5pbXBvcnQgeyBJQ09OUywgWXZjSWNvbk1vZHVsZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9pY29uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LW5vdGlmaWNhdGlvbnMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBMaWdodERpc21pc3NEaXJlY3RpdmUsIExvY2FsZURhdGVQaXBlLCBZdmNJY29uTW9kdWxlLCBDZGtUcmFwRm9jdXMsIExpc3RDb21wb25lbnQsIExpc3RJdGVtRGlyZWN0aXZlLCBUcmFuc2xhdGVNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vbm90aWZpY2F0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zUGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgc2hlbGxOb3RpZmljYXRpb25zID0gaW5qZWN0KFNoZWxsTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIGVsUmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gIHByaXZhdGUgX2ZvY3VzZWRJbmRleCA9IC0xO1xuICBwcml2YXRlIF9ub3RpZmljYXRpb25JRHM6IHN0cmluZ1tdID0gW107XG4gIG5vdGlmaWNhdGlvbnMgPSB0b1NpZ25hbCh0aGlzLnNoZWxsTm90aWZpY2F0aW9ucy5zaGVsbE5vdGlmaWNhdGlvbnMkKTtcbiAgbm90aWZpY2F0aW9uc0lkRWZmZWN0ID0gZWZmZWN0KCgpID0+ICh0aGlzLl9ub3RpZmljYXRpb25JRHMgPSAodGhpcy5ub3RpZmljYXRpb25zKCkgfHwgW10pLm1hcCgobikgPT4gbi5pZCkpKTtcblxuICBpY29ucyA9IHtcbiAgICBjbG9zZTogSUNPTlMuY2xlYXIsXG4gICAgdHJhc2g6IFlVVl9JQ09OUy50cmFzaCxcbiAgICBub3RlOiBZVVZfSUNPTlMubm90aWZpY2F0aW9uXG4gIH07XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRGVsZXRlJzoge1xuICAgICAgICBpZiAodGhpcy5fZm9jdXNlZEluZGV4ID49IDApIHRoaXMucmVtb3ZlKHRoaXMuX25vdGlmaWNhdGlvbklEc1t0aGlzLl9mb2N1c2VkSW5kZXhdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXRlbVNlbGVjdGVkKGlkeDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBuID0gdGhpcy5zaGVsbE5vdGlmaWNhdGlvbnMuZ2V0Tm90aWZpY2F0aW9uQnlJZCh0aGlzLl9ub3RpZmljYXRpb25JRHNbaWR4WzBdXSk7XG4gICAgaWYgKG4/LnRhcmdldFJvdXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlKCk7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKG4udGFyZ2V0Um91dGUsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICAgIGlmIChuLnJlbW92ZU9uVGFyZ2V0Um91dGVOYXZpZ2F0ZWQpIHRoaXMucmVtb3ZlKG4uaWQpO1xuICAgIH1cbiAgfVxuXG4gIGl0ZW1Gb2N1c2VkKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9mb2N1c2VkSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHJlbW92ZShpZDogc3RyaW5nKSB7XG4gICAgaWYgKGlkKSB0aGlzLnNoZWxsTm90aWZpY2F0aW9ucy5yZW1vdmUoaWQpO1xuICB9XG5cbiAgcmVtb3ZlQWxsKCkge1xuICAgIHRoaXMuc2hlbGxOb3RpZmljYXRpb25zLnJlbW92ZUFsbCgpO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlKFt7IG91dGxldHM6IHsgYXNpZGU6IG51bGwgfSB9XSwge1xuICAgICAgcmVwbGFjZVVybDogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zaGVsbE5vdGlmaWNhdGlvbnMubWFya0FsbEFzU2VlbigpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZmM6IEhUTUxFbGVtZW50W10gPSBVdGlscy5nZXRGb2N1c2FibGVDaGlsZHJlbih0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICBpZiAoZmMubGVuZ3RoKSBmY1swXS5mb2N1cygpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uc1wiICh5dXZMaWdodERpc21pc3MpPVwiY2xvc2UoKVwiIGNka1RyYXBGb2N1cz5cbiAgPGgyPnt7ICd5dXYuc2hlbGwubm90aWZpY2F0aW9ucy50aXRsZScgfCB0cmFuc2xhdGUgfX08L2gyPlxuXG4gIEBpZiAobm90aWZpY2F0aW9ucygpPy5sZW5ndGgpIHtcbiAgICA8eXV2LWxpc3QgKGl0ZW1TZWxlY3QpPVwiaXRlbVNlbGVjdGVkKCRldmVudClcIiAoaXRlbUZvY3VzKT1cIml0ZW1Gb2N1c2VkKCRldmVudClcIj5cbiAgICAgIEBmb3IgKG4gb2Ygbm90aWZpY2F0aW9ucygpOyB0cmFjayBuLmlkKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJub3RlIHt7IG4ubGV2ZWwgfX1cIiBbbmdDbGFzc109XCJ7IHdpdGhSb3V0ZTogbi50YXJnZXRSb3V0ZSB9XCIgeXV2TGlzdEl0ZW0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj48eXZjLWljb24gW3N2Z109XCJuLmljb24gfHwgaWNvbnMubm90ZVwiPjwveXZjLWljb24+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlY2VpdmVkXCI+e3sgbi50aW1lc3RhbXAgfCBsb2NhbGVEYXRlIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3sgbi50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPnt7IG4uZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0YVwiPjwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlbW92ZShuLmlkKVwiPlxuICAgICAgICAgICAgICA8eXZjLWljb24gW3N2Z109XCJpY29ucy50cmFzaFwiPjwveXZjLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC95dXYtbGlzdD5cblxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICA8YnV0dG9uIFtoaWRkZW5dPVwiIW5vdGlmaWNhdGlvbnMoKT8ubGVuZ3RoXCIgY2xhc3M9XCJpY29uIHNlY29uZGFyeVwiIChjbGljayk9XCJyZW1vdmVBbGwoKVwiPlxuICAgICAgICB7eyAneXV2LnNoZWxsLm5vdGlmaWNhdGlvbnMuYnV0dG9uLnJlbW92ZS5hbGwnIHwgdHJhbnNsYXRlIH19PHl2Yy1pY29uIFtzdmddPVwiaWNvbnMudHJhc2hcIj48L3l2Yy1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH0gQGVsc2Uge1xuICAgIDxkaXYgY2xhc3M9XCJlbXB0eVwiPlxuICAgICAgPHA+e3sgJ3l1di5zaGVsbC5ub3RpZmljYXRpb25zLmVtcHR5JyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxidXR0b24gY2xhc3M9XCJpY29uIGNsb3NlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICA8eXZjLWljb24gW3N2Z109XCJpY29ucy5jbG9zZVwiPjwveXZjLWljb24+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { Component, inject, signal } from '@angular/core';
|
|
2
|
-
import { toSignal } from '@angular/core/rxjs-interop';
|
|
3
|
-
import { ConfigService, TranslateModule, TranslateService, UserService } from '@yuuvis/client-core';
|
|
4
|
-
import { CommonModule, DOCUMENT } from '@angular/common';
|
|
5
|
-
import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
-
import { ShellService } from '@yuuvis/client-shell-core';
|
|
7
|
-
import { map } from 'rxjs';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/common";
|
|
10
|
-
import * as i2 from "@yuuvis/client-core";
|
|
11
|
-
export class SettingsPageComponent {
|
|
12
|
-
constructor() {
|
|
13
|
-
this.userService = inject(UserService);
|
|
14
|
-
this.config = inject(ConfigService);
|
|
15
|
-
this.translate = inject(TranslateService);
|
|
16
|
-
this.shell = inject(ShellService);
|
|
17
|
-
this.document = inject(DOCUMENT);
|
|
18
|
-
this.#fb = inject(FormBuilder);
|
|
19
|
-
this.clientLocales = signal([]);
|
|
20
|
-
this.clientVersion = signal(undefined);
|
|
21
|
-
this.user = toSignal(this.userService.user$);
|
|
22
|
-
this.appSettingForms$ = this.shell.appSettings$.pipe(map((settings) => settings.map((e) => {
|
|
23
|
-
const x = {};
|
|
24
|
-
const fcn = e.properties.map((p) => ({
|
|
25
|
-
label: this.translate.instant(p.label) || p.label,
|
|
26
|
-
name: p.name,
|
|
27
|
-
type: p.type
|
|
28
|
-
}));
|
|
29
|
-
e.properties.forEach((p) => {
|
|
30
|
-
x[p.name] = [p.value];
|
|
31
|
-
});
|
|
32
|
-
return {
|
|
33
|
-
appID: e.appID,
|
|
34
|
-
label: e.label,
|
|
35
|
-
formControls: fcn,
|
|
36
|
-
form: this.#fb.group(x)
|
|
37
|
-
};
|
|
38
|
-
})));
|
|
39
|
-
}
|
|
40
|
-
#fb;
|
|
41
|
-
saveAppSettings(appID, form) {
|
|
42
|
-
this.userService
|
|
43
|
-
.saveUserSettings({
|
|
44
|
-
clientAppSettings: {
|
|
45
|
-
[appID]: form.value
|
|
46
|
-
}
|
|
47
|
-
})
|
|
48
|
-
.subscribe({
|
|
49
|
-
next: () => {
|
|
50
|
-
form.markAsPristine();
|
|
51
|
-
},
|
|
52
|
-
error: (err) => {
|
|
53
|
-
console.error('Error saving app settings', err);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
changeClientLocale(iso) {
|
|
58
|
-
this.userService.changeClientLocale(iso);
|
|
59
|
-
}
|
|
60
|
-
ngOnInit() {
|
|
61
|
-
this.clientVersion.set(this.document.body.getAttribute('data-version') ?? 'dev');
|
|
62
|
-
this.clientLocales.set(this.config.getClientLocales());
|
|
63
|
-
}
|
|
64
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SettingsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
65
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SettingsPageComponent, isStandalone: true, selector: "yuv-settings", ngImport: i0, template: "<header>\n <h1>{{ 'yuv.shell.settings.title' | translate }}</h1>\n <h4>{{ 'yuc.shell.settings.client.version' | translate }}: {{ clientVersion() }}</h4>\n</header>\n\n\n<main>@if (user()) {\n <section class=\"user\">\n <!-- <yuv-user-avatar class=\"background\" [user]=\"user()\"></yuv-user-avatar> -->\n <div class=\"user\">\n <div class=\"meta uname\">{{ user()!.username }}</div>\n <h2>{{ user()!.title }}</h2>\n <div class=\"meta uemail\">{{ user()!.email }}</div>\n <div class=\"meta utenant\">{{ 'yuv.shell.settings.tenant' | translate }}: {{ user()!.tenant }}</div>\n </div>\n </section>\n}\n <!-- language -->\n <section yuvOfflineDisabled>\n <div class=\"label\" translate>yuv.shell.settings.language</div>\n <div class=\"value buttons\">\n @for (locale of clientLocales(); track locale.iso) {\n <button class=\"toggle secondary\" (click)=\"changeClientLocale(locale.iso)\" [ngClass]=\"{ active: translate.currentLang === locale.iso }\">\n {{ locale.label }}\n </button>\n }\n </div>\n </section>\n\n <!-- app settings -->\n <!-- TODO: activate one feature is refined -->\n <!-- @for (c of appSettingForms$ | async; track $index) {\n <section>\n {{ c.label }}\n <form [formGroup]=\"c.form\" (ngSubmit)=\"saveAppSettings(c.appID, c.form)\">\n @for (n of c.formControls; track $index) {\n <label\n >{{ n.label }}\n\n @switch (n.type) {\n @case ('string') {\n <input type=\"text\" [formControlName]=\"n.name\" />\n }\n @case ('number') {\n <input type=\"number\" [formControlName]=\"n.name\" />\n }\n }\n </label>\n }\n <button [ngClass]=\"{ hideen: c.form.untouched }\" [disabled]=\"c.form.invalid\">Save</button>\n </form>\n </section>\n } -->\n</main>\n", styles: [":host{display:grid;grid-template-columns:1fr auto;grid-template-rows:auto 1fr;grid-template-areas:\"header\" \"settings\";height:100%;overflow:hidden;overflow-y:auto}:host header{grid-area:header;padding:calc(var(--app-pane-padding) * 2)}:host header h1,:host header h4{margin:0}:host header h1{font-size:var(--font-display);font-weight:400}:host header h4{font-size:var(--font-cation);font-weight:400;font-style:italic;color:var(--text-color-caption)}:host main{grid-area:settings;padding:var(--app-pane-padding);overflow-y:auto}:host main section{display:flex;flex-flow:column;padding:var(--app-pane-padding)}:host main section .label{margin-block-end:1em}:host main section .value{display:flex;flex-flow:row wrap;gap:calc(var(--app-pane-padding) / 4)}:host main section.user h2{margin:0 0 1rem;font-weight:400}:host button.active{background-color:var(--color-accent);color:var(--color-accent-tone);pointer-events:none}:host button.color.clear{padding:2px 8px}:host button.color.accent.active{outline:2px solid #fff;outline-offset:-2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: ReactiveFormsModule }] }); }
|
|
66
|
-
}
|
|
67
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SettingsPageComponent, decorators: [{
|
|
68
|
-
type: Component,
|
|
69
|
-
args: [{ selector: 'yuv-settings', standalone: true, imports: [CommonModule, TranslateModule, ReactiveFormsModule], template: "<header>\n <h1>{{ 'yuv.shell.settings.title' | translate }}</h1>\n <h4>{{ 'yuc.shell.settings.client.version' | translate }}: {{ clientVersion() }}</h4>\n</header>\n\n\n<main>@if (user()) {\n <section class=\"user\">\n <!-- <yuv-user-avatar class=\"background\" [user]=\"user()\"></yuv-user-avatar> -->\n <div class=\"user\">\n <div class=\"meta uname\">{{ user()!.username }}</div>\n <h2>{{ user()!.title }}</h2>\n <div class=\"meta uemail\">{{ user()!.email }}</div>\n <div class=\"meta utenant\">{{ 'yuv.shell.settings.tenant' | translate }}: {{ user()!.tenant }}</div>\n </div>\n </section>\n}\n <!-- language -->\n <section yuvOfflineDisabled>\n <div class=\"label\" translate>yuv.shell.settings.language</div>\n <div class=\"value buttons\">\n @for (locale of clientLocales(); track locale.iso) {\n <button class=\"toggle secondary\" (click)=\"changeClientLocale(locale.iso)\" [ngClass]=\"{ active: translate.currentLang === locale.iso }\">\n {{ locale.label }}\n </button>\n }\n </div>\n </section>\n\n <!-- app settings -->\n <!-- TODO: activate one feature is refined -->\n <!-- @for (c of appSettingForms$ | async; track $index) {\n <section>\n {{ c.label }}\n <form [formGroup]=\"c.form\" (ngSubmit)=\"saveAppSettings(c.appID, c.form)\">\n @for (n of c.formControls; track $index) {\n <label\n >{{ n.label }}\n\n @switch (n.type) {\n @case ('string') {\n <input type=\"text\" [formControlName]=\"n.name\" />\n }\n @case ('number') {\n <input type=\"number\" [formControlName]=\"n.name\" />\n }\n }\n </label>\n }\n <button [ngClass]=\"{ hideen: c.form.untouched }\" [disabled]=\"c.form.invalid\">Save</button>\n </form>\n </section>\n } -->\n</main>\n", styles: [":host{display:grid;grid-template-columns:1fr auto;grid-template-rows:auto 1fr;grid-template-areas:\"header\" \"settings\";height:100%;overflow:hidden;overflow-y:auto}:host header{grid-area:header;padding:calc(var(--app-pane-padding) * 2)}:host header h1,:host header h4{margin:0}:host header h1{font-size:var(--font-display);font-weight:400}:host header h4{font-size:var(--font-cation);font-weight:400;font-style:italic;color:var(--text-color-caption)}:host main{grid-area:settings;padding:var(--app-pane-padding);overflow-y:auto}:host main section{display:flex;flex-flow:column;padding:var(--app-pane-padding)}:host main section .label{margin-block-end:1em}:host main section .value{display:flex;flex-flow:row wrap;gap:calc(var(--app-pane-padding) / 4)}:host main section.user h2{margin:0 0 1rem;font-weight:400}:host button.active{background-color:var(--color-accent);color:var(--color-accent-tone);pointer-events:none}:host button.color.clear{padding:2px 8px}:host button.color.accent.active{outline:2px solid #fff;outline-offset:-2px}\n"] }]
|
|
70
|
-
}] });
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvcGFnZXMvc2V0dGluZ3Mvc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvcGFnZXMvc2V0dGluZ3Mvc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQWtCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUErQixNQUFNLHFCQUFxQixDQUFDO0FBRWpJLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBYSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdFLE9BQU8sRUFBNkMsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEcsT0FBTyxFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7OztBQVN2QyxNQUFNLE9BQU8scUJBQXFCO0lBUGxDO1FBUVUsZ0JBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoQyxjQUFTLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1QixhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFD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IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQsIFNpZ25hbCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UsIFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSwgVXNlclNlcnZpY2UsIFl1dkNvbmZpZ0xhbmd1YWdlcywgWXV2VXNlciB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTaGVsbEFwcFNldHRpbmdQcm9wZXJ0eSwgU2hlbGxBcHBTZXR0aW5ncywgU2hlbGxTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtc2hlbGwtY29yZSc7XG5pbXBvcnQgeyBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LXNldHRpbmdzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3NldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2V0dGluZ3MuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1BhZ2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHVzZXJTZXJ2aWNlID0gaW5qZWN0KFVzZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoQ29uZmlnU2VydmljZSk7XG4gIHB1YmxpYyB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgc2hlbGwgPSBpbmplY3QoU2hlbGxTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG4gICNmYiA9IGluamVjdChGb3JtQnVpbGRlcik7XG5cbiAgY2xpZW50TG9jYWxlcyA9IHNpZ25hbDxZdXZDb25maWdMYW5ndWFnZXNbXT4oW10pO1xuICBjbGllbnRWZXJzaW9uID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgdXNlcjogU2lnbmFsPFl1dlVzZXIgfCB1bmRlZmluZWQ+ID0gdG9TaWduYWwodGhpcy51c2VyU2VydmljZS51c2VyJCk7XG4gIGFwcFNldHRpbmdGb3JtcyQ6IE9ic2VydmFibGU8XG4gICAge1xuICAgICAgYXBwSUQ6IHN0cmluZztcbiAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICBmb3JtQ29udHJvbHM6IFNoZWxsQXBwU2V0dGluZ1Byb3BlcnR5W107XG4gICAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgfVtdXG4gID4gPSB0aGlzLnNoZWxsLmFwcFNldHRpbmdzJC5waXBlKFxuICAgIG1hcCgoc2V0dGluZ3M6IFNoZWxsQXBwU2V0dGluZ3NbXSkgPT5cbiAgICAgIHNldHRpbmdzLm1hcCgoZSkgPT4ge1xuICAgICAgICBjb25zdCB4OiBhbnkgPSB7fTtcbiAgICAgICAgY29uc3QgZmNuOiBTaGVsbEFwcFNldHRpbmdQcm9wZXJ0eVtdID0gZS5wcm9wZXJ0aWVzLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChwLmxhYmVsKSB8fCBwLmxhYmVsLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICB0eXBlOiBwLnR5cGVcbiAgICAgICAgfSkpO1xuICAgICAgICBlLnByb3BlcnRpZXMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgIHhbcC5uYW1lXSA9IFtwLnZhbHVlXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYXBwSUQ6IGUuYXBwSUQsXG4gICAgICAgICAgbGFiZWw6IGUubGFiZWwsXG4gICAgICAgICAgZm9ybUNvbnRyb2xzOiBmY24sXG4gICAgICAgICAgZm9ybTogdGhpcy4jZmIuZ3JvdXAoeClcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKVxuICApO1xuXG4gIHNhdmVBcHBTZXR0aW5ncyhhcHBJRDogc3RyaW5nLCBmb3JtOiBGb3JtR3JvdXApIHtcbiAgICB0aGlzLnVzZXJTZXJ2aWNlXG4gICAgICAuc2F2ZVVzZXJTZXR0aW5ncyh7XG4gICAgICAgIGNsaWVudEFwcFNldHRpbmdzOiB7XG4gICAgICAgICAgW2FwcElEXTogZm9ybS52YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBmb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2F2aW5nIGFwcCBzZXR0aW5ncycsIGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgY2hhbmdlQ2xpZW50TG9jYWxlKGlzbzogc3RyaW5nKSB7XG4gICAgdGhpcy51c2VyU2VydmljZS5jaGFuZ2VDbGllbnRMb2NhbGUoaXNvKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2xpZW50VmVyc2lvbi5zZXQodGhpcy5kb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS12ZXJzaW9uJykgPz8gJ2RldicpO1xuICAgIHRoaXMuY2xpZW50TG9jYWxlcy5zZXQodGhpcy5jb25maWcuZ2V0Q2xpZW50TG9jYWxlcygpKTtcbiAgfVxufVxuIiwiPGhlYWRlcj5cbiAgPGgxPnt7ICd5dXYuc2hlbGwuc2V0dGluZ3MudGl0bGUnIHwgdHJhbnNsYXRlIH19PC9oMT5cbiAgPGg0Pnt7ICd5dWMuc2hlbGwuc2V0dGluZ3MuY2xpZW50LnZlcnNpb24nIHwgdHJhbnNsYXRlIH19OiB7eyBjbGllbnRWZXJzaW9uKCkgfX08L2g0PlxuPC9oZWFkZXI+XG5cblxuPG1haW4+QGlmICh1c2VyKCkpIHtcbiAgPHNlY3Rpb24gY2xhc3M9XCJ1c2VyXCI+XG4gICAgPCEtLSA8eXV2LXVzZXItYXZhdGFyIGNsYXNzPVwiYmFja2dyb3VuZFwiIFt1c2VyXT1cInVzZXIoKVwiPjwveXV2LXVzZXItYXZhdGFyPiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwidXNlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1ldGEgdW5hbWVcIj57eyB1c2VyKCkhLnVzZXJuYW1lIH19PC9kaXY+XG4gICAgICA8aDI+e3sgdXNlcigpIS50aXRsZSB9fTwvaDI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWV0YSB1ZW1haWxcIj57eyB1c2VyKCkhLmVtYWlsIH19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWV0YSB1dGVuYW50XCI+e3sgJ3l1di5zaGVsbC5zZXR0aW5ncy50ZW5hbnQnIHwgdHJhbnNsYXRlIH19OiB7eyB1c2VyKCkhLnRlbmFudCB9fTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG59XG4gIDwhLS0gbGFuZ3VhZ2UgLS0+XG4gIDxzZWN0aW9uIHl1dk9mZmxpbmVEaXNhYmxlZD5cbiAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIiB0cmFuc2xhdGU+eXV2LnNoZWxsLnNldHRpbmdzLmxhbmd1YWdlPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInZhbHVlIGJ1dHRvbnNcIj5cbiAgICAgIEBmb3IgKGxvY2FsZSBvZiBjbGllbnRMb2NhbGVzKCk7IHRyYWNrIGxvY2FsZS5pc28pIHtcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRvZ2dsZSBzZWNvbmRhcnlcIiAoY2xpY2spPVwiY2hhbmdlQ2xpZW50TG9jYWxlKGxvY2FsZS5pc28pXCIgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHRyYW5zbGF0ZS5jdXJyZW50TGFuZyA9PT0gbG9jYWxlLmlzbyB9XCI+XG4gICAgICAgICAge3sgbG9jYWxlLmxhYmVsIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG5cbiAgPCEtLSBhcHAgc2V0dGluZ3MgLS0+XG4gIDwhLS0gVE9ETzogYWN0aXZhdGUgb25lIGZlYXR1cmUgaXMgcmVmaW5lZCAtLT5cbiAgPCEtLSBAZm9yIChjIG9mIGFwcFNldHRpbmdGb3JtcyQgfCBhc3luYzsgdHJhY2sgJGluZGV4KSB7XG4gICAgPHNlY3Rpb24+XG4gICAgICB7eyBjLmxhYmVsIH19XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImMuZm9ybVwiIChuZ1N1Ym1pdCk9XCJzYXZlQXBwU2V0dGluZ3MoYy5hcHBJRCwgYy5mb3JtKVwiPlxuICAgICAgICBAZm9yIChuIG9mIGMuZm9ybUNvbnRyb2xzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgID57eyBuLmxhYmVsIH19XG5cbiAgICAgICAgICAgIEBzd2l0Y2ggKG4udHlwZSkge1xuICAgICAgICAgICAgICBAY2FzZSAoJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIm4ubmFtZVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGNhc2UgKCdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIm4ubmFtZVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICB9XG4gICAgICAgIDxidXR0b24gW25nQ2xhc3NdPVwieyBoaWRlZW46IGMuZm9ybS51bnRvdWNoZWQgfVwiIFtkaXNhYmxlZF09XCJjLmZvcm0uaW52YWxpZFwiPlNhdmU8L2J1dHRvbj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L3NlY3Rpb24+XG4gIH0gLS0+XG48L21haW4+XG4iXX0=
|