@yuuvis/client-shell 0.6.5

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.
Files changed (41) hide show
  1. package/README.md +94 -0
  2. package/esm2022/index.mjs +6 -0
  3. package/esm2022/lib/actions/manage-flavors/manage-flavors.action.mjs +39 -0
  4. package/esm2022/lib/actions/manage-flavors/manage-flavors.component.mjs +69 -0
  5. package/esm2022/lib/client-shell.component.mjs +191 -0
  6. package/esm2022/lib/components/app-logo/app-logo.component.mjs +18 -0
  7. package/esm2022/lib/directives/inert.directive.mjs +26 -0
  8. package/esm2022/lib/lib.routes.mjs +15 -0
  9. package/esm2022/lib/pages/dashboard/dashboard.component.mjs +11 -0
  10. package/esm2022/lib/pages/notifications/notifications.component.mjs +82 -0
  11. package/esm2022/lib/pages/settings/settings.component.mjs +71 -0
  12. package/esm2022/lib/pages/web-share-target/web-share-target.component.mjs +18 -0
  13. package/esm2022/widget-dashboard/index.mjs +3 -0
  14. package/esm2022/widget-dashboard/lib/widget-dashboard.component.mjs +46 -0
  15. package/esm2022/widget-dashboard/lib/widget-dashboard.config.mjs +3 -0
  16. package/esm2022/widget-dashboard/lib/widget-dashboard.module.mjs +49 -0
  17. package/esm2022/widget-dashboard/yuuvis-client-shell-widget-dashboard.mjs +5 -0
  18. package/esm2022/yuuvis-client-shell.mjs +5 -0
  19. package/fesm2022/yuuvis-client-shell-widget-dashboard.mjs +98 -0
  20. package/fesm2022/yuuvis-client-shell-widget-dashboard.mjs.map +1 -0
  21. package/fesm2022/yuuvis-client-shell.mjs +496 -0
  22. package/fesm2022/yuuvis-client-shell.mjs.map +1 -0
  23. package/index.d.ts +5 -0
  24. package/lib/actions/manage-flavors/manage-flavors.action.d.ts +17 -0
  25. package/lib/actions/manage-flavors/manage-flavors.component.d.ts +17 -0
  26. package/lib/assets/i18n/de.json +30 -0
  27. package/lib/assets/i18n/en.json +30 -0
  28. package/lib/client-shell.component.d.ts +42 -0
  29. package/lib/components/app-logo/app-logo.component.d.ts +7 -0
  30. package/lib/directives/inert.directive.d.ts +8 -0
  31. package/lib/lib.routes.d.ts +2 -0
  32. package/lib/pages/dashboard/dashboard.component.d.ts +5 -0
  33. package/lib/pages/notifications/notifications.component.d.ts +29 -0
  34. package/lib/pages/settings/settings.component.d.ts +28 -0
  35. package/lib/pages/web-share-target/web-share-target.component.d.ts +6 -0
  36. package/package.json +40 -0
  37. package/widget-dashboard/README.md +19 -0
  38. package/widget-dashboard/index.d.ts +2 -0
  39. package/widget-dashboard/lib/widget-dashboard.component.d.ts +16 -0
  40. package/widget-dashboard/lib/widget-dashboard.config.d.ts +7 -0
  41. package/widget-dashboard/lib/widget-dashboard.module.d.ts +13 -0
