@yuuvis/client-shell-core 2.20.0 → 3.0.0-beta.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/esm2022/index.js +15 -0
  2. package/esm2022/index.js.map +1 -0
  3. package/esm2022/lib/client-shell.assets.js +12 -0
  4. package/esm2022/lib/client-shell.assets.js.map +1 -0
  5. package/esm2022/lib/models/client-shell.interface.js +5 -0
  6. package/esm2022/lib/models/client-shell.interface.js.map +1 -0
  7. package/esm2022/lib/services/command-palette/command-palette/command-palette.component.js +94 -0
  8. package/esm2022/lib/services/command-palette/command-palette/command-palette.component.js.map +1 -0
  9. package/esm2022/lib/services/command-palette/command-palette.interface.js +2 -0
  10. package/esm2022/lib/services/command-palette/command-palette.interface.js.map +1 -0
  11. package/esm2022/lib/services/command-palette/command-palette.service.js +120 -0
  12. package/esm2022/lib/services/command-palette/command-palette.service.js.map +1 -0
  13. package/esm2022/lib/services/feature/feature.guard.js +9 -0
  14. package/esm2022/lib/services/feature/feature.guard.js.map +1 -0
  15. package/esm2022/lib/services/feature/feature.interface.js +2 -0
  16. package/esm2022/lib/services/feature/feature.interface.js.map +1 -0
  17. package/esm2022/lib/services/feature/feature.providers.js +14 -0
  18. package/esm2022/lib/services/feature/feature.providers.js.map +1 -0
  19. package/esm2022/lib/services/feature/feature.service.js +141 -0
  20. package/esm2022/lib/services/feature/feature.service.js.map +1 -0
  21. package/esm2022/lib/services/feature/index.js +5 -0
  22. package/esm2022/lib/services/feature/index.js.map +1 -0
  23. package/esm2022/lib/services/shell/noop.extension.js +13 -0
  24. package/esm2022/lib/services/shell/noop.extension.js.map +1 -0
  25. package/esm2022/lib/services/shell/requirements.parser.js +7 -0
  26. package/esm2022/lib/services/shell/requirements.parser.js.map +1 -0
  27. package/esm2022/lib/services/shell/shell.bootstrap.js +84 -0
  28. package/esm2022/lib/services/shell/shell.bootstrap.js.map +1 -0
  29. package/esm2022/lib/services/shell/shell.providers.js +20 -0
  30. package/esm2022/lib/services/shell/shell.providers.js.map +1 -0
  31. package/esm2022/lib/services/shell/shell.service.js +455 -0
  32. package/esm2022/lib/services/shell/shell.service.js.map +1 -0
  33. package/esm2022/lib/services/shell-config/shell-config.const.js +17 -0
  34. package/esm2022/lib/services/shell-config/shell-config.const.js.map +1 -0
  35. package/esm2022/lib/services/shell-config/shell-config.interface.js +2 -0
  36. package/esm2022/lib/services/shell-config/shell-config.interface.js.map +1 -0
  37. package/esm2022/lib/services/shell-config/shell-config.service.js +100 -0
  38. package/esm2022/lib/services/shell-config/shell-config.service.js.map +1 -0
  39. package/esm2022/lib/services/shell-notifications/shell-notifications.interface.js +2 -0
  40. package/esm2022/lib/services/shell-notifications/shell-notifications.interface.js.map +1 -0
  41. package/esm2022/lib/services/shell-notifications/shell-notifications.service.js +84 -0
  42. package/esm2022/lib/services/shell-notifications/shell-notifications.service.js.map +1 -0
  43. package/esm2022/lib/tile-extension.interface.js +2 -0
  44. package/esm2022/lib/tile-extension.interface.js.map +1 -0
  45. package/esm2022/yuuvis-client-shell-core.js +5 -0
  46. package/esm2022/yuuvis-client-shell-core.js.map +1 -0
  47. package/lib/services/command-palette/command-palette/command-palette.component.d.ts +2 -2
  48. package/package.json +10 -10
  49. package/yuuvis-client-shell-core.d.ts +5 -0
  50. package/esm2022/index.mjs +0 -15
  51. package/esm2022/lib/client-shell.assets.mjs +0 -12
  52. package/esm2022/lib/models/client-shell.interface.mjs +0 -5
  53. package/esm2022/lib/services/command-palette/command-palette/command-palette.component.mjs +0 -101
  54. package/esm2022/lib/services/command-palette/command-palette.interface.mjs +0 -2
  55. package/esm2022/lib/services/command-palette/command-palette.service.mjs +0 -120
  56. package/esm2022/lib/services/feature/feature.guard.mjs +0 -9
  57. package/esm2022/lib/services/feature/feature.interface.mjs +0 -2
  58. package/esm2022/lib/services/feature/feature.providers.mjs +0 -14
  59. package/esm2022/lib/services/feature/feature.service.mjs +0 -141
  60. package/esm2022/lib/services/feature/index.mjs +0 -5
  61. package/esm2022/lib/services/shell/noop.extension.mjs +0 -13
  62. package/esm2022/lib/services/shell/requirements.parser.mjs +0 -7
  63. package/esm2022/lib/services/shell/shell.bootstrap.mjs +0 -84
  64. package/esm2022/lib/services/shell/shell.providers.mjs +0 -20
  65. package/esm2022/lib/services/shell/shell.service.mjs +0 -456
  66. package/esm2022/lib/services/shell-config/shell-config.const.mjs +0 -17
  67. package/esm2022/lib/services/shell-config/shell-config.interface.mjs +0 -2
  68. package/esm2022/lib/services/shell-config/shell-config.service.mjs +0 -100
  69. package/esm2022/lib/services/shell-notifications/shell-notifications.interface.mjs +0 -2
  70. package/esm2022/lib/services/shell-notifications/shell-notifications.service.mjs +0 -84
  71. package/esm2022/lib/tile-extension.interface.mjs +0 -2
  72. package/esm2022/yuuvis-client-shell-core.mjs +0 -5
