@yuuvis/client-shell-core 3.0.0-beta.20.0 → 3.0.0-beta.21.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 (23) hide show
  1. package/esm2022/lib/services/command-palette/command-palette/command-palette.component.js +4 -4
  2. package/esm2022/lib/services/command-palette/command-palette/command-palette.component.js.map +1 -1
  3. package/esm2022/lib/services/command-palette/command-palette.interface.js +0 -1
  4. package/esm2022/lib/services/command-palette/command-palette.service.js +3 -3
  5. package/esm2022/lib/services/command-palette/command-palette.service.js.map +1 -1
  6. package/esm2022/lib/services/feature/feature.interface.js +0 -1
  7. package/esm2022/lib/services/feature/feature.service.js +3 -3
  8. package/esm2022/lib/services/feature/feature.service.js.map +1 -1
  9. package/esm2022/lib/services/shell/noop.extension.js +3 -3
  10. package/esm2022/lib/services/shell/noop.extension.js.map +1 -1
  11. package/esm2022/lib/services/shell/shell.bootstrap.js +18 -10
  12. package/esm2022/lib/services/shell/shell.bootstrap.js.map +1 -1
  13. package/esm2022/lib/services/shell/shell.service.js +6 -6
  14. package/esm2022/lib/services/shell/shell.service.js.map +1 -1
  15. package/esm2022/lib/services/shell-config/shell-config.interface.js +0 -1
  16. package/esm2022/lib/services/shell-config/shell-config.service.js +3 -3
  17. package/esm2022/lib/services/shell-config/shell-config.service.js.map +1 -1
  18. package/esm2022/lib/services/shell-notifications/shell-notifications.interface.js +0 -1
  19. package/esm2022/lib/services/shell-notifications/shell-notifications.service.js +3 -3
  20. package/esm2022/lib/services/shell-notifications/shell-notifications.service.js.map +1 -1
  21. package/esm2022/lib/tile-extension.interface.js +0 -1
  22. package/lib/services/command-palette/command-palette/command-palette.component.d.ts +2 -2
  23. package/package.json +8 -7
@@ -80,15 +80,15 @@ export class CommandPaletteComponent {
80
80
  ngAfterViewInit() {
81
81
  this.onInputBlur();
82
82
  }
83
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", 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: "20.3.19", type: CommandPaletteComponent, isStandalone: true, selector: "yuv-command-palette", outputs: { searchTermChange: "searchTermChange" }, host: { listeners: { "keydown.arrowDown": "onArrowDown($event)", "keydown.arrowUp": "onArrowUp($event)", "keydown.enter": "onEnter()" } }, 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"] }] }); }
83
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", 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: "21.2.9", type: CommandPaletteComponent, isStandalone: true, selector: "yuv-command-palette", outputs: { searchTermChange: "searchTermChange" }, host: { listeners: { "keydown.arrowDown": "onArrowDown($event)", "keydown.arrowUp": "onArrowUp($event)", "keydown.enter": "onEnter()" } }, 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}:host .commands::-webkit-scrollbar{display:none}:host .commands{-ms-overflow-style:none;scrollbar-width: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
85
  }
86
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CommandPaletteComponent, decorators: [{
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CommandPaletteComponent, decorators: [{
87
87
  type: Component,
88
88
  args: [{ selector: 'yuv-command-palette', imports: [CommonModule, FormsModule], host: {
89
89
  '(keydown.arrowDown)': 'onArrowDown($event)',
90
90
  '(keydown.arrowUp)': 'onArrowUp($event)',
91
91
  '(keydown.enter)': 'onEnter()'
92
- }, 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"] }]
92
+ }, 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}:host .commands::-webkit-scrollbar{display:none}:host .commands{-ms-overflow-style:none;scrollbar-width: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"] }]
93
93
  }], ctorParameters: () => [{ type: i1.CommandPaletteService }, { type: i0.ElementRef }], propDecorators: { searchTermChange: [{ type: i0.Output, args: ["searchTermChange"] }] } });
94
94
  //# sourceMappingURL=command-palette.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command-palette.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/command-palette/command-palette/command-palette.component.ts","../../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/command-palette/command-palette/command-palette.component.html"],"names":[],"mappings":"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","sourcesContent":["import { CommonModule } from '@angular/common';\nimport { AfterViewInit, Component, ElementRef, OnInit, output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommandPaletteCommand, DisabledCause } from '../command-palette.interface';\nimport { CommandPaletteService } from '../command-palette.service';\n\n@Component({\n selector: 'yuv-command-palette',\n imports: [CommonModule, FormsModule],\n templateUrl: './command-palette.component.html',\n styleUrl: './command-palette.component.scss',\n host: {\n '(keydown.arrowDown)': 'onArrowDown($event)',\n '(keydown.arrowUp)': 'onArrowUp($event)',\n '(keydown.enter)': 'onEnter()'\n }\n})\nexport class CommandPaletteComponent implements OnInit, AfterViewInit {\n private _commands: CommandPaletteCommand[] = [];\n private _cci = -1;\n set currentCommandIndex(i: number) {\n if (i > this.commands.length - 1) {\n i = 0;\n } else if (i < 0) {\n i = this.commands.length - 1;\n }\n this._cci = i;\n\n setTimeout(() => {\n const el = this.elRef.nativeElement.querySelector('.current');\n if (el) el.scrollIntoView(false);\n }, 0);\n }\n get currentCommandIndex() {\n return this._cci;\n }\n commands: CommandPaletteCommand[] = [];\n searchTerm = '';\n keepFocus = true;\n message: string | undefined;\n disabledCauses: DisabledCause[] = this.cmdService.disabledCauses;\n placeholder: string | undefined;\n\n readonly searchTermChange = output<string>();\n\n onArrowDown(e: KeyboardEvent) {\n e.preventDefault();\n e.stopPropagation();\n this.currentCommandIndex++;\n }\n\n onArrowUp(e: KeyboardEvent) {\n e.preventDefault();\n e.stopPropagation();\n this.currentCommandIndex--;\n }\n\n onEnter() {\n this.triggerCommand();\n }\n\n constructor(\n private cmdService: CommandPaletteService,\n private elRef: ElementRef\n ) {\n this.placeholder = this.cmdService.placeholder;\n }\n\n onTermChange(term: string) {\n const regExp = new RegExp(term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n this.commands = [...this._commands.filter((c) => c.label.match(regExp))];\n this.currentCommandIndex = 0;\n }\n\n onInputBlur() {\n if (this.keepFocus && !this.disabledCauses.length) {\n this.elRef.nativeElement.querySelector('input').focus();\n }\n }\n\n triggerCommand(command?: CommandPaletteCommand) {\n if (command || this.commands[this.currentCommandIndex]) {\n this.cmdService.triggerCommand(command || this.commands[this.currentCommandIndex]);\n }\n }\n\n highlight(txt: string | undefined): string | undefined {\n if (txt) {\n const re = new RegExp(this.searchTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n return txt.replace(re, '<mark>$&</mark>');\n } else {\n return txt;\n }\n }\n\n ngOnInit(): void {\n this._commands = this.cmdService.getCommands();\n this.commands = [...this._commands];\n }\n\n ngAfterViewInit() {\n this.onInputBlur();\n }\n}\n","@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"]}
1
+ {"version":3,"file":"command-palette.component.js","sourceRoot":"","sources":["../../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/command-palette/command-palette/command-palette.component.ts","../../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/command-palette/command-palette/command-palette.component.html"],"names":[],"mappings":"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","sourcesContent":["import { CommonModule } from '@angular/common';\nimport { AfterViewInit, Component, ElementRef, OnInit, output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { CommandPaletteCommand, DisabledCause } from '../command-palette.interface';\nimport { CommandPaletteService } from '../command-palette.service';\n\n@Component({\n selector: 'yuv-command-palette',\n imports: [CommonModule, FormsModule],\n templateUrl: './command-palette.component.html',\n styleUrl: './command-palette.component.scss',\n host: {\n '(keydown.arrowDown)': 'onArrowDown($event)',\n '(keydown.arrowUp)': 'onArrowUp($event)',\n '(keydown.enter)': 'onEnter()'\n }\n})\nexport class CommandPaletteComponent implements OnInit, AfterViewInit {\n private _commands: CommandPaletteCommand[] = [];\n private _cci = -1;\n set currentCommandIndex(i: number) {\n if (i > this.commands.length - 1) {\n i = 0;\n } else if (i < 0) {\n i = this.commands.length - 1;\n }\n this._cci = i;\n\n setTimeout(() => {\n const el = this.elRef.nativeElement.querySelector('.current');\n if (el) el.scrollIntoView(false);\n }, 0);\n }\n get currentCommandIndex() {\n return this._cci;\n }\n commands: CommandPaletteCommand[] = [];\n searchTerm = '';\n keepFocus = true;\n message: string | undefined;\n disabledCauses: DisabledCause[] = this.cmdService.disabledCauses;\n placeholder: string | undefined;\n\n readonly searchTermChange = output<string>();\n\n onArrowDown(e: KeyboardEvent | Event) {\n e.preventDefault();\n e.stopPropagation();\n this.currentCommandIndex++;\n }\n\n onArrowUp(e: KeyboardEvent | Event) {\n e.preventDefault();\n e.stopPropagation();\n this.currentCommandIndex--;\n }\n\n onEnter() {\n this.triggerCommand();\n }\n\n constructor(\n private cmdService: CommandPaletteService,\n private elRef: ElementRef\n ) {\n this.placeholder = this.cmdService.placeholder;\n }\n\n onTermChange(term: string) {\n const regExp = new RegExp(term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n this.commands = [...this._commands.filter((c) => c.label.match(regExp))];\n this.currentCommandIndex = 0;\n }\n\n onInputBlur() {\n if (this.keepFocus && !this.disabledCauses.length) {\n this.elRef.nativeElement.querySelector('input').focus();\n }\n }\n\n triggerCommand(command?: CommandPaletteCommand) {\n if (command || this.commands[this.currentCommandIndex]) {\n this.cmdService.triggerCommand(command || this.commands[this.currentCommandIndex]);\n }\n }\n\n highlight(txt: string | undefined): string | undefined {\n if (txt) {\n const re = new RegExp(this.searchTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n return txt.replace(re, '<mark>$&</mark>');\n } else {\n return txt;\n }\n }\n\n ngOnInit(): void {\n this._commands = this.cmdService.getCommands();\n this.commands = [...this._commands];\n }\n\n ngAfterViewInit() {\n this.onInputBlur();\n }\n}\n","@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"]}
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=command-palette.interface.js.map
@@ -108,10 +108,10 @@ export class CommandPaletteService {
108
108
  this.overlayVisibleSource.next(this.overlayVisible);
109
109
  }
110
110
  }
111
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CommandPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
112
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CommandPaletteService, providedIn: 'root' }); }
111
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CommandPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
112
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CommandPaletteService, providedIn: 'root' }); }
113
113
  }
