@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
@@ -0,0 +1,82 @@
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", "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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Q0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTFEVSwwQkFBMEI7bUdBQTFCLDBCQUEwQixzSUNuQnZDLHM4Q0FxQ0EsbW5HRHRCWSxZQUFZLDZIQUFFLHFCQUFxQix1RkFBRSxjQUFjLGtEQUFFLGFBQWEsK0hBQUUsWUFBWSw0SUFBRSxhQUFhLHdJQUFFLGlCQUFpQixxR0FBRSxlQUFlOzs0RkFJbEksMEJBQTBCO2tCQVB0QyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGVBQWUsQ0FBQzs4QkFvQnpHLFNBQVM7c0JBQTdDLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVHJhcEZvY3VzIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPbkluaXQsIGVmZmVjdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMb2NhbGVEYXRlUGlwZSwgVHJhbnNsYXRlTW9kdWxlLCBVdGlscyB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgTGlnaHREaXNtaXNzRGlyZWN0aXZlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtZnJhbWV3b3JrL2NvbW1vbic7XG5pbXBvcnQgeyBZVVZfSUNPTlMgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvaWNvbnMnO1xuaW1wb3J0IHsgTGlzdENvbXBvbmVudCwgTGlzdEl0ZW1EaXJlY3RpdmUgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1mcmFtZXdvcmsvbGlzdCc7XG5pbXBvcnQgeyBTaGVsbE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtc2hlbGwtY29yZSc7XG5pbXBvcnQgeyBJQ09OUywgWXZjSWNvbk1vZHVsZSB9IGZyb20gJ0B5dXV2aXMvY29tcG9uZW50cy9pY29uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LW5vdGlmaWNhdGlvbnMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBMaWdodERpc21pc3NEaXJlY3RpdmUsIExvY2FsZURhdGVQaXBlLCBZdmNJY29uTW9kdWxlLCBDZGtUcmFwRm9jdXMsIExpc3RDb21wb25lbnQsIExpc3RJdGVtRGlyZWN0aXZlLCBUcmFuc2xhdGVNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vbm90aWZpY2F0aW9ucy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zUGFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgc2hlbGxOb3RpZmljYXRpb25zID0gaW5qZWN0KFNoZWxsTm90aWZpY2F0aW9uc1NlcnZpY2UpO1xuICBwcml2YXRlIGVsUmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuXG4gIHByaXZhdGUgX2ZvY3VzZWRJbmRleCA9IC0xO1xuICBwcml2YXRlIF9ub3RpZmljYXRpb25JRHM6IHN0cmluZ1tdID0gW107XG4gIG5vdGlmaWNhdGlvbnMgPSB0b1NpZ25hbCh0aGlzLnNoZWxsTm90aWZpY2F0aW9ucy5zaGVsbE5vdGlmaWNhdGlvbnMkKTtcbiAgbm90aWZpY2F0aW9uc0lkRWZmZWN0ID0gZWZmZWN0KCgpID0+ICh0aGlzLl9ub3RpZmljYXRpb25JRHMgPSAodGhpcy5ub3RpZmljYXRpb25zKCkgfHwgW10pLm1hcCgobikgPT4gbi5pZCkpKTtcblxuICBpY29ucyA9IHtcbiAgICBjbG9zZTogSUNPTlMuY2xlYXIsXG4gICAgdHJhc2g6IFlVVl9JQ09OUy50cmFzaCxcbiAgICBub3RlOiBZVVZfSUNPTlMubm90aWZpY2F0aW9uXG4gIH07XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgY2FzZSAnRGVsZXRlJzoge1xuICAgICAgICBpZiAodGhpcy5fZm9jdXNlZEluZGV4ID49IDApIHRoaXMucmVtb3ZlKHRoaXMuX25vdGlmaWNhdGlvbklEc1t0aGlzLl9mb2N1c2VkSW5kZXhdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXRlbVNlbGVjdGVkKGlkeDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBuID0gdGhpcy5zaGVsbE5vdGlmaWNhdGlvbnMuZ2V0Tm90aWZpY2F0aW9uQnlJZCh0aGlzLl9ub3RpZmljYXRpb25JRHNbaWR4WzBdXSk7XG4gICAgaWYgKG4/LnRhcmdldFJvdXRlKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsb3NlKCk7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKG4udGFyZ2V0Um91dGUsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcbiAgICAgIGlmIChuLnJlbW92ZU9uVGFyZ2V0Um91dGVOYXZpZ2F0ZWQpIHRoaXMucmVtb3ZlKG4uaWQpO1xuICAgIH1cbiAgfVxuXG4gIGl0ZW1Gb2N1c2VkKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9mb2N1c2VkSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHJlbW92ZShpZDogc3RyaW5nKSB7XG4gICAgaWYgKGlkKSB0aGlzLnNoZWxsTm90aWZpY2F0aW9ucy5yZW1vdmUoaWQpO1xuICB9XG5cbiAgcmVtb3ZlQWxsKCkge1xuICAgIHRoaXMuc2hlbGxOb3RpZmljYXRpb25zLnJlbW92ZUFsbCgpO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlKFt7IG91dGxldHM6IHsgYXNpZGU6IG51bGwgfSB9XSwge1xuICAgICAgcmVwbGFjZVVybDogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zaGVsbE5vdGlmaWNhdGlvbnMubWFya0FsbEFzU2VlbigpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZmM6IEhUTUxFbGVtZW50W10gPSBVdGlscy5nZXRGb2N1c2FibGVDaGlsZHJlbih0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICBpZiAoZmMubGVuZ3RoKSBmY1swXS5mb2N1cygpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uc1wiICh5dXZMaWdodERpc21pc3MpPVwiY2xvc2UoKVwiIGNka1RyYXBGb2N1cz5cbiAgPGgyPnt7ICd5dXYuc2hlbGwubm90aWZpY2F0aW9ucy50aXRsZScgfCB0cmFuc2xhdGUgfX08L2gyPlxuXG4gIEBpZiAobm90aWZpY2F0aW9ucygpPy5sZW5ndGgpIHtcbiAgICA8eXV2LWxpc3QgKGl0ZW1TZWxlY3QpPVwiaXRlbVNlbGVjdGVkKCRldmVudClcIiAoaXRlbUZvY3VzKT1cIml0ZW1Gb2N1c2VkKCRldmVudClcIj5cbiAgICAgIEBmb3IgKG4gb2Ygbm90aWZpY2F0aW9ucygpOyB0cmFjayBuLmlkKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJub3RlIHt7IG4ubGV2ZWwgfX1cIiBbbmdDbGFzc109XCJ7IHdpdGhSb3V0ZTogbi50YXJnZXRSb3V0ZSB9XCIgeXV2TGlzdEl0ZW0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb25cIj48eXZjLWljb24gW3N2Z109XCJuLmljb24gfHwgaWNvbnMubm90ZVwiPjwveXZjLWljb24+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlY2VpdmVkXCI+e3sgbi50aW1lc3RhbXAgfCBsb2NhbGVEYXRlIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3sgbi50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiPnt7IG4uZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0YVwiPjwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInJlbW92ZShuLmlkKVwiPlxuICAgICAgICAgICAgICA8eXZjLWljb24gW3N2Z109XCJpY29ucy50cmFzaFwiPjwveXZjLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC95dXYtbGlzdD5cblxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICA8YnV0dG9uIFtoaWRkZW5dPVwiIW5vdGlmaWNhdGlvbnMoKT8ubGVuZ3RoXCIgY2xhc3M9XCJpY29uIHNlY29uZGFyeVwiIChjbGljayk9XCJyZW1vdmVBbGwoKVwiPlxuICAgICAgICB7eyAneXV2LnNoZWxsLm5vdGlmaWNhdGlvbnMuYnV0dG9uLnJlbW92ZS5hbGwnIHwgdHJhbnNsYXRlIH19PHl2Yy1pY29uIFtzdmddPVwiaWNvbnMudHJhc2hcIj48L3l2Yy1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH0gQGVsc2Uge1xuICAgIDxkaXYgY2xhc3M9XCJlbXB0eVwiPlxuICAgICAgPHA+e3sgJ3l1di5zaGVsbC5ub3RpZmljYXRpb25zLmVtcHR5JyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICA8L2Rpdj5cbiAgfVxuXG4gIDxidXR0b24gY2xhc3M9XCJpY29uIGNsb3NlXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICA8eXZjLWljb24gW3N2Z109XCJpY29ucy5jbG9zZVwiPjwveXZjLWljb24+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,71 @@
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=
@@ -0,0 +1,18 @@
1
+ import { Component } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ export class WebShareTargetPageComponent {
5
+ constructor() {
6
+ navigator.serviceWorker.onmessage = (e) => {
7
+ const file = e.data.file;
8
+ console.log(file);
9
+ };
10
+ }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebShareTargetPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WebShareTargetPageComponent, isStandalone: true, selector: "yuv-web-share-target", ngImport: i0, template: "<p>web-share-target works!</p>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WebShareTargetPageComponent, decorators: [{
15
+ type: Component,
16
+ args: [{ selector: 'yuv-web-share-target', standalone: true, imports: [CommonModule], template: "<p>web-share-target works!</p>\n" }]
17
+ }], ctorParameters: () => [] });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLXNoYXJlLXRhcmdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvc3JjL2xpYi9wYWdlcy93ZWItc2hhcmUtdGFyZ2V0L3dlYi1zaGFyZS10YXJnZXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3NyYy9saWIvcGFnZXMvd2ViLXNoYXJlLXRhcmdldC93ZWItc2hhcmUtdGFyZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQVMvQyxNQUFNLE9BQU8sMkJBQTJCO0lBRXRDO1FBQ0UsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN4QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUV6QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBCLENBQUMsQ0FBQTtJQUNILENBQUM7K0dBVFUsMkJBQTJCO21HQUEzQiwyQkFBMkIsZ0ZDVnhDLGtDQUNBLHlEREtZLFlBQVk7OzRGQUlYLDJCQUEyQjtrQkFQdkMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd5dXYtd2ViLXNoYXJlLXRhcmdldCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vd2ViLXNoYXJlLXRhcmdldC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi93ZWItc2hhcmUtdGFyZ2V0LmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBXZWJTaGFyZVRhcmdldFBhZ2VDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLm9ubWVzc2FnZSA9IChlKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gZS5kYXRhLmZpbGU7XG5cbiAgICAgIGNvbnNvbGUubG9nKGZpbGUpO1xuICAgICAgXG4gICAgfVxuICB9XG59XG4iLCI8cD53ZWItc2hhcmUtdGFyZ2V0IHdvcmtzITwvcD5cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './lib/widget-dashboard.component';
2
+ export * from './lib/widget-dashboard.module';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvd2lkZ2V0LWRhc2hib2FyZC9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvd2lkZ2V0LWRhc2hib2FyZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvd2lkZ2V0LWRhc2hib2FyZC5tb2R1bGUnO1xuIl19
@@ -0,0 +1,46 @@
1
+ import { Component, Inject } from '@angular/core';
2
+ import { WIDGET_DASHBOARD_CONFIG } from './widget-dashboard.config';
3
+ import { WidgetGridUtils } from '@yuuvis/widget-grid';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@yuuvis/widget-grid";
6
+ export class WidgetDashboardPageComponent {
7
+ constructor(config) {
8
+ this.config = config;
9
+ this.gridItemConfig = [];
10
+ this.editMode = false;
11
+ if (config) {
12
+ const cfg = localStorage.getItem(config.id);
13
+ if (cfg) {
14
+ if (config?.workspaces) {
15
+ this.workspaceConfig = JSON.parse(cfg);
16
+ }
17
+ else {
18
+ this.gridItemConfig = JSON.parse(cfg);
19
+ }
20
+ }
21
+ }
22
+ }
23
+ onGridEvent(e) {
24
+ console.log(e);
25
+ }
26
+ onGridChange(e) {
27
+ this._saveConfig(e);
28
+ }
29
+ onWorkspacesConfigChange(e) {
30
+ this._saveConfig(e);
31
+ }
32
+ _saveConfig(e) {
33
+ if (this.config)
34
+ localStorage.setItem(this.config.id, WidgetGridUtils.gridConfigStringify(e));
35
+ }
36
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetDashboardPageComponent, deps: [{ token: WIDGET_DASHBOARD_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); }
37
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: WidgetDashboardPageComponent, selector: "yuv-widget-dashboard", ngImport: i0, template: "@if (config?.workspaces) {\n <yuv-widget-grid-workspaces\n [buckets]=\"config?.buckets\"\n [workspaceConfig]=\"workspaceConfig\"\n (gridItemEvent)=\"onGridEvent($event)\"\n (configChange)=\"onWorkspacesConfigChange($event)\"\n ></yuv-widget-grid-workspaces>\n} @else {\n <yuv-widget-grid\n [buckets]=\"config?.buckets\"\n [gridItemConfig]=\"gridItemConfig\"\n [editMode]=\"editMode\"\n (gridItemEvent)=\"onGridEvent($event)\"\n (gridChange)=\"onGridChange($event)\"\n ></yuv-widget-grid>\n}\n", styles: [":host{--wd-grid-line-color: var(--panel-divider-color)}:host ::ng-deep gridster{background-color:transparent}:host ::ng-deep gridster .gridster-row,:host ::ng-deep gridster .gridster-column{border-color:var(--wd-grid-line-color)}\n"], dependencies: [{ kind: "component", type: i1.WidgetGridComponent, selector: "yuv-widget-grid", inputs: ["gridConfig", "editMode", "gridItemConfig", "buckets"], outputs: ["gridChange", "gridItemEvent", "widgetPickerOpen"] }, { kind: "component", type: i1.WidgetGridWorkspacesComponent, selector: "yuv-widget-grid-workspaces", inputs: ["options", "workspaceConfig", "preventAdd", "workspaceLabelMaxLength", "buckets"], outputs: ["configChange", "gridItemEvent", "editModeChange"] }] }); }
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetDashboardPageComponent, decorators: [{
40
+ type: Component,
41
+ args: [{ selector: 'yuv-widget-dashboard', template: "@if (config?.workspaces) {\n <yuv-widget-grid-workspaces\n [buckets]=\"config?.buckets\"\n [workspaceConfig]=\"workspaceConfig\"\n (gridItemEvent)=\"onGridEvent($event)\"\n (configChange)=\"onWorkspacesConfigChange($event)\"\n ></yuv-widget-grid-workspaces>\n} @else {\n <yuv-widget-grid\n [buckets]=\"config?.buckets\"\n [gridItemConfig]=\"gridItemConfig\"\n [editMode]=\"editMode\"\n (gridItemEvent)=\"onGridEvent($event)\"\n (gridChange)=\"onGridChange($event)\"\n ></yuv-widget-grid>\n}\n", styles: [":host{--wd-grid-line-color: var(--panel-divider-color)}:host ::ng-deep gridster{background-color:transparent}:host ::ng-deep gridster .gridster-row,:host ::ng-deep gridster .gridster-column{border-color:var(--wd-grid-line-color)}\n"] }]
42
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
43
+ type: Inject,
44
+ args: [WIDGET_DASHBOARD_CONFIG]
45
+ }] }] });
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWRhc2hib2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvd2lkZ2V0LWRhc2hib2FyZC9zcmMvbGliL3dpZGdldC1kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3dpZGdldC1kYXNoYm9hcmQvc3JjL2xpYi93aWRnZXQtZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSx1QkFBdUIsRUFBeUIsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRixPQUFPLEVBQXVDLGVBQWUsRUFBNkIsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBT3RILE1BQU0sT0FBTyw0QkFBNEI7SUFLdkMsWUFBb0QsTUFBeUM7UUFBekMsV0FBTSxHQUFOLE1BQU0sQ0FBbUM7UUFIN0YsbUJBQWMsR0FBMkIsRUFBRSxDQUFDO1FBQzVDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFHZixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixJQUFJLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLENBQWdCO1FBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVELFlBQVksQ0FBQyxDQUF5QjtRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxDQUE0QjtRQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFTyxXQUFXLENBQUMsQ0FBcUQ7UUFDdkUsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEcsQ0FBQzsrR0FoQ1UsNEJBQTRCLGtCQUtuQix1QkFBdUI7bUdBTGhDLDRCQUE0Qiw0RENUekMsNmdCQWdCQTs7NEZEUGEsNEJBQTRCO2tCQUx4QyxTQUFTOytCQUNFLHNCQUFzQjs7MEJBU25CLE1BQU07MkJBQUMsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdJREdFVF9EQVNIQk9BUkRfQ09ORklHLCBXaWRnZXREYXNoYm9hcmRDb25maWcgfSBmcm9tICcuL3dpZGdldC1kYXNoYm9hcmQuY29uZmlnJztcbmltcG9ydCB7IEdyaWRJdGVtRXZlbnQsIFdpZGdldEdyaWRJdGVtQ29uZmlnLCBXaWRnZXRHcmlkVXRpbHMsIFdpZGdldEdyaWRXb3Jrc3BhY2VDb25maWcgfSBmcm9tICdAeXV1dmlzL3dpZGdldC1ncmlkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXV2LXdpZGdldC1kYXNoYm9hcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2lkZ2V0LWRhc2hib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dpZGdldC1kYXNoYm9hcmQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXREYXNoYm9hcmRQYWdlQ29tcG9uZW50IHtcbiAgd29ya3NwYWNlQ29uZmlnPzogV2lkZ2V0R3JpZFdvcmtzcGFjZUNvbmZpZztcbiAgZ3JpZEl0ZW1Db25maWc6IFdpZGdldEdyaWRJdGVtQ29uZmlnW10gPSBbXTtcbiAgZWRpdE1vZGUgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFdJREdFVF9EQVNIQk9BUkRfQ09ORklHKSBwdWJsaWMgY29uZmlnOiBXaWRnZXREYXNoYm9hcmRDb25maWcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICBjb25zdCBjZmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShjb25maWcuaWQpO1xuICAgICAgaWYgKGNmZykge1xuICAgICAgICBpZiAoY29uZmlnPy53b3Jrc3BhY2VzKSB7XG4gICAgICAgICAgdGhpcy53b3Jrc3BhY2VDb25maWcgPSBKU09OLnBhcnNlKGNmZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5ncmlkSXRlbUNvbmZpZyA9IEpTT04ucGFyc2UoY2ZnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uR3JpZEV2ZW50KGU6IEdyaWRJdGVtRXZlbnQpIHtcbiAgICBjb25zb2xlLmxvZyhlKTtcbiAgfVxuXG4gIG9uR3JpZENoYW5nZShlOiBXaWRnZXRHcmlkSXRlbUNvbmZpZ1tdKSB7XG4gICAgdGhpcy5fc2F2ZUNvbmZpZyhlKTtcbiAgfVxuXG4gIG9uV29ya3NwYWNlc0NvbmZpZ0NoYW5nZShlOiBXaWRnZXRHcmlkV29ya3NwYWNlQ29uZmlnKSB7XG4gICAgdGhpcy5fc2F2ZUNvbmZpZyhlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NhdmVDb25maWcoZTogV2lkZ2V0R3JpZEl0ZW1Db25maWdbXSB8IFdpZGdldEdyaWRXb3Jrc3BhY2VDb25maWcpIHtcbiAgICBpZiAodGhpcy5jb25maWcpIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuY29uZmlnLmlkLCBXaWRnZXRHcmlkVXRpbHMuZ3JpZENvbmZpZ1N0cmluZ2lmeShlKSk7XG4gIH1cbn1cbiIsIkBpZiAoY29uZmlnPy53b3Jrc3BhY2VzKSB7XG4gIDx5dXYtd2lkZ2V0LWdyaWQtd29ya3NwYWNlc1xuICAgIFtidWNrZXRzXT1cImNvbmZpZz8uYnVja2V0c1wiXG4gICAgW3dvcmtzcGFjZUNvbmZpZ109XCJ3b3Jrc3BhY2VDb25maWdcIlxuICAgIChncmlkSXRlbUV2ZW50KT1cIm9uR3JpZEV2ZW50KCRldmVudClcIlxuICAgIChjb25maWdDaGFuZ2UpPVwib25Xb3Jrc3BhY2VzQ29uZmlnQ2hhbmdlKCRldmVudClcIlxuICA+PC95dXYtd2lkZ2V0LWdyaWQtd29ya3NwYWNlcz5cbn0gQGVsc2Uge1xuICA8eXV2LXdpZGdldC1ncmlkXG4gICAgW2J1Y2tldHNdPVwiY29uZmlnPy5idWNrZXRzXCJcbiAgICBbZ3JpZEl0ZW1Db25maWddPVwiZ3JpZEl0ZW1Db25maWdcIlxuICAgIFtlZGl0TW9kZV09XCJlZGl0TW9kZVwiXG4gICAgKGdyaWRJdGVtRXZlbnQpPVwib25HcmlkRXZlbnQoJGV2ZW50KVwiXG4gICAgKGdyaWRDaGFuZ2UpPVwib25HcmlkQ2hhbmdlKCRldmVudClcIlxuICA+PC95dXYtd2lkZ2V0LWdyaWQ+XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ import { InjectionToken } from "@angular/core";
2
+ export const WIDGET_DASHBOARD_CONFIG = new InjectionToken('WIDGET_DASHBOARD_CONFIG');
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWRhc2hib2FyZC5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvd2lkZ2V0LWRhc2hib2FyZC9zcmMvbGliL3dpZGdldC1kYXNoYm9hcmQuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxjQUFjLENBQUMseUJBQXlCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuZXhwb3J0IGNvbnN0IFdJREdFVF9EQVNIQk9BUkRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuKCdXSURHRVRfREFTSEJPQVJEX0NPTkZJRycpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdpZGdldERhc2hib2FyZENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBidWNrZXRzPzogc3RyaW5nW107XG4gICAgd29ya3NwYWNlcz86IGJvb2xlYW47XG59Il19
@@ -0,0 +1,49 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { WidgetDashboardPageComponent } from './widget-dashboard.component';
4
+ import { RouterModule } from '@angular/router';
5
+ import { YuvWidgetGridModule } from '@yuuvis/widget-grid';
6
+ import { WIDGET_DASHBOARD_CONFIG } from './widget-dashboard.config';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/router";
9
+ export function ConfigFactory() {
10
+ return YuvWidgetDashboardModule.config;
11
+ }
12
+ export class YuvWidgetDashboardModule {
13
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YuvWidgetDashboardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
14
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: YuvWidgetDashboardModule, declarations: [WidgetDashboardPageComponent], imports: [CommonModule,
15
+ YuvWidgetGridModule, i1.RouterModule], exports: [WidgetDashboardPageComponent] }); }
16
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YuvWidgetDashboardModule, providers: [
17
+ {
18
+ provide: WIDGET_DASHBOARD_CONFIG,
19
+ useFactory: ConfigFactory
20
+ }
21
+ ], imports: [CommonModule,
22
+ YuvWidgetGridModule,
23
+ RouterModule.forChild([
24
+ { path: '', component: WidgetDashboardPageComponent },
25
+ { path: '**', redirectTo: '/' }
26
+ ])] }); }
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YuvWidgetDashboardModule, decorators: [{
29
+ type: NgModule,
30
+ args: [{
31
+ imports: [
32
+ CommonModule,
33
+ YuvWidgetGridModule,
34
+ RouterModule.forChild([
35
+ { path: '', component: WidgetDashboardPageComponent },
36
+ { path: '**', redirectTo: '/' }
37
+ ])
38
+ ],
39
+ declarations: [WidgetDashboardPageComponent],
40
+ exports: [WidgetDashboardPageComponent],
41
+ providers: [
42
+ {
43
+ provide: WIDGET_DASHBOARD_CONFIG,
44
+ useFactory: ConfigFactory
45
+ }
46
+ ]
47
+ }]
48
+ }] });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWRhc2hib2FyZC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwvd2lkZ2V0LWRhc2hib2FyZC9zcmMvbGliL3dpZGdldC1kYXNoYm9hcmQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsdUJBQXVCLEVBQXlCLE1BQU0sMkJBQTJCLENBQUM7OztBQUUzRixNQUFNLFVBQVUsYUFBYTtJQUMzQixPQUFPLHdCQUF3QixDQUFDLE1BQU0sQ0FBQztBQUN6QyxDQUFDO0FBb0JELE1BQU0sT0FBTyx3QkFBd0I7K0dBQXhCLHdCQUF3QjtnSEFBeEIsd0JBQXdCLGlCQVRwQiw0QkFBNEIsYUFQekMsWUFBWTtZQUNaLG1CQUFtQiw4QkFPWCw0QkFBNEI7Z0hBUTNCLHdCQUF3QixhQVB4QjtZQUNUO2dCQUNFLE9BQU8sRUFBRSx1QkFBdUI7Z0JBQ2hDLFVBQVUsRUFBRSxhQUFhO2FBQzFCO1NBQ0YsWUFkQyxZQUFZO1lBQ1osbUJBQW1CO1lBQ25CLFlBQVksQ0FBQyxRQUFRLENBQUM7Z0JBQ3BCLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsNEJBQTRCLEVBQUU7Z0JBQ3JELEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFO2FBQ2hDLENBQUM7OzRGQVdPLHdCQUF3QjtrQkFsQnBDLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixZQUFZLENBQUMsUUFBUSxDQUFDOzRCQUNwQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLDRCQUE0QixFQUFFOzRCQUNyRCxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRTt5QkFDaEMsQ0FBQztxQkFDSDtvQkFDRCxZQUFZLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQztvQkFDNUMsT0FBTyxFQUFFLENBQUMsNEJBQTRCLENBQUM7b0JBQ3ZDLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsdUJBQXVCOzRCQUNoQyxVQUFVLEVBQUUsYUFBYTt5QkFDMUI7cUJBQ0Y7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpZGdldERhc2hib2FyZFBhZ2VDb21wb25lbnQgfSBmcm9tICcuL3dpZGdldC1kYXNoYm9hcmQuY29tcG9uZW50JztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBZdXZXaWRnZXRHcmlkTW9kdWxlIH0gZnJvbSAnQHl1dXZpcy93aWRnZXQtZ3JpZCc7XG5pbXBvcnQgeyBXSURHRVRfREFTSEJPQVJEX0NPTkZJRywgV2lkZ2V0RGFzaGJvYXJkQ29uZmlnIH0gZnJvbSAnLi93aWRnZXQtZGFzaGJvYXJkLmNvbmZpZyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb25maWdGYWN0b3J5KCkge1xuICByZXR1cm4gWXV2V2lkZ2V0RGFzaGJvYXJkTW9kdWxlLmNvbmZpZztcbn1cblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBZdXZXaWRnZXRHcmlkTW9kdWxlLFxuICAgIFJvdXRlck1vZHVsZS5mb3JDaGlsZChbXG4gICAgICB7IHBhdGg6ICcnLCBjb21wb25lbnQ6IFdpZGdldERhc2hib2FyZFBhZ2VDb21wb25lbnQgfSxcbiAgICAgIHsgcGF0aDogJyoqJywgcmVkaXJlY3RUbzogJy8nIH1cbiAgICBdKVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtXaWRnZXREYXNoYm9hcmRQYWdlQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW1dpZGdldERhc2hib2FyZFBhZ2VDb21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBXSURHRVRfREFTSEJPQVJEX0NPTkZJRyxcbiAgICAgIHVzZUZhY3Rvcnk6IENvbmZpZ0ZhY3RvcnlcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgWXV2V2lkZ2V0RGFzaGJvYXJkTW9kdWxlIHtcbiAgc3RhdGljIGNvbmZpZz86IFdpZGdldERhc2hib2FyZENvbmZpZztcbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXV1dmlzLWNsaWVudC1zaGVsbC13aWRnZXQtZGFzaGJvYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsL3dpZGdldC1kYXNoYm9hcmQvc3JjL3l1dXZpcy1jbGllbnQtc2hlbGwtd2lkZ2V0LWRhc2hib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXV1dmlzLWNsaWVudC1zaGVsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC9zcmMveXV1dmlzLWNsaWVudC1zaGVsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,98 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, Component, Inject, NgModule } from '@angular/core';
3
+ import * as i1 from '@yuuvis/widget-grid';
4
+ import { WidgetGridUtils, YuvWidgetGridModule } from '@yuuvis/widget-grid';
5
+ import { CommonModule } from '@angular/common';
6
+ import * as i1$1 from '@angular/router';
7
+ import { RouterModule } from '@angular/router';
8
+
9
+ const WIDGET_DASHBOARD_CONFIG = new InjectionToken('WIDGET_DASHBOARD_CONFIG');
10
+
11
+ class WidgetDashboardPageComponent {
12
+ constructor(config) {
13
+ this.config = config;
14
+ this.gridItemConfig = [];
15
+ this.editMode = false;
16
+ if (config) {
17
+ const cfg = localStorage.getItem(config.id);
18
+ if (cfg) {
19
+ if (config?.workspaces) {
20
+ this.workspaceConfig = JSON.parse(cfg);
21
+ }
22
+ else {
23
+ this.gridItemConfig = JSON.parse(cfg);
24
+ }
25
+ }
26
+ }
27
+ }
28
+ onGridEvent(e) {
29
+ console.log(e);
30
+ }
31
+ onGridChange(e) {
32
+ this._saveConfig(e);
33
+ }
34
+ onWorkspacesConfigChange(e) {
35
+ this._saveConfig(e);
36
+ }
37
+ _saveConfig(e) {
38
+ if (this.config)
39
+ localStorage.setItem(this.config.id, WidgetGridUtils.gridConfigStringify(e));
40
+ }
41
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetDashboardPageComponent, deps: [{ token: WIDGET_DASHBOARD_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); }
42
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: WidgetDashboardPageComponent, selector: "yuv-widget-dashboard", ngImport: i0, template: "@if (config?.workspaces) {\n <yuv-widget-grid-workspaces\n [buckets]=\"config?.buckets\"\n [workspaceConfig]=\"workspaceConfig\"\n (gridItemEvent)=\"onGridEvent($event)\"\n (configChange)=\"onWorkspacesConfigChange($event)\"\n ></yuv-widget-grid-workspaces>\n} @else {\n <yuv-widget-grid\n [buckets]=\"config?.buckets\"\n [gridItemConfig]=\"gridItemConfig\"\n [editMode]=\"editMode\"\n (gridItemEvent)=\"onGridEvent($event)\"\n (gridChange)=\"onGridChange($event)\"\n ></yuv-widget-grid>\n}\n", styles: [":host{--wd-grid-line-color: var(--panel-divider-color)}:host ::ng-deep gridster{background-color:transparent}:host ::ng-deep gridster .gridster-row,:host ::ng-deep gridster .gridster-column{border-color:var(--wd-grid-line-color)}\n"], dependencies: [{ kind: "component", type: i1.WidgetGridComponent, selector: "yuv-widget-grid", inputs: ["gridConfig", "editMode", "gridItemConfig", "buckets"], outputs: ["gridChange", "gridItemEvent", "widgetPickerOpen"] }, { kind: "component", type: i1.WidgetGridWorkspacesComponent, selector: "yuv-widget-grid-workspaces", inputs: ["options", "workspaceConfig", "preventAdd", "workspaceLabelMaxLength", "buckets"], outputs: ["configChange", "gridItemEvent", "editModeChange"] }] }); }
43
+ }
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetDashboardPageComponent, decorators: [{
45
+ type: Component,
46
+ args: [{ selector: 'yuv-widget-dashboard', template: "@if (config?.workspaces) {\n <yuv-widget-grid-workspaces\n [buckets]=\"config?.buckets\"\n [workspaceConfig]=\"workspaceConfig\"\n (gridItemEvent)=\"onGridEvent($event)\"\n (configChange)=\"onWorkspacesConfigChange($event)\"\n ></yuv-widget-grid-workspaces>\n} @else {\n <yuv-widget-grid\n [buckets]=\"config?.buckets\"\n [gridItemConfig]=\"gridItemConfig\"\n [editMode]=\"editMode\"\n (gridItemEvent)=\"onGridEvent($event)\"\n (gridChange)=\"onGridChange($event)\"\n ></yuv-widget-grid>\n}\n", styles: [":host{--wd-grid-line-color: var(--panel-divider-color)}:host ::ng-deep gridster{background-color:transparent}:host ::ng-deep gridster .gridster-row,:host ::ng-deep gridster .gridster-column{border-color:var(--wd-grid-line-color)}\n"] }]
47
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
48
+ type: Inject,
49
+ args: [WIDGET_DASHBOARD_CONFIG]
50
+ }] }] });
51
+
52
+ function ConfigFactory() {
53
+ return YuvWidgetDashboardModule.config;
54
+ }
55
+ class YuvWidgetDashboardModule {
56
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YuvWidgetDashboardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
57
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: YuvWidgetDashboardModule, declarations: [WidgetDashboardPageComponent], imports: [CommonModule,
58
+ YuvWidgetGridModule, i1$1.RouterModule], exports: [WidgetDashboardPageComponent] }); }
59
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YuvWidgetDashboardModule, providers: [
60
+ {
61
+ provide: WIDGET_DASHBOARD_CONFIG,
62
+ useFactory: ConfigFactory
63
+ }
64
+ ], imports: [CommonModule,
65
+ YuvWidgetGridModule,
66
+ RouterModule.forChild([
67
+ { path: '', component: WidgetDashboardPageComponent },
68
+ { path: '**', redirectTo: '/' }
69
+ ])] }); }
70
+ }
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: YuvWidgetDashboardModule, decorators: [{
72
+ type: NgModule,
73
+ args: [{
74
+ imports: [
75
+ CommonModule,
76
+ YuvWidgetGridModule,
77
+ RouterModule.forChild([
78
+ { path: '', component: WidgetDashboardPageComponent },
79
+ { path: '**', redirectTo: '/' }
80
+ ])
81
+ ],
82
+ declarations: [WidgetDashboardPageComponent],
83
+ exports: [WidgetDashboardPageComponent],
84
+ providers: [
85
+ {
86
+ provide: WIDGET_DASHBOARD_CONFIG,
87
+ useFactory: ConfigFactory
88
+ }
89
+ ]
90
+ }]
91
+ }] });
92
+
93
+ /**
94
+ * Generated bundle index. Do not edit.
95
+ */
96
+
97
+ export { ConfigFactory, WidgetDashboardPageComponent, YuvWidgetDashboardModule };
98
+ //# sourceMappingURL=yuuvis-client-shell-widget-dashboard.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yuuvis-client-shell-widget-dashboard.mjs","sources":["../../../../../libs/yuuvis/client-shell/widget-dashboard/src/lib/widget-dashboard.config.ts","../../../../../libs/yuuvis/client-shell/widget-dashboard/src/lib/widget-dashboard.component.ts","../../../../../libs/yuuvis/client-shell/widget-dashboard/src/lib/widget-dashboard.component.html","../../../../../libs/yuuvis/client-shell/widget-dashboard/src/lib/widget-dashboard.module.ts","../../../../../libs/yuuvis/client-shell/widget-dashboard/src/yuuvis-client-shell-widget-dashboard.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\n\nexport const WIDGET_DASHBOARD_CONFIG = new InjectionToken('WIDGET_DASHBOARD_CONFIG');\n\nexport interface WidgetDashboardConfig {\n id: string;\n buckets?: string[];\n workspaces?: boolean;\n}","import { Component, Inject } from '@angular/core';\nimport { WIDGET_DASHBOARD_CONFIG, WidgetDashboardConfig } from './widget-dashboard.config';\nimport { GridItemEvent, WidgetGridItemConfig, WidgetGridUtils, WidgetGridWorkspaceConfig } from '@yuuvis/widget-grid';\n\n@Component({\n selector: 'yuv-widget-dashboard',\n templateUrl: './widget-dashboard.component.html',\n styleUrls: ['./widget-dashboard.component.scss']\n})\nexport class WidgetDashboardPageComponent {\n workspaceConfig?: WidgetGridWorkspaceConfig;\n gridItemConfig: WidgetGridItemConfig[] = [];\n editMode = false;\n\n constructor(@Inject(WIDGET_DASHBOARD_CONFIG) public config: WidgetDashboardConfig | undefined) {\n if (config) {\n const cfg = localStorage.getItem(config.id);\n if (cfg) {\n if (config?.workspaces) {\n this.workspaceConfig = JSON.parse(cfg);\n } else {\n this.gridItemConfig = JSON.parse(cfg);\n }\n }\n }\n }\n\n onGridEvent(e: GridItemEvent) {\n console.log(e);\n }\n\n onGridChange(e: WidgetGridItemConfig[]) {\n this._saveConfig(e);\n }\n\n onWorkspacesConfigChange(e: WidgetGridWorkspaceConfig) {\n this._saveConfig(e);\n }\n\n private _saveConfig(e: WidgetGridItemConfig[] | WidgetGridWorkspaceConfig) {\n if (this.config) localStorage.setItem(this.config.id, WidgetGridUtils.gridConfigStringify(e));\n }\n}\n","@if (config?.workspaces) {\n <yuv-widget-grid-workspaces\n [buckets]=\"config?.buckets\"\n [workspaceConfig]=\"workspaceConfig\"\n (gridItemEvent)=\"onGridEvent($event)\"\n (configChange)=\"onWorkspacesConfigChange($event)\"\n ></yuv-widget-grid-workspaces>\n} @else {\n <yuv-widget-grid\n [buckets]=\"config?.buckets\"\n [gridItemConfig]=\"gridItemConfig\"\n [editMode]=\"editMode\"\n (gridItemEvent)=\"onGridEvent($event)\"\n (gridChange)=\"onGridChange($event)\"\n ></yuv-widget-grid>\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { WidgetDashboardPageComponent } from './widget-dashboard.component';\nimport { RouterModule } from '@angular/router';\nimport { YuvWidgetGridModule } from '@yuuvis/widget-grid';\nimport { WIDGET_DASHBOARD_CONFIG, WidgetDashboardConfig } from './widget-dashboard.config';\n\nexport function ConfigFactory() {\n return YuvWidgetDashboardModule.config;\n}\n\n@NgModule({\n imports: [\n CommonModule,\n YuvWidgetGridModule,\n RouterModule.forChild([\n { path: '', component: WidgetDashboardPageComponent },\n { path: '**', redirectTo: '/' }\n ])\n ],\n declarations: [WidgetDashboardPageComponent],\n exports: [WidgetDashboardPageComponent],\n providers: [\n {\n provide: WIDGET_DASHBOARD_CONFIG,\n useFactory: ConfigFactory\n }\n ]\n})\nexport class YuvWidgetDashboardModule {\n static config?: WidgetDashboardConfig;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAEO,MAAM,uBAAuB,GAAG,IAAI,cAAc,CAAC,yBAAyB,CAAC;;MCOvE,4BAA4B,CAAA;AAKvC,IAAA,WAAA,CAAoD,MAAyC,EAAA;QAAzC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAmC;QAH7F,IAAc,CAAA,cAAA,GAA2B,EAAE,CAAC;QAC5C,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAC;QAGf,IAAI,MAAM,EAAE;YACV,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,GAAG,EAAE;AACP,gBAAA,IAAI,MAAM,EAAE,UAAU,EAAE;oBACtB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBACxC;qBAAM;oBACL,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBACvC;aACF;SACF;KACF;AAED,IAAA,WAAW,CAAC,CAAgB,EAAA;AAC1B,QAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAChB;AAED,IAAA,YAAY,CAAC,CAAyB,EAAA;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;KACrB;AAED,IAAA,wBAAwB,CAAC,CAA4B,EAAA;AACnD,QAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;KACrB;AAEO,IAAA,WAAW,CAAC,CAAqD,EAAA;QACvE,IAAI,IAAI,CAAC,MAAM;AAAE,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;KAC/F;AAhCU,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,kBAKnB,uBAAuB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AALhC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,4DCTzC,6gBAgBA,EAAA,MAAA,EAAA,CAAA,yOAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,eAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,6BAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,eAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;4FDPa,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBALxC,SAAS;+BACE,sBAAsB,EAAA,QAAA,EAAA,6gBAAA,EAAA,MAAA,EAAA,CAAA,yOAAA,CAAA,EAAA,CAAA;;0BASnB,MAAM;2BAAC,uBAAuB,CAAA;;;SEP7B,aAAa,GAAA;IAC3B,OAAO,wBAAwB,CAAC,MAAM,CAAC;AACzC,CAAC;MAoBY,wBAAwB,CAAA;+GAAxB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;gHAAxB,wBAAwB,EAAA,YAAA,EAAA,CATpB,4BAA4B,CAAA,EAAA,OAAA,EAAA,CAPzC,YAAY;AACZ,YAAA,mBAAmB,gCAOX,4BAA4B,CAAA,EAAA,CAAA,CAAA,EAAA;AAQ3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,EAPxB,SAAA,EAAA;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,uBAAuB;AAChC,gBAAA,UAAU,EAAE,aAAa;AAC1B,aAAA;AACF,SAAA,EAAA,OAAA,EAAA,CAdC,YAAY;YACZ,mBAAmB;YACnB,YAAY,CAAC,QAAQ,CAAC;AACpB,gBAAA,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,4BAA4B,EAAE;AACrD,gBAAA,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE;aAChC,CAAC,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAWO,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAlBpC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,YAAY,CAAC,QAAQ,CAAC;AACpB,4BAAA,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,4BAA4B,EAAE;AACrD,4BAAA,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE;yBAChC,CAAC;AACH,qBAAA;oBACD,YAAY,EAAE,CAAC,4BAA4B,CAAC;oBAC5C,OAAO,EAAE,CAAC,4BAA4B,CAAC;AACvC,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,uBAAuB;AAChC,4BAAA,UAAU,EAAE,aAAa;AAC1B,yBAAA;AACF,qBAAA;AACF,iBAAA,CAAA;;;AC5BD;;AAEG;;;;"}