package/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # @yuuvis/client-shell
2
+
3
+ The client shell project provides the frame for a yuuvis® MOMENTUM client application.
4
+ This frame is then able to host multiple dedicated apps built for the shell environment.
5
+ For the hosted apps `@yuuvis/client-shell` provides a set of services and components to interact with with a yuuvis® MOMENTUM backend.
6
+
7
+ ## User settings
8
+
9
+ Settings are handled by the shell. It provides a page where users can configure their application(s). As authentication is covered by the shell, settings will be managed as well. In general this includes e.g. the users preferred language, but also settings of each individual in-shell-app.
10
+
11
+ ## Interfaces
12
+
13
+ Client shell provides a couple of APIs apps can utilize.
14
+
15
+ ### Actions
16
+
17
+ Using the `actions.service` apps are able to register actions to the whole shell and its applications. Let's say we have an app dedicated to deal with eMails you can create an actions that will open any email (regardless of the app showing it) in your eMail app. To do so you first of all write the action (checkout `open-in-app.action.ts` for the code).
18
+
19
+ In your apps extension package you can now register that action:
20
+
21
+ ```ts
22
+ @Injectable()
23
+ export class ExtensionsService {
24
+ init(): Promise<any> {
25
+ this.#actionsService.register([{ id: ACTION_ID, action: MailArchiveOpenInAppAction }]);
26
+ }
27
+ }
28
+ ```
29
+
30
+ Now this action is made available to all apps.
31
+
32
+ ### Renderers
33
+
34
+ The objects apps are dealing with will have a variety of property types. The basic ones are defined by the schema definition. Here we have:
35
+
36
+ - string
37
+ - date
38
+ - integer
39
+ - decimal
40
+ - ...
41
+
42
+ Renderers are used to define how the values for those properties are rendered. Dates for example are formatted based on the users locale.
43
+
44
+ There may be special properties that need a different treatment. The `system:contentStreamLength` property of objects define there size in bytes. This would be hard to read for users so we can create a renderer for this particular property (checkout `filesize.renderer.component.ts` for the code).
45
+
46
+ In your apps extension package you can now register that renderer:
47
+
48
+ ```ts
49
+ @Injectable()
50
+ export class ExtensionsService {
51
+ init(): Promise<any> {
52
+ this.#rendererService.registerRenderer(FileSizeRendererComponent, `system:contentStreamLength`);
53
+ }
54
+ }
55
+ ```
56
+
57
+ Now this renderer is made available to all apps. You can limit the renderer to specific types by adding a third parameter to the registerRenderer function.
58
+
59
+ ### Object types
60
+
61
+ Types/Flavors are collections of properties that can be added to an object. Let's say you have a document that is an invoice. First of all any file is just a document. By adding a type of `invoice` its metadata will be extended by the properties defined by the aspect.
62
+
63
+ ```ts
64
+ @Injectable()
65
+ export class ExtensionsService {
66
+ #shell = inject(ShellService);
67
+
68
+ init(): Promise<any> {
69
+ this.#shell.exposeObjectFlavors(APP_FLAVORS);
70
+ }
71
+ }
72
+ ```
73
+
74
+ Flavors are simple objects defining a type:
75
+
76
+ ```ts
77
+ const flavor = {
78
+ // unique id
79
+ id: 'io.yuuvis.app.ai.flavor.invoice',
80
+ // key to fetch translated description
81
+ descriptionKey: 'io.yuuvis.app.ai.flavor.invoice.description',
82
+ // an icon
83
+ icon: '<svg/>...</svg>',
84
+ // the base object type ID for the type
85
+ objectTypeID: SystemType.DOCUMENT,
86
+ // ID of the secondary object type defining the properties of the type
87
+ sot: `${APP_PREFIX}invoice`,
88
+ // restrict on which kind of files this type could be applied
89
+ applicableTo: {
90
+ // match against mime type incl. wildcards
91
+ mimeTypes: ['*/*']
92
+ }
93
+ };
94
+ ```
@@ -0,0 +1,6 @@
1
+ export * from './lib/directives/inert.directive';
2
+ export * from './lib/client-shell.component';
3
+ export * from './lib/components/app-logo/app-logo.component';
4
+ export * from './lib/lib.routes';
5
+ export * from './lib/actions/manage-flavors/manage-flavors.action';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvREFBb0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvaW5lcnQuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NsaWVudC1zaGVsbC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9hcHAtbG9nby9hcHAtbG9nby5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbGliLnJvdXRlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9hY3Rpb25zL21hbmFnZS1mbGF2b3JzL21hbmFnZS1mbGF2b3JzLmFjdGlvbic7XG5cbiJdfQ==
@@ -0,0 +1,39 @@
1
+ import { inject } from '@angular/core';
2
+ import { TranslateService } from '@yuuvis/client-core';
3
+ import { AbstractContextAction, ACTION_ICON, SelectionRange } from '@yuuvis/client-framework/actions';
4
+ import { ShellService } from '@yuuvis/client-shell-core';
5
+ import { YvcOverlayService } from '@yuuvis/components/overlay';
6
+ import { of } from 'rxjs';
7
+ import { ManageFlavorsComponent } from './manage-flavors.component';
8
+ export class ManageFlavorsAction extends AbstractContextAction {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.#shell = inject(ShellService);
12
+ this.#overlay = inject(YvcOverlayService);
13
+ this.translate = inject(TranslateService);
14
+ this.id = 'yuv.base.manage-flavor';
15
+ this.label = this.translate.instant('yuv.shell.action.manage-flavor.label');
16
+ this.description = this.translate.instant('yuv.shell.action.manage-flavor.description');
17
+ this.priority = 8;
18
+ this.icon = ACTION_ICON.manageFlavor;
19
+ this.group = 'common';
20
+ this.range = SelectionRange.SINGLE_SELECT;
21
+ this.supports = {
22
+ pattern: '*'
23
+ };
24
+ }
25
+ #shell;
26
+ #overlay;
27
+ isExecutable(items) {
28
+ const item = items[0];
29
+ return of(item && !!item.permissions?.writeIndexData && !!item.content && this.#shell.getApplicableObjectFlavors(item.content.mimeType).length > 0);
30
+ }
31
+ run(items) {
32
+ this.#overlay.open(ManageFlavorsComponent, items[0], {
33
+ width: '400px',
34
+ maxWidth: '90vw',
35
+ });
36
+ return of(true);
37
+ }
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlLWZsYXZvcnMuYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvYWN0aW9ucy9tYW5hZ2UtZmxhdm9ycy9tYW5hZ2UtZmxhdm9ycy5hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQVUsV0FBVyxFQUE4QixjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVwRSxNQUFNLE9BQU8sbUJBQW9CLFNBQVEscUJBQXFCO0lBQTlEOztRQUNFLFdBQU0sR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDOUIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdCLGNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUU3QyxPQUFFLEdBQUcsd0JBQXdCLENBQUM7UUFDOUIsVUFBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDdkUsZ0JBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ25GLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFDYixTQUFJLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztRQUNoQyxVQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ2pCLFVBQUssR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDO1FBQ3JDLGFBQVEsR0FBa0I7WUFDeEIsT0FBTyxFQUFFLEdBQUc7U0FDYixDQUFDO0lBY0osQ0FBQztJQTNCQyxNQUFNLENBQXdCO0lBQzlCLFFBQVEsQ0FBNkI7SUFjckMsWUFBWSxDQUFDLEtBQWtCO1FBQzdCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixPQUFPLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsY0FBYyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEosQ0FBQztJQUVELEdBQUcsQ0FBQyxLQUFrQjtRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbkQsS0FBSyxFQUFFLE9BQU87WUFDZCxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERtc09iamVjdCwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250ZXh0QWN0aW9uLCBBY3Rpb24sIEFDVElPTl9JQ09OLCBBY3Rpb25TdXBwb3J0LCBCQVNFX0FDVElPTiwgU2VsZWN0aW9uUmFuZ2UgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvYWN0aW9ucyc7XG5pbXBvcnQgeyBTaGVsbFNlcnZpY2UgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlJztcbmltcG9ydCB7IFl2Y092ZXJsYXlTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL292ZXJsYXknO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1hbmFnZUZsYXZvcnNDb21wb25lbnQgfSBmcm9tICcuL21hbmFnZS1mbGF2b3JzLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VGbGF2b3JzQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RDb250ZXh0QWN0aW9uIGltcGxlbWVudHMgQWN0aW9uIHtcbiAgI3NoZWxsID0gaW5qZWN0KFNoZWxsU2VydmljZSk7XG4gICNvdmVybGF5ID0gaW5qZWN0KFl2Y092ZXJsYXlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgaWQgPSAneXV2LmJhc2UubWFuYWdlLWZsYXZvcic7XG4gIGxhYmVsID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LnNoZWxsLmFjdGlvbi5tYW5hZ2UtZmxhdm9yLmxhYmVsJyk7XG4gIGRlc2NyaXB0aW9uID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgneXV2LnNoZWxsLmFjdGlvbi5tYW5hZ2UtZmxhdm9yLmRlc2NyaXB0aW9uJyk7XG4gIHByaW9yaXR5ID0gODtcbiAgaWNvbiA9IEFDVElPTl9JQ09OLm1hbmFnZUZsYXZvcjtcbiAgZ3JvdXAgPSAnY29tbW9uJztcbiAgcmFuZ2UgPSBTZWxlY3Rpb25SYW5nZS5TSU5HTEVfU0VMRUNUO1xuICBzdXBwb3J0czogQWN0aW9uU3VwcG9ydCA9IHtcbiAgICBwYXR0ZXJuOiAnKidcbiAgfTtcblxuICBpc0V4ZWN1dGFibGUoaXRlbXM6IERtc09iamVjdFtdKSB7XG4gICAgY29uc3QgaXRlbSA9IGl0ZW1zWzBdO1xuICAgIHJldHVybiBvZihpdGVtICYmICEhaXRlbS5wZXJtaXNzaW9ucz8ud3JpdGVJbmRleERhdGEgJiYgISFpdGVtLmNvbnRlbnQgJiYgdGhpcy4jc2hlbGwuZ2V0QXBwbGljYWJsZU9iamVjdEZsYXZvcnMoaXRlbS5jb250ZW50Lm1pbWVUeXBlKS5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIHJ1bihpdGVtczogRG1zT2JqZWN0W10pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICB0aGlzLiNvdmVybGF5Lm9wZW4oTWFuYWdlRmxhdm9yc0NvbXBvbmVudCwgaXRlbXNbMF0sIHtcbiAgICAgIHdpZHRoOiAnNDAwcHgnLFxuICAgICAgbWF4V2lkdGg6ICc5MHZ3JyxcbiAgICB9KTtcbiAgICByZXR1cm4gb2YodHJ1ZSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,69 @@
1
+ import { Component, inject, signal } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { YvcOverlayRef } from '@yuuvis/components/overlay';
4
+ import { DmsService, TranslateModule } from '@yuuvis/client-core';
5
+ import { ShellService } from '@yuuvis/client-shell-core';
6
+ import { FlavorChipComponent } from '@yuuvis/client-framework/object-flavor';
7
+ import { ListComponent, ListItemDirective } from '@yuuvis/client-framework/list';
8
+ import { BusyOverlayDirective } from '@yuuvis/client-framework/common';
9
+ import { tap } from 'rxjs';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@yuuvis/client-core";
12
+ export class ManageFlavorsComponent {
13
+ constructor() {
14
+ this.#overlayRef = inject(YvcOverlayRef);
15
+ this.#shell = inject(ShellService);
16
+ this.#dmsService = inject(DmsService);
17
+ this.item = this.#overlayRef.data;
18
+ this.busy = signal(false);
19
+ this.appliedFlavors = [];
20
+ this.applicableFlavors = [];
21
+ }
22
+ #overlayRef;
23
+ #shell;
24
+ #dmsService;
25
+ applyFlavor(flavor) {
26
+ this.busy.set(true);
27
+ this.#shell.triggerApplyObjectFlavor(this.item, flavor).subscribe(() => {
28
+ this.#overlayRef.close();
29
+ this.busy.set(false);
30
+ });
31
+ }
32
+ removeFlavor(flavor) {
33
+ this.busy.set(true);
34
+ this.#shell.removeObjectFlavor(this.item, flavor).subscribe(() => {
35
+ this.#overlayRef.close();
36
+ this.busy.set(false);
37
+ });
38
+ }
39
+ #refreshDmsObject() {
40
+ this.busy.set(true);
41
+ this.#dmsService
42
+ .getDmsObject(this.item.id)
43
+ .pipe(tap((dmsObject) => {
44
+ this.item = dmsObject;
45
+ this.#getAppliedFlavors(this.item);
46
+ }))
47
+ .subscribe()
48
+ .add(() => this.busy.set(false));
49
+ }
50
+ #getAppliedFlavors(dmsObject) {
51
+ const res = this.#shell.getAppliedObjectFlavors(dmsObject);
52
+ this.appliedFlavors = res.applied;
53
+ this.applicableFlavors = res.applicable;
54
+ }
55
+ cancel() {
56
+ if (this.#overlayRef)
57
+ this.#overlayRef.close();
58
+ }
59
+ ngOnInit() {
60
+ this.#refreshDmsObject();
61
+ }
62
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ManageFlavorsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
63
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ManageFlavorsComponent, isStandalone: true, selector: "yuv-manage-flavors", ngImport: i0, template: "<header>\n <h2>{{ 'yuv.shell.action.manage-flavors.title' | translate }}</h2>\n <p>{{ 'yuv.shell.action.manage-flavors.text' | translate }}</p>\n</header>\n<main [yuvBusyOverlay]=\"busy()\">\n @if (appliedFlavors.length) {\n <h3>{{ 'yuv.shell.action.manage-flavors.applied.headline' | translate }}</h3>\n <ul>\n @for (f of appliedFlavors; track $index) {\n <li>\n <yuv-flavor-chip [flavor]=\"f\" yuvListItem></yuv-flavor-chip>\n <button class=\"secondary\" (click)=\"removeFlavor(f)\">{{ 'yuv.shell.action.manage-flavors.applicable.button.remove' | translate }}</button>\n </li>\n }\n </ul>\n }\n @if (applicableFlavors.length) {\n <h3>{{ 'yuv.shell.action.manage-flavors.applicable.headline' | translate }}</h3>\n <ul>\n @for (f of applicableFlavors; track $index) {\n <li>\n <yuv-flavor-chip [flavor]=\"f\" yuvListItem></yuv-flavor-chip>\n <button class=\"secondary\" (click)=\"applyFlavor(f)\">{{ 'yuv.shell.action.manage-flavors.applied.button.apply' | translate }}</button>\n </li>\n }\n </ul>\n }\n</main>\n<footer>\n <button class=\"secondary\" (click)=\"cancel()\">{{ 'yuv.shell.action.manage-flavors.button.cancel' | translate }}</button>\n</footer>\n", styles: [":host{display:flex;flex-flow:column;padding:var(--app-pane-padding)}:host header{flex:0 0 auto}:host header h2{padding:0;font-weight:400;font-size:var(--font-headline);margin:0 0 var(--app-pane-padding) 0}:host header p{max-width:42ch;line-height:1.3em}:host main{flex:1;overflow-y:auto}:host main yuv-flavor-chip{border-color:transparent;flex:1}:host main ul{padding:0;margin:0;list-style-type:none}:host main li{display:flex;gap:calc(var(--app-pane-padding) / 2);align-items:center;border:1px solid var(--panel-divider-color);margin-block-end:2px;padding:calc(var(--app-pane-padding) / 4)}:host main li button{padding:calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 2)}:host footer{flex:0 0 auto;margin-block-start:var(--app-pane-padding)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: ListItemDirective, selector: "[yuvListItem]", inputs: ["disabled", "active", "selected"] }, { kind: "component", type: FlavorChipComponent, selector: "yuv-flavor-chip", inputs: ["flavor", "enableRemove", "enableDescription"], outputs: ["flavorRemove"] }] }); }
64
+ }
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ManageFlavorsComponent, decorators: [{
66
+ type: Component,
67
+ args: [{ selector: 'yuv-manage-flavors', standalone: true, imports: [CommonModule, ListComponent, BusyOverlayDirective, TranslateModule, ListItemDirective, FlavorChipComponent], template: "<header>\n <h2>{{ 'yuv.shell.action.manage-flavors.title' | translate }}</h2>\n <p>{{ 'yuv.shell.action.manage-flavors.text' | translate }}</p>\n</header>\n<main [yuvBusyOverlay]=\"busy()\">\n @if (appliedFlavors.length) {\n <h3>{{ 'yuv.shell.action.manage-flavors.applied.headline' | translate }}</h3>\n <ul>\n @for (f of appliedFlavors; track $index) {\n <li>\n <yuv-flavor-chip [flavor]=\"f\" yuvListItem></yuv-flavor-chip>\n <button class=\"secondary\" (click)=\"removeFlavor(f)\">{{ 'yuv.shell.action.manage-flavors.applicable.button.remove' | translate }}</button>\n </li>\n }\n </ul>\n }\n @if (applicableFlavors.length) {\n <h3>{{ 'yuv.shell.action.manage-flavors.applicable.headline' | translate }}</h3>\n <ul>\n @for (f of applicableFlavors; track $index) {\n <li>\n <yuv-flavor-chip [flavor]=\"f\" yuvListItem></yuv-flavor-chip>\n <button class=\"secondary\" (click)=\"applyFlavor(f)\">{{ 'yuv.shell.action.manage-flavors.applied.button.apply' | translate }}</button>\n </li>\n }\n </ul>\n }\n</main>\n<footer>\n <button class=\"secondary\" (click)=\"cancel()\">{{ 'yuv.shell.action.manage-flavors.button.cancel' | translate }}</button>\n</footer>\n", styles: [":host{display:flex;flex-flow:column;padding:var(--app-pane-padding)}:host header{flex:0 0 auto}:host header h2{padding:0;font-weight:400;font-size:var(--font-headline);margin:0 0 var(--app-pane-padding) 0}:host header p{max-width:42ch;line-height:1.3em}:host main{flex:1;overflow-y:auto}:host main yuv-flavor-chip{border-color:transparent;flex:1}:host main ul{padding:0;margin:0;list-style-type:none}:host main li{display:flex;gap:calc(var(--app-pane-padding) / 2);align-items:center;border:1px solid var(--panel-divider-color);margin-block-end:2px;padding:calc(var(--app-pane-padding) / 4)}:host main li button{padding:calc(var(--app-pane-padding) / 4) calc(var(--app-pane-padding) / 2)}:host footer{flex:0 0 auto;margin-block-start:var(--app-pane-padding)}\n"] }]
68
+ }] });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlLWZsYXZvcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvYWN0aW9ucy9tYW5hZ2UtZmxhdm9ycy9tYW5hZ2UtZmxhdm9ycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvc3JjL2xpYi9hY3Rpb25zL21hbmFnZS1mbGF2b3JzL21hbmFnZS1mbGF2b3JzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBYSxVQUFVLEVBQUUsZUFBZSxFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBQy9GLE9BQU8sRUFBZ0IsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7OztBQVN2QyxNQUFNLE9BQU8sc0JBQXNCO0lBUG5DO1FBUUUsZ0JBQVcsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM5QixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENB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dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgWXZjT3ZlcmxheVJlZiB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9vdmVybGF5JztcbmltcG9ydCB7IERtc09iamVjdCwgRG1zU2VydmljZSwgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBPYmplY3RGbGF2b3IsIFNoZWxsU2VydmljZSB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUnO1xuaW1wb3J0IHsgRmxhdm9yQ2hpcENvbXBvbmVudCB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWZyYW1ld29yay9vYmplY3QtZmxhdm9yJztcbmltcG9ydCB7IExpc3RDb21wb25lbnQsIExpc3RJdGVtRGlyZWN0aXZlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtZnJhbWV3b3JrL2xpc3QnO1xuaW1wb3J0IHsgQnVzeU92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvY29tbW9uJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd5dXYtbWFuYWdlLWZsYXZvcnMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBMaXN0Q29tcG9uZW50LCBCdXN5T3ZlcmxheURpcmVjdGl2ZSwgVHJhbnNsYXRlTW9kdWxlLCBMaXN0SXRlbURpcmVjdGl2ZSwgRmxhdm9yQ2hpcENvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9tYW5hZ2UtZmxhdm9ycy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9tYW5hZ2UtZmxhdm9ycy5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgTWFuYWdlRmxhdm9yc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICNvdmVybGF5UmVmID0gaW5qZWN0KFl2Y092ZXJsYXlSZWYpO1xuICAjc2hlbGwgPSBpbmplY3QoU2hlbGxTZXJ2aWNlKTtcbiAgI2Rtc1NlcnZpY2UgPSBpbmplY3QoRG1zU2VydmljZSk7XG4gIGl0ZW06IERtc09iamVjdCA9IHRoaXMuI292ZXJsYXlSZWYuZGF0YTtcblxuICBidXN5ID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICBhcHBsaWVkRmxhdm9yczogT2JqZWN0Rmxhdm9yW10gPSBbXTtcbiAgYXBwbGljYWJsZUZsYXZvcnM6IE9iamVjdEZsYXZvcltdID0gW107XG5cbiAgYXBwbHlGbGF2b3IoZmxhdm9yOiBPYmplY3RGbGF2b3IpIHtcbiAgICB0aGlzLmJ1c3kuc2V0KHRydWUpO1xuICAgIHRoaXMuI3NoZWxsLnRyaWdnZXJBcHBseU9iamVjdEZsYXZvcih0aGlzLml0ZW0sIGZsYXZvcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuI292ZXJsYXlSZWYuY2xvc2UoKTtcbiAgICAgIHRoaXMuYnVzeS5zZXQoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRmxhdm9yKGZsYXZvcjogT2JqZWN0Rmxhdm9yKSB7XG4gICAgdGhpcy5idXN5LnNldCh0cnVlKTtcbiAgICB0aGlzLiNzaGVsbC5yZW1vdmVPYmplY3RGbGF2b3IodGhpcy5pdGVtLCBmbGF2b3IpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLiNvdmVybGF5UmVmLmNsb3NlKCk7XG4gICAgICB0aGlzLmJ1c3kuc2V0KGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gICNyZWZyZXNoRG1zT2JqZWN0KCkge1xuICAgIHRoaXMuYnVzeS5zZXQodHJ1ZSk7XG4gICAgdGhpcy4jZG1zU2VydmljZVxuICAgICAgLmdldERtc09iamVjdCh0aGlzLml0ZW0uaWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChkbXNPYmplY3QpID0+IHtcbiAgICAgICAgICB0aGlzLml0ZW0gPSBkbXNPYmplY3Q7XG4gICAgICAgICAgdGhpcy4jZ2V0QXBwbGllZEZsYXZvcnModGhpcy5pdGVtKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKVxuICAgICAgLmFkZCgoKSA9PiB0aGlzLmJ1c3kuc2V0KGZhbHNlKSk7XG4gIH1cblxuICAjZ2V0QXBwbGllZEZsYXZvcnMoZG1zT2JqZWN0OiBEbXNPYmplY3QpIHtcbiAgICBjb25zdCByZXMgPSB0aGlzLiNzaGVsbC5nZXRBcHBsaWVkT2JqZWN0Rmxhdm9ycyhkbXNPYmplY3QpO1xuICAgIHRoaXMuYXBwbGllZEZsYXZvcnMgPSByZXMuYXBwbGllZDtcbiAgICB0aGlzLmFwcGxpY2FibGVGbGF2b3JzID0gcmVzLmFwcGxpY2FibGU7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMuI292ZXJsYXlSZWYpIHRoaXMuI292ZXJsYXlSZWYuY2xvc2UoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuI3JlZnJlc2hEbXNPYmplY3QoKTtcbiAgfVxufVxuIiwiPGhlYWRlcj5cbiAgPGgyPnt7ICd5dXYuc2hlbGwuYWN0aW9uLm1hbmFnZS1mbGF2b3JzLnRpdGxlJyB8IHRyYW5zbGF0ZSB9fTwvaDI+XG4gIDxwPnt7ICd5dXYuc2hlbGwuYWN0aW9uLm1hbmFnZS1mbGF2b3JzLnRleHQnIHwgdHJhbnNsYXRlIH19PC9wPlxuPC9oZWFkZXI+XG48bWFpbiBbeXV2QnVzeU92ZXJsYXldPVwiYnVzeSgpXCI+XG4gIEBpZiAoYXBwbGllZEZsYXZvcnMubGVuZ3RoKSB7XG4gICAgPGgzPnt7ICd5dXYuc2hlbGwuYWN0aW9uLm1hbmFnZS1mbGF2b3JzLmFwcGxpZWQuaGVhZGxpbmUnIHwgdHJhbnNsYXRlIH19PC9oMz5cbiAgICA8dWw+XG4gICAgICBAZm9yIChmIG9mIGFwcGxpZWRGbGF2b3JzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPGxpPlxuICAgICAgICAgIDx5dXYtZmxhdm9yLWNoaXAgW2ZsYXZvcl09XCJmXCIgeXV2TGlzdEl0ZW0+PC95dXYtZmxhdm9yLWNoaXA+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlY29uZGFyeVwiIChjbGljayk9XCJyZW1vdmVGbGF2b3IoZilcIj57eyAneXV2LnNoZWxsLmFjdGlvbi5tYW5hZ2UtZmxhdm9ycy5hcHBsaWNhYmxlLmJ1dHRvbi5yZW1vdmUnIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICAgIDwvbGk+XG4gICAgICB9XG4gICAgPC91bD5cbiAgfVxuICBAaWYgKGFwcGxpY2FibGVGbGF2b3JzLmxlbmd0aCkge1xuICAgIDxoMz57eyAneXV2LnNoZWxsLmFjdGlvbi5tYW5hZ2UtZmxhdm9ycy5hcHBsaWNhYmxlLmhlYWRsaW5lJyB8IHRyYW5zbGF0ZSB9fTwvaDM+XG4gICAgPHVsPlxuICAgICAgQGZvciAoZiBvZiBhcHBsaWNhYmxlRmxhdm9yczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8eXV2LWZsYXZvci1jaGlwIFtmbGF2b3JdPVwiZlwiIHl1dkxpc3RJdGVtPjwveXV2LWZsYXZvci1jaGlwPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWNvbmRhcnlcIiAoY2xpY2spPVwiYXBwbHlGbGF2b3IoZilcIj57eyAneXV2LnNoZWxsLmFjdGlvbi5tYW5hZ2UtZmxhdm9ycy5hcHBsaWVkLmJ1dHRvbi5hcHBseScgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgPC9saT5cbiAgICAgIH1cbiAgICA8L3VsPlxuICB9XG48L21haW4+XG48Zm9vdGVyPlxuICA8YnV0dG9uIGNsYXNzPVwic2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+e3sgJ3l1di5zaGVsbC5hY3Rpb24ubWFuYWdlLWZsYXZvcnMuYnV0dG9uLmNhbmNlbCcgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbjwvZm9vdGVyPlxuIl19
@@ -0,0 +1,191 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXNoZWxsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC9zcmMvbGliL2NsaWVudC1zaGVsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvc3JjL2xpYi9jbGllbnQtc2hlbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBa0IsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFTLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDNUksT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDM0YsT0FBTyxFQUlMLHFCQUFxQixFQUVyQix5QkFBeUIsRUFDekIsWUFBWSxFQUNiLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFF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QUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7K0dBek1VLG9CQUFvQjttR0FBcEIsb0JBQW9CLCthQzVCakMsNHZFQW1EQSx5b0hEM0JZLElBQUksd0ZBQUUsU0FBUyw2Q0FBRSxlQUFlLDJGQUFFLFlBQVksMHBCQUFFLGFBQWEsK0hBQUUsaUNBQWlDOzs0RkFJL0Ysb0JBQW9CO2tCQVBoQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1AsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGlDQUFpQyxDQUFDO3dEQWdEM0csYUFBYTtzQkFEWixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU01QyxVQUFVO3NCQURULFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkluaXQsIFNpZ25hbCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGUsIFJvdXRlciwgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN3UHVzaCB9IGZyb20gJ0Bhbmd1bGFyL3NlcnZpY2Utd29ya2VyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlLCBEZXZpY2VTZXJ2aWNlLCBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UsIFVzZXJSb2xlcywgVXNlclNlcnZpY2UsIFV0aWxzLCBZdXZVc2VyIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBNZXRhZGF0YURlZmF1bHRUZW1wbGF0ZXNDb21wb25lbnQgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvbWV0YWRhdGEtZm9ybSc7XG5pbXBvcnQge1xuICBBcHAsXG4gIENsaWVudFNoZWxsQ29uZmlnLFxuICBDb21tYW5kUGFsZXR0ZUNvbW1hbmQsXG4gIENvbW1hbmRQYWxldHRlU2VydmljZSxcbiAgU2hlbGxOb3RpZmljYXRpb25MZXZlbCxcbiAgU2hlbGxOb3RpZmljYXRpb25zU2VydmljZSxcbiAgU2hlbGxTZXJ2aWNlXG59IGZyb20gJ0B5dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUnO1xuaW1wb3J0IHsgWXZjSWNvbk1vZHVsZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjbGllbnRTaGVsbFJvdXRlcyB9IGZyb20gJy4vbGliLnJvdXRlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3l1di1jbGllbnQtc2hlbGwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdJZiwgQXN5bmNQaXBlLCBUcmFuc2xhdGVNb2R1bGUsIFJvdXRlck1vZHVsZSwgWXZjSWNvbk1vZHVsZSwgTWV0YWRhdGFEZWZhdWx0VGVtcGxhdGVzQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NsaWVudC1zaGVsbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NsaWVudC1zaGVsbC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENsaWVudFNoZWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJpdmF0ZSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB1c2VyU2VydmljZSA9IGluamVjdChVc2VyU2VydmljZSk7XG4gICNzaGVsbCA9IGluamVjdChTaGVsbFNlcnZpY2UpO1xuICBwcml2YXRlIHNoZWxsTm90aWZpY2F0aW9ucyA9IGluamVjdChTaGVsbE5vdGlmaWNhdGlvbnNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0cmFuc2xhdGUgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgY29tbWFuZFBhbGV0dGUgPSBpbmplY3QoQ29tbWFuZFBhbGV0dGVTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI2RldmljZSA9IGluamVjdChEZXZpY2VTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI3N3UHVzaCA9IGluamVjdChTd1B1c2gpO1xuXG4gIHByaXZhdGUgQVBQX0xPR09VVF9FVkVOVF9LRVkgPSAneXV2LmFwcC5ldmVudC5sb2dvdXQnO1xuXG4gIHByaXZhdGUgX2xldmVsczogUmVjb3JkPFNoZWxsTm90aWZpY2F0aW9uTGV2ZWwsIG51bWJlcj4gPSB7XG4gICAgaW5mbzogMCxcbiAgICBzdWNjZXNzOiAxLFxuICAgIHdhcm5pbmc6IDIsXG4gICAgYWxlcnQ6IDNcbiAgfTtcblxuICBzaG93VXBsb2FkT3ZlcmxheSA9IGZhbHNlO1xuICBidXN5JCA9IHRoaXMuI3NoZWxsLmlzQnVzeSQ7XG4gIGNvbnRleHQ/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==
@@ -0,0 +1,18 @@
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
@@ -0,0 +1,26 @@
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==
@@ -0,0 +1,15 @@
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
@@ -0,0 +1,11 @@
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=