114
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CommandPaletteService, decorators: [{
114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CommandPaletteService, decorators: [{
115
115
  type: Injectable,
116
116
  args: [{
117
117
  providedIn: 'root'
@@ -1 +1 @@
1
- {"version":3,"file":"command-palette.service.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/command-palette/command-palette.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { Observable, ReplaySubject, Subject, debounceTime, fromEvent } from 'rxjs';\nimport { filter, map, tap } from 'rxjs/operators';\nimport { CommandPaletteCommand, DisabledCause } from './command-palette.interface';\nimport { CommandPaletteComponent } from './command-palette/command-palette.component';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CommandPaletteService {\n #dialog = inject(MatDialog);\n\n readonly actionKey: string = 'Control';\n private _ac = 0;\n #dialogRef: MatDialogRef<CommandPaletteComponent> | undefined;\n\n private overlayVisible = false;\n disabledCauses: DisabledCause[] = [];\n placeholder = '';\n private overlayVisibleSource = new ReplaySubject<boolean>();\n public overlayVisible$: Observable<boolean> = this.overlayVisibleSource.asObservable();\n\n private commands: CommandPaletteCommand[] = [];\n private commandSource = new Subject<CommandPaletteCommand>();\n public command$: Observable<CommandPaletteCommand> = this.commandSource.asObservable();\n\n onSearchTerm!: (term: string, cb: (res: CommandPaletteCommand[]) => void) => void;\n constructor() {\n fromEvent(document, 'keyup')\n .pipe(\n debounceTime(100),\n map((e: Event) => e as KeyboardEvent),\n tap((e) => {\n if (e.key === this.actionKey) this._actionKeyClick();\n })\n )\n .subscribe();\n }\n\n getCommands(): CommandPaletteCommand[] {\n const commands: CommandPaletteCommand[] = Object.values(this.commands);\n return commands;\n }\n\n registerCommand(command: CommandPaletteCommand): Observable<CommandPaletteCommand> {\n this.commands.push(command);\n this._processCommands();\n return this.command$.pipe(filter((c) => c.id === command.id));\n }\n\n registerCommands(commands: CommandPaletteCommand[]): Observable<CommandPaletteCommand> {\n this.commands = [...this.commands, ...commands];\n this._processCommands();\n return this.command$.pipe(filter((cmd) => commands.map((c) => c.id).includes(cmd.id)));\n }\n\n unregisterCommand(id: string) {\n this.unregisterCommands([id]);\n }\n\n unregisterCommands(ids: string[]) {\n this.commands = this.commands.filter((c) => !ids.includes(c.id));\n }\n\n /**\n * Updates the properties of the registered commands. This is usefull when\n * the language of the app changes and you want to update the commands labels.\n * Based on the IDs propeties of the registered commands will be updated.\n * @param cmds Commands containing the updated properties\n */\n updateCommands(cmds: CommandPaletteCommand[]) {\n const exCmdQA: Record<string, any> = {};\n cmds.forEach((c) => (exCmdQA[c.id] = c));\n\n const updatedCommands = this.commands.map((c) => (exCmdQA[c.id] ? exCmdQA[c.id] : c));\n this.commands = updatedCommands;\n }\n\n triggerCommand(cmd: CommandPaletteCommand) {\n this.commandSource.next(cmd);\n if (cmd.callback) cmd.callback();\n this.#dialogRef?.close();\n }\n\n addDisabledCause(cause: DisabledCause) {\n const existingCauseIndex = this.disabledCauses.findIndex((c) => c.id === cause.id);\n if (existingCauseIndex === -1) {\n this.disabledCauses.push(cause);\n } else {\n this.disabledCauses[existingCauseIndex].message = cause.message;\n }\n }\n\n removeDisabledCause(id: string) {\n this.disabledCauses = this.disabledCauses.filter((c) => c.id !== id);\n }\n\n removeAllDisabledCauses() {\n this.disabledCauses = [];\n }\n\n private _processCommands() {\n // sort the commands\n this.commands.sort((a, b) => (a.label > b.label ? 1 : a.label === b.label ? 0 : -1));\n }\n private _actionKeyClick() {\n this._ac++;\n if (this._ac === 2) {\n this.appendComponentToBody();\n this._ac = 0;\n } else if (this._ac === 1) {\n setTimeout(() => {\n this._ac = 0;\n }, 300);\n }\n }\n\n private appendComponentToBody() {\n if (!this.overlayVisible) {\n this.#dialogRef = this.#dialog.open(CommandPaletteComponent);\n this.#dialogRef\n .afterClosed()\n .subscribe(() => {\n this.overlayVisible = false;\n this.overlayVisibleSource.next(this.overlayVisible);\n });\n this.overlayVisible = true;\n this.overlayVisibleSource.next(this.overlayVisible);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"command-palette.service.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/command-palette/command-palette.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,SAAS,EAAgB,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAc,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACnF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;;AAKtF,MAAM,OAAO,qBAAqB;IAChC,OAAO,CAAqB;IAI5B,UAAU,CAAoD;IAa9D;QAjBA,YAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAEnB,cAAS,GAAW,SAAS,CAAC;QAC/B,QAAG,GAAG,CAAC,CAAC;QAGR,mBAAc,GAAG,KAAK,CAAC;QAC/B,mBAAc,GAAoB,EAAE,CAAC;QACrC,gBAAW,GAAG,EAAE,CAAC;QACT,yBAAoB,GAAG,IAAI,aAAa,EAAW,CAAC;QACrD,oBAAe,GAAwB,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC;QAE/E,aAAQ,GAA4B,EAAE,CAAC;QACvC,kBAAa,GAAG,IAAI,OAAO,EAAyB,CAAC;QACtD,aAAQ,GAAsC,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QAIrF,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;aACzB,IAAI,CACH,YAAY,CAAC,GAAG,CAAC,EACjB,GAAG,CAAC,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAkB,CAAC,EACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACR,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,eAAe,EAAE,CAAC;QACvD,CAAC,CAAC,CACH;aACA,SAAS,EAAE,CAAC;IACjB,CAAC;IAED,WAAW;QACT,MAAM,QAAQ,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,eAAe,CAAC,OAA8B;QAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,gBAAgB,CAAC,QAAiC;QAChD,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,iBAAiB,CAAC,EAAU;QAC1B,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,kBAAkB,CAAC,GAAa;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,IAA6B;QAC1C,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC;IAClC,CAAC;IAED,cAAc,CAAC,GAA0B;QACvC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,GAAG,CAAC,QAAQ;YAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,gBAAgB,CAAC,KAAoB;QACnC,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;QACnF,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAClE,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,EAAU;QAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,uBAAuB;QACrB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;IAC3B,CAAC;IAEO,gBAAgB;QACtB,oBAAoB;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IACO,eAAe;QACrB,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;YAC1B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;YACf,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAEO,qBAAqB;QAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC7D,IAAI,CAAC,UAAU;iBACZ,WAAW,EAAE;iBACb,SAAS,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YACL,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;8GAxHU,qBAAqB;kHAArB,qBAAqB,cAFpB,MAAM;;2FAEP,qBAAqB;kBAHjC,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB","sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { Observable, ReplaySubject, Subject, debounceTime, fromEvent } from 'rxjs';\nimport { filter, map, tap } from 'rxjs/operators';\nimport { CommandPaletteCommand, DisabledCause } from './command-palette.interface';\nimport { CommandPaletteComponent } from './command-palette/command-palette.component';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CommandPaletteService {\n #dialog = inject(MatDialog);\n\n readonly actionKey: string = 'Control';\n private _ac = 0;\n #dialogRef: MatDialogRef<CommandPaletteComponent> | undefined;\n\n private overlayVisible = false;\n disabledCauses: DisabledCause[] = [];\n placeholder = '';\n private overlayVisibleSource = new ReplaySubject<boolean>();\n public overlayVisible$: Observable<boolean> = this.overlayVisibleSource.asObservable();\n\n private commands: CommandPaletteCommand[] = [];\n private commandSource = new Subject<CommandPaletteCommand>();\n public command$: Observable<CommandPaletteCommand> = this.commandSource.asObservable();\n\n onSearchTerm!: (term: string, cb: (res: CommandPaletteCommand[]) => void) => void;\n constructor() {\n fromEvent(document, 'keyup')\n .pipe(\n debounceTime(100),\n map((e: Event) => e as KeyboardEvent),\n tap((e) => {\n if (e.key === this.actionKey) this._actionKeyClick();\n })\n )\n .subscribe();\n }\n\n getCommands(): CommandPaletteCommand[] {\n const commands: CommandPaletteCommand[] = Object.values(this.commands);\n return commands;\n }\n\n registerCommand(command: CommandPaletteCommand): Observable<CommandPaletteCommand> {\n this.commands.push(command);\n this._processCommands();\n return this.command$.pipe(filter((c) => c.id === command.id));\n }\n\n registerCommands(commands: CommandPaletteCommand[]): Observable<CommandPaletteCommand> {\n this.commands = [...this.commands, ...commands];\n this._processCommands();\n return this.command$.pipe(filter((cmd) => commands.map((c) => c.id).includes(cmd.id)));\n }\n\n unregisterCommand(id: string) {\n this.unregisterCommands([id]);\n }\n\n unregisterCommands(ids: string[]) {\n this.commands = this.commands.filter((c) => !ids.includes(c.id));\n }\n\n /**\n * Updates the properties of the registered commands. This is usefull when\n * the language of the app changes and you want to update the commands labels.\n * Based on the IDs propeties of the registered commands will be updated.\n * @param cmds Commands containing the updated properties\n */\n updateCommands(cmds: CommandPaletteCommand[]) {\n const exCmdQA: Record<string, any> = {};\n cmds.forEach((c) => (exCmdQA[c.id] = c));\n\n const updatedCommands = this.commands.map((c) => (exCmdQA[c.id] ? exCmdQA[c.id] : c));\n this.commands = updatedCommands;\n }\n\n triggerCommand(cmd: CommandPaletteCommand) {\n this.commandSource.next(cmd);\n if (cmd.callback) cmd.callback();\n this.#dialogRef?.close();\n }\n\n addDisabledCause(cause: DisabledCause) {\n const existingCauseIndex = this.disabledCauses.findIndex((c) => c.id === cause.id);\n if (existingCauseIndex === -1) {\n this.disabledCauses.push(cause);\n } else {\n this.disabledCauses[existingCauseIndex].message = cause.message;\n }\n }\n\n removeDisabledCause(id: string) {\n this.disabledCauses = this.disabledCauses.filter((c) => c.id !== id);\n }\n\n removeAllDisabledCauses() {\n this.disabledCauses = [];\n }\n\n private _processCommands() {\n // sort the commands\n this.commands.sort((a, b) => (a.label > b.label ? 1 : a.label === b.label ? 0 : -1));\n }\n private _actionKeyClick() {\n this._ac++;\n if (this._ac === 2) {\n this.appendComponentToBody();\n this._ac = 0;\n } else if (this._ac === 1) {\n setTimeout(() => {\n this._ac = 0;\n }, 300);\n }\n }\n\n private appendComponentToBody() {\n if (!this.overlayVisible) {\n this.#dialogRef = this.#dialog.open(CommandPaletteComponent);\n this.#dialogRef\n .afterClosed()\n .subscribe(() => {\n this.overlayVisible = false;\n this.overlayVisibleSource.next(this.overlayVisible);\n });\n this.overlayVisible = true;\n this.overlayVisibleSource.next(this.overlayVisible);\n }\n }\n}\n"]}
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=feature.interface.js.map
@@ -129,10 +129,10 @@ export class FeatureService {
129
129
  : of(null)))
130
130
  : of(null);
131
131
  }
132
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FeatureService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
133
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FeatureService, providedIn: 'root' }); }
132
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: FeatureService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
133
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: FeatureService, providedIn: 'root' }); }
134
134
  }