@@ -1,101 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, ElementRef, EventEmitter, HostListener, Output } from '@angular/core';
3
- import { FormsModule } from '@angular/forms';
4
- import { CommandPaletteService } from '../command-palette.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../command-palette.service";
7
- import * as i2 from "@angular/common";
8
- import * as i3 from "@angular/forms";
9
- export class CommandPaletteComponent {
10
- set currentCommandIndex(i) {
11
- if (i > this.commands.length - 1) {
12
- i = 0;
13
- }
14
- else if (i < 0) {
15
- i = this.commands.length - 1;
16
- }
17
- this._cci = i;
18
- setTimeout(() => {
19
- const el = this.elRef.nativeElement.querySelector('.current');
20
- if (el)
21
- el.scrollIntoView(false);
22
- }, 0);
23
- }
24
- get currentCommandIndex() {
25
- return this._cci;
26
- }
27
- onArrowDown(e) {
28
- e.preventDefault();
29
- e.stopPropagation();
30
- this.currentCommandIndex++;
31
- }
32
- onArrowUp(e) {
33
- e.preventDefault();
34
- e.stopPropagation();
35
- this.currentCommandIndex--;
36
- }
37
- onEnter() {
38
- this.triggerCommand();
39
- }
40
- constructor(cmdService, elRef) {
41
- this.cmdService = cmdService;
42
- this.elRef = elRef;
43
- this._commands = [];
44
- this._cci = -1;
45
- this.commands = [];
46
- this.searchTerm = '';
47
- this.keepFocus = true;
48
- this.disabledCauses = this.cmdService.disabledCauses;
49
- this.searchTermChange = new EventEmitter();
50
- this.placeholder = this.cmdService.placeholder;
51
- }
52
- onTermChange(term) {
53
- const regExp = new RegExp(term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi');
54
- this.commands = [...this._commands.filter((c) => c.label.match(regExp))];
55
- this.currentCommandIndex = 0;
56
- }
57
- onInputBlur() {
58
- if (this.keepFocus && !this.disabledCauses.length) {
59
- this.elRef.nativeElement.querySelector('input').focus();
60
- }
61
- }
62
- triggerCommand(command) {
63
- if (command || this.commands[this.currentCommandIndex]) {
64
- this.cmdService.triggerCommand(command || this.commands[this.currentCommandIndex]);
65
- }
66
- }
67
- highlight(txt) {
68
- if (txt) {
69
- const re = new RegExp(this.searchTerm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi');
70
- return txt.replace(re, '<mark>$&</mark>');
71
- }
72
- else {
73
- return txt;
74
- }
75
- }
76
- ngOnInit() {
77
- this._commands = this.cmdService.getCommands();
78
- this.commands = [...this._commands];
79
- }
80
- ngAfterViewInit() {
81
- this.onInputBlur();
82
- }
83
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: CommandPaletteComponent, deps: [{ token: i1.CommandPaletteService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
84
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: CommandPaletteComponent, isStandalone: true, selector: "yuv-command-palette", outputs: { searchTermChange: "searchTermChange" }, host: { listeners: { "keydown.arrowDown": "onArrowDown($event)", "keydown.arrowUp": "onArrowUp($event)", "keydown.Enter": "onEnter($event)" } }, ngImport: i0, template: "@if (!disabledCauses.length) {\n <div class=\"search\">\n <input type=\"text\" autofocus [placeholder]=\"placeholder\" [(ngModel)]=\"searchTerm\" (blur)=\"onInputBlur()\" (ngModelChange)=\"onTermChange($event)\" />\n @if (message) {\n <div class=\"message\">{{ message }}</div>\n }\n </div>\n\n <div class=\"commands\">\n @for (c of commands; track c.id; let i = $index) {\n <div class=\"command\" [ngStyle]=\"{ '--i': i }\" [ngClass]=\"{ current: i === currentCommandIndex }\" (click)=\"triggerCommand(c)\">\n <div class=\"label\" [innerHTML]=\"highlight(c.label)\"></div>\n <div class=\"desc\" [innerHTML]=\"highlight(c?.description)\"></div>\n </div>\n }\n </div>\n} @else {\n <div class=\"disabled\">\n @for (c of disabledCauses; track c.id) {\n <div class=\"disabled-cause\">{{ c.message }}</div>\n }\n </div>\n}\n", styles: [":host{display:grid;grid-template-rows:auto 2fr;grid-template-columns:1fr;grid-template-areas:\"search\" \"commands\";overflow:hidden}:host .search{display:flex;flex-flow:column;align-items:center;justify-content:flex-end;grid-area:search}:host .search input{background-color:transparent;border:0;outline:0;font-size:2em;padding:var(--ymt-spacing-m);color:var(--ymt-text-color);border-bottom:1px solid var(--ymt-outline-variant)}:host .search input::placeholder{font-size:.6em;opacity:.4}:host .search .message{background:var(--ymt-primary);margin:2px;padding:.2em .5em;border-radius:2px;box-sizing:border-box}:host .commands{box-sizing:border-box;grid-area:commands;overflow-y:auto;display:flex;flex-flow:column;-ms-overflow-style:none;scrollbar-width:none}:host .commands::-webkit-scrollbar{display:none}:host .commands .command{opacity:0;animation:commandEnter .15s ease-in-out .2s forwards;animation-delay:calc(var(--i) * 50ms);width:var(--cmp-width);min-width:var(--cmp-min-width);box-sizing:border-box;padding:var(--ymt-spacing-m);transition:background-color .2s ease-in-out;cursor:pointer;border-radius:2px}:host .commands .command.current{background-color:var(--ymt-focus-background)}:host .commands .command:not(.current):hover{background-color:var(--ymt-hover-background)}:host .commands .command ::ng-deep mark{position:relative;display:inline-block;background-color:transparent;color:var(--ymt-text-color)}:host .commands .command ::ng-deep mark:after{content:\"\";position:absolute;bottom:-3px;height:2px;border-radius:1px;background-color:var(--ymt-text-color-subtle);left:0;right:0}:host .commands .command .desc{font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle);margin-top:.5em}:host .disabled{grid-row:1/span 2;display:flex;flex-flow:column;align-items:center;justify-content:center}@keyframes commandEnter{0%{opacity:0}to{opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
85
- }
86
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: CommandPaletteComponent, decorators: [{
87
- type: Component,
88
- args: [{ selector: 'yuv-command-palette', standalone: true, imports: [CommonModule, FormsModule], template: "@if (!disabledCauses.length) {\n <div class=\"search\">\n <input type=\"text\" autofocus [placeholder]=\"placeholder\" [(ngModel)]=\"searchTerm\" (blur)=\"onInputBlur()\" (ngModelChange)=\"onTermChange($event)\" />\n @if (message) {\n <div class=\"message\">{{ message }}</div>\n }\n </div>\n\n <div class=\"commands\">\n @for (c of commands; track c.id; let i = $index) {\n <div class=\"command\" [ngStyle]=\"{ '--i': i }\" [ngClass]=\"{ current: i === currentCommandIndex }\" (click)=\"triggerCommand(c)\">\n <div class=\"label\" [innerHTML]=\"highlight(c.label)\"></div>\n <div class=\"desc\" [innerHTML]=\"highlight(c?.description)\"></div>\n </div>\n }\n </div>\n} @else {\n <div class=\"disabled\">\n @for (c of disabledCauses; track c.id) {\n <div class=\"disabled-cause\">{{ c.message }}</div>\n }\n </div>\n}\n", styles: [":host{display:grid;grid-template-rows:auto 2fr;grid-template-columns:1fr;grid-template-areas:\"search\" \"commands\";overflow:hidden}:host .search{display:flex;flex-flow:column;align-items:center;justify-content:flex-end;grid-area:search}:host .search input{background-color:transparent;border:0;outline:0;font-size:2em;padding:var(--ymt-spacing-m);color:var(--ymt-text-color);border-bottom:1px solid var(--ymt-outline-variant)}:host .search input::placeholder{font-size:.6em;opacity:.4}:host .search .message{background:var(--ymt-primary);margin:2px;padding:.2em .5em;border-radius:2px;box-sizing:border-box}:host .commands{box-sizing:border-box;grid-area:commands;overflow-y:auto;display:flex;flex-flow:column;-ms-overflow-style:none;scrollbar-width:none}:host .commands::-webkit-scrollbar{display:none}:host .commands .command{opacity:0;animation:commandEnter .15s ease-in-out .2s forwards;animation-delay:calc(var(--i) * 50ms);width:var(--cmp-width);min-width:var(--cmp-min-width);box-sizing:border-box;padding:var(--ymt-spacing-m);transition:background-color .2s ease-in-out;cursor:pointer;border-radius:2px}:host .commands .command.current{background-color:var(--ymt-focus-background)}:host .commands .command:not(.current):hover{background-color:var(--ymt-hover-background)}:host .commands .command ::ng-deep mark{position:relative;display:inline-block;background-color:transparent;color:var(--ymt-text-color)}:host .commands .command ::ng-deep mark:after{content:\"\";position:absolute;bottom:-3px;height:2px;border-radius:1px;background-color:var(--ymt-text-color-subtle);left:0;right:0}:host .commands .command .desc{font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle);margin-top:.5em}:host .disabled{grid-row:1/span 2;display:flex;flex-flow:column;align-items:center;justify-content:center}@keyframes commandEnter{0%{opacity:0}to{opacity:1}}\n"] }]
89
- }], ctorParameters: () => [{ type: i1.CommandPaletteService }, { type: i0.ElementRef }], propDecorators: { searchTermChange: [{
90
- type: Output
91
- }], onArrowDown: [{
92
- type: HostListener,
93
- args: ['keydown.arrowDown', ['$event']]
94
- }], onArrowUp: [{
95
- type: HostListener,
96
- args: ['keydown.arrowUp', ['$event']]
97
- }], onEnter: [{
98
- type: HostListener,
99
- args: ['keydown.Enter', ['$event']]
100
- }] } });
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1wYWxldHRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlL3NyYy9saWIvc2VydmljZXMvY29tbWFuZC1wYWxldHRlL2NvbW1hbmQtcGFsZXR0ZS9jb21tYW5kLXBhbGV0dGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9jb21tYW5kLXBhbGV0dGUvY29tbWFuZC1wYWxldHRlL2NvbW1hbmQtcGFsZXR0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7QUFTbkUsTUFBTSxPQUFPLHVCQUF1QjtJQUdsQyxJQUFJLG1CQUFtQixDQUFDLENBQVM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNSLENBQUM7YUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQixDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUVkLFVBQVUsQ0FBQyxH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QyxPQUFPLENBQUMsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQzsrR0FuRlUsdUJBQXVCO21HQUF2Qix1QkFBdUIsbVJDYnBDLGszQkF1QkEsdTRERGRZLFlBQVksaU5BQUUsV0FBVzs7NEZBSXhCLHVCQUF1QjtrQkFQbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQzttSEE4QjFCLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFd0MsV0FBVztzQkFBekQsWUFBWTt1QkFBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFLQSxTQUFTO3NCQUFyRCxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUtBLE9BQU87c0JBQWpELFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvbW1hbmRQYWxldHRlQ29tbWFuZCwgRGlzYWJsZWRDYXVzZSB9IGZyb20gJy4uL2NvbW1hbmQtcGFsZXR0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29tbWFuZFBhbGV0dGVTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbWFuZC1wYWxldHRlLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd5dXYtY29tbWFuZC1wYWxldHRlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tbWFuZC1wYWxldHRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NvbW1hbmQtcGFsZXR0ZS5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWFuZFBhbGV0dGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIF9jb21tYW5kczogQ29tbWFuZFBhbGV0dGVDb21tYW5kW10gPSBbXTtcbiAgcHJpdmF0ZSBfY2NpID0gLTE7XG4gIHNldCBjdXJyZW50Q29tbWFuZEluZGV4KGk6IG51bWJlcikge1xuICAgIGlmIChpID4gdGhpcy5jb21tYW5kcy5sZW5ndGggLSAxKSB7XG4gICAgICBpID0gMDtcbiAgICB9IGVsc2UgaWYgKGkgPCAwKSB7XG4gICAgICBpID0gdGhpcy5jb21tYW5kcy5sZW5ndGggLSAxO1xuICAgIH1cbiAgICB0aGlzLl9jY2kgPSBpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuY3VycmVudCcpO1xuICAgICAgaWYgKGVsKSBlbC5zY3JvbGxJbnRvVmlldyhmYWxzZSk7XG4gICAgfSwgMCk7XG4gIH1cbiAgZ2V0IGN1cnJlbnRDb21tYW5kSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NjaTtcbiAgfVxuICBjb21tYW5kczogQ29tbWFuZFBhbGV0dGVDb21tYW5kW10gPSBbXTtcbiAgc2VhcmNoVGVybSA9ICcnO1xuICBrZWVwRm9jdXMgPSB0cnVlO1xuICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGRpc2FibGVkQ2F1c2VzOiBEaXNhYmxlZENhdXNlW10gPSB0aGlzLmNtZFNlcnZpY2UuZGlzYWJsZWRDYXVzZXM7XG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgQE91dHB1dCgpIHNlYXJjaFRlcm1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93RG93bicsIFsnJGV2ZW50J10pIG9uQXJyb3dEb3duKGU6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmN1cnJlbnRDb21tYW5kSW5kZXgrKztcbiAgfVxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93VXAnLCBbJyRldmVudCddKSBvbkFycm93VXAoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY3VycmVudENvbW1hbmRJbmRleC0tO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uRW50ZXInLCBbJyRldmVudCddKSBvbkVudGVyKCkge1xuICAgIHRoaXMudHJpZ2dlckNvbW1hbmQoKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY21kU2VydmljZTogQ29tbWFuZFBhbGV0dGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHRoaXMuY21kU2VydmljZS5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIG9uVGVybUNoYW5nZSh0ZXJtOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZWdFeHAgPSBuZXcgUmVnRXhwKHRlcm0ucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKSwgJ2dpJyk7XG4gICAgdGhpcy5jb21tYW5kcyA9IFsuLi50aGlzLl9jb21tYW5kcy5maWx0ZXIoKGMpID0+IGMubGFiZWwubWF0Y2gocmVnRXhwKSldO1xuICAgIHRoaXMuY3VycmVudENvbW1hbmRJbmRleCA9IDA7XG4gIH1cblxuICBvbklucHV0Qmx1cigpIHtcbiAgICBpZiAodGhpcy5rZWVwRm9jdXMgJiYgIXRoaXMuZGlzYWJsZWRDYXVzZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJDb21tYW5kKGNvbW1hbmQ/OiBDb21tYW5kUGFsZXR0ZUNvbW1hbmQpIHtcbiAgICBpZiAoY29tbWFuZCB8fCB0aGlzLmNvbW1hbmRzW3RoaXMuY3VycmVudENvbW1hbmRJbmRleF0pIHtcbiAgICAgIHRoaXMuY21kU2VydmljZS50cmlnZ2VyQ29tbWFuZChjb21tYW5kIHx8IHRoaXMuY29tbWFuZHNbdGhpcy5jdXJyZW50Q29tbWFuZEluZGV4XSk7XG4gICAgfVxuICB9XG5cbiAgaGlnaGxpZ2h0KHR4dDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHh0KSB7XG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAodGhpcy5zZWFyY2hUZXJtLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyksICdnaScpO1xuICAgICAgcmV0dXJuIHR4dC5yZXBsYWNlKHJlLCAnPG1hcms+JCY8L21hcms+Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0eHQ7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWFuZHMgPSB0aGlzLmNtZFNlcnZpY2UuZ2V0Q29tbWFuZHMoKTtcbiAgICB0aGlzLmNvbW1hbmRzID0gWy4uLnRoaXMuX2NvbW1hbmRzXTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLm9uSW5wdXRCbHVyKCk7XG4gIH1cbn1cbiIsIkBpZiAoIWRpc2FibGVkQ2F1c2VzLmxlbmd0aCkge1xuICA8ZGl2IGNsYXNzPVwic2VhcmNoXCI+XG4gICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgYXV0b2ZvY3VzIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFsobmdNb2RlbCldPVwic2VhcmNoVGVybVwiIChibHVyKT1cIm9uSW5wdXRCbHVyKClcIiAobmdNb2RlbENoYW5nZSk9XCJvblRlcm1DaGFuZ2UoJGV2ZW50KVwiIC8+XG4gICAgQGlmIChtZXNzYWdlKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPnt7IG1lc3NhZ2UgfX08L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjb21tYW5kc1wiPlxuICAgIEBmb3IgKGMgb2YgY29tbWFuZHM7IHRyYWNrIGMuaWQ7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiY29tbWFuZFwiIFtuZ1N0eWxlXT1cInsgJy0taSc6IGkgfVwiIFtuZ0NsYXNzXT1cInsgY3VycmVudDogaSA9PT0gY3VycmVudENvbW1hbmRJbmRleCB9XCIgKGNsaWNrKT1cInRyaWdnZXJDb21tYW5kKGMpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbFwiIFtpbm5lckhUTUxdPVwiaGlnaGxpZ2h0KGMubGFiZWwpXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjXCIgW2lubmVySFRNTF09XCJoaWdobGlnaHQoYz8uZGVzY3JpcHRpb24pXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxufSBAZWxzZSB7XG4gIDxkaXYgY2xhc3M9XCJkaXNhYmxlZFwiPlxuICAgIEBmb3IgKGMgb2YgZGlzYWJsZWRDYXVzZXM7IHRyYWNrIGMuaWQpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJkaXNhYmxlZC1jYXVzZVwiPnt7IGMubWVzc2FnZSB9fTwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1wYWxldHRlLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlL3NyYy9saWIvc2VydmljZXMvY29tbWFuZC1wYWxldHRlL2NvbW1hbmQtcGFsZXR0ZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFBhbGV0dGVNb2R1bGVDb25maWcge1xuICAvLyBLZXkgdGhhdCBzaG91bGQgdHJpZ2dlciB0aGUgY29tbWFuZGVyLlxuICAvLyBIaXR0aW5nIHRoaXMga2V5IHR3aWNlIHdpbGwgb3BlbiB0aGUgY29tbWFuZGVyIG92ZXJsYXlcbiAgdHJpZ2dlcktleT86IHN0cmluZztcbiAgYWNjZW50Q29sb3I/OiBzdHJpbmc7XG4gIC8vIGNob29zZSBhIGNoYXJhY3RlciB0aGF0IGVudGVycyBzZWFyY2ggbW9kZVxuICAvLyBTZXR0aW5nIHRoaXMgdmFsdWUgd2lsIHNldCB0aGUgY29tcG9uZW50IHRvIHNlYXJjaCBtb2RlLiBUaGlzIHdpbGwgdGhlIGVtaXQgdGhlXG4gIC8vIGVudGVyZWQgdGVybSBpbnN0ZWFkIG9mIGZpbHRlcmluZyB0aGUgbGlzdCBvZiBjb21tYW5kcyBzbyB5b3UgY2FuIGUuZy4gdHJpZ2dlciBhXG4gIC8vIGZ1bGx0ZXh0IHNlYXJjaCBhbmQgZGlzcGxheSB0aGUgcmVzdWx0cy5cbiAgc2VhcmNoTW9kZUluZGljYXRvcj86IHN0cmluZztcbiAgLy8gUGxhY2Vob2xkZXIgZm9yIGNvbW1hbmQgcGFsZXR0cyBpbnB1dCBmaWVsZFxuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUGFsZXR0ZUNvbW1hbmQge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgY2FsbGJhY2s/OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc2FibGVkQ2F1c2Uge1xuICBpZDogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG59XG4iXX0=
@@ -1,120 +0,0 @@
1
- import { Injectable, inject } from '@angular/core';
2
- import { MatDialog } from '@angular/material/dialog';
3
- import { ReplaySubject, Subject, debounceTime, fromEvent } from 'rxjs';
4
- import { filter, map, tap } from 'rxjs/operators';
5
- import { CommandPaletteComponent } from './command-palette/command-palette.component';
6
- import * as i0 from "@angular/core";
7
- export class CommandPaletteService {
8
- #dialog;
9
- #dialogRef;
10
- constructor() {
11
- this.#dialog = inject(MatDialog);
12
- this.actionKey = 'Control';
13
- this._ac = 0;
14
- this.overlayVisible = false;
15
- this.disabledCauses = [];
16
- this.placeholder = '';
17
- this.overlayVisibleSource = new ReplaySubject();
18
- this.overlayVisible$ = this.overlayVisibleSource.asObservable();
19
- this.commands = [];
20
- this.commandSource = new Subject();
21
- this.command$ = this.commandSource.asObservable();
22
- fromEvent(document, 'keyup')
23
- .pipe(debounceTime(100), map((e) => e), tap((e) => {
24
- if (e.key === this.actionKey)
25
- this._actionKeyClick();
26
- }))
27
- .subscribe();
28
- }
29
- getCommands() {
30
- const commands = Object.values(this.commands);
31
- return commands;
32
- }
33
- registerCommand(command) {
34
- this.commands.push(command);
35
- this._processCommands();
36
- return this.command$.pipe(filter((c) => c.id === command.id));
37
- }
38
- registerCommands(commands) {
39
- this.commands = [...this.commands, ...commands];
40
- this._processCommands();
41
- return this.command$.pipe(filter((cmd) => commands.map((c) => c.id).includes(cmd.id)));
42
- }
43
- unregisterCommand(id) {
44
- this.unregisterCommands([id]);
45
- }
46
- unregisterCommands(ids) {
47
- this.commands = this.commands.filter((c) => !ids.includes(c.id));
48
- }
49
- /**
50
- * Updates the properties of the registered commands. This is usefull when
51
- * the language of the app changes and you want to update the commands labels.
52
- * Based on the IDs propeties of the registered commands will be updated.
53
- * @param cmds Commands containing the updated properties
54
- */
55
- updateCommands(cmds) {
56
- const exCmdQA = {};
57
- cmds.forEach((c) => (exCmdQA[c.id] = c));
58
- const updatedCommands = this.commands.map((c) => (exCmdQA[c.id] ? exCmdQA[c.id] : c));
59
- this.commands = updatedCommands;
60
- }
61
- triggerCommand(cmd) {
62
- this.commandSource.next(cmd);
63
- if (cmd.callback)
64
- cmd.callback();
65
- this.#dialogRef?.close();
66
- }
67
- addDisabledCause(cause) {
68
- const existingCauseIndex = this.disabledCauses.findIndex((c) => c.id === cause.id);
69
- if (existingCauseIndex === -1) {
70
- this.disabledCauses.push(cause);
71
- }
72
- else {
73
- this.disabledCauses[existingCauseIndex].message = cause.message;
74
- }
75
- }
76
- removeDisabledCause(id) {
77
- this.disabledCauses = this.disabledCauses.filter((c) => c.id !== id);
78
- }
79
- removeAllDisabledCauses() {
80
- this.disabledCauses = [];
81
- }
82
- _processCommands() {
83
- // sort the commands
84
- this.commands.sort((a, b) => (a.label > b.label ? 1 : a.label === b.label ? 0 : -1));
85
- }
86
- _actionKeyClick() {
87
- this._ac++;
88
- if (this._ac === 2) {
89
- this.appendComponentToBody();
90
- this._ac = 0;
91
- }
92
- else if (this._ac === 1) {
93
- setTimeout(() => {
94
- this._ac = 0;
95
- }, 300);
96
- }
97
- }
98
- appendComponentToBody() {
99
- if (!this.overlayVisible) {
100
- this.#dialogRef = this.#dialog.open(CommandPaletteComponent);
101
- this.#dialogRef
102
- .afterClosed()
103
- .subscribe(() => {
104
- this.overlayVisible = false;
105
- this.overlayVisibleSource.next(this.overlayVisible);
106
- });
107
- this.overlayVisible = true;
108
- this.overlayVisibleSource.next(this.overlayVisible);
109
- }
110
- }
111
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: CommandPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
112
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: CommandPaletteService, providedIn: 'root' }); }
113
- }
114
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: CommandPaletteService, decorators: [{
115
- type: Injectable,
116
- args: [{
117
- providedIn: 'root'
118
- }]
119
- }], ctorParameters: () => [] });
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1wYWxldHRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwtY29yZS9zcmMvbGliL3NlcnZpY2VzL2NvbW1hbmQtcGFsZXR0ZS9jb21tYW5kLXBhbGV0dGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBYyxhQUFhLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkNBQTZDLENBQUM7O0FBS3RGLE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsT0FBTyxDQUFxQjtJQUk1QixVQUFVLENBQW9EO0lBYTlEO1FBakJBLFlBQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbkIsY0FBUyxHQUFXLFNBQVMsQ0FBQztRQUMvQixRQUFHLEdBQUcsQ0FBQyxDQUFDO1FBR1IsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDL0IsbUJBQWMsR0FBb0IsRUFBRSxDQUFDO1FBQ3JDLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ1QseUJBQW9CLEdBQUcsSUFBSSxhQUFhLEVBQVcsQ0FBQztRQUNyRCxvQkFBZSxHQUF3QixJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFL0UsYUFBUSxHQUE0QixFQUFFLENBQUM7UUFDdkMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztRQUN0RCxhQUFRLEdBQXND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b20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgZGVib3VuY2VUaW1lLCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21tYW5kUGFsZXR0ZUNvbW1hbmQsIERpc2FibGVkQ2F1c2UgfSBmcm9tICcuL2NvbW1hbmQtcGFsZXR0ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29tbWFuZFBhbGV0dGVDb21wb25lbnQgfSBmcm9tICcuL2NvbW1hbmQtcGFsZXR0ZS9jb21tYW5kLXBhbGV0dGUuY29tcG9uZW50JztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWFuZFBhbGV0dGVTZXJ2aWNlIHtcbiAgI2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuXG4gIHJlYWRvbmx5IGFjdGlvbktleTogc3RyaW5nID0gJ0NvbnRyb2wnO1xuICBwcml2YXRlIF9hYyA9IDA7XG4gICNkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxDb21tYW5kUGFsZXR0ZUNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBvdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICBkaXNhYmxlZENhdXNlczogRGlzYWJsZWRDYXVzZVtdID0gW107XG4gIHBsYWNlaG9sZGVyID0gJyc7XG4gIHByaXZhdGUgb3ZlcmxheVZpc2libGVTb3VyY2UgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigpO1xuICBwdWJsaWMgb3ZlcmxheVZpc2libGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5vdmVybGF5VmlzaWJsZVNvdXJjZS5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIGNvbW1hbmRzOiBDb21tYW5kUGFsZXR0ZUNvbW1hbmRbXSA9IFtdO1xuICBwcml2YXRlIGNvbW1hbmRTb3VyY2UgPSBuZXcgU3ViamVjdDxDb21tYW5kUGFsZXR0ZUNvbW1hbmQ+KCk7XG4gIHB1YmxpYyBjb21tYW5kJDogT2JzZXJ2YWJsZTxDb21tYW5kUGFsZXR0ZUNvbW1hbmQ+ID0gdGhpcy5jb21tYW5kU291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIG9uU2VhcmNoVGVybSE6ICh0ZXJtOiBzdHJpbmcsIGNiOiAocmVzOiBDb21tYW5kUGFsZXR0ZUNvbW1hbmRbXSkgPT4gdm9pZCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZnJvbUV2ZW50KGRvY3VtZW50LCAna2V5dXAnKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgxMDApLFxuICAgICAgICBtYXAoKGU6IEV2ZW50KSA9PiBlIGFzIEtleWJvYXJkRXZlbnQpLFxuICAgICAgICB0YXAoKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5rZXkgPT09IHRoaXMuYWN0aW9uS2V5KSB0aGlzLl9hY3Rpb25LZXlDbGljaygpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZ2V0Q29tbWFuZHMoKTogQ29tbWFuZFBhbGV0dGVDb21tYW5kW10ge1xuICAgIGNvbnN0IGNvbW1hbmRzOiBDb21tYW5kUGFsZXR0ZUNvbW1hbmRbXSA9IE9iamVjdC52YWx1ZXModGhpcy5jb21tYW5kcyk7XG4gICAgcmV0dXJuIGNvbW1hbmRzO1xuICB9XG5cbiAgcmVnaXN0ZXJDb21tYW5kKGNvbW1hbmQ6IENvbW1hbmRQYWxldHRlQ29tbWFuZCk6IE9ic2VydmFibGU8Q29tbWFuZFBhbGV0dGVDb21tYW5kPiB7XG4gICAgdGhpcy5jb21tYW5kcy5wdXNoKGNvbW1hbmQpO1xuICAgIHRoaXMuX3Byb2Nlc3NDb21tYW5kcygpO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQkLnBpcGUoZmlsdGVyKChjKSA9PiBjLmlkID09PSBjb21tYW5kLmlkKSk7XG4gIH1cblxuICByZWdpc3RlckNvbW1hbmRzKGNvbW1hbmRzOiBDb21tYW5kUGFsZXR0ZUNvbW1hbmRbXSk6IE9ic2VydmFibGU8Q29tbWFuZFBhbGV0dGVDb21tYW5kPiB7XG4gICAgdGhpcy5jb21tYW5kcyA9IFsuLi50aGlzLmNvbW1hbmRzLCAuLi5jb21tYW5kc107XG4gICAgdGhpcy5fcHJvY2Vzc0NvbW1hbmRzKCk7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZCQucGlwZShmaWx0ZXIoKGNtZCkgPT4gY29tbWFuZHMubWFwKChjKSA9PiBjLmlkKS5pbmNsdWRlcyhjbWQuaWQpKSk7XG4gIH1cblxuICB1bnJlZ2lzdGVyQ29tbWFuZChpZDogc3RyaW5nKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyQ29tbWFuZHMoW2lkXSk7XG4gIH1cblxuICB1bnJlZ2lzdGVyQ29tbWFuZHMoaWRzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuY29tbWFuZHMgPSB0aGlzLmNvbW1hbmRzLmZpbHRlcigoYykgPT4gIWlkcy5pbmNsdWRlcyhjLmlkKSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmVnaXN0ZXJlZCBjb21tYW5kcy4gVGhpcyBpcyB1c2VmdWxsIHdoZW5cbiAgICogdGhlIGxhbmd1YWdlIG9mIHRoZSBhcHAgY2hhbmdlcyBhbmQgeW91IHdhbnQgdG8gdXBkYXRlIHRoZSBjb21tYW5kcyBsYWJlbHMuXG4gICAqIEJhc2VkIG9uIHRoZSBJRHMgcHJvcGV0aWVzIG9mIHRoZSByZWdpc3RlcmVkIGNvbW1hbmRzIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHBhcmFtIGNtZHMgQ29tbWFuZHMgY29udGFpbmluZyB0aGUgdXBkYXRlZCBwcm9wZXJ0aWVzXG4gICAqL1xuICB1cGRhdGVDb21tYW5kcyhjbWRzOiBDb21tYW5kUGFsZXR0ZUNvbW1hbmRbXSkge1xuICAgIGNvbnN0IGV4Q21kUUE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjbWRzLmZvckVhY2goKGMpID0+IChleENtZFFBW2MuaWRdID0gYykpO1xuXG4gICAgY29uc3QgdXBkYXRlZENvbW1hbmRzID0gdGhpcy5jb21tYW5kcy5tYXAoKGMpID0+IChleENtZFFBW2MuaWRdID8gZXhDbWRRQVtjLmlkXSA6IGMpKTtcbiAgICB0aGlzLmNvbW1hbmRzID0gdXBkYXRlZENvbW1hbmRzO1xuICB9XG5cbiAgdHJpZ2dlckNvbW1hbmQoY21kOiBDb21tYW5kUGFsZXR0ZUNvbW1hbmQpIHtcbiAgICB0aGlzLmNvbW1hbmRTb3VyY2UubmV4dChjbWQpO1xuICAgIGlmIChjbWQuY2FsbGJhY2spIGNtZC5jYWxsYmFjaygpO1xuICAgIHRoaXMuI2RpYWxvZ1JlZj8uY2xvc2UoKTtcbiAgfVxuXG4gIGFkZERpc2FibGVkQ2F1c2UoY2F1c2U6IERpc2FibGVkQ2F1c2UpIHtcbiAgICBjb25zdCBleGlzdGluZ0NhdXNlSW5kZXggPSB0aGlzLmRpc2FibGVkQ2F1c2VzLmZpbmRJbmRleCgoYykgPT4gYy5pZCA9PT0gY2F1c2UuaWQpO1xuICAgIGlmIChleGlzdGluZ0NhdXNlSW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmRpc2FibGVkQ2F1c2VzLnB1c2goY2F1c2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVkQ2F1c2VzW2V4aXN0aW5nQ2F1c2VJbmRleF0ubWVzc2FnZSA9IGNhdXNlLm1lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRGlzYWJsZWRDYXVzZShpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5kaXNhYmxlZENhdXNlcyA9IHRoaXMuZGlzYWJsZWRDYXVzZXMuZmlsdGVyKChjKSA9PiBjLmlkICE9PSBpZCk7XG4gIH1cblxuICByZW1vdmVBbGxEaXNhYmxlZENhdXNlcygpIHtcbiAgICB0aGlzLmRpc2FibGVkQ2F1c2VzID0gW107XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzQ29tbWFuZHMoKSB7XG4gICAgLy8gc29ydCB0aGUgY29tbWFuZHNcbiAgICB0aGlzLmNvbW1hbmRzLnNvcnQoKGEsIGIpID0+IChhLmxhYmVsID4gYi5sYWJlbCA/IDEgOiBhLmxhYmVsID09PSBiLmxhYmVsID8gMCA6IC0xKSk7XG4gIH1cbiAgcHJpdmF0ZSBfYWN0aW9uS2V5Q2xpY2soKSB7XG4gICAgdGhpcy5fYWMrKztcbiAgICBpZiAodGhpcy5fYWMgPT09IDIpIHtcbiAgICAgIHRoaXMuYXBwZW5kQ29tcG9uZW50VG9Cb2R5KCk7XG4gICAgICB0aGlzLl9hYyA9IDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9hYyA9PT0gMSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2FjID0gMDtcbiAgICAgIH0sIDMwMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBlbmRDb21wb25lbnRUb0JvZHkoKSB7XG4gICAgaWYgKCF0aGlzLm92ZXJsYXlWaXNpYmxlKSB7XG4gICAgICB0aGlzLiNkaWFsb2dSZWYgPSB0aGlzLiNkaWFsb2cub3BlbihDb21tYW5kUGFsZXR0ZUNvbXBvbmVudCk7XG4gICAgICB0aGlzLiNkaWFsb2dSZWZcbiAgICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMub3ZlcmxheVZpc2libGVTb3VyY2UubmV4dCh0aGlzLm92ZXJsYXlWaXNpYmxlKTtcbiAgICAgICAgfSk7XG4gICAgICB0aGlzLm92ZXJsYXlWaXNpYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMub3ZlcmxheVZpc2libGVTb3VyY2UubmV4dCh0aGlzLm92ZXJsYXlWaXNpYmxlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,9 +0,0 @@
1
- import { inject } from '@angular/core';
2
- import { FeatureService } from './feature.service';
3
- export const canMatchFeature = (route) => {
4
- const featureService = inject(FeatureService);
5
- return (featureService.canMatchRequirements(route) &&
6
- featureService.canUseApp(route) &&
7
- featureService.canUseFeatureById(route.id));
8
- };
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlL3NyYy9saWIvc2VydmljZXMvZmVhdHVyZS9mZWF0dXJlLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdkMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQVksRUFBRSxFQUFFO0lBQzlDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxPQUFPLENBQ0wsY0FBYyxDQUFDLG9CQUFvQixDQUFDLEtBQXVCLENBQUM7UUFDNUQsY0FBYyxDQUFDLFNBQVMsQ0FBQyxLQUFZLENBQUM7UUFDdEMsY0FBYyxDQUFDLGlCQUFpQixDQUFFLEtBQWEsQ0FBQyxFQUFFLENBQUMsQ0FDcEQsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NsaWVudC1zaGVsbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRmVhdHVyZVNlcnZpY2UgfSBmcm9tICcuL2ZlYXR1cmUuc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBjYW5NYXRjaEZlYXR1cmUgPSAocm91dGU6IFJvdXRlKSA9PiB7XG4gIGNvbnN0IGZlYXR1cmVTZXJ2aWNlID0gaW5qZWN0KEZlYXR1cmVTZXJ2aWNlKTtcbiAgcmV0dXJuIChcbiAgICBmZWF0dXJlU2VydmljZS5jYW5NYXRjaFJlcXVpcmVtZW50cyhyb3V0ZSBhcyB7IGlkOiBzdHJpbmcgfSkgJiZcbiAgICBmZWF0dXJlU2VydmljZS5jYW5Vc2VBcHAocm91dGUgYXMgQXBwKSAmJlxuICAgIGZlYXR1cmVTZXJ2aWNlLmNhblVzZUZlYXR1cmVCeUlkKChyb3V0ZSBhcyBBcHApLmlkKVxuICApO1xufTtcbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwtY29yZS9zcmMvbGliL3NlcnZpY2VzL2ZlYXR1cmUvZmVhdHVyZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U2hlbGxGZWF0dXJlQ29uZmlnIHtcbiAgICBvYmplY3RJRDogc3RyaW5nO1xuICAgIGZlYXR1cmVzOiBDbGllbnRTaGVsbEZlYXR1cmVbXTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U2hlbGxGZWF0dXJlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIC8vIGxhYmVsIGZvciB0aGUgZmVhdHVyZVxuICAgIGxhYmVsPzogc3RyaW5nO1xuICAgIGV4dGVuc2lvbj86IGJvb2xlYW47XG4gICAgLy8gbGlzdCBvZiBhbGxvd2VkIGF1dGhvcml0aWVzIChyb2xlcykgZm9yIHRoaXMgZmVhdHVyZVxuICAgIGFsbG93ZWQ/OiBzdHJpbmdbXTtcbiAgICAvLyBsaXN0IG9mIGRlbmllZCBhdXRob3JpdGllcyAocm9sZXMpIGZvciB0aGlzIGZlYXR1cmVcbiAgICAvLyBkZW5pZWQgd2lsbCBvdmVycnVsZSBhbGxvd2VkXG4gICAgZGVuaWVkPzogc3RyaW5nW107IFxufSJdfQ==
@@ -1,14 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- export const CLIENT_SHELL_FEATURE_CONFIG = new InjectionToken('Feature configurations for client shell', {
3
- factory: () => undefined
4
- });
5
- export const provideClientShellFeatures = (featureConfig) => {
6
- return { provide: CLIENT_SHELL_FEATURE_CONFIG, useValue: featureConfig };
7
- };
8
- export const CLIENT_SHELL_FEATURE_CONFIG_ALWAYS_SHOW_NOTOFICATION = new InjectionToken('Always show notifications in client shell', {
9
- factory: () => false
10
- });
11
- export const provideClientShellAlwaysShowNotifications = (alwaysShow) => {
12
- return { provide: CLIENT_SHELL_FEATURE_CONFIG_ALWAYS_SHOW_NOTOFICATION, useValue: alwaysShow };
13
- };
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5wcm92aWRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwtY29yZS9zcmMvbGliL3NlcnZpY2VzL2ZlYXR1cmUvZmVhdHVyZS5wcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUd6RCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLGNBQWMsQ0FBdUMseUNBQXlDLEVBQUU7SUFDN0ksT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVM7Q0FDekIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxhQUF1QyxFQUFZLEVBQUU7SUFDOUYsT0FBTyxFQUFFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFDM0UsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0RBQW9ELEdBQUcsSUFBSSxjQUFjLENBQVUsMkNBQTJDLEVBQUU7SUFDM0ksT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUs7Q0FDckIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0seUNBQXlDLEdBQUcsQ0FBQyxVQUFtQixFQUFZLEVBQUU7SUFDekYsT0FBTyxFQUFFLE9BQU8sRUFBRSxvREFBb0QsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDakcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDbGllbnRTaGVsbEZlYXR1cmVDb25maWcgfSBmcm9tICcuL2ZlYXR1cmUuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNvbnN0IENMSUVOVF9TSEVMTF9GRUFUVVJFX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxDbGllbnRTaGVsbEZlYXR1cmVDb25maWcgfCB1bmRlZmluZWQ+KCdGZWF0dXJlIGNvbmZpZ3VyYXRpb25zIGZvciBjbGllbnQgc2hlbGwnLCB7XG4gIGZhY3Rvcnk6ICgpID0+IHVuZGVmaW5lZFxufSk7XG5cbmV4cG9ydCBjb25zdCBwcm92aWRlQ2xpZW50U2hlbGxGZWF0dXJlcyA9IChmZWF0dXJlQ29uZmlnOiBDbGllbnRTaGVsbEZlYXR1cmVDb25maWcpOiBQcm92aWRlciA9PiB7XG4gIHJldHVybiB7IHByb3ZpZGU6IENMSUVOVF9TSEVMTF9GRUFUVVJFX0NPTkZJRywgdXNlVmFsdWU6IGZlYXR1cmVDb25maWcgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBDTElFTlRfU0hFTExfRkVBVFVSRV9DT05GSUdfQUxXQVlTX1NIT1dfTk9UT0ZJQ0FUSU9OID0gbmV3IEluamVjdGlvblRva2VuPGJvb2xlYW4+KCdBbHdheXMgc2hvdyBub3RpZmljYXRpb25zIGluIGNsaWVudCBzaGVsbCcsIHtcbiAgZmFjdG9yeTogKCkgPT4gZmFsc2Vcbn0pO1xuXG5leHBvcnQgY29uc3QgcHJvdmlkZUNsaWVudFNoZWxsQWx3YXlzU2hvd05vdGlmaWNhdGlvbnMgPSAoYWx3YXlzU2hvdzogYm9vbGVhbik6IFByb3ZpZGVyID0+IHtcbiAgcmV0dXJuIHsgcHJvdmlkZTogQ0xJRU5UX1NIRUxMX0ZFQVRVUkVfQ09ORklHX0FMV0FZU19TSE9XX05PVE9GSUNBVElPTiwgdXNlVmFsdWU6IGFsd2F5c1Nob3cgfTtcbn07XG4iXX0=
@@ -1,141 +0,0 @@
1
- import { inject, Injectable } from '@angular/core';
2
- import { AVAILABLE_BACKEND_APPS, BackendService, CLIENT_APP_REQUIREMENTS } from '@yuuvis/client-core';
3
- import { YUV_USER } from '@yuuvis/client-core';
4
- import { of, switchMap, tap } from 'rxjs';
5
- import { SHELL_CONFIG_FEATURES } from '../shell-config/shell-config.const';
6
- import { ShellConfigService } from '../shell-config/shell-config.service';
7
- import { ShellService } from '../shell/shell.service';
8
- import { CLIENT_SHELL_FEATURE_CONFIG } from './feature.providers';
9
- import * as i0 from "@angular/core";
10
- export class FeatureService {
11
- #featureManagement = inject(AVAILABLE_BACKEND_APPS);
12
- #featureRequirements = inject(CLIENT_APP_REQUIREMENTS);
13
- #featureConfig = inject(CLIENT_SHELL_FEATURE_CONFIG);
14
- #userToken = inject(YUV_USER);
15
- #shell = inject(ShellService);
16
- #shellConfig = inject(ShellConfigService);
17
- #featureObjectId = this.#featureConfig?.objectID;
18
- #features = this.#featureConfig?.features || [];
19
- #backend = inject(BackendService);
20
- /**
21
- * Checks if a feature meets all its requirements.
22
- *
23
- * This method validates whether a feature (identified by its ID) can be enabled based on:
24
- * 1. Whether it has any defined requirements in the feature requirements configuration
25
- * 2. Whether all its requirements are present and enabled in the feature availability list
26
- *
27
- * @param fet - An object containing the feature ID to check
28
- * @param fet.id - The unique identifier of the feature (may include '.extension' suffix)
29
- * @returns `true` if the feature has no requirements or all requirements are enabled; `false` otherwise
30
- *
31
- * @remarks
32
- * - The method matches feature IDs exactly or with an optional '.extension' suffix
33
- * - Requirement names ending with '+' have the suffix removed before validation
34
- * - If no matching requirements are found, the feature is considered valid (returns `true`)
35
- * - All requirements must have a state of 'enabled' for the feature to pass validation
36
- */
37
- #matchesRequirements(feat) {
38
- const featureRequirements = this.#featureRequirements;
39
- const featureAvailability = this.#featureManagement;
40
- if (!featureRequirements)
41
- return true;
42
- // Check if fet.id matches exactly 'key' or 'key.extension'
43
- const matchingKey = Object.keys(featureRequirements).find((key) => new RegExp(`^${key}(\\.extension)?$`).test(feat.id));
44
- // If no matching key, return true
45
- if (!matchingKey) {
46
- return true;
47
- }
48
- // Get the requirements for the matching key
49
- const requirements = featureRequirements[matchingKey];
50
- // Check if all requirements are in avv with state 'enabled'
51
- return requirements.every((reqName) => {
52
- // Remove the '+' suffix if present
53
- const cleanReqName = reqName.replace(/\+$/, '');
54
- // Find the requirement in avv and check if it's enabled
55
- const found = featureAvailability.find((item) => item.name === cleanReqName);
56
- return found && found.state === 'enabled';
57
- });
58
- }
59
- hasFeatureConfig() {
60
- return !!this.#featureObjectId;
61
- }
62
- getFeatures() {
63
- return this.#features;
64
- }
65
- getAvailableApps(allApps) {
66
- return allApps.filter((app) => this.#matchesRequirements(app) && this.canUseApp(app) && this.canUseFeatureById(app.id));
67
- }
68
- canUseApp(app) {
69
- const authorities = this.#userToken?.authorities || [];
70
- const allowed = app.permissions?.allow || [];
71
- const denied = app.permissions?.deny || [];
72
- const isAllowed = allowed.length === 0 || authorities.some((authority) => allowed.includes(authority));
73
- const isDenied = denied.some((deniedAuthority) => authorities.includes(deniedAuthority));
74
- return isAllowed && !isDenied;
75
- }
76
- canMatchRequirements(app) {
77
- return this.#matchesRequirements({ id: app.id });
78
- }
79
- canUseFeatureById(featureId, authorities) {
80
- // check requirement
81
- if (!this.#matchesRequirements({ id: featureId }))
82
- return false;
83
- // check configuration from the backend (item filed in shell config)
84
- const feature = this.#features.find((f) => f.id === featureId);
85
- return !feature || this.canUseFeature(feature, authorities);
86
- }
87
- canUseFeature(feature, authorities) {
88
- const authoritiesToCheck = authorities || this.#userToken?.authorities || [];
89
- const allowed = feature.allowed || [];
90
- const denied = feature.denied || [];
91
- const isAllowed = allowed.length === 0 || authoritiesToCheck.some((authority) => allowed.includes(authority));
92
- const isDenied = denied.some((deniedAuthority) => authoritiesToCheck.includes(deniedAuthority));
93
- return isAllowed && !isDenied;
94
- }
95
- saveFeatureSettings(features) {
96
- if (!this.#featureObjectId) {
97
- throw new Error('No feature configuration object ID provided');
98
- }
99
- return this.#shellConfig.update(this.#featureObjectId, features).pipe(tap(() => (this.#features = features)));
100
- }
101
- deleteFeatureSettings() {
102
- if (!this.#featureObjectId) {
103
- throw new Error('No feature configuration object ID provided');
104
- }
105
- return this.#shellConfig.delete(this.#featureObjectId);
106
- }
107
- createSettingsObject() {
108
- return this.#shellConfig.create(SHELL_CONFIG_FEATURES, []).pipe(tap((res) => {
109
- this.#featureObjectId = res.id;
110
- }));
111
- }
112
- export() {
113
- if (this.#featureObjectId) {
114
- this.#shellConfig.download(this.#featureObjectId, `${SHELL_CONFIG_FEATURES}.json`);
115
- }
116
- }
117
- import() {
118
- // read files contents
119
- return this.#featureObjectId
120
- ? this.#shell.pickFile().pipe(switchMap((file) => file
121
- ? this.#shellConfig.upload(this.#featureObjectId, file).pipe(switchMap((res) => {
122
- // read uploaded file
123
- return this.#backend.get(`/dms/objects/${res.id}/contents/file`).pipe(tap((data) => {
124
- // update features
125
- //console.log('data', data);
126
- this.#features = data;
127
- }));
128
- }))
129
- : of(null)))
130
- : of(null);
131
- }
132
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FeatureService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
133
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FeatureService, providedIn: 'root' }); }
134
- }
135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: FeatureService, decorators: [{
136
- type: Injectable,
137
- args: [{
138
- providedIn: 'root'
139
- }]
140
- }] });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9mZWF0dXJlL2ZlYXR1cmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGNBQWMsRUFDZCx1QkFBdUIsRUFJeEIsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFLbEUsTUFBTSxPQUFPLGNBQWM7SUFDekIsa0JBQWtCLEdBQUcsTUFBTSxDQUE0QixzQkFBc0IsQ0FBQyxDQUFDO0lBQy9FLG9CQUFvQixHQUFHLE1BQU0sQ0FBZSx1QkFBdUIsQ0FBQyxDQUFDO0lBRXJFLGNBQWMsR0FBRyxNQUFNLENBQTJCLDJCQUEyQixDQUFDLENBQUM7SUFDL0UsVUFBVSxHQUFHLE1BQU0sQ0FBVSxRQUFRLENBQUMsQ0FBQztJQUN2QyxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlCLFlBQVksR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUMxQyxnQkFBZ0IsR0FBSSxJQUFJLENB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QjtRQUV0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0I7WUFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUN6QixTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNqQixJQUFJO2dCQUNGLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUN6RCxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDaEIscUJBQXFCO29CQUNyQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FDbkUsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ1gsa0JBQWtCO3dCQUNsQiw0QkFBNEI7d0JBRTVCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO29CQUN4QixDQUFDLENBQUMsQ0FDSCxDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUNIO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQ2IsQ0FDRjtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZixDQUFDOytHQTVKVSxjQUFjO21IQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQVZBSUxBQkxFX0JBQ0tFTkRfQVBQUyxcbiAgQmFja2VuZFNlcnZpY2UsXG4gIENMSUVOVF9BUFBfUkVRVUlSRU1FTlRTLFxuICBSZXF1aXJlbWVudHMsXG4gIFl1dkF2YWlsYWJsZUJhY2tlbmRBcHBzLFxuICBZdXZVc2VyXG59IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuXG5pbXBvcnQgeyBZVVZfVVNFUiB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBcHAgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2xpZW50LXNoZWxsLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTSEVMTF9DT05GSUdfRkVBVFVSRVMgfSBmcm9tICcuLi9zaGVsbC1jb25maWcvc2hlbGwtY29uZmlnLmNvbnN0JztcbmltcG9ydCB7IFNoZWxsQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NoZWxsLWNvbmZpZy9zaGVsbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBTaGVsbFNlcnZpY2UgfSBmcm9tICcuLi9zaGVsbC9zaGVsbC5zZXJ2aWNlJztcbmltcG9ydCB7IENsaWVudFNoZWxsRmVhdHVyZSwgQ2xpZW50U2hlbGxGZWF0dXJlQ29uZmlnIH0gZnJvbSAnLi9mZWF0dXJlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDTElFTlRfU0hFTExfRkVBVFVSRV9DT05GSUcgfSBmcm9tICcuL2ZlYXR1cmUucHJvdmlkZXJzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRmVhdHVyZVNlcnZpY2Uge1xuICAjZmVhdHVyZU1hbmFnZW1lbnQgPSBpbmplY3Q8WXV2QXZhaWxhYmxlQmFja2VuZEFwcHNbXT4oQVZBSUxBQkxFX0JBQ0tFTkRfQVBQUyk7XG4gICNmZWF0dXJlUmVxdWlyZW1lbnRzID0gaW5qZWN0PFJlcXVpcmVtZW50cz4oQ0xJRU5UX0FQUF9SRVFVSVJFTUVOVFMpO1xuXG4gICNmZWF0dXJlQ29uZmlnID0gaW5qZWN0PENsaWVudFNoZWxsRmVhdHVyZUNvbmZpZz4oQ0xJRU5UX1NIRUxMX0ZFQVRVUkVfQ09ORklHKTtcbiAgI3VzZXJUb2tlbiA9IGluamVjdDxZdXZVc2VyPihZVVZfVVNFUik7XG4gICNzaGVsbCA9IGluamVjdChTaGVsbFNlcnZpY2UpO1xuICAjc2hlbGxDb25maWcgPSBpbmplY3QoU2hlbGxDb25maWdTZXJ2aWNlKTtcbiAgI2ZlYXR1cmVPYmplY3RJZD8gPSB0aGlzLiNmZWF0dXJlQ29uZmlnPy5vYmplY3RJRDtcbiAgI2ZlYXR1cmVzID0gdGhpcy4jZmVhdHVyZUNvbmZpZz8uZmVhdHVyZXMgfHwgW107XG4gICNiYWNrZW5kID0gaW5qZWN0KEJhY2tlbmRTZXJ2aWNlKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgZmVhdHVyZSBtZWV0cyBhbGwgaXRzIHJlcXVpcmVtZW50cy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgdmFsaWRhdGVzIHdoZXRoZXIgYSBmZWF0dXJlIChpZGVudGlmaWVkIGJ5IGl0cyBJRCkgY2FuIGJlIGVuYWJsZWQgYmFzZWQgb246XG4gICAqIDEuIFdoZXRoZXIgaXQgaGFzIGFueSBkZWZpbmVkIHJlcXVpcmVtZW50cyBpbiB0aGUgZmVhdHVyZSByZXF1aXJlbWVudHMgY29uZmlndXJhdGlvblxuICAgKiAyLiBXaGV0aGVyIGFsbCBpdHMgcmVxdWlyZW1lbnRzIGFyZSBwcmVzZW50IGFuZCBlbmFibGVkIGluIHRoZSBmZWF0dXJlIGF2YWlsYWJpbGl0eSBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSBmZXQgLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZmVhdHVyZSBJRCB0byBjaGVja1xuICAgKiBAcGFyYW0gZmV0LmlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmZWF0dXJlIChtYXkgaW5jbHVkZSAnLmV4dGVuc2lvbicgc3VmZml4KVxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaGFzIG5vIHJlcXVpcmVtZW50cyBvciBhbGwgcmVxdWlyZW1lbnRzIGFyZSBlbmFibGVkOyBgZmFsc2VgIG90aGVyd2lzZVxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiAtIFRoZSBtZXRob2QgbWF0Y2hlcyBmZWF0dXJlIElEcyBleGFjdGx5IG9yIHdpdGggYW4gb3B0aW9uYWwgJy5leHRlbnNpb24nIHN1ZmZpeFxuICAgKiAtIFJlcXVpcmVtZW50IG5hbWVzIGVuZGluZyB3aXRoICcrJyBoYXZlIHRoZSBzdWZmaXggcmVtb3ZlZCBiZWZvcmUgdmFsaWRhdGlvblxuICAgKiAtIElmIG5vIG1hdGNoaW5nIHJlcXVpcmVtZW50cyBhcmUgZm91bmQsIHRoZSBmZWF0dXJlIGlzIGNvbnNpZGVyZWQgdmFsaWQgKHJldHVybnMgYHRydWVgKVxuICAgKiAtIEFsbCByZXF1aXJlbWVudHMgbXVzdCBoYXZlIGEgc3RhdGUgb2YgJ2VuYWJsZWQnIGZvciB0aGUgZmVhdHVyZSB0byBwYXNzIHZhbGlkYXRpb25cbiAgICovXG4gICNtYXRjaGVzUmVxdWlyZW1lbnRzKGZlYXQ6IHsgaWQ6IHN0cmluZyB9KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmVhdHVyZVJlcXVpcmVtZW50cyA9IHRoaXMuI2ZlYXR1cmVSZXF1aXJlbWVudHM7XG4gICAgY29uc3QgZmVhdHVyZUF2YWlsYWJpbGl0eSA9IHRoaXMuI2ZlYXR1cmVNYW5hZ2VtZW50O1xuICAgIGlmICghZmVhdHVyZVJlcXVpcmVtZW50cykgcmV0dXJuIHRydWU7XG4gICAgLy8gQ2hlY2sgaWYgZmV0LmlkIG1hdGNoZXMgZXhhY3RseSAna2V5JyBvciAna2V5LmV4dGVuc2lvbidcbiAgICBjb25zdCBtYXRjaGluZ0tleSA9IE9iamVjdC5rZXlzKGZlYXR1cmVSZXF1aXJlbWVudHMpLmZpbmQoKGtleSkgPT5cbiAgICAgIG5ldyBSZWdFeHAoYF4ke2tleX0oXFxcXC5leHRlbnNpb24pPyRgKS50ZXN0KGZlYXQuaWQpXG4gICAgKTtcblxuICAgIC8vIElmIG5vIG1hdGNoaW5nIGtleSwgcmV0dXJuIHRydWVcbiAgICBpZiAoIW1hdGNoaW5nS2V5KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIHJlcXVpcmVtZW50cyBmb3IgdGhlIG1hdGNoaW5nIGtleVxuICAgIGNvbnN0IHJlcXVpcmVtZW50cyA9IGZlYXR1cmVSZXF1aXJlbWVudHNbbWF0Y2hpbmdLZXldO1xuXG4gICAgLy8gQ2hlY2sgaWYgYWxsIHJlcXVpcmVtZW50cyBhcmUgaW4gYXZ2IHdpdGggc3RhdGUgJ2VuYWJsZWQnXG4gICAgcmV0dXJuIHJlcXVpcmVtZW50cy5ldmVyeSgocmVxTmFtZSkgPT4ge1xuICAgICAgLy8gUmVtb3ZlIHRoZSAnKycgc3VmZml4IGlmIHByZXNlbnRcbiAgICAgIGNvbnN0IGNsZWFuUmVxTmFtZSA9IHJlcU5hbWUucmVwbGFjZSgvXFwrJC8sICcnKTtcbiAgICAgIC8vIEZpbmQgdGhlIHJlcXVpcmVtZW50IGluIGF2diBhbmQgY2hlY2sgaWYgaXQncyBlbmFibGVkXG4gICAgICBjb25zdCBmb3VuZCA9IGZlYXR1cmVBdmFpbGFiaWxpdHkuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBjbGVhblJlcU5hbWUpO1xuICAgICAgcmV0dXJuIGZvdW5kICYmIGZvdW5kLnN0YXRlID09PSAnZW5hYmxlZCc7XG4gICAgfSk7XG4gIH1cblxuICBoYXNGZWF0dXJlQ29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuI2ZlYXR1cmVPYmplY3RJZDtcbiAgfVxuXG4gIGdldEZlYXR1cmVzKCk6IENsaWVudFNoZWxsRmVhdHVyZVtdIHtcbiAgICByZXR1cm4gdGhpcy4jZmVhdHVyZXM7XG4gIH1cblxuICBnZXRBdmFpbGFibGVBcHBzKGFsbEFwcHM6IEFwcFtdKTogQXBwW10ge1xuICAgIHJldHVybiBhbGxBcHBzLmZpbHRlcihcbiAgICAgIChhcHApID0+IHRoaXMuI21hdGNoZXNSZXF1aXJlbWVudHMoYXBwKSAmJiB0aGlzLmNhblVzZUFwcChhcHApICYmIHRoaXMuY2FuVXNlRmVhdHVyZUJ5SWQoYXBwLmlkKVxuICAgICk7XG4gIH1cblxuICBjYW5Vc2VBcHAoYXBwOiBBcHApIHtcbiAgICBjb25zdCBhdXRob3JpdGllcyA9IHRoaXMuI3VzZXJUb2tlbj8uYXV0aG9yaXRpZXMgfHwgW107XG4gICAgY29uc3QgYWxsb3dlZCA9IGFwcC5wZXJtaXNzaW9ucz8uYWxsb3cgfHwgW107XG4gICAgY29uc3QgZGVuaWVkID0gYXBwLnBlcm1pc3Npb25zPy5kZW55IHx8IFtdO1xuXG4gICAgY29uc3QgaXNBbGxvd2VkID0gYWxsb3dlZC5sZW5ndGggPT09IDAgfHwgYXV0aG9yaXRpZXMuc29tZSgoYXV0aG9yaXR5KSA9PiBhbGxvd2VkLmluY2x1ZGVzKGF1dGhvcml0eSkpO1xuICAgIGNvbnN0IGlzRGVuaWVkID0gZGVuaWVkLnNvbWUoKGRlbmllZEF1dGhvcml0eSkgPT4gYXV0aG9yaXRpZXMuaW5jbHVkZXMoZGVuaWVkQXV0aG9yaXR5KSk7XG5cbiAgICByZXR1cm4gaXNBbGxvd2VkICYmICFpc0RlbmllZDtcbiAgfVxuXG4gIGNhbk1hdGNoUmVxdWlyZW1lbnRzKGFwcDogeyBpZDogc3RyaW5nIH0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jbWF0Y2hlc1JlcXVpcmVtZW50cyh7IGlkOiBhcHAuaWQgfSk7XG4gIH1cblxuICBjYW5Vc2VGZWF0dXJlQnlJZChmZWF0dXJlSWQ6IHN0cmluZywgYXV0aG9yaXRpZXM/OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIC8vIGNoZWNrIHJlcXVpcmVtZW50XG4gICAgaWYgKCF0aGlzLiNtYXRjaGVzUmVxdWlyZW1lbnRzKHsgaWQ6IGZlYXR1cmVJZCB9KSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGNoZWNrIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgYmFja2VuZCAoaXRlbSBmaWxlZCBpbiBzaGVsbCBjb25maWcpXG4gICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuI2ZlYXR1cmVzLmZpbmQoKGYpID0+IGYuaWQgPT09IGZlYXR1cmVJZCk7XG4gICAgcmV0dXJuICFmZWF0dXJlIHx8IHRoaXMuY2FuVXNlRmVhdHVyZShmZWF0dXJlLCBhdXRob3JpdGllcyk7XG4gIH1cblxuICBjYW5Vc2VGZWF0dXJlKGZlYXR1cmU6IENsaWVudFNoZWxsRmVhdHVyZSwgYXV0aG9yaXRpZXM/OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGF1dGhvcml0aWVzVG9DaGVjayA9IGF1dGhvcml0aWVzIHx8IHRoaXMuI3VzZXJUb2tlbj8uYXV0aG9yaXRpZXMgfHwgW107XG4gICAgY29uc3QgYWxsb3dlZCA9IGZlYXR1cmUuYWxsb3dlZCB8fCBbXTtcbiAgICBjb25zdCBkZW5pZWQgPSBmZWF0dXJlLmRlbmllZCB8fCBbXTtcblxuICAgIGNvbnN0IGlzQWxsb3dlZCA9IGFsbG93ZWQubGVuZ3RoID09PSAwIHx8IGF1dGhvcml0aWVzVG9DaGVjay5zb21lKChhdXRob3JpdHkpID0+IGFsbG93ZWQuaW5jbHVkZXMoYXV0aG9yaXR5KSk7XG4gICAgY29uc3QgaXNEZW5pZWQgPSBkZW5pZWQuc29tZSgoZGVuaWVkQXV0aG9yaXR5KSA9PiBhdXRob3JpdGllc1RvQ2hlY2suaW5jbHVkZXMoZGVuaWVkQXV0aG9yaXR5KSk7XG5cbiAgICByZXR1cm4gaXNBbGxvd2VkICYmICFpc0RlbmllZDtcbiAgfVxuXG4gIHNhdmVGZWF0dXJlU2V0dGluZ3MoZmVhdHVyZXM6IENsaWVudFNoZWxsRmVhdHVyZVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuI2ZlYXR1cmVPYmplY3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBmZWF0dXJlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IElEIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNzaGVsbENvbmZpZy51cGRhdGUodGhpcy4jZmVhdHVyZU9iamVjdElkLCBmZWF0dXJlcykucGlwZSh0YXAoKCkgPT4gKHRoaXMuI2ZlYXR1cmVzID0gZmVhdHVyZXMpKSk7XG4gIH1cblxuICBkZWxldGVGZWF0dXJlU2V0dGluZ3MoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuI2ZlYXR1cmVPYmplY3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBmZWF0dXJlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IElEIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLiNzaGVsbENvbmZpZy5kZWxldGUodGhpcy4jZmVhdHVyZU9iamVjdElkKTtcbiAgfVxuXG4gIGNyZWF0ZVNldHRpbmdzT2JqZWN0KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuI3NoZWxsQ29uZmlnLmNyZWF0ZShTSEVMTF9DT05GSUdfRkVBVFVSRVMsIFtdKS5waXBlKFxuICAgICAgdGFwKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy4jZmVhdHVyZU9iamVjdElkID0gcmVzLmlkO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZXhwb3J0KCkge1xuICAgIGlmICh0aGlzLiNmZWF0dXJlT2JqZWN0SWQpIHtcbiAgICAgIHRoaXMuI3NoZWxsQ29uZmlnLmRvd25sb2FkKHRoaXMuI2ZlYXR1cmVPYmplY3RJZCwgYCR7U0hFTExfQ09ORklHX0ZFQVRVUkVTfS5qc29uYCk7XG4gICAgfVxuICB9XG5cbiAgaW1wb3J0KCkge1xuICAgIC8vIHJlYWQgZmlsZXMgY29udGVudHNcblxuICAgIHJldHVybiB0aGlzLiNmZWF0dXJlT2JqZWN0SWRcbiAgICAgID8gdGhpcy4jc2hlbGwucGlja0ZpbGUoKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoZmlsZSkgPT5cbiAgICAgICAgICAgIGZpbGVcbiAgICAgICAgICAgICAgPyB0aGlzLiNzaGVsbENvbmZpZy51cGxvYWQodGhpcy4jZmVhdHVyZU9iamVjdElkISwgZmlsZSkucGlwZShcbiAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgdXBsb2FkZWQgZmlsZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jYmFja2VuZC5nZXQoYC9kbXMvb2JqZWN0cy8ke3Jlcy5pZH0vY29udGVudHMvZmlsZWApLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgdGFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2RhdGEnLCBkYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZmVhdHVyZXMgPSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBvZihudWxsKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgOiBvZihudWxsKTtcbiAgfVxufVxuIl19
@@ -1,5 +0,0 @@
1
- export * from './feature.interface';
2
- export * from './feature.guard';
3
- export * from './feature.providers';
4
- export * from './feature.service';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwtY29yZS9zcmMvbGliL3NlcnZpY2VzL2ZlYXR1cmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZmVhdHVyZS5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9mZWF0dXJlLmd1YXJkJztcbmV4cG9ydCAqIGZyb20gJy4vZmVhdHVyZS5wcm92aWRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9mZWF0dXJlLnNlcnZpY2UnOyJdfQ==
@@ -1,13 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export class NoopExtension {
4
- init() {
5
- return Promise.resolve();
6
- }
7
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: NoopExtension, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: NoopExtension }); }
9
- }
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: NoopExtension, decorators: [{
11
- type: Injectable
12
- }] });
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcC5leHRlbnNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtc2hlbGwtY29yZS9zcmMvbGliL3NlcnZpY2VzL3NoZWxsL25vb3AuZXh0ZW5zaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBSTNDLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLElBQUk7UUFDRixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDOytHQUhVLGFBQWE7bUhBQWIsYUFBYTs7NEZBQWIsYUFBYTtrQkFEekIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENsaWVudFNoZWxsRXh0ZW5zaW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NsaWVudC1zaGVsbC5pbnRlcmZhY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTm9vcEV4dGVuc2lvbiBpbXBsZW1lbnRzIENsaWVudFNoZWxsRXh0ZW5zaW9uIHtcbiAgaW5pdCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufVxuIl19
@@ -1,7 +0,0 @@
1
- export const requirementsMapping = (requirementsResponse) => {
2
- return Object.keys(requirementsResponse).map((key) => ({
3
- name: key,
4
- state: 'enabled'
5
- }));
6
- };
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZW1lbnRzLnBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1zaGVsbC1jb3JlL3NyYy9saWIvc2VydmljZXMvc2hlbGwvcmVxdWlyZW1lbnRzLnBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLG9CQUFnRCxFQUE2QixFQUFFO0lBQ2pILE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLEVBQUUsR0FBRztRQUNULEtBQUssRUFBRSxTQUE4QjtLQUN0QyxDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF2YWlsYWJpbGl0eVN0YXRlLCBZdXZBdmFpbGFibGVCYWNrZW5kQXBwcyB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWNvcmUnO1xuXG5leHBvcnQgY29uc3QgcmVxdWlyZW1lbnRzTWFwcGluZyA9IChyZXF1aXJlbWVudHNSZXNwb25zZTogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pOiBZdXZBdmFpbGFibGVCYWNrZW5kQXBwc1tdID0+IHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHJlcXVpcmVtZW50c1Jlc3BvbnNlKS5tYXAoKGtleSkgPT4gKHtcbiAgICBuYW1lOiBrZXksXG4gICAgc3RhdGU6ICdlbmFibGVkJyBhcyBBdmFpbGFiaWxpdHlTdGF0ZVxuICB9KSk7XG59O1xuIl19
@@ -1,84 +0,0 @@
1
- import { inject, provideAppInitializer } from '@angular/core';
2
- import { bootstrapApplication } from '@angular/platform-browser';
3
- import { BaseObjectTypeField, provideAvailabilityManagement, provideRequirements, provideUser } from '@yuuvis/client-core';
4
- import { provideClientShellAlwaysShowNotifications, provideClientShellFeatures } from '../feature/feature.providers';
5
- import { getShellConfigQueryString, SHELL_CONFIG_FEATURES } from '../shell-config/shell-config.const';
6
- import { requirementsMapping } from './requirements.parser';
7
- import { ShellService } from './shell.service';
8
- /**
9
- * Boostraps a yuuvis Momentum shell client.
10
- *
11
- * ```ts
12
- * import { bootstrapShellApplication } from '@yuuvis/client-shell-core';
13
- *
14
- * bootstrapShellApplication(AppComponent, appConfig).catch((err) => console.error(err));
15
- * ```
16
- *
17
- * @param rootComponent Root component of the application
18
- * @param options Application configuration
19
- * @returns
20
- */
21
- export async function bootstrapShellApplication(rootComponent, options, shellOptions, requirements) {
22
- const o = options || {
23
- providers: []
24
- };
25
- const defaultProviders = [];
26
- const userResponse = await fetch('/api-web/api/idm/whoami', {
27
- headers: {
28
- 'Content-Type': 'application/json'
29
- }
30
- });
31
- if (!userResponse.ok) {
32
- if (userResponse.status === 401) {
33
- window.location.href = `${location.origin}/logout`;
34
- }
35
- else {
36
- throw new Error('Failed to fetch user information');
37
- }
38
- }
39
- const userRes = await userResponse.json();
40
- o.providers = [...o.providers, provideUser(userRes)];
41
- if (shellOptions?.enableObjectTypeConfig) {
42
- defaultProviders.push(provideAppInitializer(() => {
43
- inject(ShellService)._initObjectTypeConfig();
44
- }));
45
- }
46
- if (shellOptions?.alwaysShowNotifications) {
47
- defaultProviders.push(provideClientShellAlwaysShowNotifications(true));
48
- }
49
- // only call the backend if there actually are requirements to check
50
- if (requirements && Object.keys(requirements).length > 0) {
51
- const requirementsResponse = await fetch(`/api/dms/apps`, { headers: { 'Content-Type': 'application/json' } });
52
- if (requirementsResponse.ok) {
53
- defaultProviders.push(provideAvailabilityManagement(requirementsMapping(await requirementsResponse.json())));
54
- }
55
- defaultProviders.push(provideRequirements(requirements));
56
- }
57
- if (userRes && shellOptions?.enableFeatureConfig) {
58
- // find the config file
59
- const response = await fetch('/api/dms/objects/search', {
60
- method: 'POST',
61
- headers: { 'Content-Type': 'application/json' },
62
- body: JSON.stringify({
63
- query: {
64
- statement: getShellConfigQueryString(SHELL_CONFIG_FEATURES)
65
- }
66
- })
67
- });
68
- const res = await response.json();
69
- const objects = res.objects;
70
- if (objects?.length > 0) {
71
- const id = objects[0]?.properties[BaseObjectTypeField.OBJECT_ID].value;
72
- const file = await fetch(`/api/dms/objects/${id}/contents/file`, { headers: { 'Content-Type': 'application/json' } });
73
- const res = await file.json();
74
- const shellFeatureConfig = {
75
- objectID: id,
76
- features: res || []
77
- };
78
- defaultProviders.push(provideClientShellFeatures(shellFeatureConfig));
79
- }
80
- }
81
- o.providers = [...defaultProviders, ...o.providers];
82
- return bootstrapApplication(rootComponent, o);
83
- }
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwuYm9vdHN0cmFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LXNoZWxsLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9zaGVsbC9zaGVsbC5ib290c3RyYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQyxNQUFNLEVBQUUscUJBQXFCLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFDdkcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLG1CQUFtQixFQUFnQiw2QkFBNkIsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd6SSxPQUFPLEVBQUUseUNBQXlDLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNySCxPQUFPLEVBQUUseUJBQXlCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0M7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIsQ0FDN0MsYUFBNEIsRUFDNUIsT0FBMkIsRUFDM0IsWUFBb0MsRUFDcEMsWUFBMkI7SUFFM0IsTUFBTSxDQUFDLEdBQXNCLE9BQU8sSUFBSTtRQUN0QyxTQUFTLEVBQUUsRUFBRTtLQUNkLENBQUM7SUFDRixNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM1QixNQUFNLFlBQVksR0FBYSxNQUFNLEtBQUssQ0FBQyx5QkFBeUIsRUFBRTtRQUNwRSxPQUFPLEVBQUU7WUFDUCxjQUFjLEVBQUUsa0JBQWtCO1NBQ25DO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLFlBQVksQ0FBQyxF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QUFHLElBQUksRUFBRTthQUNwQixDQUFDO1lBRUYsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUNELENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sb0JBQW9CLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcHBsaWNhdGlvbkNvbmZpZywgQXBwbGljYXRpb25SZWYsIGluamVjdCwgcHJvdmlkZUFwcEluaXRpYWxpemVyLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBib290c3RyYXBBcHBsaWNhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgQmFzZU9iamVjdFR5cGVGaWVsZCwgUmVxdWlyZW1lbnRzLCBwcm92aWRlQXZhaWxhYmlsaXR5TWFuYWdlbWVudCwgcHJvdmlkZVJlcXVpcmVtZW50cywgcHJvdmlkZVVzZXIgfSBmcm9tICdAeXV1dmlzL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IFNoZWxsQm9vdHN0cmFwT3B0aW9ucyB9IGZyb20gJy4uLy4uL21vZGVscy9jbGllbnQtc2hlbGwuaW50ZXJmYWNlJztcbmltcG9ydCB7IENsaWVudFNoZWxsRmVhdHVyZUNvbmZpZyB9IGZyb20gJy4uL2ZlYXR1cmUvZmVhdHVyZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcHJvdmlkZUNsaWVudFNoZWxsQWx3YXlzU2hvd05vdGlmaWNhdGlvbnMsIHByb3ZpZGVDbGllbnRTaGVsbEZlYXR1cmVzIH0gZnJvbSAnLi4vZmVhdHVyZS9mZWF0dXJlLnByb3ZpZGVycyc7XG5pbXBvcnQgeyBnZXRTaGVsbENvbmZpZ1F1ZXJ5U3RyaW5nLCBTSEVMTF9DT05GSUdfRkVBVFVSRVMgfSBmcm9tICcuLi9zaGVsbC1jb25maWcvc2hlbGwtY29uZmlnLmNvbnN0JztcbmltcG9ydCB7IHJlcXVpcmVtZW50c01hcHBpbmcgfSBmcm9tICcuL3JlcXVpcmVtZW50cy5wYXJzZXInO1xuaW1wb3J0IHsgU2hlbGxTZXJ2aWNlIH0gZnJvbSAnLi9zaGVsbC5zZXJ2aWNlJztcblxuLyoqXG4gKiBCb29zdHJhcHMgYSB5dXV2aXMgTW9tZW50dW0gc2hlbGwgY2xpZW50LlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBib290c3RyYXBTaGVsbEFwcGxpY2F0aW9uIH0gZnJvbSAnQHl1dXZpcy9jbGllbnQtc2hlbGwtY29yZSc7XG4gKlxuICogYm9vdHN0cmFwU2hlbGxBcHBsaWNhdGlvbihBcHBDb21wb25lbnQsIGFwcENvbmZpZykuY2F0Y2goKGVycikgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSByb290Q29tcG9uZW50IFJvb3QgY29tcG9uZW50IG9mIHRoZSBhcHBsaWNhdGlvblxuICogQHBhcmFtIG9wdGlvbnMgQXBwbGljYXRpb24gY29uZmlndXJhdGlvblxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcFNoZWxsQXBwbGljYXRpb24oXG4gIHJvb3RDb21wb25lbnQ6IFR5cGU8dW5rbm93bj4sXG4gIG9wdGlvbnM/OiBBcHBsaWNhdGlvbkNvbmZpZyxcbiAgc2hlbGxPcHRpb25zPzogU2hlbGxCb290c3RyYXBPcHRpb25zLFxuICByZXF1aXJlbWVudHM/OiBSZXF1aXJlbWVudHNcbik6IFByb21pc2U8QXBwbGljYXRpb25SZWY+IHtcbiAgY29uc3QgbzogQXBwbGljYXRpb25Db25maWcgPSBvcHRpb25zIHx8IHtcbiAgICBwcm92aWRlcnM6IFtdXG4gIH07XG4gIGNvbnN0IGRlZmF1bHRQcm92aWRlcnMgPSBbXTtcbiAgY29uc3QgdXNlclJlc3BvbnNlOiBSZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpLXdlYi9hcGkvaWRtL3dob2FtaScsIHtcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgfVxuICB9KTtcblxuICBpZiAoIXVzZXJSZXNwb25zZS5vaykge1xuICAgIGlmICh1c2VyUmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYCR7bG9jYXRpb24ub3JpZ2lufS9sb2dvdXRgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCB1c2VyIGluZm9ybWF0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdXNlclJlcyA9IGF3YWl0IHVzZXJSZXNwb25zZS5qc29uKCk7XG4gIG8ucHJvdmlkZXJzID0gWy4uLm8ucHJvdmlkZXJzLCBwcm92aWRlVXNlcih1c2VyUmVzKV07XG5cbiAgaWYgKHNoZWxsT3B0aW9ucz8uZW5hYmxlT2JqZWN0VHlwZUNvbmZpZykge1xuICAgIGRlZmF1bHRQcm92aWRlcnMucHVzaChcbiAgICAgIHByb3ZpZGVBcHBJbml0aWFsaXplcigoKSA9PiB7XG4gICAgICAgIGluamVjdChTaGVsbFNlcnZpY2UpLl9pbml0T2JqZWN0VHlwZUNvbmZpZygpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgaWYgKHNoZWxsT3B0aW9ucz8uYWx3YXlzU2hvd05vdGlmaWNhdGlvbnMpIHtcbiAgICBkZWZhdWx0UHJvdmlkZXJzLnB1c2gocHJvdmlkZUNsaWVudFNoZWxsQWx3YXlzU2hvd05vdGlmaWNhdGlvbnModHJ1ZSkpO1xuICB9XG5cbiAgLy8gb25seSBjYWxsIHRoZSBiYWNrZW5kIGlmIHRoZXJlIGFjdHVhbGx5IGFyZSByZXF1aXJlbWVudHMgdG8gY2hlY2tcbiAgaWYgKHJlcXVpcmVtZW50cyAmJiBPYmplY3Qua2V5cyhyZXF1aXJlbWVudHMpLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCByZXF1aXJlbWVudHNSZXNwb25zZTogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS9kbXMvYXBwc2AsIHsgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0gfSk7XG4gICAgaWYgKHJlcXVpcmVtZW50c1Jlc3BvbnNlLm9rKSB7XG4gICAgICBkZWZhdWx0UHJvdmlkZXJzLnB1c2gocHJvdmlkZUF2YWlsYWJpbGl0eU1hbmFnZW1lbnQocmVxdWlyZW1lbnRzTWFwcGluZyhhd2FpdCByZXF1aXJlbWVudHNSZXNwb25zZS5qc29uKCkpKSk7XG4gICAgfVxuICAgIGRlZmF1bHRQcm92aWRlcnMucHVzaChwcm92aWRlUmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykpO1xuICB9XG5cbiAgaWYgKHVzZXJSZXMgJiYgc2hlbGxPcHRpb25zPy5lbmFibGVGZWF0dXJlQ29uZmlnKSB7XG4gICAgLy8gZmluZCB0aGUgY29uZmlnIGZpbGVcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2Rtcy9vYmplY3RzL3NlYXJjaCcsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgc3RhdGVtZW50OiBnZXRTaGVsbENvbmZpZ1F1ZXJ5U3RyaW5nKFNIRUxMX0NPTkZJR19GRUFUVVJFUylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICBjb25zdCBvYmplY3RzID0gcmVzLm9iamVjdHM7XG4gICAgaWYgKG9iamVjdHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlkID0gb2JqZWN0c1swXT8ucHJvcGVydGllc1tCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9JRF0udmFsdWU7XG5cbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBmZXRjaChgL2FwaS9kbXMvb2JqZWN0cy8ke2lkfS9jb250ZW50cy9maWxlYCwgeyBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSB9KTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZpbGUuanNvbigpO1xuICAgICAgY29uc3Qgc2hlbGxGZWF0dXJlQ29uZmlnOiBDbGllbnRTaGVsbEZlYXR1cmVDb25maWcgPSB7XG4gICAgICAgIG9iamVjdElEOiBpZCxcbiAgICAgICAgZmVhdHVyZXM6IHJlcyB8fCBbXVxuICAgICAgfTtcblxuICAgICAgZGVmYXVsdFByb3ZpZGVycy5wdXNoKHByb3ZpZGVDbGllbnRTaGVsbEZlYXR1cmVzKHNoZWxsRmVhdHVyZUNvbmZpZykpO1xuICAgIH1cbiAgfVxuICBvLnByb3ZpZGVycyA9IFsuLi5kZWZhdWx0UHJvdmlkZXJzLCAuLi5vLnByb3ZpZGVyc107XG4gIHJldHVybiBib290c3RyYXBBcHBsaWNhdGlvbihyb290Q29tcG9uZW50LCBvKTtcbn1cbiJdfQ==