135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FeatureService, decorators: [{
135
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: FeatureService, decorators: [{
136
136
  type: Injectable,
137
137
  args: [{
138
138
  providedIn: 'root'
@@ -1 +1 @@
1
- {"version":3,"file":"feature.service.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/feature/feature.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport {\n AVAILABLE_BACKEND_APPS,\n BackendService,\n CLIENT_APP_REQUIREMENTS,\n Requirements,\n YuvAvailableBackendApps,\n YuvUser\n} from '@yuuvis/client-core';\n\nimport { YUV_USER } from '@yuuvis/client-core';\nimport { Observable, of, switchMap, tap } from 'rxjs';\nimport { App } from '../../models/client-shell.interface';\nimport { SHELL_CONFIG_FEATURES } from '../shell-config/shell-config.const';\nimport { ShellConfigService } from '../shell-config/shell-config.service';\nimport { ShellService } from '../shell/shell.service';\nimport { ClientShellFeature, ClientShellFeatureConfig } from './feature.interface';\nimport { CLIENT_SHELL_FEATURE_CONFIG } from './feature.providers';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FeatureService {\n #featureManagement = inject<YuvAvailableBackendApps[]>(AVAILABLE_BACKEND_APPS);\n #featureRequirements = inject<Requirements>(CLIENT_APP_REQUIREMENTS);\n\n #featureConfig = inject<ClientShellFeatureConfig>(CLIENT_SHELL_FEATURE_CONFIG);\n #userToken = inject<YuvUser>(YUV_USER);\n #shell = inject(ShellService);\n #shellConfig = inject(ShellConfigService);\n #featureObjectId? = this.#featureConfig?.objectID;\n #features = this.#featureConfig?.features || [];\n #backend = inject(BackendService);\n\n /**\n * Checks if a feature meets all its requirements.\n *\n * This method validates whether a feature (identified by its ID) can be enabled based on:\n * 1. Whether it has any defined requirements in the feature requirements configuration\n * 2. Whether all its requirements are present and enabled in the feature availability list\n *\n * @param fet - An object containing the feature ID to check\n * @param fet.id - The unique identifier of the feature (may include '.extension' suffix)\n * @returns `true` if the feature has no requirements or all requirements are enabled; `false` otherwise\n *\n * @remarks\n * - The method matches feature IDs exactly or with an optional '.extension' suffix\n * - Requirement names ending with '+' have the suffix removed before validation\n * - If no matching requirements are found, the feature is considered valid (returns `true`)\n * - All requirements must have a state of 'enabled' for the feature to pass validation\n */\n #matchesRequirements(feat: { id: string }): boolean {\n const featureRequirements = this.#featureRequirements;\n const featureAvailability = this.#featureManagement;\n if (!featureRequirements) return true;\n // Check if fet.id matches exactly 'key' or 'key.extension'\n const matchingKey = Object.keys(featureRequirements).find((key) =>\n new RegExp(`^${key}(\\\\.extension)?$`).test(feat.id)\n );\n\n // If no matching key, return true\n if (!matchingKey) {\n return true;\n }\n\n // Get the requirements for the matching key\n const requirements = featureRequirements[matchingKey];\n\n // Check if all requirements are in avv with state 'enabled'\n return requirements.every((reqName) => {\n // Remove the '+' suffix if present\n const cleanReqName = reqName.replace(/\\+$/, '');\n // Find the requirement in avv and check if it's enabled\n const found = featureAvailability.find((item) => item.name === cleanReqName);\n return found && found.state === 'enabled';\n });\n }\n\n hasFeatureConfig(): boolean {\n return !!this.#featureObjectId;\n }\n\n getFeatures(): ClientShellFeature[] {\n return this.#features;\n }\n\n getAvailableApps(allApps: App[]): App[] {\n return allApps.filter(\n (app) => this.#matchesRequirements(app) && this.canUseApp(app) && this.canUseFeatureById(app.id)\n );\n }\n\n canUseApp(app: App) {\n const authorities = this.#userToken?.authorities || [];\n const allowed = app.permissions?.allow || [];\n const denied = app.permissions?.deny || [];\n\n const isAllowed = allowed.length === 0 || authorities.some((authority) => allowed.includes(authority));\n const isDenied = denied.some((deniedAuthority) => authorities.includes(deniedAuthority));\n\n return isAllowed && !isDenied;\n }\n\n canMatchRequirements(app: { id: string }): boolean {\n return this.#matchesRequirements({ id: app.id });\n }\n\n canUseFeatureById(featureId: string, authorities?: string[]): boolean {\n // check requirement\n if (!this.#matchesRequirements({ id: featureId })) return false;\n // check configuration from the backend (item filed in shell config)\n const feature = this.#features.find((f) => f.id === featureId);\n return !feature || this.canUseFeature(feature, authorities);\n }\n\n canUseFeature(feature: ClientShellFeature, authorities?: string[]): boolean {\n const authoritiesToCheck = authorities || this.#userToken?.authorities || [];\n const allowed = feature.allowed || [];\n const denied = feature.denied || [];\n\n const isAllowed = allowed.length === 0 || authoritiesToCheck.some((authority) => allowed.includes(authority));\n const isDenied = denied.some((deniedAuthority) => authoritiesToCheck.includes(deniedAuthority));\n\n return isAllowed && !isDenied;\n }\n\n saveFeatureSettings(features: ClientShellFeature[]): Observable<any> {\n if (!this.#featureObjectId) {\n throw new Error('No feature configuration object ID provided');\n }\n return this.#shellConfig.update(this.#featureObjectId, features).pipe(tap(() => (this.#features = features)));\n }\n\n deleteFeatureSettings(): Observable<any> {\n if (!this.#featureObjectId) {\n throw new Error('No feature configuration object ID provided');\n }\n return this.#shellConfig.delete(this.#featureObjectId);\n }\n\n createSettingsObject(): Observable<any> {\n return this.#shellConfig.create(SHELL_CONFIG_FEATURES, []).pipe(\n tap((res) => {\n this.#featureObjectId = res.id;\n })\n );\n }\n\n export() {\n if (this.#featureObjectId) {\n this.#shellConfig.download(this.#featureObjectId, `${SHELL_CONFIG_FEATURES}.json`);\n }\n }\n\n import() {\n // read files contents\n\n return this.#featureObjectId\n ? this.#shell.pickFile().pipe(\n switchMap((file) =>\n file\n ? this.#shellConfig.upload(this.#featureObjectId!, file).pipe(\n switchMap((res) => {\n // read uploaded file\n return this.#backend.get(`/dms/objects/${res.id}/contents/file`).pipe(\n tap((data) => {\n // update features\n //console.log('data', data);\n\n this.#features = data;\n })\n );\n })\n )\n : of(null)\n )\n )\n : of(null);\n }\n}\n"]}
1
+ {"version":3,"file":"feature.service.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/feature/feature.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport {\n AVAILABLE_BACKEND_APPS,\n BackendService,\n CLIENT_APP_REQUIREMENTS,\n Requirements,\n YuvAvailableBackendApps,\n YuvUser\n} from '@yuuvis/client-core';\n\nimport { YUV_USER } from '@yuuvis/client-core';\nimport { Observable, of, switchMap, tap } from 'rxjs';\nimport { App } from '../../models/client-shell.interface';\nimport { SHELL_CONFIG_FEATURES } from '../shell-config/shell-config.const';\nimport { ShellConfigService } from '../shell-config/shell-config.service';\nimport { ShellService } from '../shell/shell.service';\nimport { ClientShellFeature, ClientShellFeatureConfig } from './feature.interface';\nimport { CLIENT_SHELL_FEATURE_CONFIG } from './feature.providers';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FeatureService {\n #featureManagement = inject<YuvAvailableBackendApps[]>(AVAILABLE_BACKEND_APPS);\n #featureRequirements = inject<Requirements>(CLIENT_APP_REQUIREMENTS);\n\n #featureConfig = inject<ClientShellFeatureConfig>(CLIENT_SHELL_FEATURE_CONFIG);\n #userToken = inject<YuvUser>(YUV_USER);\n #shell = inject(ShellService);\n #shellConfig = inject(ShellConfigService);\n #featureObjectId? = this.#featureConfig?.objectID;\n #features = this.#featureConfig?.features || [];\n #backend = inject(BackendService);\n\n /**\n * Checks if a feature meets all its requirements.\n *\n * This method validates whether a feature (identified by its ID) can be enabled based on:\n * 1. Whether it has any defined requirements in the feature requirements configuration\n * 2. Whether all its requirements are present and enabled in the feature availability list\n *\n * @param fet - An object containing the feature ID to check\n * @param fet.id - The unique identifier of the feature (may include '.extension' suffix)\n * @returns `true` if the feature has no requirements or all requirements are enabled; `false` otherwise\n *\n * @remarks\n * - The method matches feature IDs exactly or with an optional '.extension' suffix\n * - Requirement names ending with '+' have the suffix removed before validation\n * - If no matching requirements are found, the feature is considered valid (returns `true`)\n * - All requirements must have a state of 'enabled' for the feature to pass validation\n */\n #matchesRequirements(feat: { id: string }): boolean {\n const featureRequirements = this.#featureRequirements;\n const featureAvailability = this.#featureManagement;\n if (!featureRequirements) return true;\n // Check if fet.id matches exactly 'key' or 'key.extension'\n const matchingKey = Object.keys(featureRequirements).find((key) =>\n new RegExp(`^${key}(\\\\.extension)?$`).test(feat.id)\n );\n\n // If no matching key, return true\n if (!matchingKey) {\n return true;\n }\n\n // Get the requirements for the matching key\n const requirements = featureRequirements[matchingKey];\n\n // Check if all requirements are in avv with state 'enabled'\n return requirements.every((reqName) => {\n // Remove the '+' suffix if present\n const cleanReqName = reqName.replace(/\\+$/, '');\n // Find the requirement in avv and check if it's enabled\n const found = featureAvailability.find((item) => item.name === cleanReqName);\n return found && found.state === 'enabled';\n });\n }\n\n hasFeatureConfig(): boolean {\n return !!this.#featureObjectId;\n }\n\n getFeatures(): ClientShellFeature[] {\n return this.#features;\n }\n\n getAvailableApps(allApps: App[]): App[] {\n return allApps.filter(\n (app) => this.#matchesRequirements(app) && this.canUseApp(app) && this.canUseFeatureById(app.id)\n );\n }\n\n canUseApp(app: App) {\n const authorities = this.#userToken?.authorities || [];\n const allowed = app.permissions?.allow || [];\n const denied = app.permissions?.deny || [];\n\n const isAllowed = allowed.length === 0 || authorities.some((authority) => allowed.includes(authority));\n const isDenied = denied.some((deniedAuthority) => authorities.includes(deniedAuthority));\n\n return isAllowed && !isDenied;\n }\n\n canMatchRequirements(app: { id: string }): boolean {\n return this.#matchesRequirements({ id: app.id });\n }\n\n canUseFeatureById(featureId: string, authorities?: string[]): boolean {\n // check requirement\n if (!this.#matchesRequirements({ id: featureId })) return false;\n // check configuration from the backend (item filed in shell config)\n const feature = this.#features.find((f) => f.id === featureId);\n return !feature || this.canUseFeature(feature, authorities);\n }\n\n canUseFeature(feature: ClientShellFeature, authorities?: string[]): boolean {\n const authoritiesToCheck = authorities || this.#userToken?.authorities || [];\n const allowed = feature.allowed || [];\n const denied = feature.denied || [];\n\n const isAllowed = allowed.length === 0 || authoritiesToCheck.some((authority) => allowed.includes(authority));\n const isDenied = denied.some((deniedAuthority) => authoritiesToCheck.includes(deniedAuthority));\n\n return isAllowed && !isDenied;\n }\n\n saveFeatureSettings(features: ClientShellFeature[]): Observable<any> {\n if (!this.#featureObjectId) {\n throw new Error('No feature configuration object ID provided');\n }\n return this.#shellConfig.update(this.#featureObjectId, features).pipe(tap(() => (this.#features = features)));\n }\n\n deleteFeatureSettings(): Observable<any> {\n if (!this.#featureObjectId) {\n throw new Error('No feature configuration object ID provided');\n }\n return this.#shellConfig.delete(this.#featureObjectId);\n }\n\n createSettingsObject(): Observable<any> {\n return this.#shellConfig.create(SHELL_CONFIG_FEATURES, []).pipe(\n tap((res) => {\n this.#featureObjectId = res.id;\n })\n );\n }\n\n export() {\n if (this.#featureObjectId) {\n this.#shellConfig.download(this.#featureObjectId, `${SHELL_CONFIG_FEATURES}.json`);\n }\n }\n\n import() {\n // read files contents\n\n return this.#featureObjectId\n ? this.#shell.pickFile().pipe(\n switchMap((file) =>\n file\n ? this.#shellConfig.upload(this.#featureObjectId!, file).pipe(\n switchMap((res) => {\n // read uploaded file\n return this.#backend.get(`/dms/objects/${res.id}/contents/file`).pipe(\n tap((data) => {\n // update features\n //console.log('data', data);\n\n this.#features = data;\n })\n );\n })\n )\n : of(null)\n )\n )\n : of(null);\n }\n}\n"]}
@@ -4,10 +4,10 @@ export class NoopExtension {
4
4
  init() {
5
5
  return Promise.resolve();
6
6
  }
7
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: NoopExtension, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: NoopExtension }); }
7
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NoopExtension, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NoopExtension }); }
9
9
  }
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: NoopExtension, decorators: [{
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NoopExtension, decorators: [{
11
11
  type: Injectable
12
12
  }] });
13
13
  //# sourceMappingURL=noop.extension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"noop.extension.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/shell/noop.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;;AAI3C,MAAM,OAAO,aAAa;IACxB,IAAI;QACF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;+GAHU,aAAa;mHAAb,aAAa;;4FAAb,aAAa;kBADzB,UAAU","sourcesContent":["import { Injectable } from '@angular/core';\nimport { ClientShellExtension } from '../../models/client-shell.interface';\n\n@Injectable()\nexport class NoopExtension implements ClientShellExtension {\n init(): Promise<any> {\n return Promise.resolve();\n }\n}\n"]}
1
+ {"version":3,"file":"noop.extension.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/shell/noop.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;;AAI3C,MAAM,OAAO,aAAa;IACxB,IAAI;QACF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;8GAHU,aAAa;kHAAb,aAAa;;2FAAb,aAAa;kBADzB,UAAU","sourcesContent":["import { Injectable } from '@angular/core';\nimport { ClientShellExtension } from '../../models/client-shell.interface';\n\n@Injectable()\nexport class NoopExtension implements ClientShellExtension {\n init(): Promise<any> {\n return Promise.resolve();\n }\n}\n"]}
@@ -1,10 +1,11 @@
1
- import { inject, provideAppInitializer } from '@angular/core';
1
+ import { inject, provideAppInitializer, provideZoneChangeDetection } from '@angular/core';
2
2
  import { bootstrapApplication } from '@angular/platform-browser';
3
3
  import { BaseObjectTypeField, provideAvailabilityManagement, provideRequirements, provideUser } from '@yuuvis/client-core';
4
4
  import { provideClientShellAlwaysShowNotifications, provideClientShellFeatures } from '../feature/feature.providers';
5
5
  import { getShellConfigQueryString, SHELL_CONFIG_FEATURES } from '../shell-config/shell-config.const';
6
6
  import { requirementsMapping } from './requirements.parser';
7
7
  import { ShellService } from './shell.service';
8
+ const HTTP_UNAUTHORIZED = 401;
8
9
  /**
9
10
  * Boostraps a yuuvis Momentum shell client.
10
11
  *
@@ -19,7 +20,7 @@ import { ShellService } from './shell.service';
19
20
  * @returns
20
21
  */
21
22
  export async function bootstrapShellApplication(rootComponent, options, shellOptions, requirements) {
22
- const o = options || {
23
+ const appConfig = options || {
23
24
  providers: []
24
25
  };
25
26
  const defaultProviders = [];
@@ -29,7 +30,7 @@ export async function bootstrapShellApplication(rootComponent, options, shellOpt
29
30
  }
30
31
  });
31
32
  if (!userResponse.ok) {
32
- if (userResponse.status === 401) {
33
+ if (userResponse.status === HTTP_UNAUTHORIZED) {
33
34
  window.location.href = `${location.origin}/logout`;
34
35
  }
35
36
  else {
@@ -37,10 +38,10 @@ export async function bootstrapShellApplication(rootComponent, options, shellOpt
37
38
  }
38
39
  }
39
40
  const userRes = await userResponse.json();
40
- o.providers = [...o.providers, provideUser(userRes)];
41
+ appConfig.providers = [...appConfig.providers, provideUser(userRes)];
41
42
  if (shellOptions?.enableObjectTypeConfig) {
42
- defaultProviders.push(provideAppInitializer(() => {
43
- inject(ShellService)._initObjectTypeConfig();
43
+ defaultProviders.push(provideAppInitializer(async () => {
44
+ await inject(ShellService)._initObjectTypeConfig();
44
45
  }));
45
46
  }
46
47
  if (shellOptions?.alwaysShowNotifications) {
@@ -48,7 +49,9 @@ export async function bootstrapShellApplication(rootComponent, options, shellOpt
48
49
  }
49
50
  // only call the backend if there actually are requirements to check
50
51
  if (requirements && Object.keys(requirements).length > 0) {
51
- const requirementsResponse = await fetch(`/api/dms/apps`, { headers: { 'Content-Type': 'application/json' } });
52
+ const requirementsResponse = await fetch(`/api/dms/apps`, {
53
+ headers: { 'Content-Type': 'application/json' }
54
+ });
52
55
  if (requirementsResponse.ok) {
53
56
  defaultProviders.push(provideAvailabilityManagement(requirementsMapping(await requirementsResponse.json())));
54
57
  }
@@ -69,7 +72,9 @@ export async function bootstrapShellApplication(rootComponent, options, shellOpt
69
72
  const objects = res.objects;
70
73
  if (objects?.length > 0) {
71
74
  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' } });
75
+ const file = await fetch(`/api/dms/objects/${id}/contents/file`, {
76
+ headers: { 'Content-Type': 'application/json' }
77
+ });
73
78
  const res = await file.json();
74
79
  const shellFeatureConfig = {
75
80
  objectID: id,
@@ -78,7 +83,10 @@ export async function bootstrapShellApplication(rootComponent, options, shellOpt
78
83
  defaultProviders.push(provideClientShellFeatures(shellFeatureConfig));
79
84
  }
80
85
  }
81
- o.providers = [...defaultProviders, ...o.providers];
82
- return bootstrapApplication(rootComponent, o);
86
+ appConfig.providers = [...defaultProviders, ...appConfig.providers];
87
+ return bootstrapApplication(rootComponent, {
88
+ ...appConfig,
89
+ providers: [provideZoneChangeDetection(), ...appConfig.providers]
90
+ });
83
91
  }
84
92
  //# sourceMappingURL=shell.bootstrap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.bootstrap.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/shell/shell.bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApplicationConfig, ApplicationRef, inject, provideAppInitializer, Type } from '@angular/core';\nimport { bootstrapApplication } from '@angular/platform-browser';\nimport { BaseObjectTypeField, Requirements, provideAvailabilityManagement, provideRequirements, provideUser } from '@yuuvis/client-core';\nimport { ShellBootstrapOptions } from '../../models/client-shell.interface';\nimport { ClientShellFeatureConfig } from '../feature/feature.interface';\nimport { provideClientShellAlwaysShowNotifications, provideClientShellFeatures } from '../feature/feature.providers';\nimport { getShellConfigQueryString, SHELL_CONFIG_FEATURES } from '../shell-config/shell-config.const';\nimport { requirementsMapping } from './requirements.parser';\nimport { ShellService } from './shell.service';\n\n/**\n * Boostraps a yuuvis Momentum shell client.\n *\n * ```ts\n * import { bootstrapShellApplication } from '@yuuvis/client-shell-core';\n *\n * bootstrapShellApplication(AppComponent, appConfig).catch((err) => console.error(err));\n * ```\n *\n * @param rootComponent Root component of the application\n * @param options Application configuration\n * @returns\n */\nexport async function bootstrapShellApplication(\n rootComponent: Type<unknown>,\n options?: ApplicationConfig,\n shellOptions?: ShellBootstrapOptions,\n requirements?: Requirements\n): Promise<ApplicationRef> {\n const o: ApplicationConfig = options || {\n providers: []\n };\n const defaultProviders = [];\n const userResponse: Response = await fetch('/api-web/api/idm/whoami', {\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n\n if (!userResponse.ok) {\n if (userResponse.status === 401) {\n window.location.href = `${location.origin}/logout`;\n } else {\n throw new Error('Failed to fetch user information');\n }\n }\n\n const userRes = await userResponse.json();\n o.providers = [...o.providers, provideUser(userRes)];\n\n if (shellOptions?.enableObjectTypeConfig) {\n defaultProviders.push(\n provideAppInitializer(() => {\n inject(ShellService)._initObjectTypeConfig();\n })\n );\n }\n\n if (shellOptions?.alwaysShowNotifications) {\n defaultProviders.push(provideClientShellAlwaysShowNotifications(true));\n }\n\n // only call the backend if there actually are requirements to check\n if (requirements && Object.keys(requirements).length > 0) {\n const requirementsResponse: Response = await fetch(`/api/dms/apps`, { headers: { 'Content-Type': 'application/json' } });\n if (requirementsResponse.ok) {\n defaultProviders.push(provideAvailabilityManagement(requirementsMapping(await requirementsResponse.json())));\n }\n defaultProviders.push(provideRequirements(requirements));\n }\n\n if (userRes && shellOptions?.enableFeatureConfig) {\n // find the config file\n const response = await fetch('/api/dms/objects/search', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n query: {\n statement: getShellConfigQueryString(SHELL_CONFIG_FEATURES)\n }\n })\n });\n const res = await response.json();\n\n const objects = res.objects;\n if (objects?.length > 0) {\n const id = objects[0]?.properties[BaseObjectTypeField.OBJECT_ID].value;\n\n const file = await fetch(`/api/dms/objects/${id}/contents/file`, { headers: { 'Content-Type': 'application/json' } });\n const res = await file.json();\n const shellFeatureConfig: ClientShellFeatureConfig = {\n objectID: id,\n features: res || []\n };\n\n defaultProviders.push(provideClientShellFeatures(shellFeatureConfig));\n }\n }\n o.providers = [...defaultProviders, ...o.providers];\n return bootstrapApplication(rootComponent, o);\n}\n"]}
1
+ {"version":3,"file":"shell.bootstrap.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/shell/shell.bootstrap.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ApplicationConfig,\n ApplicationRef,\n inject,\n provideAppInitializer,\n provideZoneChangeDetection,\n Type\n} from '@angular/core';\nimport { bootstrapApplication } from '@angular/platform-browser';\nimport {\n BaseObjectTypeField,\n provideAvailabilityManagement,\n provideRequirements,\n provideUser,\n Requirements\n} from '@yuuvis/client-core';\nimport { ShellBootstrapOptions } from '../../models/client-shell.interface';\nimport { ClientShellFeatureConfig } from '../feature/feature.interface';\nimport { provideClientShellAlwaysShowNotifications, provideClientShellFeatures } from '../feature/feature.providers';\nimport { getShellConfigQueryString, SHELL_CONFIG_FEATURES } from '../shell-config/shell-config.const';\nimport { requirementsMapping } from './requirements.parser';\nimport { ShellService } from './shell.service';\n\nconst HTTP_UNAUTHORIZED = 401;\n\n/**\n * Boostraps a yuuvis Momentum shell client.\n *\n * ```ts\n * import { bootstrapShellApplication } from '@yuuvis/client-shell-core';\n *\n * bootstrapShellApplication(AppComponent, appConfig).catch((err) => console.error(err));\n * ```\n *\n * @param rootComponent Root component of the application\n * @param options Application configuration\n * @returns\n */\nexport async function bootstrapShellApplication(\n rootComponent: Type<unknown>,\n options?: ApplicationConfig,\n shellOptions?: ShellBootstrapOptions,\n requirements?: Requirements\n): Promise<ApplicationRef> {\n const appConfig: ApplicationConfig = options || {\n providers: []\n };\n const defaultProviders = [];\n const userResponse: Response = await fetch('/api-web/api/idm/whoami', {\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n\n if (!userResponse.ok) {\n if (userResponse.status === HTTP_UNAUTHORIZED) {\n window.location.href = `${location.origin}/logout`;\n } else {\n throw new Error('Failed to fetch user information');\n }\n }\n\n const userRes = await userResponse.json();\n appConfig.providers = [...appConfig.providers, provideUser(userRes)];\n\n if (shellOptions?.enableObjectTypeConfig) {\n defaultProviders.push(\n provideAppInitializer(async () => {\n await inject(ShellService)._initObjectTypeConfig();\n })\n );\n }\n\n if (shellOptions?.alwaysShowNotifications) {\n defaultProviders.push(provideClientShellAlwaysShowNotifications(true));\n }\n\n // only call the backend if there actually are requirements to check\n if (requirements && Object.keys(requirements).length > 0) {\n const requirementsResponse: Response = await fetch(`/api/dms/apps`, {\n headers: { 'Content-Type': 'application/json' }\n });\n if (requirementsResponse.ok) {\n defaultProviders.push(provideAvailabilityManagement(requirementsMapping(await requirementsResponse.json())));\n }\n defaultProviders.push(provideRequirements(requirements));\n }\n\n if (userRes && shellOptions?.enableFeatureConfig) {\n // find the config file\n const response = await fetch('/api/dms/objects/search', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n query: {\n statement: getShellConfigQueryString(SHELL_CONFIG_FEATURES)\n }\n })\n });\n const res = await response.json();\n\n const objects = res.objects;\n if (objects?.length > 0) {\n const id = objects[0]?.properties[BaseObjectTypeField.OBJECT_ID].value;\n\n const file = await fetch(`/api/dms/objects/${id}/contents/file`, {\n headers: { 'Content-Type': 'application/json' }\n });\n const res = await file.json();\n const shellFeatureConfig: ClientShellFeatureConfig = {\n objectID: id,\n features: res || []\n };\n\n defaultProviders.push(provideClientShellFeatures(shellFeatureConfig));\n }\n }\n appConfig.providers = [...defaultProviders, ...appConfig.providers];\n return bootstrapApplication(rootComponent, {\n ...appConfig,\n providers: [provideZoneChangeDetection(), ...appConfig.providers]\n });\n}\n"]}
@@ -45,15 +45,15 @@ export class ShellService {
45
45
  this.isBusySubject = new BehaviorSubject(false);
46
46
  this.isBusy$ = this.isBusySubject.asObservable().pipe(debounceTime(500));
47
47
  // Apps can register their own setting components to be shown in shell settings
48
- this.#appSettings = signal([], ...(ngDevMode ? [{ debugName: "#appSettings" }] : []));
48
+ this.#appSettings = signal([], ...(ngDevMode ? [{ debugName: "#appSettings" }] : /* istanbul ignore next */ []));
49
49
  this.appSettings = this.#appSettings.asReadonly();
50
50
  this.appBaseRoutes = {};
51
51
  this.#defaultShellConfig = {
52
52
  appIcon: CLIENT_SHELL_ASSETS.appIcon,
53
53
  shellIconNamespace: CLIENT_SHELL_ASSETS.shellIconNamespace
54
54
  };
55
- this.shellConfig = signal(this.#defaultShellConfig, ...(ngDevMode ? [{ debugName: "shellConfig" }] : []));
56
- this.apps = signal([], ...(ngDevMode ? [{ debugName: "apps" }] : []));
55
+ this.shellConfig = signal(this.#defaultShellConfig, ...(ngDevMode ? [{ debugName: "shellConfig" }] : /* istanbul ignore next */ []));
56
+ this.apps = signal([], ...(ngDevMode ? [{ debugName: "apps" }] : /* istanbul ignore next */ []));
57
57
  /** TODO: implement this feature ????
58
58
  * Global shortcuts are captured by the shell to provide a consistent experience
59
59
  * accross all apps. Search is one example. Apps should not define their own shourtcuts
@@ -443,10 +443,10 @@ export class ShellService {
443
443
  _init() {
444
444
  // the place for initialization tasks if
445
445
  }
446
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ShellService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
447
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ShellService, providedIn: 'root' }); }
446
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ShellService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
447
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ShellService, providedIn: 'root' }); }
448
448
  }
449
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ShellService, decorators: [{
449
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ShellService, decorators: [{
450
450
  type: Injectable,
451
451
  args: [{
452
452
  providedIn: 'root'
@@ -1 +1 @@
1
- {"version":3,"file":"shell.service.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/shell/shell.service.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport { inject, Injectable, signal, Type, DOCUMENT } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ActivatedRoute, Navigation, NavigationEnd, Router, UrlSegmentGroup, UrlTree } from '@angular/router';\nimport {\n ApiBase,\n BaseObjectTypeField,\n ConfigService,\n DmsObject,\n DmsService,\n ObjectCreateFlavor,\n SystemService,\n SystemType,\n TranslateService,\n UserService,\n Utils,\n YuvUser\n} from '@yuuvis/client-core';\nimport {\n BehaviorSubject,\n debounceTime,\n filter,\n first,\n firstValueFrom,\n fromEvent,\n map,\n Observable,\n of,\n tap\n} from 'rxjs';\nimport { CLIENT_SHELL_ASSETS } from '../../client-shell.assets';\nimport {\n App,\n AppFlavor,\n ClientShellConfig,\n GlobalShortcut,\n ObjectFlavor,\n ShellAppSettings\n} from '../../models/client-shell.interface';\nimport { TileExtension } from '../../tile-extension.interface';\nimport { SHELL_CONFIG_TYPES } from '../shell-config/shell-config.const';\nimport { ClientShellType, ShellConfig } from '../shell-config/shell-config.interface';\nimport { ShellConfigService } from '../shell-config/shell-config.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ShellService {\n #dmsService = inject(DmsService);\n\n #dialog = inject(MatDialog);\n #system = inject(SystemService);\n #userService = inject(UserService);\n // TODO: Need orignal MatIconRegistry to #registerObjectTypeIcons, otherwise icons could not be registered in the namespace\n // #iconRegistry = inject(YuvMatIconRegistry);\n #iconRegistry = inject(MatIconRegistry);\n #shellConfig = inject(ShellConfigService);\n #configService = inject(ConfigService);\n #sanitizer = inject(DomSanitizer);\n #router = inject(Router);\n #route = inject(ActivatedRoute);\n #DOCUMENT = inject(DOCUMENT);\n private translate = inject(TranslateService);\n\n private _busyCount = 0;\n private isBusySubject = new BehaviorSubject<boolean>(false);\n isBusy$ = this.isBusySubject.asObservable().pipe(debounceTime(500));\n\n // Apps can register their own setting components to be shown in shell settings\n #appSettings = signal<ShellAppSettings[]>([]);\n appSettings = this.#appSettings.asReadonly();\n\n appBaseRoutes: Record<string, string> = {};\n\n #defaultShellConfig: ClientShellConfig = {\n appIcon: CLIENT_SHELL_ASSETS.appIcon,\n shellIconNamespace: CLIENT_SHELL_ASSETS.shellIconNamespace\n };\n shellConfig = signal<ClientShellConfig>(this.#defaultShellConfig);\n apps = signal<App[]>([]);\n\n /** TODO: implement this feature ????\n * Global shortcuts are captured by the shell to provide a consistent experience\n * accross all apps. Search is one example. Apps should not define their own shourtcuts\n * for search. Instead they should subscribe to the global shortcuts and initialize their\n * search based on the global search shortcut.\n */\n globalShortcuts$: Observable<GlobalShortcut> = fromEvent<KeyboardEvent>(document, 'keydown').pipe(\n map((e: KeyboardEvent) => {\n // global shortcut for search\n // if (e.ctrlKey && e.code === 'KeyF') {\n // e.preventDefault();\n // return GlobalShortcut.search;\n // }\n return undefined;\n }),\n filter((s: GlobalShortcut | undefined) => s !== undefined),\n map((s) => s as GlobalShortcut)\n );\n\n private _extensions: Record<string, TileExtension> = {};\n private _objectFlavors: ObjectFlavor[] = [];\n private _objectCreateFlavors: ObjectCreateFlavor[] = [];\n\n constructor() {\n this.translate.onLangChange.subscribe(() => {\n this.apps.set(this.#getMappedApps(this.apps()));\n });\n\n // track open dialogs in an auxillary route to support closing them on back navigation\n // as this is the expected behaviour on mobile devices\n this.#dialog.afterOpened.subscribe((ref: MatDialogRef<any, any>) => {\n this.#router.navigate([{ outlets: { dt: ['dialogs', this.#dialog.openDialogs.map((d, i) => i).join('-')] } }], {\n // replaceUrl: true,\n queryParamsHandling: 'preserve'\n });\n ref.afterClosed().subscribe((res) => {\n if (res?.closedByRoute) return;\n const openDialogs = this.#dialog.openDialogs.filter((d) => d.id !== ref.id);\n // having no open dialogs, clear the auxillary route\n const param = openDialogs.length > 0 ? ['dialogs', openDialogs.map((d, i) => i).join('-')] : null;\n this.#router.navigate([{ outlets: { dt: param } }], { replaceUrl: true, queryParamsHandling: 'preserve' });\n });\n });\n this.#router.events.pipe(filter((e) => e instanceof NavigationEnd)).subscribe((e) => {\n // when navigating and having no open dialogs, clear the auxillary route from the url\n if (this.#dialog.openDialogs.length === 0 && e.urlAfterRedirects.match(/(dt:[.]*)/)) {\n this.#router.navigate([{ outlets: { dt: null } }], { replaceUrl: true, queryParamsHandling: 'preserve' });\n }\n\n // if there are open dialogs and the primary route changed, close all open dialogs\n if (this.#dialog.openDialogs.length > 0) {\n if (this.primaryRouteChanged(this.#router.currentNavigation())) {\n this.#dialog.openDialogs.forEach((d) => d.close());\n }\n }\n });\n }\n\n #getPrimaryRoute(nav: Navigation | null): string | undefined {\n if (!nav) return undefined;\n const url: UrlTree = nav.finalUrl || nav.extractedUrl;\n const urlTreeChildren: UrlSegmentGroup | undefined = url.root.children['primary'];\n return urlTreeChildren ? urlTreeChildren.segments.map((s) => s.path).join('/') : undefined;\n }\n\n primaryRouteChanged(nav: Navigation | null): boolean {\n const previousNav = nav?.previousNavigation || null;\n return this.#getPrimaryRoute(nav) !== this.#getPrimaryRoute(previousNav);\n }\n\n pickFile(): Observable<File | null> {\n const input = this.#DOCUMENT.createElement('input');\n input.type = 'file';\n input.click();\n return fromEvent(input, 'change').pipe(\n map((e: Event) => (e.target as HTMLInputElement).files?.[0] || null),\n tap(() => {\n input.remove();\n })\n );\n }\n\n setShellConfig(csc: ClientShellConfig) {\n this.shellConfig.update((sc) => ({\n appIcon: csc.appIcon ?? sc.appIcon,\n shellIconNamespace: csc.shellIconNamespace ?? sc.shellIconNamespace\n }));\n }\n\n setApps(apps: App[]) {\n this.apps.set(this.#getMappedApps(apps));\n const appBaseRoutes: Record<string, string> = {};\n apps.forEach((a) => (appBaseRoutes[a.id] = a.path || ''));\n this.appBaseRoutes = appBaseRoutes;\n }\n\n #getMappedApps(apps: App[]): App[] {\n return apps.map((a) => {\n const ma = {\n ...a,\n title: this.#getAppTitle(a)\n };\n if (a.options?.appClaimKey) {\n ma.options = { ...ma.options, appClaim: this.#getAppClaim(a.options.appClaimKey) || a.options.appClaim };\n }\n return ma;\n });\n }\n\n #getAppTitle(a: App): string {\n const translatedTitle = this.translate.instant(a.id);\n return translatedTitle && !translatedTitle.startsWith('!missing') ? translatedTitle : (a.title as string) || '';\n }\n\n #getAppClaim(claimKey: string): string | undefined {\n const translatedClaim = this.translate.instant(claimKey);\n return translatedClaim && !translatedClaim.startsWith('!missing') ? translatedClaim : undefined;\n }\n\n getApp(id: string): App | undefined {\n return this.apps().find((a) => id === a.id);\n }\n\n getApps(ids: string[] = []): App[] {\n return ids.length ? this.apps().filter((a) => ids.includes(a.id)) : this.apps();\n }\n\n /**\n * Register settings for apps to hook into shell settings page.\n * @param appID ID of the app that exposes the settings\n * @param cfg ShellAppSettings object containing the settings component\n */\n registerAppSettings(cfg: ShellAppSettings) {\n this.#appSettings.set([...this.#appSettings(), cfg]);\n }\n\n /**\n * Load persisted settings for a specific app\n * @param appID ID of the app to load the settings for\n */\n usersAppSettings$(appID: string): Observable<ShellAppSettings | undefined> {\n return this.#userService.user$.pipe(\n map((u: YuvUser | undefined) => {\n return u && u.userSettings.clientAppSettings ? u.userSettings.clientAppSettings[appID] : undefined;\n })\n );\n }\n\n saveUsersAppSettings(appID: string, settings: ShellAppSettings): Observable<any> {\n return this.#userService.saveUserSettings({ clientAppSettings: { [appID]: settings } });\n }\n\n addBusy() {\n if (this._busyCount === 0) {\n this.isBusySubject.next(true);\n }\n this._busyCount++;\n }\n removeBusy() {\n this._busyCount--;\n if (this._busyCount === 0) {\n this.isBusySubject.next(false);\n }\n }\n\n /**\n * Exposes object create flavors to the shell.\n * Thes flavors describe different ways of how objects can be created. So apps\n * can register custom ways of creating objects that can then be used by other apps.\n * @param flavors Create flavors to be exposed\n */\n exposeObjectCreateFlavors(flavors: ObjectCreateFlavor[]) {\n flavors.forEach((flavor: ObjectCreateFlavor) => {\n const idx = this._objectCreateFlavors.findIndex((f) => f.id === flavor.id);\n if (idx === -1) this._objectCreateFlavors.push(flavor);\n });\n }\n\n /**\n * Remove object create flavors from the shells registry\n * @param flavors Create flavors to be removed\n */\n concealObjectCreateFlavors(flavors: ObjectCreateFlavor[]) {\n const fid = flavors.map((f) => f.id);\n this._objectCreateFlavors = this._objectCreateFlavors.filter((f) => !fid.includes(f.id));\n }\n\n /**\n * Get all registerd object create flavors\n */\n getObjectCreateFlavors(): ObjectCreateFlavor[] {\n return this._objectCreateFlavors;\n }\n\n /**\n * Exposes a list of object flavors to the shell.\n * Flavors are able to be applied to objects and add new metadata properties to them.\n * @param flavors Array of flavors to be exposed\n * @param app Optional ID of the app that exposes the flavors (defaults to 'global' if not provided)\n * @param origin Optional origin of the flavors. Flavors could be added by apps or derived\n * from a configuration (defaults to 'app' if not provided)\n */\n exposeObjectFlavors(flavors: AppFlavor[], app = 'global', origin: 'app' | 'config' = 'app') {\n flavors.forEach((f) => this.exposeObjectFlavor(f, app, origin));\n }\n\n /**\n * Removes exposed object flavors from the shell.\n * @param flavors Array of flavors to be concealed\n */\n concealObjectFlavors(flavors: AppFlavor[], app = 'global') {\n flavors.forEach((f) => this.concealObjectFlavor(f, app));\n }\n\n /**\n * Exposes an object flavor to the shell. Flavors are able to be applied to objects\n * in order to add a new aspect to them. An object containing an image for example could\n * be added a flavor of 'EXIF Data' that will add the corresponding SOT to it. This way the\n * object gets new metadata properties. If supported, these metadata could even be extracted\n * from the file and filled out automatically.\n * @param flavor The flavor object to be exposed\n * @param app Optional ID of the app that exposes the flavor (defaults to 'global' if not provided)\n * @param origin Optional origin of the flavors. Flavors could be added by apps or derived\n * from a configuration (defaults to 'app' if not provided)\n */\n exposeObjectFlavor(flavor: AppFlavor, app = 'global', origin: 'app' | 'config' = 'app') {\n const idx = this._objectFlavors.findIndex((f) => f.id === flavor.id && f.app === app);\n if (idx === -1) this._objectFlavors.push({ ...flavor, app, origin });\n }\n\n /**\n * Removes an exposed object flavor from the shell.\n * @param flavor Flavor to be concealed\n * @param app Optional ID of the app that exposes the flavor (defaults to 'global' if not provided)\n */\n concealObjectFlavor(flavor: AppFlavor, app = 'global') {\n this._objectFlavors = this._objectFlavors.filter((f) => {\n const hasSameId = f.id === flavor.id;\n const isFromSameApp = f.app === app;\n return hasSameId && isFromSameApp ? false : true;\n });\n }\n\n /**\n * Get registered object flavors\n * @param app Optional app ID that restricts the returned flavors to the ones\n * provided by a particular app. If not provided all flavors are returned\n * @returns Array of matching object flavors\n */\n getObjectFlavors(app?: string): ObjectFlavor[] {\n return app ? this._objectFlavors.filter((of) => of.app === app) : this._objectFlavors;\n }\n\n /**\n * Triggers the application of an object flavor. If the flavor has an applyComponent\n * defined, the overlay will be opened with the component. Otherwise the flavor will\n * be applied directly to the object.\n * @param dmsObject The object to apply the flavor to\n * @param flavor The flavor to apply\n * @param data Optional data to be passed to the flavor component\n * @returns Observable that emits true if the flavor was applied successfully\n */\n triggerApplyObjectFlavor(\n dmsObject: DmsObject,\n flavor: ObjectFlavor,\n data?: any,\n applyComponent?: Type<any>\n ): Observable<boolean> {\n if (flavor.preventApply) return of(false);\n if (dmsObject) {\n const ac = applyComponent || flavor.applyComponent;\n if (ac) {\n this.#dialog.open(ac, {\n maxWidth: '90vw',\n maxHeight: '90vh',\n minWidth: '50vw',\n data: {\n dmsObject,\n flavor,\n data\n }\n });\n return of(true);\n } else {\n const sots: string[] = (dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] as string[]) || [];\n const data: any = {};\n data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, flavor.sot];\n return this.#dmsService.updateDmsObject(dmsObject?.id, data).pipe(map(() => true));\n }\n } else return of(false);\n }\n\n removeObjectFlavor(dmsObject: DmsObject, flavor: ObjectFlavor): Observable<any> {\n if (flavor.preventRemove) return of(false);\n const data: Record<string, unknown> = {\n [BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS]: (\n dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] as string[]\n ).filter((sot: string) => sot !== flavor.sot)\n };\n return this.#dmsService.updateDmsObject(dmsObject.id, data).pipe(map(() => true));\n }\n\n /**\n * Get object flavors applicable for a certain mimetype\n * @param mimeType Mime type or mime type pattern like 'image/*'\n * @param app Optional app ID that restricts the returned flavors to the ones\n * provided by a particular app\n * @param customFlavors Optional array of custom flavors to also take into account.\n * This could be flavors managed by an app itself that are not supposed to be\n * exposed to other apps\n * @returns Array of matching object flavors\n */\n getApplicableDocumentFlavors(mimeType: string, app?: string, customFlavors?: ObjectFlavor[]): ObjectFlavor[] {\n return [...(customFlavors || []), ...this._objectFlavors].filter(\n (of: ObjectFlavor) =>\n // !of.preventApply &&\n (!of.applicableTo?.folders || (of.applicableTo?.folders && of.applicableTo?.documents)) &&\n (!of.applicableTo ||\n !of.applicableTo?.mimeTypes ||\n (of.applicableTo?.mimeTypes?.some((mtp) => Utils.patternToRegExp(mtp).test(mimeType)) &&\n (!app || of.app === app)))\n );\n }\n\n getApplicableFolderFlavors(app?: string, customFlavors?: ObjectFlavor[]): ObjectFlavor[] {\n return [...(customFlavors || []), ...this._objectFlavors].filter(\n (of: ObjectFlavor) => !of.preventApply && of.applicableTo?.folders && (!app || of.app === app)\n );\n }\n\n /**\n * Get applied and applicable object flavors for a certain object\n * @param dmsObject DmsObject to get flavors for\n * @returns Object containing two arrays: applied and applicable flavors\n */\n getAppliedObjectFlavors(dmsObject: DmsObject): {\n applied: ObjectFlavor[];\n applicable: ObjectFlavor[];\n } {\n const applied: ObjectFlavor[] = [];\n const applicable: ObjectFlavor[] = [];\n if (dmsObject) {\n const sots: string[] = (dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] as string[]) || [];\n if (dmsObject.content) {\n this.getApplicableDocumentFlavors(dmsObject.content.mimeType).forEach((flavor: ObjectFlavor) => {\n flavor = {\n ...flavor,\n name: this.#system.getLocalizedLabel(flavor.id) || this.translate.instant(flavor.id),\n description:\n this.#system.getLocalizedDescription(flavor.id) ||\n (flavor.descriptionKey ? this.translate.instant(flavor.descriptionKey) : undefined)\n };\n if (sots.includes(flavor.sot)) {\n applied.push(flavor);\n } else if (!flavor.preventApply) {\n applicable.push(flavor);\n }\n });\n }\n\n if (dmsObject.isFolder) {\n this.getApplicableFolderFlavors().forEach((flavor: ObjectFlavor) => {\n flavor = {\n ...flavor,\n name: this.#system.getLocalizedLabel(flavor.id) || this.translate.instant(flavor.id),\n description:\n this.#system.getLocalizedDescription(flavor.id) ||\n (flavor.descriptionKey ? this.translate.instant(flavor.descriptionKey) : undefined)\n };\n if (sots.includes(flavor.sot)) {\n applied.push(flavor);\n } else {\n applicable.push(flavor);\n }\n });\n }\n }\n return { applied, applicable };\n }\n\n getFlavorLabel(id: string) {\n return this.#system.getLocalizedLabel(id) || this.translate.instant(id);\n }\n\n applyObjectFlavor(\n dmsObject: DmsObject,\n flavor: ObjectFlavor,\n data: Record<string, unknown> = {}\n ): Observable<DmsObject> {\n const sots: string[] = (dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] as string[]) || [];\n data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, flavor.sot];\n return this.#dmsService.updateDmsObject(dmsObject.id, data);\n }\n\n registerTileExtension(ext: TileExtension) {\n this._extensions[ext.typeId] = ext;\n }\n\n /**\n * Get tile extensions for a certain type\n * @param typeId ID of the type to fetch extesion for (objectTypeID or secondaryObjectTypeID)\n * @returns\n */\n getRegisteredTileExtensions(): Record<string, TileExtension> {\n return this._extensions;\n }\n\n _initObjectTypeConfig(): Promise<unknown> {\n // load flavors from config\n console.debug('Loading object type config...');\n return firstValueFrom(\n this.#shellConfig.get(SHELL_CONFIG_TYPES).pipe(\n tap((res: ShellConfig | undefined) => {\n if (res) {\n this.#registerObjectTypeIcons((res.data as ClientShellType[]).map((t) => t.id));\n\n const flv: AppFlavor[] = (res.data as ClientShellType[]).map((t) => ({\n id: t.id,\n sot: t.id,\n icon: t.id,\n svgIcon: true,\n objectTypeID: t.baseType,\n applicableTo: {\n folders: t.baseType === SystemType.FOLDER || t.baseType === SystemType.OBJECT,\n documents: t.baseType === SystemType.DOCUMENT || t.baseType === SystemType.OBJECT,\n mimeTypes: t.applicableToMimeTypes || undefined\n },\n useDefaultApplyComponent: !t.instantApply\n }));\n this.exposeObjectFlavors(flv, 'global', 'config');\n }\n })\n )\n );\n }\n\n #registerObjectTypeIcons(ids: string[]) {\n this.#system.system$.pipe(first()).subscribe(() => {\n ids.forEach((id) => {\n // split technical name e.g. 'system:document' and use the first part as namespace\n const idTokens = id.split(':');\n if (idTokens.length === 2) {\n const uri = `${this.#configService.getApiBase(ApiBase.none, true)}${this.#system.getObjectTypeIconUri(id)}`;\n this.#iconRegistry.addSvgIconInNamespace(\n idTokens[0],\n idTokens[1],\n this.#sanitizer.bypassSecurityTrustResourceUrl(uri)\n );\n }\n });\n });\n }\n\n _init() {\n // the place for initialization tasks if\n }\n}\n"]}
1
+ {"version":3,"file":"shell.service.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/shell/shell.service.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport { inject, Injectable, signal, Type, DOCUMENT } from '@angular/core';\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ActivatedRoute, Navigation, NavigationEnd, Router, UrlSegmentGroup, UrlTree } from '@angular/router';\nimport {\n ApiBase,\n BaseObjectTypeField,\n ConfigService,\n DmsObject,\n DmsService,\n ObjectCreateFlavor,\n SystemService,\n SystemType,\n TranslateService,\n UserService,\n Utils,\n YuvUser\n} from '@yuuvis/client-core';\nimport {\n BehaviorSubject,\n debounceTime,\n filter,\n first,\n firstValueFrom,\n fromEvent,\n map,\n Observable,\n of,\n tap\n} from 'rxjs';\nimport { CLIENT_SHELL_ASSETS } from '../../client-shell.assets';\nimport {\n App,\n AppFlavor,\n ClientShellConfig,\n GlobalShortcut,\n ObjectFlavor,\n ShellAppSettings\n} from '../../models/client-shell.interface';\nimport { TileExtension } from '../../tile-extension.interface';\nimport { SHELL_CONFIG_TYPES } from '../shell-config/shell-config.const';\nimport { ClientShellType, ShellConfig } from '../shell-config/shell-config.interface';\nimport { ShellConfigService } from '../shell-config/shell-config.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ShellService {\n #dmsService = inject(DmsService);\n\n #dialog = inject(MatDialog);\n #system = inject(SystemService);\n #userService = inject(UserService);\n // TODO: Need orignal MatIconRegistry to #registerObjectTypeIcons, otherwise icons could not be registered in the namespace\n // #iconRegistry = inject(YuvMatIconRegistry);\n #iconRegistry = inject(MatIconRegistry);\n #shellConfig = inject(ShellConfigService);\n #configService = inject(ConfigService);\n #sanitizer = inject(DomSanitizer);\n #router = inject(Router);\n #route = inject(ActivatedRoute);\n #DOCUMENT = inject(DOCUMENT);\n private translate = inject(TranslateService);\n\n private _busyCount = 0;\n private isBusySubject = new BehaviorSubject<boolean>(false);\n isBusy$ = this.isBusySubject.asObservable().pipe(debounceTime(500));\n\n // Apps can register their own setting components to be shown in shell settings\n #appSettings = signal<ShellAppSettings[]>([]);\n appSettings = this.#appSettings.asReadonly();\n\n appBaseRoutes: Record<string, string> = {};\n\n #defaultShellConfig: ClientShellConfig = {\n appIcon: CLIENT_SHELL_ASSETS.appIcon,\n shellIconNamespace: CLIENT_SHELL_ASSETS.shellIconNamespace\n };\n shellConfig = signal<ClientShellConfig>(this.#defaultShellConfig);\n apps = signal<App[]>([]);\n\n /** TODO: implement this feature ????\n * Global shortcuts are captured by the shell to provide a consistent experience\n * accross all apps. Search is one example. Apps should not define their own shourtcuts\n * for search. Instead they should subscribe to the global shortcuts and initialize their\n * search based on the global search shortcut.\n */\n globalShortcuts$: Observable<GlobalShortcut> = fromEvent<KeyboardEvent>(document, 'keydown').pipe(\n map((e: KeyboardEvent) => {\n // global shortcut for search\n // if (e.ctrlKey && e.code === 'KeyF') {\n // e.preventDefault();\n // return GlobalShortcut.search;\n // }\n return undefined;\n }),\n filter((s: GlobalShortcut | undefined) => s !== undefined),\n map((s) => s as GlobalShortcut)\n );\n\n private _extensions: Record<string, TileExtension> = {};\n private _objectFlavors: ObjectFlavor[] = [];\n private _objectCreateFlavors: ObjectCreateFlavor[] = [];\n\n constructor() {\n this.translate.onLangChange.subscribe(() => {\n this.apps.set(this.#getMappedApps(this.apps()));\n });\n\n // track open dialogs in an auxillary route to support closing them on back navigation\n // as this is the expected behaviour on mobile devices\n this.#dialog.afterOpened.subscribe((ref: MatDialogRef<any, any>) => {\n this.#router.navigate([{ outlets: { dt: ['dialogs', this.#dialog.openDialogs.map((d, i) => i).join('-')] } }], {\n // replaceUrl: true,\n queryParamsHandling: 'preserve'\n });\n ref.afterClosed().subscribe((res) => {\n if (res?.closedByRoute) return;\n const openDialogs = this.#dialog.openDialogs.filter((d) => d.id !== ref.id);\n // having no open dialogs, clear the auxillary route\n const param = openDialogs.length > 0 ? ['dialogs', openDialogs.map((d, i) => i).join('-')] : null;\n this.#router.navigate([{ outlets: { dt: param } }], { replaceUrl: true, queryParamsHandling: 'preserve' });\n });\n });\n this.#router.events.pipe(filter((e) => e instanceof NavigationEnd)).subscribe((e) => {\n // when navigating and having no open dialogs, clear the auxillary route from the url\n if (this.#dialog.openDialogs.length === 0 && e.urlAfterRedirects.match(/(dt:[.]*)/)) {\n this.#router.navigate([{ outlets: { dt: null } }], { replaceUrl: true, queryParamsHandling: 'preserve' });\n }\n\n // if there are open dialogs and the primary route changed, close all open dialogs\n if (this.#dialog.openDialogs.length > 0) {\n if (this.primaryRouteChanged(this.#router.currentNavigation())) {\n this.#dialog.openDialogs.forEach((d) => d.close());\n }\n }\n });\n }\n\n #getPrimaryRoute(nav: Navigation | null): string | undefined {\n if (!nav) return undefined;\n const url: UrlTree = nav.finalUrl || nav.extractedUrl;\n const urlTreeChildren: UrlSegmentGroup | undefined = url.root.children['primary'];\n return urlTreeChildren ? urlTreeChildren.segments.map((s) => s.path).join('/') : undefined;\n }\n\n primaryRouteChanged(nav: Navigation | null): boolean {\n const previousNav = nav?.previousNavigation || null;\n return this.#getPrimaryRoute(nav) !== this.#getPrimaryRoute(previousNav);\n }\n\n pickFile(): Observable<File | null> {\n const input = this.#DOCUMENT.createElement('input');\n input.type = 'file';\n input.click();\n return fromEvent(input, 'change').pipe(\n map((e: Event) => (e.target as HTMLInputElement).files?.[0] || null),\n tap(() => {\n input.remove();\n })\n );\n }\n\n setShellConfig(csc: ClientShellConfig) {\n this.shellConfig.update((sc) => ({\n appIcon: csc.appIcon ?? sc.appIcon,\n shellIconNamespace: csc.shellIconNamespace ?? sc.shellIconNamespace\n }));\n }\n\n setApps(apps: App[]) {\n this.apps.set(this.#getMappedApps(apps));\n const appBaseRoutes: Record<string, string> = {};\n apps.forEach((a) => (appBaseRoutes[a.id] = a.path || ''));\n this.appBaseRoutes = appBaseRoutes;\n }\n\n #getMappedApps(apps: App[]): App[] {\n return apps.map((a) => {\n const ma = {\n ...a,\n title: this.#getAppTitle(a)\n };\n if (a.options?.appClaimKey) {\n ma.options = { ...ma.options, appClaim: this.#getAppClaim(a.options.appClaimKey) || a.options.appClaim };\n }\n return ma;\n });\n }\n\n #getAppTitle(a: App): string {\n const translatedTitle = this.translate.instant(a.id);\n return translatedTitle && !translatedTitle.startsWith('!missing') ? translatedTitle : (a.title as string) || '';\n }\n\n #getAppClaim(claimKey: string): string | undefined {\n const translatedClaim = this.translate.instant(claimKey);\n return translatedClaim && !translatedClaim.startsWith('!missing') ? translatedClaim : undefined;\n }\n\n getApp(id: string): App | undefined {\n return this.apps().find((a) => id === a.id);\n }\n\n getApps(ids: string[] = []): App[] {\n return ids.length ? this.apps().filter((a) => ids.includes(a.id)) : this.apps();\n }\n\n /**\n * Register settings for apps to hook into shell settings page.\n * @param appID ID of the app that exposes the settings\n * @param cfg ShellAppSettings object containing the settings component\n */\n registerAppSettings(cfg: ShellAppSettings) {\n this.#appSettings.set([...this.#appSettings(), cfg]);\n }\n\n /**\n * Load persisted settings for a specific app\n * @param appID ID of the app to load the settings for\n */\n usersAppSettings$(appID: string): Observable<ShellAppSettings | undefined> {\n return this.#userService.user$.pipe(\n map((u: YuvUser | undefined) => {\n return u && u.userSettings.clientAppSettings ? u.userSettings.clientAppSettings[appID] : undefined;\n })\n );\n }\n\n saveUsersAppSettings(appID: string, settings: ShellAppSettings): Observable<any> {\n return this.#userService.saveUserSettings({ clientAppSettings: { [appID]: settings } });\n }\n\n addBusy() {\n if (this._busyCount === 0) {\n this.isBusySubject.next(true);\n }\n this._busyCount++;\n }\n removeBusy() {\n this._busyCount--;\n if (this._busyCount === 0) {\n this.isBusySubject.next(false);\n }\n }\n\n /**\n * Exposes object create flavors to the shell.\n * Thes flavors describe different ways of how objects can be created. So apps\n * can register custom ways of creating objects that can then be used by other apps.\n * @param flavors Create flavors to be exposed\n */\n exposeObjectCreateFlavors(flavors: ObjectCreateFlavor[]) {\n flavors.forEach((flavor: ObjectCreateFlavor) => {\n const idx = this._objectCreateFlavors.findIndex((f) => f.id === flavor.id);\n if (idx === -1) this._objectCreateFlavors.push(flavor);\n });\n }\n\n /**\n * Remove object create flavors from the shells registry\n * @param flavors Create flavors to be removed\n */\n concealObjectCreateFlavors(flavors: ObjectCreateFlavor[]) {\n const fid = flavors.map((f) => f.id);\n this._objectCreateFlavors = this._objectCreateFlavors.filter((f) => !fid.includes(f.id));\n }\n\n /**\n * Get all registerd object create flavors\n */\n getObjectCreateFlavors(): ObjectCreateFlavor[] {\n return this._objectCreateFlavors;\n }\n\n /**\n * Exposes a list of object flavors to the shell.\n * Flavors are able to be applied to objects and add new metadata properties to them.\n * @param flavors Array of flavors to be exposed\n * @param app Optional ID of the app that exposes the flavors (defaults to 'global' if not provided)\n * @param origin Optional origin of the flavors. Flavors could be added by apps or derived\n * from a configuration (defaults to 'app' if not provided)\n */\n exposeObjectFlavors(flavors: AppFlavor[], app = 'global', origin: 'app' | 'config' = 'app') {\n flavors.forEach((f) => this.exposeObjectFlavor(f, app, origin));\n }\n\n /**\n * Removes exposed object flavors from the shell.\n * @param flavors Array of flavors to be concealed\n */\n concealObjectFlavors(flavors: AppFlavor[], app = 'global') {\n flavors.forEach((f) => this.concealObjectFlavor(f, app));\n }\n\n /**\n * Exposes an object flavor to the shell. Flavors are able to be applied to objects\n * in order to add a new aspect to them. An object containing an image for example could\n * be added a flavor of 'EXIF Data' that will add the corresponding SOT to it. This way the\n * object gets new metadata properties. If supported, these metadata could even be extracted\n * from the file and filled out automatically.\n * @param flavor The flavor object to be exposed\n * @param app Optional ID of the app that exposes the flavor (defaults to 'global' if not provided)\n * @param origin Optional origin of the flavors. Flavors could be added by apps or derived\n * from a configuration (defaults to 'app' if not provided)\n */\n exposeObjectFlavor(flavor: AppFlavor, app = 'global', origin: 'app' | 'config' = 'app') {\n const idx = this._objectFlavors.findIndex((f) => f.id === flavor.id && f.app === app);\n if (idx === -1) this._objectFlavors.push({ ...flavor, app, origin });\n }\n\n /**\n * Removes an exposed object flavor from the shell.\n * @param flavor Flavor to be concealed\n * @param app Optional ID of the app that exposes the flavor (defaults to 'global' if not provided)\n */\n concealObjectFlavor(flavor: AppFlavor, app = 'global') {\n this._objectFlavors = this._objectFlavors.filter((f) => {\n const hasSameId = f.id === flavor.id;\n const isFromSameApp = f.app === app;\n return hasSameId && isFromSameApp ? false : true;\n });\n }\n\n /**\n * Get registered object flavors\n * @param app Optional app ID that restricts the returned flavors to the ones\n * provided by a particular app. If not provided all flavors are returned\n * @returns Array of matching object flavors\n */\n getObjectFlavors(app?: string): ObjectFlavor[] {\n return app ? this._objectFlavors.filter((of) => of.app === app) : this._objectFlavors;\n }\n\n /**\n * Triggers the application of an object flavor. If the flavor has an applyComponent\n * defined, the overlay will be opened with the component. Otherwise the flavor will\n * be applied directly to the object.\n * @param dmsObject The object to apply the flavor to\n * @param flavor The flavor to apply\n * @param data Optional data to be passed to the flavor component\n * @returns Observable that emits true if the flavor was applied successfully\n */\n triggerApplyObjectFlavor(\n dmsObject: DmsObject,\n flavor: ObjectFlavor,\n data?: any,\n applyComponent?: Type<any>\n ): Observable<boolean> {\n if (flavor.preventApply) return of(false);\n if (dmsObject) {\n const ac = applyComponent || flavor.applyComponent;\n if (ac) {\n this.#dialog.open(ac, {\n maxWidth: '90vw',\n maxHeight: '90vh',\n minWidth: '50vw',\n data: {\n dmsObject,\n flavor,\n data\n }\n });\n return of(true);\n } else {\n const sots: string[] = (dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] as string[]) || [];\n const data: any = {};\n data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, flavor.sot];\n return this.#dmsService.updateDmsObject(dmsObject?.id, data).pipe(map(() => true));\n }\n } else return of(false);\n }\n\n removeObjectFlavor(dmsObject: DmsObject, flavor: ObjectFlavor): Observable<any> {\n if (flavor.preventRemove) return of(false);\n const data: Record<string, unknown> = {\n [BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS]: (\n dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] as string[]\n ).filter((sot: string) => sot !== flavor.sot)\n };\n return this.#dmsService.updateDmsObject(dmsObject.id, data).pipe(map(() => true));\n }\n\n /**\n * Get object flavors applicable for a certain mimetype\n * @param mimeType Mime type or mime type pattern like 'image/*'\n * @param app Optional app ID that restricts the returned flavors to the ones\n * provided by a particular app\n * @param customFlavors Optional array of custom flavors to also take into account.\n * This could be flavors managed by an app itself that are not supposed to be\n * exposed to other apps\n * @returns Array of matching object flavors\n */\n getApplicableDocumentFlavors(mimeType: string, app?: string, customFlavors?: ObjectFlavor[]): ObjectFlavor[] {\n return [...(customFlavors || []), ...this._objectFlavors].filter(\n (of: ObjectFlavor) =>\n // !of.preventApply &&\n (!of.applicableTo?.folders || (of.applicableTo?.folders && of.applicableTo?.documents)) &&\n (!of.applicableTo ||\n !of.applicableTo?.mimeTypes ||\n (of.applicableTo?.mimeTypes?.some((mtp) => Utils.patternToRegExp(mtp).test(mimeType)) &&\n (!app || of.app === app)))\n );\n }\n\n getApplicableFolderFlavors(app?: string, customFlavors?: ObjectFlavor[]): ObjectFlavor[] {\n return [...(customFlavors || []), ...this._objectFlavors].filter(\n (of: ObjectFlavor) => !of.preventApply && of.applicableTo?.folders && (!app || of.app === app)\n );\n }\n\n /**\n * Get applied and applicable object flavors for a certain object\n * @param dmsObject DmsObject to get flavors for\n * @returns Object containing two arrays: applied and applicable flavors\n */\n getAppliedObjectFlavors(dmsObject: DmsObject): {\n applied: ObjectFlavor[];\n applicable: ObjectFlavor[];\n } {\n const applied: ObjectFlavor[] = [];\n const applicable: ObjectFlavor[] = [];\n if (dmsObject) {\n const sots: string[] = (dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] as string[]) || [];\n if (dmsObject.content) {\n this.getApplicableDocumentFlavors(dmsObject.content.mimeType).forEach((flavor: ObjectFlavor) => {\n flavor = {\n ...flavor,\n name: this.#system.getLocalizedLabel(flavor.id) || this.translate.instant(flavor.id),\n description:\n this.#system.getLocalizedDescription(flavor.id) ||\n (flavor.descriptionKey ? this.translate.instant(flavor.descriptionKey) : undefined)\n };\n if (sots.includes(flavor.sot)) {\n applied.push(flavor);\n } else if (!flavor.preventApply) {\n applicable.push(flavor);\n }\n });\n }\n\n if (dmsObject.isFolder) {\n this.getApplicableFolderFlavors().forEach((flavor: ObjectFlavor) => {\n flavor = {\n ...flavor,\n name: this.#system.getLocalizedLabel(flavor.id) || this.translate.instant(flavor.id),\n description:\n this.#system.getLocalizedDescription(flavor.id) ||\n (flavor.descriptionKey ? this.translate.instant(flavor.descriptionKey) : undefined)\n };\n if (sots.includes(flavor.sot)) {\n applied.push(flavor);\n } else {\n applicable.push(flavor);\n }\n });\n }\n }\n return { applied, applicable };\n }\n\n getFlavorLabel(id: string) {\n return this.#system.getLocalizedLabel(id) || this.translate.instant(id);\n }\n\n applyObjectFlavor(\n dmsObject: DmsObject,\n flavor: ObjectFlavor,\n data: Record<string, unknown> = {}\n ): Observable<DmsObject> {\n const sots: string[] = (dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] as string[]) || [];\n data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, flavor.sot];\n return this.#dmsService.updateDmsObject(dmsObject.id, data);\n }\n\n registerTileExtension(ext: TileExtension) {\n this._extensions[ext.typeId] = ext;\n }\n\n /**\n * Get tile extensions for a certain type\n * @param typeId ID of the type to fetch extesion for (objectTypeID or secondaryObjectTypeID)\n * @returns\n */\n getRegisteredTileExtensions(): Record<string, TileExtension> {\n return this._extensions;\n }\n\n _initObjectTypeConfig(): Promise<unknown> {\n // load flavors from config\n console.debug('Loading object type config...');\n return firstValueFrom(\n this.#shellConfig.get(SHELL_CONFIG_TYPES).pipe(\n tap((res: ShellConfig | undefined) => {\n if (res) {\n this.#registerObjectTypeIcons((res.data as ClientShellType[]).map((t) => t.id));\n\n const flv: AppFlavor[] = (res.data as ClientShellType[]).map((t) => ({\n id: t.id,\n sot: t.id,\n icon: t.id,\n svgIcon: true,\n objectTypeID: t.baseType,\n applicableTo: {\n folders: t.baseType === SystemType.FOLDER || t.baseType === SystemType.OBJECT,\n documents: t.baseType === SystemType.DOCUMENT || t.baseType === SystemType.OBJECT,\n mimeTypes: t.applicableToMimeTypes || undefined\n },\n useDefaultApplyComponent: !t.instantApply\n }));\n this.exposeObjectFlavors(flv, 'global', 'config');\n }\n })\n )\n );\n }\n\n #registerObjectTypeIcons(ids: string[]) {\n this.#system.system$.pipe(first()).subscribe(() => {\n ids.forEach((id) => {\n // split technical name e.g. 'system:document' and use the first part as namespace\n const idTokens = id.split(':');\n if (idTokens.length === 2) {\n const uri = `${this.#configService.getApiBase(ApiBase.none, true)}${this.#system.getObjectTypeIconUri(id)}`;\n this.#iconRegistry.addSvgIconInNamespace(\n idTokens[0],\n idTokens[1],\n this.#sanitizer.bypassSecurityTrustResourceUrl(uri)\n );\n }\n });\n });\n }\n\n _init() {\n // the place for initialization tasks if\n }\n}\n"]}
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=shell-config.interface.js.map
@@ -88,10 +88,10 @@ export class ShellConfigService {
88
88
  #dataToFile(data) {
89
89
  return new File([JSON.stringify(data)], 'config.json', { type: 'application/json' });
90
90
  }
91
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ShellConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
92
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ShellConfigService, providedIn: 'root' }); }
91
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ShellConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
92
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ShellConfigService, providedIn: 'root' }); }
93
93
  }
94
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ShellConfigService, decorators: [{
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ShellConfigService, decorators: [{
95
95
  type: Injectable,
96
96
  args: [{
97
97
  providedIn: 'root'
@@ -1 +1 @@
1
- {"version":3,"file":"shell-config.service.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/shell-config/shell-config.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { ApiBase, BackendService, BaseObjectTypeField, DmsService } from '@yuuvis/client-core';\nimport { map, Observable, of, switchMap } from 'rxjs';\nimport { getShellConfigQueryString, SHELL_CONFIG_BASE } from './shell-config.const';\nimport { ShellConfig } from './shell-config.interface';\n\n/**\n * Service to manage shell configuration objects. Base on the 'system:item' type.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ShellConfigService {\n #dmsService = inject(DmsService);\n #backend = inject(BackendService);\n\n get(name: string): Observable<ShellConfig | undefined> {\n let object: any;\n return this.#backend\n .post(\n '/dms/objects/search',\n {\n query: {\n statement: getShellConfigQueryString(name)\n }\n },\n ApiBase.core\n )\n .pipe(\n map((res) => {\n if (res.objects.length) {\n object = res.objects[0];\n }\n return object ? object.properties[BaseObjectTypeField.OBJECT_ID].value : undefined;\n }),\n switchMap((id) => (id ? this.#backend.get(`/dms/objects/${id}/contents/file`, ApiBase.core) : of(undefined))),\n map((data) => {\n return data\n ? {\n id: object.properties[BaseObjectTypeField.OBJECT_ID].value,\n name: object.properties[SHELL_CONFIG_BASE.nameProperty].value,\n context: object.properties['system:context']?.value,\n user: object.properties['system:user']?.value,\n data\n }\n : undefined;\n })\n );\n }\n\n /**\n * Create a new configuration object.\n * @param cfg the configuration object to be created\n */\n create(name: string, data: unknown, context?: string, user?: string[]): Observable<ShellConfig> {\n const properties: Record<string, unknown> = {\n [SHELL_CONFIG_BASE.nameProperty]: name\n };\n if (user) properties['system:user'] = user;\n if (context) properties['system:context'] = context;\n return this.#dmsService\n .createDmsObject(\n SHELL_CONFIG_BASE.objectType,\n {\n [BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS]: [SHELL_CONFIG_BASE.secondaryObjectType],\n ...properties\n },\n [this.#dataToFile(data)],\n undefined,\n true\n )\n .pipe(\n map((res) => ({\n id: res[0],\n name,\n context,\n user,\n data\n }))\n );\n }\n\n /**\n * Update data of an existing configuration object.\n * @param id the id of the configuration object to update\n * @param data the new configuration data to be set\n */\n update(id: string, data: unknown): Observable<any> {\n return this.#dmsService.uploadContent(id, this.#dataToFile(data), undefined, true);\n }\n\n /**\n * Delete a configuration object.\n * @param id the id of the configuration object to delete\n */\n delete(id: string): Observable<any> {\n return this.#dmsService.deleteDmsObject(id);\n }\n\n download(id: string, filename?: string): void {\n this.#backend.download(this.#dmsService.getContentPath(id), filename);\n }\n\n upload(id: string, file: File): Observable<any> {\n return this.#dmsService.uploadContent(id, file, undefined, true);\n }\n\n /**\n * Transform the configuration to a file.\n * @param data the configuration data to be transformed\n * @returns a file object containing the configuration data\n */\n #dataToFile(data: unknown): File {\n return new File([JSON.stringify(data)], 'config.json', { type: 'application/json' });\n }\n}\n"]}
1
+ {"version":3,"file":"shell-config.service.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/shell-config/shell-config.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { ApiBase, BackendService, BaseObjectTypeField, DmsService } from '@yuuvis/client-core';\nimport { map, Observable, of, switchMap } from 'rxjs';\nimport { getShellConfigQueryString, SHELL_CONFIG_BASE } from './shell-config.const';\nimport { ShellConfig } from './shell-config.interface';\n\n/**\n * Service to manage shell configuration objects. Base on the 'system:item' type.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ShellConfigService {\n #dmsService = inject(DmsService);\n #backend = inject(BackendService);\n\n get(name: string): Observable<ShellConfig | undefined> {\n let object: any;\n return this.#backend\n .post(\n '/dms/objects/search',\n {\n query: {\n statement: getShellConfigQueryString(name)\n }\n },\n ApiBase.core\n )\n .pipe(\n map((res) => {\n if (res.objects.length) {\n object = res.objects[0];\n }\n return object ? object.properties[BaseObjectTypeField.OBJECT_ID].value : undefined;\n }),\n switchMap((id) => (id ? this.#backend.get(`/dms/objects/${id}/contents/file`, ApiBase.core) : of(undefined))),\n map((data) => {\n return data\n ? {\n id: object.properties[BaseObjectTypeField.OBJECT_ID].value,\n name: object.properties[SHELL_CONFIG_BASE.nameProperty].value,\n context: object.properties['system:context']?.value,\n user: object.properties['system:user']?.value,\n data\n }\n : undefined;\n })\n );\n }\n\n /**\n * Create a new configuration object.\n * @param cfg the configuration object to be created\n */\n create(name: string, data: unknown, context?: string, user?: string[]): Observable<ShellConfig> {\n const properties: Record<string, unknown> = {\n [SHELL_CONFIG_BASE.nameProperty]: name\n };\n if (user) properties['system:user'] = user;\n if (context) properties['system:context'] = context;\n return this.#dmsService\n .createDmsObject(\n SHELL_CONFIG_BASE.objectType,\n {\n [BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS]: [SHELL_CONFIG_BASE.secondaryObjectType],\n ...properties\n },\n [this.#dataToFile(data)],\n undefined,\n true\n )\n .pipe(\n map((res) => ({\n id: res[0],\n name,\n context,\n user,\n data\n }))\n );\n }\n\n /**\n * Update data of an existing configuration object.\n * @param id the id of the configuration object to update\n * @param data the new configuration data to be set\n */\n update(id: string, data: unknown): Observable<any> {\n return this.#dmsService.uploadContent(id, this.#dataToFile(data), undefined, true);\n }\n\n /**\n * Delete a configuration object.\n * @param id the id of the configuration object to delete\n */\n delete(id: string): Observable<any> {\n return this.#dmsService.deleteDmsObject(id);\n }\n\n download(id: string, filename?: string): void {\n this.#backend.download(this.#dmsService.getContentPath(id), filename);\n }\n\n upload(id: string, file: File): Observable<any> {\n return this.#dmsService.uploadContent(id, file, undefined, true);\n }\n\n /**\n * Transform the configuration to a file.\n * @param data the configuration data to be transformed\n * @returns a file object containing the configuration data\n */\n #dataToFile(data: unknown): File {\n return new File([JSON.stringify(data)], 'config.json', { type: 'application/json' });\n }\n}\n"]}
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=shell-notifications.interface.js.map
@@ -72,10 +72,10 @@ export class ShellNotificationsService {
72
72
  this._notificationsSource.next(this._notifications);
73
73
  this.appCache.setItem(this.LOCAL_STORAGE_KEY, this._notifications).subscribe();
74
74
  }
75
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ShellNotificationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
76
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ShellNotificationsService, providedIn: 'root' }); }
75
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ShellNotificationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
76
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ShellNotificationsService, providedIn: 'root' }); }
77
77
  }
78
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ShellNotificationsService, decorators: [{
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ShellNotificationsService, decorators: [{
79
79
  type: Injectable,
80
80
  args: [{
81
81
  providedIn: 'root'
@@ -1 +1 @@
1
- {"version":3,"file":"shell-notifications.service.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/shell-notifications/shell-notifications.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { ShellNotification } from './shell-notifications.interface';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { AppCacheService, NativeNotificationService, TranslateService, Utils } from '@yuuvis/client-core';\nimport { ShellService } from '../shell/shell.service';\nimport { Router } from '@angular/router';\nimport { CLIENT_SHELL_FEATURE_CONFIG_ALWAYS_SHOW_NOTOFICATION } from '../feature';\n\n/**\n * Service managing shell notifications.\n * Every app could propagate shell notifications. They will be published\n * in the notifications section of the shell. Incoming new messahes will\n * also add an indicator to the icon in the shell bar.\n *\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ShellNotificationsService {\n private LOCAL_STORAGE_KEY = 'yuv.shell.notifications';\n private appCache = inject(AppCacheService);\n #shell = inject(ShellService);\n #router = inject(Router);\n private translate = inject(TranslateService);\n #nativeNotificationService = inject(NativeNotificationService);\n alwaysShowNotifications = inject(CLIENT_SHELL_FEATURE_CONFIG_ALWAYS_SHOW_NOTOFICATION);\n\n private _notifications: ShellNotificationItem[] = [];\n private _notificationsSource = new ReplaySubject<ShellNotificationItem[]>();\n shellNotifications$: Observable<ShellNotificationItem[]> = this._notificationsSource.asObservable();\n\n constructor() {\n this.appCache.getItem(this.LOCAL_STORAGE_KEY).subscribe((res) => {\n this._notifications = res || [];\n this._notificationsSource.next(this._notifications);\n });\n }\n\n add(notification: ShellNotification, nativeNotification = false) {\n this._notifications.push({\n ...notification,\n id: Utils.uuid(),\n timestamp: new Date().getTime(),\n seen: false\n });\n // // check for unseen items\n // if (document.hidden && nativeNotification && this._notifications.some((n) => !n.seen)) {\n // this.#nativeNotificationService.showNotification(this.translate.instant('yuv.shell.notification.native.title'), {\n // onClick: () => this.#router.navigate([{ outlets: { aside: 'notifications' } }]),\n // options: {\n // body: this.translate.instant('yuv.shell.notification.native.message'),\n // // badge: this.#shell.shellConfig().icons!.appIcon,\n // icon: 'https://budgie.enaioci.net/client/assets/_yuuvis/theme/favicon.svg'\n // }\n // });\n // }\n this._updateNotifications();\n }\n\n remove(id: string) {\n this._notifications = this._notifications.filter((n) => n.id !== id);\n this._updateNotifications();\n }\n\n removeAll() {\n this._notifications = [];\n this._updateNotifications();\n }\n\n markAllAsSeen() {\n this._notifications.forEach((n) => (n.seen = true));\n this._updateNotifications();\n }\n\n getNotificationById(id: string): ShellNotificationItem | undefined {\n return this._notifications.find((n) => n.id === id);\n }\n\n private _updateNotifications() {\n this._notifications = this._notifications.sort((a, b) => b.timestamp - a.timestamp);\n this._notificationsSource.next(this._notifications);\n this.appCache.setItem(this.LOCAL_STORAGE_KEY, this._notifications).subscribe();\n }\n}\n\ntype ShellNotificationItem = ShellNotification & {\n id: string;\n timestamp: number;\n seen: boolean;\n};\n"]}
1
+ {"version":3,"file":"shell-notifications.service.js","sourceRoot":"","sources":["../../../../../../../../libs/yuuvis/client-shell-core/src/lib/services/shell-notifications/shell-notifications.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAc,aAAa,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,oDAAoD,EAAE,MAAM,YAAY,CAAC;;AAElF;;;;;;GAMG;AAIH,MAAM,OAAO,yBAAyB;IAGpC,MAAM,CAAwB;IAC9B,OAAO,CAAkB;IAEzB,0BAA0B,CAAqC;IAO/D;QAZQ,sBAAiB,GAAG,yBAAyB,CAAC;QAC9C,aAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;QAC3C,WAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QAC9B,YAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACjB,cAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC7C,+BAA0B,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAC/D,4BAAuB,GAAG,MAAM,CAAC,oDAAoD,CAAC,CAAC;QAE/E,mBAAc,GAA4B,EAAE,CAAC;QAC7C,yBAAoB,GAAG,IAAI,aAAa,EAA2B,CAAC;QAC5E,wBAAmB,GAAwC,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE,CAAC;QAGlG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9D,IAAI,CAAC,cAAc,GAAG,GAAG,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,YAA+B,EAAE,kBAAkB,GAAG,KAAK;QAC7D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACvB,GAAG,YAAY;YACf,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;YAC/B,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,4BAA4B;QAC5B,2FAA2F;QAC3F,sHAAsH;QACtH,uFAAuF;QACvF,iBAAiB;QACjB,+EAA+E;QAC/E,4DAA4D;QAC5D,mFAAmF;QACnF,QAAQ;QACR,QAAQ;QACR,IAAI;QACJ,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,SAAS;QACP,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,mBAAmB,CAAC,EAAU;QAC5B,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QACpF,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC;IACjF,CAAC;8GAhEU,yBAAyB;kHAAzB,yBAAyB,cAFxB,MAAM;;2FAEP,yBAAyB;kBAHrC,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB","sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { ShellNotification } from './shell-notifications.interface';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { AppCacheService, NativeNotificationService, TranslateService, Utils } from '@yuuvis/client-core';\nimport { ShellService } from '../shell/shell.service';\nimport { Router } from '@angular/router';\nimport { CLIENT_SHELL_FEATURE_CONFIG_ALWAYS_SHOW_NOTOFICATION } from '../feature';\n\n/**\n * Service managing shell notifications.\n * Every app could propagate shell notifications. They will be published\n * in the notifications section of the shell. Incoming new messahes will\n * also add an indicator to the icon in the shell bar.\n *\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ShellNotificationsService {\n private LOCAL_STORAGE_KEY = 'yuv.shell.notifications';\n private appCache = inject(AppCacheService);\n #shell = inject(ShellService);\n #router = inject(Router);\n private translate = inject(TranslateService);\n #nativeNotificationService = inject(NativeNotificationService);\n alwaysShowNotifications = inject(CLIENT_SHELL_FEATURE_CONFIG_ALWAYS_SHOW_NOTOFICATION);\n\n private _notifications: ShellNotificationItem[] = [];\n private _notificationsSource = new ReplaySubject<ShellNotificationItem[]>();\n shellNotifications$: Observable<ShellNotificationItem[]> = this._notificationsSource.asObservable();\n\n constructor() {\n this.appCache.getItem(this.LOCAL_STORAGE_KEY).subscribe((res) => {\n this._notifications = res || [];\n this._notificationsSource.next(this._notifications);\n });\n }\n\n add(notification: ShellNotification, nativeNotification = false) {\n this._notifications.push({\n ...notification,\n id: Utils.uuid(),\n timestamp: new Date().getTime(),\n seen: false\n });\n // // check for unseen items\n // if (document.hidden && nativeNotification && this._notifications.some((n) => !n.seen)) {\n // this.#nativeNotificationService.showNotification(this.translate.instant('yuv.shell.notification.native.title'), {\n // onClick: () => this.#router.navigate([{ outlets: { aside: 'notifications' } }]),\n // options: {\n // body: this.translate.instant('yuv.shell.notification.native.message'),\n // // badge: this.#shell.shellConfig().icons!.appIcon,\n // icon: 'https://budgie.enaioci.net/client/assets/_yuuvis/theme/favicon.svg'\n // }\n // });\n // }\n this._updateNotifications();\n }\n\n remove(id: string) {\n this._notifications = this._notifications.filter((n) => n.id !== id);\n this._updateNotifications();\n }\n\n removeAll() {\n this._notifications = [];\n this._updateNotifications();\n }\n\n markAllAsSeen() {\n this._notifications.forEach((n) => (n.seen = true));\n this._updateNotifications();\n }\n\n getNotificationById(id: string): ShellNotificationItem | undefined {\n return this._notifications.find((n) => n.id === id);\n }\n\n private _updateNotifications() {\n this._notifications = this._notifications.sort((a, b) => b.timestamp - a.timestamp);\n this._notificationsSource.next(this._notifications);\n this.appCache.setItem(this.LOCAL_STORAGE_KEY, this._notifications).subscribe();\n }\n}\n\ntype ShellNotificationItem = ShellNotification & {\n id: string;\n timestamp: number;\n seen: boolean;\n};\n"]}
@@ -1,2 +1 @@
1
- export {};
2
1
  //# sourceMappingURL=tile-extension.interface.js.map
@@ -16,8 +16,8 @@ export declare class CommandPaletteComponent implements OnInit, AfterViewInit {
16
16
  disabledCauses: DisabledCause[];
17
17
  placeholder: string | undefined;
18
18
  readonly searchTermChange: import("@angular/core").OutputEmitterRef<string>;
19
- onArrowDown(e: KeyboardEvent): void;
20
- onArrowUp(e: KeyboardEvent): void;
19
+ onArrowDown(e: KeyboardEvent | Event): void;
20
+ onArrowUp(e: KeyboardEvent | Event): void;
21
21
  onEnter(): void;
22
22
  constructor(cmdService: CommandPaletteService, elRef: ElementRef);
23
23
  onTermChange(term: string): void;
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@yuuvis/client-shell-core",
3
- "version": "3.0.0-beta.20.0",
3
+ "version": "3.0.0-beta.21.0",
4
4
  "author": "OPTIMAL SYSTEMS GmbH <npm@optimal-systems.de>",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
7
- "@angular/common": "^20.0.0",
8
- "@angular/core": "^20.0.0",
9
- "@angular/material": "^20.0.0",
7
+ "@angular/common": "^21.2.9",
8
+ "@angular/core": "^21.2.9",
9
+ "@angular/material": "^21.2.7",
10
10
  "rxjs": "^7.8.2",
11
- "@angular/platform-browser": "^20.0.0",
12
- "@yuuvis/client-core": "^3.0.0-beta.20.0"
11
+ "@angular/platform-browser": "^21.2.9",
12
+ "@yuuvis/client-core": "^3.0.0-beta.21.0"
13
13
  },
14
14
  "dependencies": {
15
15
  "tslib": "^2.3.0"
@@ -25,5 +25,6 @@
25
25
  "types": "./yuuvis-client-shell-core.d.ts",
26
26
  "default": "./esm2022/yuuvis-client-shell-core.js"
27
27
  }
28
- }
28
+ },
29
+ "type": "module"
29
30
  }