@yuuvis/client-framework 3.20.1 → 3.22.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 (25) hide show
  1. package/fesm2022/yuuvis-client-framework-actions.mjs +66 -16
  2. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
  3. package/fesm2022/yuuvis-client-framework-badges.mjs +80 -39
  4. package/fesm2022/yuuvis-client-framework-badges.mjs.map +1 -1
  5. package/fesm2022/yuuvis-client-framework-forms.mjs +17 -6
  6. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
  7. package/fesm2022/yuuvis-client-framework-object-details.mjs +16 -5
  8. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
  9. package/fesm2022/yuuvis-client-framework-object-preview.mjs +25 -42
  10. package/fesm2022/yuuvis-client-framework-object-preview.mjs.map +1 -1
  11. package/fesm2022/yuuvis-client-framework-object-summary.mjs +1 -1
  12. package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -1
  13. package/fesm2022/yuuvis-client-framework-smart-search.mjs +22 -3
  14. package/fesm2022/yuuvis-client-framework-smart-search.mjs.map +1 -1
  15. package/fesm2022/yuuvis-client-framework-tile-list.mjs +31 -17
  16. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
  17. package/lib/assets/i18n/de.json +1 -1
  18. package/lib/assets/i18n/en.json +1 -1
  19. package/package.json +5 -5
  20. package/types/yuuvis-client-framework-actions.d.ts +20 -2
  21. package/types/yuuvis-client-framework-badges.d.ts +32 -2
  22. package/types/yuuvis-client-framework-forms.d.ts +3 -1
  23. package/types/yuuvis-client-framework-object-details.d.ts +7 -1
  24. package/types/yuuvis-client-framework-smart-search.d.ts +16 -1
  25. package/types/yuuvis-client-framework-tile-list.d.ts +19 -9
@@ -257,24 +257,30 @@ class DeleteComponent {
257
257
  #dialogData;
258
258
  #dialogRef;
259
259
  run() {
260
+ // A double-click on the confirm button would otherwise send a second DELETE for objects the
261
+ // first request already removed. That one answers 404 inside an HTTP 207, which consumers
262
+ // cannot tell apart from a delete that genuinely failed.
263
+ if (this.deleting())
264
+ return;
260
265
  this.errors.set([]);
261
266
  if (this.deleteItems.length) {
262
267
  this.deleting.set(true);
263
- this.#dmsService
264
- .deleteDmsObjects(this.deleteItems.map((o) => ({
265
- id: o.id,
266
- subject: o.data[this.context.subjectProperty || o.id]
267
- })))
268
- .subscribe({
268
+ const items = this.deleteItems.map((item) => ({ id: item.id, subject: this.#itemSubject(item) }));
269
+ const subjects = new Map(items.map((item) => [item.id, item.subject]));
270
+ this.#dmsService.deleteDmsObjects(items).subscribe({
269
271
  next: (res) => {
270
- this.errors.set(res
271
- .filter((r) => !!r._error)
272
- .map((r) => ({
273
- status: r._error.status,
274
- subject: this.context?.subjectProperty ? r.properties[this.context.subjectProperty].value : r.id,
275
- message: this.#getErrorMessage(r._error)
276
- })));
277
- !this.errors().length && this.#dialogRef.close();
272
+ const errors = res.flatMap((result) => result._error
273
+ ? [
274
+ {
275
+ status: result._error.status,
276
+ subject: this.#resultSubject(result, subjects),
277
+ message: this.#getErrorMessage(result._error)
278
+ }
279
+ ]
280
+ : []);
281
+ this.errors.set(errors);
282
+ if (!errors.length)
283
+ this.#dialogRef.close();
278
284
  },
279
285
  error: (err) => {
280
286
  this.deleting.set(false);
@@ -283,6 +289,25 @@ class DeleteComponent {
283
289
  });
284
290
  }
285
291
  }
292
+ /**
293
+ * Subject sent along with the delete request: the value of the configured subject property,
294
+ * falling back to the object ID when there is no such property or it carries no value.
295
+ */
296
+ #itemSubject(item) {
297
+ const property = this.context?.subjectProperty;
298
+ const value = property ? item.data[property] : undefined;
299
+ return value == null ? item.id : String(value);
300
+ }
301
+ /**
302
+ * Subject shown for an errored object. A DELETE response only echoes `system:objectId`, so the
303
+ * configured subject property is normally absent from it — fall back to the subject that was
304
+ * sent for that object, and then to its ID.
305
+ */
306
+ #resultSubject(result, subjects) {
307
+ const property = this.context?.subjectProperty;
308
+ const value = property ? result.properties?.[property]?.value : undefined;
309
+ return value == null ? (subjects.get(result.id) ?? result.id) : String(value);
310
+ }
286
311
  #getErrorMessage(error) {
287
312
  switch (error.status) {
288
313
  case 403:
@@ -418,13 +443,14 @@ class ActionsService {
418
443
  }
419
444
  /**
420
445
  * Returns all actions that are executable for the given selection.
446
+ * An action is only taken into account when its `range` matches the size of
447
+ * the current selection, so a `SelectionRange.SINGLE_SELECT` action is never
448
+ * offered for a multi selection.
421
449
  * @param selection Array of DmsObjects to check for executable actions
422
450
  * @param options options to filter the actions
423
451
  * @returns Observable of actions that are executable for the given selection
424
452
  */
425
453
  getActions(selection, options) {
426
- // TODO: check if selection is empty or if nessasery at all
427
- // if (!selection || selection.length === 0) return of([]);
428
454
  const selections = this.getAvailableActions(options?.context)
429
455
  .filter((action) => options?.exclude
430
456
  ? Array.isArray(options.exclude)
@@ -433,12 +459,36 @@ class ActionsService {
433
459
  ? !options.exclude.test(action.id)
434
460
  : true
435
461
  : true)
462
+ .filter((action) => this.matchesSelectionRange(action, selection))
436
463
  .map((action) => action.isExecutable(selection).pipe(map((executable) => ({
437
464
  action,
438
465
  executable
439
466
  }))));
467
+ if (selections.length === 0)
468
+ return of([]);
440
469
  return forkJoin(selections).pipe(map((res) => res.filter((result) => result.executable).map((executable) => executable.action)), switchMap((actions) => this.resolveDisabledState(actions, selection)));
441
470
  }
471
+ /**
472
+ * Checks whether an action supports the size of the given selection based on
473
+ * its `range` property. Actions without a `range` are treated as
474
+ * `SelectionRange.ANY`.
475
+ * @param action Action to check
476
+ * @param selection Array of DmsObjects the action should be applied to
477
+ * @returns true if the action supports the size of the given selection
478
+ */
479
+ matchesSelectionRange(action, selection) {
480
+ const count = selection?.length ?? 0;
481
+ switch (action.range) {
482
+ case SelectionRange.SINGLE_SELECT:
483
+ return count === 1;
484
+ case SelectionRange.MULTI_SELECT:
485
+ return count >= 1;
486
+ case SelectionRange.MULTI_SELECT_ONLY:
487
+ return count > 1;
488
+ default:
489
+ return true;
490
+ }
491
+ }
442
492
  /**
443
493
  * Get all available actions. This includes the default actions and all registered actions but
444
494
  * without checking if they are executable.
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-client-framework-actions.mjs","sources":["../../../../../libs/yuuvis/client-framework/actions/src/lib/actions.module.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/components/contextmenu/contextmenu.component.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/components/contextmenu/contextmenu.component.html","../../../../../libs/yuuvis/client-framework/actions/src/lib/components/contextmenu/contextmenuTrigger.directive.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/models/actions.icon.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/models/actions.models.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/services/action.priority-levels.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/services/action.validation.service.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/copy-action/copy-action.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/cut-action/cut-action.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/delete-action/delete/delete.component.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/delete-action/delete/delete.component.html","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/delete-action/delete-action.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/download-action/download-action.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/services/actions.service.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/tokens/actions.token.ts","../../../../../libs/yuuvis/client-framework/actions/src/yuuvis-client-framework-actions.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Module for the actions library.\n */\n@NgModule({\n imports: [TranslateModule]\n})\nexport class ActionsModule {}\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { CommonModule } from '@angular/common';\n\nimport { CdkMenu, CdkMenuItem } from '@angular/cdk/menu';\nimport { MatIconModule } from '@angular/material/icon';\nimport { YuvListModule } from '@yuuvis/client-framework/list';\n\nimport {\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n untracked,\n viewChild,\n viewChildren\n} from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ContextMenuAction, ContextMenuItemSelectEvent } from './contextmenu.model';\n\n@Component({\n selector: 'yuv-contextmenu',\n imports: [CommonModule, MatIconModule, YuvListModule, A11yModule, CdkMenu, CdkMenuItem, MatTooltip],\n providers: [MatTooltip],\n templateUrl: './contextmenu.component.html',\n styleUrls: ['./contextmenu.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ContextmenuComponent {\n actions = input<ContextMenuAction[]>([]);\n selection = input<unknown[]>([]);\n itemSelect = output<ContextMenuItemSelectEvent>();\n private translate = inject(TranslateService);\n\n cdkMenu = viewChild.required(CdkMenu);\n menuItems = viewChildren<CdkMenuItem | null>(CdkMenuItem);\n\n sortedActions = computed(() =>\n [...this.actions()].sort((a, b) => a.label.localeCompare(b.label, this.translate.getCurrentLang()))\n );\n\n constructor() {\n afterRenderEffect(() => {\n //Focus First Item when @for is finished\n untracked(() => {\n //firstElement?.nativeElement.focus();\n this.cdkMenu().focusFirstItem('program');\n });\n });\n }\n\n onItemTrigger({ action }: ContextMenuItemSelectEvent): void {\n this.itemSelect.emit({ action });\n }\n}\n","<div class=\"context-menu\" cdkMenu>\n @for (a of sortedActions(); track a.id) {\n <span [matTooltip]=\"a.description\" [matTooltipDisabled]=\"!a.description\">\n <div\n class=\"context-menu__item\"\n [class.context-menu__item--disabled]=\"a.disabled\"\n cdkMenuItem\n [cdkMenuItemDisabled]=\"a.disabled\"\n [attr.aria-label]=\"'Execute Action: ' + a.label\"\n (cdkMenuItemTriggered)=\"onItemTrigger({ action: a })\"\n >\n <mat-icon class=\"context-menu__item-icon ymt-icon--size-s\">{{ a.icon }}</mat-icon>\n {{ a.label }}\n </div>\n </span>\n }\n</div>\n","import { CdkContextMenuTrigger, MENU_STACK, MENU_TRIGGER, MenuStack } from '@angular/cdk/menu';\nimport { Directive, effect, Input, input, signal, TemplateRef, untracked } from '@angular/core';\n\n@Directive({\n selector: '[yuvContextMenuTrigger]',\n exportAs: 'yuvContextMenuTrigger',\n standalone: true,\n providers: [\n { provide: MENU_TRIGGER, useExisting: YuvContextMenuTriggerDirective },\n { provide: MENU_STACK, useClass: MenuStack }\n ]\n})\nexport class YuvContextMenuTriggerDirective extends CdkContextMenuTrigger {\n @Input({ alias: 'yuvContextMenuTrigger' })\n override menuTemplateRef!: TemplateRef<unknown>;\n\n triggerWhen = input<boolean | null>(null, { alias: 'yuvContextMenuTriggerWhen' });\n\n #contextMenuEvent = signal<MouseEvent | null>(null);\n\n constructor() {\n super();\n\n effect(() => {\n // Only a fresh context-menu event may re-run this effect. triggerWhen is read\n // untracked so a later false -> true transition (e.g. actions repopulating after\n // navigating into a folder and selecting an item) can't replay a stale event and\n // reopen the menu without a right-click.\n const event = this.#contextMenuEvent();\n untracked(() => {\n const triggerWhen = this.triggerWhen();\n if (event && (triggerWhen || triggerWhen === null)) {\n super._openOnContextMenu(event);\n this.#contextMenuEvent.set(null); // consume the event so it can't be replayed\n }\n });\n });\n }\n\n override _openOnContextMenu(event: MouseEvent) {\n this.#contextMenuEvent.set(event);\n }\n}\n","export const ACTION_ICON = {\n download: 'download',\n delete: 'delete',\n copy: 'content_copy',\n cut: 'content_cut',\n manageFlavor: 'cards_star'\n}","import { DmsObject } from '@yuuvis/client-core';\nimport { Observable } from 'rxjs';\n\nexport type ActionClass = { \n new (...args: any[]): any \n};\n\nexport class AbstractContextAction {\n context?: ActionContext;\n constructor(context?: ActionContext) {\n this.context = context;\n }\n}\n\nexport interface BaseAction {\n /**\n * Equals the selector of the actions selector (will be set by the action service)\n */\n id: string;\n /**\n * label to be displayed inside the action menu\n */\n label: string;\n /**\n * description to be displayed inside the action menu\n */\n description?: string;\n /**\n * @ignore\n */\n icon: string;\n /**\n * actions priority defining the position of the action within the whole list of actions\n */\n priority: number;\n /**\n * group of actions the action should be part of ('common' or 'further')\n */\n group: string;\n /**\n * number of selected items supported by the action\n * (SelectionRange.SINGLE_SELECT, SelectionRange.MULTI_SELECT, SelectionRange.MULTI_SELECT_ONLY )\n */\n range: SelectionRange;\n\n /**\n * Types that are supported by the action\n */\n supports: ActionSupport;\n\n /**\n * Determining whether or not the action is executable for the given selection.\n * Controls visibility: when false, the action is hidden from the UI entirely.\n * @param item Current selection\n * @returns true if the action is executable for the current selection, false otherwise\n */\n isExecutable: (items: DmsObject[]) => Observable<boolean>;\n\n /**\n * Optional check whether the action should be disabled for the given selection.\n * Unlike isExecutable (which controls visibility), isDisabled controls whether\n * a visible action can be triggered. When absent, the action is never disabled.\n * @param items Current selection\n * @returns true if the action should be disabled, false otherwise\n */\n isDisabled?: (items: DmsObject[]) => Observable<boolean>;\n\n /**\n * Resolved disabled state for template binding. Set by ActionsService after\n * evaluating isDisabled(). Do not set manually on action classes.\n */\n disabled?: boolean;\n}\n\nexport interface ActionSupport {\n // object types\n types?: string[];\n // object types\n sots?: string[];\n // pattern to match the type name against\n pattern?: string;\n}\n\nexport interface ActionContext {\n /**\n * As actions deal with DmsObjects the subject property is the property that\n * should be used to display the name of the object. This may be used for\n * showing the name of the object in a confirmation/error dialog or similar.\n */\n subjectProperty?: string;\n /**\n * The appId is the id of the application that the action is executed in.\n */\n appId?: string;\n}\n\nexport interface Action extends BaseAction {\n run: (items: DmsObject[]) => Observable<boolean>;\n /**\n * Optional child actions. When present, this action renders as a sub-menu\n * trigger instead of executing `run`. Nesting can be arbitrarily deep.\n * An empty array is treated as \"no children\" (leaf action).\n */\n children?: Action[];\n}\n\nexport interface ActionOptions {\n context?: ActionContext;\n exclude?: string[] | RegExp;\n}\n\nexport enum SelectionRange {\n SINGLE_SELECT,\n MULTI_SELECT,\n MULTI_SELECT_ONLY,\n ANY\n}\n\nexport const BASE_ACTION = {\n copy: 'yuv.base.copy',\n cut: 'yuv.base.cut',\n download: 'yuv.base.download',\n delete: 'yuv.base.delete'\n};\n","export const ActionPriorityLevel = {\n LEVEL_1: 1,\n LEVEL_2: 2,\n LEVEL_3: 3,\n LEVEL_4: 4,\n LEVEL_5: 5,\n LEVEL_6: 6,\n LEVEL_7: 7,\n LEVEL_8: 8,\n LEVEL_9: 9,\n LEVEL_10: 10\n} as const;\n","import { inject, Injectable } from '@angular/core';\nimport {\n AppCacheService,\n DmsObject,\n ObjectLockingService,\n STORAGE_USERS_KEY,\n TranslateService,\n YuvUser\n} from '@yuuvis/client-core';\nimport { map, Observable, of } from 'rxjs';\n\n/**\n * Service responsible for validating actions on DMS objects.\n * Provides checks for document lock states and related user information.\n */\n/** @deprecated */\n@Injectable({\n providedIn: 'root'\n})\nexport class ActionsValidationService {\n private readonly translate = inject(TranslateService);\n readonly #appCache = inject(AppCacheService);\n readonly #objectLocking = inject(ObjectLockingService);\n\n /** @deprecated */\n checkDocumentLock(dmsObject: DmsObject): Observable<{ state: boolean; description?: string }> {\n const lockState = this.#objectLocking.getLockState(dmsObject);\n if (!lockState.locked || lockState.lockedByCurrentUser) return of({ state: false });\n return this.#appCache.getItem<YuvUser[]>(STORAGE_USERS_KEY).pipe(\n map((users) => {\n const lockUser = users?.find((user) => user.id === lockState.ownerId);\n const user = lockUser ? lockUser.title || lockUser.email || lockUser.id : null;\n const description = user\n ? this.translate.instant('yuv.action-menu.action.unlock.description-locked-by-other', { user })\n : this.translate.instant('yuv.action-menu.action.unlock.description-locked-by-unknown-user');\n return { state: true, description };\n })\n );\n }\n}\n","import { inject } from '@angular/core';\nimport { ClipboardService, DmsObject, TranslateService } from '@yuuvis/client-core';\nimport { Observable, of } from 'rxjs';\nimport { AbstractContextAction, Action, ACTION_ICON, ActionSupport, BASE_ACTION, SelectionRange } from '../../models';\nimport { ActionPriorityLevel } from '../../services';\n\nexport class CopyAction extends AbstractContextAction implements Action {\n readonly #clipboardService = inject(ClipboardService);\n readonly #translate = inject(TranslateService);\n\n id = BASE_ACTION.copy;\n label = this.#translate.instant('yuv.action-menu.action.copy.dms.object.label');\n description = this.#translate.instant('yuv.action-menu.action.copy.dms.object.description');\n priority = ActionPriorityLevel.LEVEL_8;\n icon = ACTION_ICON.copy;\n group = 'common';\n range = SelectionRange.MULTI_SELECT;\n supports: ActionSupport = {\n pattern: '*'\n };\n\n isExecutable(items: DmsObject[]): Observable<boolean> {\n const notAllowed = items.some((item) => !item.permissions?.writeIndexData);\n return of(items.length > 0 && !notAllowed);\n }\n\n run(items: DmsObject[]): Observable<boolean> {\n this.#clipboardService.addObjects(items, 'copy', this.context?.appId);\n return of(true);\n }\n}\n","import { inject } from '@angular/core';\nimport { ClipboardService, DmsObject, TranslateService } from '@yuuvis/client-core';\nimport { Observable, of } from 'rxjs';\nimport { AbstractContextAction, Action, ACTION_ICON, ActionSupport, BASE_ACTION, SelectionRange } from '../../models';\nimport { ActionPriorityLevel } from '../../services';\n\nexport class CutAction extends AbstractContextAction implements Action {\n readonly #clipboardService = inject(ClipboardService);\n readonly #translate = inject(TranslateService);\n\n id = BASE_ACTION.cut;\n label = this.#translate.instant('yuv.action-menu.action.cut.dms.object.label');\n description = this.#translate.instant('yuv.action-menu.action.cut.dms.object.description');\n priority = ActionPriorityLevel.LEVEL_8;\n icon = ACTION_ICON.cut;\n group = 'common';\n range = SelectionRange.MULTI_SELECT;\n supports: ActionSupport = {\n pattern: '*'\n };\n\n isExecutable(items: DmsObject[]): Observable<boolean> {\n return of(\n items.length > 0 &&\n items.every(\n (item) => item.permissions?.writeContent && item.permissions.writeIndexData && item.permissions.deleteObject\n )\n );\n }\n\n run(items: DmsObject[]): Observable<boolean> {\n this.#clipboardService.addObjects(items, 'cut', this.context?.appId);\n return of(true);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport {\n DmsObject,\n DmsService,\n ObjectDeleteError,\n ObjectDeleteResult,\n TranslatePipe,\n TranslateService\n} from '@yuuvis/client-core';\nimport { DialogComponent } from '@yuuvis/client-framework/common';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { ActionContext } from '../../../models';\n\n/**\n * @ignore\n */\n\n@Component({\n selector: 'yuv-delete',\n standalone: true,\n imports: [CommonModule, TranslatePipe, MatButtonModule, DialogComponent, MatProgressBar, YmtButtonDirective],\n templateUrl: './delete.component.html',\n styleUrls: ['./delete.component.scss']\n})\nexport class DeleteComponent {\n readonly #dmsService = inject(DmsService);\n private readonly translate = inject(TranslateService);\n #dialogData = inject<any>(MAT_DIALOG_DATA);\n readonly #dialogRef = inject(MatDialogRef<DeleteComponent>);\n\n errors = signal<\n {\n status: number;\n subject: string;\n message: string;\n }[]\n >([]);\n\n deleting = signal(false);\n deleteItems: DmsObject[] = this.#dialogData.items;\n context: ActionContext = this.#dialogData.context;\n\n run() {\n this.errors.set([]);\n if (this.deleteItems.length) {\n this.deleting.set(true);\n this.#dmsService\n .deleteDmsObjects(\n this.deleteItems.map((o) => ({\n id: o.id,\n subject: o.data[this.context.subjectProperty || o.id] as string\n }))\n )\n .subscribe({\n next: (res: ObjectDeleteResult[]) => {\n this.errors.set(\n res\n .filter((r) => !!r._error)\n .map((r: any) => ({\n status: r._error.status,\n subject: this.context?.subjectProperty ? r.properties[this.context.subjectProperty].value : r.id,\n message: this.#getErrorMessage(r._error)\n }))\n );\n !this.errors().length && this.#dialogRef.close();\n },\n error: (err: ObjectDeleteError) => {\n this.deleting.set(false);\n },\n complete: () => this.deleting.set(false)\n });\n }\n }\n\n #getErrorMessage(error: ObjectDeleteError): string {\n switch (error.status) {\n case 403:\n return this.translate.instant('yuv.action-menu.action.delete.error.403');\n case 404:\n return this.translate.instant('yuv.action-menu.action.delete.error.404');\n default:\n return this.translate.instant('yuv.action-menu.action.delete.error.default');\n }\n }\n\n cancel() {\n this.#dialogRef.close();\n }\n}\n","<yuv-dialog [headertitle]=\"'yuv.action-menu.action.delete.dms.object.label' | translate\">\n <main class=\"yuv-delete\" [ngClass]=\"{ deleting: deleting() }\">\n <mat-progress-bar mode=\"indeterminate\" class=\"progress-bar\"></mat-progress-bar>\n\n @if (errors().length) {\n <ul class=\"errors\">\n @for (e of errors(); track $index) {\n <li class=\"error\">\n <span class=\"subject\">{{ e.subject }}</span>\n <span class=\"message\">{{ e.message }}</span>\n </li>\n }\n </ul>\n } @else {\n <p>{{ 'yuv.action-menu.action.delete.dms.object.confirm.message' | translate }}</p>\n }\n </main>\n <footer class=\"form-buttons\">\n <button ymtButton=\"secondary\" [disabled]=\"deleting()\" (click)=\"cancel()\">\n {{ 'yuv.action-menu.action.delete.dms.object.confirm.cancel' | translate }}\n </button>\n\n <button ymtButton=\"primary\" [disabled]=\"deleting() || !!errors().length\" (click)=\"run()\">\n {{ 'yuv.action-menu.action.delete.dms.object.confirm.ok' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { inject } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { DmsObject, IdmService, ObjectLockingService, RetentionService, TranslateService } from '@yuuvis/client-core';\nimport { map, Observable, of } from 'rxjs';\nimport { AbstractContextAction, Action, ACTION_ICON, ActionSupport, BASE_ACTION, SelectionRange } from '../../models';\nimport { ActionPriorityLevel } from '../../services';\nimport { DeleteComponent } from './delete/delete.component';\n\nexport class DeleteAction extends AbstractContextAction implements Action {\n readonly #translate = inject(TranslateService);\n readonly #dialog = inject(MatDialog);\n readonly #retention = inject(RetentionService);\n readonly #idmService = inject(IdmService);\n readonly #objectLocking = inject(ObjectLockingService);\n\n id = BASE_ACTION.delete;\n label = this.#translate.instant('yuv.action-menu.action.delete.dms.object.label');\n description = this.#translate.instant('yuv.action-menu.action.delete.dms.object.description');\n priority = ActionPriorityLevel.LEVEL_8;\n icon = ACTION_ICON.delete;\n group = 'common';\n range = SelectionRange.MULTI_SELECT;\n supports: ActionSupport = {\n pattern: '*'\n };\n\n isDisabled(items: DmsObject[]): Observable<boolean> {\n const lockState = this.#objectLocking.getLockState(items[0]);\n if (!lockState.locked) return of(false);\n return this.#idmService.getUserById(lockState.ownerId || '').pipe(\n map((user) => {\n const userName = user ? user.title || user.email || user.id : null;\n this.description = userName\n ? this.#translate.instant('yuv.action-menu.action.unlock.description-locked-by-other', { user: userName })\n : this.#translate.instant('yuv.action-menu.action.unlock.description-locked-by-unknown-user');\n return true;\n })\n );\n }\n\n isExecutable(items: DmsObject[]): Observable<boolean> {\n const dmsObject = items[0];\n return of(\n !!dmsObject.permissions &&\n dmsObject.permissions.deleteObject &&\n !this.#retention.getRetentionState(dmsObject).underRetention\n );\n }\n\n run(items: DmsObject[]): Observable<boolean> {\n this.#dialog.open(DeleteComponent, {\n data: {\n items,\n context: this.context\n }\n });\n return of(true);\n }\n}\n","import { inject } from '@angular/core';\nimport { DmsObject, DmsService, SystemType, TranslateService } from '@yuuvis/client-core';\nimport { Observable, of } from 'rxjs';\nimport { AbstractContextAction, Action, ACTION_ICON, ActionSupport, BASE_ACTION, SelectionRange } from '../../models';\nimport { ActionPriorityLevel } from '../../services';\n\nexport class DownloadAction extends AbstractContextAction implements Action {\n readonly #translate = inject(TranslateService);\n readonly #dmsService = inject(DmsService);\n\n id = BASE_ACTION.download;\n label = this.#translate.instant('yuv.action-menu.action.download.dms.object.content.label');\n description = this.#translate.instant('yuv.action-menu.action.download.dms.object.content.description');\n priority = ActionPriorityLevel.LEVEL_2;\n icon = ACTION_ICON.download;\n group = 'common';\n range = SelectionRange.MULTI_SELECT;\n supports: ActionSupport = {\n types: [SystemType.DOCUMENT]\n };\n\n isExecutable(selection: DmsObject[]): Observable<boolean> {\n const noContentMatch = (Array.isArray(selection) ? selection : [selection]).find((e) => !e.content);\n if (selection.length < 1) return of(false);\n return of(!noContentMatch);\n }\n\n run(selection: DmsObject[]): Observable<boolean> {\n this.#dmsService.downloadContent(Array.isArray(selection) ? selection : [selection]);\n return of(true);\n }\n}\n","import { Injectable, Injector, Signal, inject, runInInjectionContext } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DmsObject, Utils } from '@yuuvis/client-core';\nimport { Observable, forkJoin, map, of, switchMap } from 'rxjs';\nimport { CopyAction } from '../actions/copy-action/copy-action';\nimport { CutAction } from '../actions/cut-action/cut-action';\nimport { DeleteAction } from '../actions/delete-action/delete-action';\nimport { DownloadAction } from '../actions/download-action/download-action';\nimport { ContextmenuComponent } from '../components/contextmenu/contextmenu.component';\nimport { Action, ActionClass, ActionContext, ActionOptions, BASE_ACTION } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ActionsService {\n readonly injector = inject(Injector);\n #dialog = inject(MatDialog);\n readonly iconRegistry = inject(MatIconRegistry);\n\n private _registeredActions: Record<string, ActionClass> = {};\n\n /**\n * Registers actions that can be used in the application.\n * @param a Array of actions to register, each action must have an id and a\n * class that extends ActionClass\n */\n registerActions(actions: { id: string; action: ActionClass }[]): void {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n Array.isArray(actions) &&\n actions.forEach((action) => {\n this._registeredActions[action.id] = action.action;\n });\n }\n\n /**\n * Conceals actions that are no longer needed or should not be available.\n * This will remove the actions from the registered actions list.\n * @param actionIDs Array of action IDs to conceal\n */\n concealActions(actionIDs: string[]): void {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n Array.isArray(actionIDs) && actionIDs.forEach((id) => delete this._registeredActions[id]);\n }\n\n /**\n * Returns all actions that are executable for the given selection.\n * @param selection Array of DmsObjects to check for executable actions\n * @param options options to filter the actions\n * @returns Observable of actions that are executable for the given selection\n */\n getActions(selection: DmsObject[], options?: ActionOptions): Observable<Action[]> {\n // TODO: check if selection is empty or if nessasery at all\n // if (!selection || selection.length === 0) return of([]);\n const selections: Observable<{ action: Action; executable: boolean }>[] = this.getAvailableActions(options?.context)\n .filter((action) =>\n options?.exclude\n ? Array.isArray(options.exclude)\n ? !options.exclude.includes(action.id)\n : options.exclude instanceof RegExp\n ? !options.exclude.test(action.id)\n : true\n : true\n )\n .map((action: Action) =>\n action.isExecutable(selection).pipe(\n map((executable: boolean) => ({\n action,\n executable\n }))\n )\n );\n\n return forkJoin(selections).pipe(\n map((res: { action: Action; executable: boolean }[]) =>\n res.filter((result) => result.executable).map((executable) => executable.action)\n ),\n switchMap((actions: Action[]) => this.resolveDisabledState(actions, selection))\n );\n }\n\n /**\n * Get all available actions. This includes the default actions and all registered actions but\n * without checking if they are executable.\n * @param context Context passed to the actions\n * @returns Array of available actions\n */\n getAvailableActions(context?: ActionContext): Action[] {\n let actions: Action[] = [];\n\n runInInjectionContext(this.injector, () => {\n actions = [...Object.values(this._registeredActions).map((action: ActionClass) => new action(context))];\n });\n return actions;\n }\n\n getActionsForType(objectTypeId: string, context?: ActionContext): Action[] {\n return this.getAvailableActions(context).filter((action: Action) =>\n this.#actionsSupportsType(action, objectTypeId)\n );\n }\n\n getActionById(id: string, context?: ActionContext): Action | undefined {\n return this.getAvailableActions(context).find((action) => action.id === id);\n }\n\n getActionsById(ids: string[], context?: ActionContext): Action[] {\n return this.getAvailableActions(context).filter((action: Action) => ids.includes(action.id));\n }\n\n /**\n * Resolves the disabled state for the given actions against the given selection.\n * Sets the `disabled` property on each action instance.\n * @param actions Array of actions to resolve\n * @param selection Array of DmsObjects to check against\n * @returns Observable emitting the same actions with `disabled` set\n */\n resolveDisabledState(actions: Action[], selection: DmsObject[]): Observable<Action[]> {\n if (actions.length === 0) return of([]);\n\n const disabledChecks = actions.map((action: Action) => {\n const resolve$ = action.isDisabled\n ? action.isDisabled(selection).pipe(\n map((disabled: boolean) => {\n action.disabled = disabled;\n return action;\n })\n )\n : of(Object.assign(action, { disabled: false }));\n\n // Recursively resolve children\n if (action.children?.length) {\n return resolve$.pipe(\n switchMap((action) => this.resolveDisabledState(action.children!, selection).pipe(map(() => action)))\n );\n }\n return resolve$;\n });\n\n return forkJoin(disabledChecks);\n }\n\n openContextMenu(\n actions: Signal<Action[]>,\n callback: (action: Action) => void,\n overlayOrigin: { x: number; y: number }\n ): void {\n if (actions().length)\n this.#dialog.open(ContextmenuComponent, {\n data: { actions, callback },\n panelClass: 'context-menu-dialog'\n // position: { top: `${overlayOrigin.y}`, left: `${overlayOrigin.x}` }\n });\n const width = 10;\n const hight = 10;\n\n setTimeout(() => {\n const dialog = document.querySelector('.context-menu-dialog') as HTMLElement;\n\n const dialogWidth = dialog.offsetWidth;\n const dialogHeight = dialog.offsetHeight;\n const screenW = window.innerWidth;\n const screenH = window.innerHeight;\n\n let left = overlayOrigin.x;\n let top = overlayOrigin.y;\n if (left + dialogWidth > screenW) {\n left = screenW - dialogWidth - width;\n }\n if (top + dialogHeight > screenH) {\n top = screenH - dialogHeight - hight;\n }\n\n dialog.style.position = 'fixed';\n dialog.style.left = `${left}px`;\n dialog.style.top = `${top}px`;\n });\n }\n\n /**\n * Registers a set of default actions that are commonly used in the application.\n * These actions include delete, download, copy and cut. This method can be called\n * during the initialization of the application to ensure that these actions\n * are available for use.\n */\n registerDefaultActions(): void {\n this.registerActions([\n { id: BASE_ACTION.delete, action: DeleteAction },\n { id: BASE_ACTION.download, action: DownloadAction },\n { id: BASE_ACTION.copy, action: CopyAction },\n { id: BASE_ACTION.cut, action: CutAction }\n ]);\n }\n\n #actionsSupportsType(action: Action, objectTypeId: string): boolean {\n const matchesTypes = action.supports.types ? action.supports.types.includes(objectTypeId) : false;\n const matchesSOTs = action.supports.sots ? action.supports.sots.includes(objectTypeId) : false;\n const matchesPattern = action.supports.pattern\n ? Utils.patternToRegExp(action.supports.pattern).test(objectTypeId)\n : false;\n return matchesTypes || matchesSOTs || matchesPattern;\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { ActionContext } from '../models';\n\nexport const ACTION_CONTEXT_TOKEN = new InjectionToken<ActionContext>('action-context');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["TranslateService","i1"],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-client-framework-actions.mjs","sources":["../../../../../libs/yuuvis/client-framework/actions/src/lib/actions.module.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/components/contextmenu/contextmenu.component.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/components/contextmenu/contextmenu.component.html","../../../../../libs/yuuvis/client-framework/actions/src/lib/components/contextmenu/contextmenuTrigger.directive.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/models/actions.icon.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/models/actions.models.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/services/action.priority-levels.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/services/action.validation.service.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/copy-action/copy-action.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/cut-action/cut-action.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/delete-action/delete/delete.component.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/delete-action/delete/delete.component.html","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/delete-action/delete-action.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/actions/download-action/download-action.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/services/actions.service.ts","../../../../../libs/yuuvis/client-framework/actions/src/lib/tokens/actions.token.ts","../../../../../libs/yuuvis/client-framework/actions/src/yuuvis-client-framework-actions.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { TranslateModule } from '@ngx-translate/core';\n\n/**\n * Module for the actions library.\n */\n@NgModule({\n imports: [TranslateModule]\n})\nexport class ActionsModule {}\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { CommonModule } from '@angular/common';\n\nimport { CdkMenu, CdkMenuItem } from '@angular/cdk/menu';\nimport { MatIconModule } from '@angular/material/icon';\nimport { YuvListModule } from '@yuuvis/client-framework/list';\n\nimport {\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n untracked,\n viewChild,\n viewChildren\n} from '@angular/core';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ContextMenuAction, ContextMenuItemSelectEvent } from './contextmenu.model';\n\n@Component({\n selector: 'yuv-contextmenu',\n imports: [CommonModule, MatIconModule, YuvListModule, A11yModule, CdkMenu, CdkMenuItem, MatTooltip],\n providers: [MatTooltip],\n templateUrl: './contextmenu.component.html',\n styleUrls: ['./contextmenu.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ContextmenuComponent {\n actions = input<ContextMenuAction[]>([]);\n selection = input<unknown[]>([]);\n itemSelect = output<ContextMenuItemSelectEvent>();\n private translate = inject(TranslateService);\n\n cdkMenu = viewChild.required(CdkMenu);\n menuItems = viewChildren<CdkMenuItem | null>(CdkMenuItem);\n\n sortedActions = computed(() =>\n [...this.actions()].sort((a, b) => a.label.localeCompare(b.label, this.translate.getCurrentLang()))\n );\n\n constructor() {\n afterRenderEffect(() => {\n //Focus First Item when @for is finished\n untracked(() => {\n //firstElement?.nativeElement.focus();\n this.cdkMenu().focusFirstItem('program');\n });\n });\n }\n\n onItemTrigger({ action }: ContextMenuItemSelectEvent): void {\n this.itemSelect.emit({ action });\n }\n}\n","<div class=\"context-menu\" cdkMenu>\n @for (a of sortedActions(); track a.id) {\n <span [matTooltip]=\"a.description\" [matTooltipDisabled]=\"!a.description\">\n <div\n class=\"context-menu__item\"\n [class.context-menu__item--disabled]=\"a.disabled\"\n cdkMenuItem\n [cdkMenuItemDisabled]=\"a.disabled\"\n [attr.aria-label]=\"'Execute Action: ' + a.label\"\n (cdkMenuItemTriggered)=\"onItemTrigger({ action: a })\"\n >\n <mat-icon class=\"context-menu__item-icon ymt-icon--size-s\">{{ a.icon }}</mat-icon>\n {{ a.label }}\n </div>\n </span>\n }\n</div>\n","import { CdkContextMenuTrigger, MENU_STACK, MENU_TRIGGER, MenuStack } from '@angular/cdk/menu';\nimport { Directive, effect, Input, input, signal, TemplateRef, untracked } from '@angular/core';\n\n@Directive({\n selector: '[yuvContextMenuTrigger]',\n exportAs: 'yuvContextMenuTrigger',\n standalone: true,\n providers: [\n { provide: MENU_TRIGGER, useExisting: YuvContextMenuTriggerDirective },\n { provide: MENU_STACK, useClass: MenuStack }\n ]\n})\nexport class YuvContextMenuTriggerDirective extends CdkContextMenuTrigger {\n @Input({ alias: 'yuvContextMenuTrigger' })\n override menuTemplateRef!: TemplateRef<unknown>;\n\n triggerWhen = input<boolean | null>(null, { alias: 'yuvContextMenuTriggerWhen' });\n\n #contextMenuEvent = signal<MouseEvent | null>(null);\n\n constructor() {\n super();\n\n effect(() => {\n // Only a fresh context-menu event may re-run this effect. triggerWhen is read\n // untracked so a later false -> true transition (e.g. actions repopulating after\n // navigating into a folder and selecting an item) can't replay a stale event and\n // reopen the menu without a right-click.\n const event = this.#contextMenuEvent();\n untracked(() => {\n const triggerWhen = this.triggerWhen();\n if (event && (triggerWhen || triggerWhen === null)) {\n super._openOnContextMenu(event);\n this.#contextMenuEvent.set(null); // consume the event so it can't be replayed\n }\n });\n });\n }\n\n override _openOnContextMenu(event: MouseEvent) {\n this.#contextMenuEvent.set(event);\n }\n}\n","export const ACTION_ICON = {\n download: 'download',\n delete: 'delete',\n copy: 'content_copy',\n cut: 'content_cut',\n manageFlavor: 'cards_star'\n}","import { DmsObject } from '@yuuvis/client-core';\nimport { Observable } from 'rxjs';\n\nexport type ActionClass = { \n new (...args: any[]): any \n};\n\nexport class AbstractContextAction {\n context?: ActionContext;\n constructor(context?: ActionContext) {\n this.context = context;\n }\n}\n\nexport interface BaseAction {\n /**\n * Equals the selector of the actions selector (will be set by the action service)\n */\n id: string;\n /**\n * label to be displayed inside the action menu\n */\n label: string;\n /**\n * description to be displayed inside the action menu\n */\n description?: string;\n /**\n * @ignore\n */\n icon: string;\n /**\n * actions priority defining the position of the action within the whole list of actions\n */\n priority: number;\n /**\n * group of actions the action should be part of ('common' or 'further')\n */\n group: string;\n /**\n * number of selected items supported by the action. Enforced by the actions\n * service: an action whose range does not match the current selection size is\n * never offered, no matter what `isExecutable` returns.\n *\n * - `SINGLE_SELECT` — exactly one item\n * - `MULTI_SELECT` — one or more items\n * - `MULTI_SELECT_ONLY` — more than one item\n * - `ANY` — any selection, including an empty one\n */\n range: SelectionRange;\n\n /**\n * Types that are supported by the action\n */\n supports: ActionSupport;\n\n /**\n * Determining whether or not the action is executable for the given selection.\n * Controls visibility: when false, the action is hidden from the UI entirely.\n * @param item Current selection\n * @returns true if the action is executable for the current selection, false otherwise\n */\n isExecutable: (items: DmsObject[]) => Observable<boolean>;\n\n /**\n * Optional check whether the action should be disabled for the given selection.\n * Unlike isExecutable (which controls visibility), isDisabled controls whether\n * a visible action can be triggered. When absent, the action is never disabled.\n * @param items Current selection\n * @returns true if the action should be disabled, false otherwise\n */\n isDisabled?: (items: DmsObject[]) => Observable<boolean>;\n\n /**\n * Resolved disabled state for template binding. Set by ActionsService after\n * evaluating isDisabled(). Do not set manually on action classes.\n */\n disabled?: boolean;\n}\n\nexport interface ActionSupport {\n // object types\n types?: string[];\n // object types\n sots?: string[];\n // pattern to match the type name against\n pattern?: string;\n}\n\nexport interface ActionContext {\n /**\n * As actions deal with DmsObjects the subject property is the property that\n * should be used to display the name of the object. This may be used for\n * showing the name of the object in a confirmation/error dialog or similar.\n */\n subjectProperty?: string;\n /**\n * The appId is the id of the application that the action is executed in.\n */\n appId?: string;\n}\n\nexport interface Action extends BaseAction {\n run: (items: DmsObject[]) => Observable<boolean>;\n /**\n * Optional child actions. When present, this action renders as a sub-menu\n * trigger instead of executing `run`. Nesting can be arbitrarily deep.\n * An empty array is treated as \"no children\" (leaf action).\n */\n children?: Action[];\n}\n\nexport interface ActionOptions {\n context?: ActionContext;\n exclude?: string[] | RegExp;\n}\n\nexport enum SelectionRange {\n SINGLE_SELECT,\n MULTI_SELECT,\n MULTI_SELECT_ONLY,\n ANY\n}\n\nexport const BASE_ACTION = {\n copy: 'yuv.base.copy',\n cut: 'yuv.base.cut',\n download: 'yuv.base.download',\n delete: 'yuv.base.delete'\n};\n","export const ActionPriorityLevel = {\n LEVEL_1: 1,\n LEVEL_2: 2,\n LEVEL_3: 3,\n LEVEL_4: 4,\n LEVEL_5: 5,\n LEVEL_6: 6,\n LEVEL_7: 7,\n LEVEL_8: 8,\n LEVEL_9: 9,\n LEVEL_10: 10\n} as const;\n","import { inject, Injectable } from '@angular/core';\nimport {\n AppCacheService,\n DmsObject,\n ObjectLockingService,\n STORAGE_USERS_KEY,\n TranslateService,\n YuvUser\n} from '@yuuvis/client-core';\nimport { map, Observable, of } from 'rxjs';\n\n/**\n * Service responsible for validating actions on DMS objects.\n * Provides checks for document lock states and related user information.\n */\n/** @deprecated */\n@Injectable({\n providedIn: 'root'\n})\nexport class ActionsValidationService {\n private readonly translate = inject(TranslateService);\n readonly #appCache = inject(AppCacheService);\n readonly #objectLocking = inject(ObjectLockingService);\n\n /** @deprecated */\n checkDocumentLock(dmsObject: DmsObject): Observable<{ state: boolean; description?: string }> {\n const lockState = this.#objectLocking.getLockState(dmsObject);\n if (!lockState.locked || lockState.lockedByCurrentUser) return of({ state: false });\n return this.#appCache.getItem<YuvUser[]>(STORAGE_USERS_KEY).pipe(\n map((users) => {\n const lockUser = users?.find((user) => user.id === lockState.ownerId);\n const user = lockUser ? lockUser.title || lockUser.email || lockUser.id : null;\n const description = user\n ? this.translate.instant('yuv.action-menu.action.unlock.description-locked-by-other', { user })\n : this.translate.instant('yuv.action-menu.action.unlock.description-locked-by-unknown-user');\n return { state: true, description };\n })\n );\n }\n}\n","import { inject } from '@angular/core';\nimport { ClipboardService, DmsObject, TranslateService } from '@yuuvis/client-core';\nimport { Observable, of } from 'rxjs';\nimport { AbstractContextAction, Action, ACTION_ICON, ActionSupport, BASE_ACTION, SelectionRange } from '../../models';\nimport { ActionPriorityLevel } from '../../services';\n\nexport class CopyAction extends AbstractContextAction implements Action {\n readonly #clipboardService = inject(ClipboardService);\n readonly #translate = inject(TranslateService);\n\n id = BASE_ACTION.copy;\n label = this.#translate.instant('yuv.action-menu.action.copy.dms.object.label');\n description = this.#translate.instant('yuv.action-menu.action.copy.dms.object.description');\n priority = ActionPriorityLevel.LEVEL_8;\n icon = ACTION_ICON.copy;\n group = 'common';\n range = SelectionRange.MULTI_SELECT;\n supports: ActionSupport = {\n pattern: '*'\n };\n\n isExecutable(items: DmsObject[]): Observable<boolean> {\n const notAllowed = items.some((item) => !item.permissions?.writeIndexData);\n return of(items.length > 0 && !notAllowed);\n }\n\n run(items: DmsObject[]): Observable<boolean> {\n this.#clipboardService.addObjects(items, 'copy', this.context?.appId);\n return of(true);\n }\n}\n","import { inject } from '@angular/core';\nimport { ClipboardService, DmsObject, TranslateService } from '@yuuvis/client-core';\nimport { Observable, of } from 'rxjs';\nimport { AbstractContextAction, Action, ACTION_ICON, ActionSupport, BASE_ACTION, SelectionRange } from '../../models';\nimport { ActionPriorityLevel } from '../../services';\n\nexport class CutAction extends AbstractContextAction implements Action {\n readonly #clipboardService = inject(ClipboardService);\n readonly #translate = inject(TranslateService);\n\n id = BASE_ACTION.cut;\n label = this.#translate.instant('yuv.action-menu.action.cut.dms.object.label');\n description = this.#translate.instant('yuv.action-menu.action.cut.dms.object.description');\n priority = ActionPriorityLevel.LEVEL_8;\n icon = ACTION_ICON.cut;\n group = 'common';\n range = SelectionRange.MULTI_SELECT;\n supports: ActionSupport = {\n pattern: '*'\n };\n\n isExecutable(items: DmsObject[]): Observable<boolean> {\n return of(\n items.length > 0 &&\n items.every(\n (item) => item.permissions?.writeContent && item.permissions.writeIndexData && item.permissions.deleteObject\n )\n );\n }\n\n run(items: DmsObject[]): Observable<boolean> {\n this.#clipboardService.addObjects(items, 'cut', this.context?.appId);\n return of(true);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, inject, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport {\n DmsObject,\n DmsService,\n ObjectDeleteError,\n ObjectDeleteResult,\n TranslatePipe,\n TranslateService\n} from '@yuuvis/client-core';\nimport { DialogComponent } from '@yuuvis/client-framework/common';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { ActionContext } from '../../../models';\n\n/**\n * @ignore\n */\n\n@Component({\n selector: 'yuv-delete',\n standalone: true,\n imports: [CommonModule, TranslatePipe, MatButtonModule, DialogComponent, MatProgressBar, YmtButtonDirective],\n templateUrl: './delete.component.html',\n styleUrls: ['./delete.component.scss']\n})\nexport class DeleteComponent {\n readonly #dmsService = inject(DmsService);\n private readonly translate = inject(TranslateService);\n #dialogData = inject<any>(MAT_DIALOG_DATA);\n readonly #dialogRef = inject(MatDialogRef<DeleteComponent>);\n\n errors = signal<\n {\n status: number;\n subject: string;\n message: string;\n }[]\n >([]);\n\n deleting = signal(false);\n deleteItems: DmsObject[] = this.#dialogData.items;\n context: ActionContext = this.#dialogData.context;\n\n run(): void {\n // A double-click on the confirm button would otherwise send a second DELETE for objects the\n // first request already removed. That one answers 404 inside an HTTP 207, which consumers\n // cannot tell apart from a delete that genuinely failed.\n if (this.deleting()) return;\n this.errors.set([]);\n if (this.deleteItems.length) {\n this.deleting.set(true);\n const items = this.deleteItems.map((item) => ({ id: item.id, subject: this.#itemSubject(item) }));\n const subjects = new Map(items.map((item) => [item.id, item.subject]));\n this.#dmsService.deleteDmsObjects(items).subscribe({\n next: (res: ObjectDeleteResult[]) => {\n const errors = res.flatMap((result) =>\n result._error\n ? [\n {\n status: result._error.status,\n subject: this.#resultSubject(result, subjects),\n message: this.#getErrorMessage(result._error)\n }\n ]\n : []\n );\n this.errors.set(errors);\n if (!errors.length) this.#dialogRef.close();\n },\n error: (err: ObjectDeleteError) => {\n this.deleting.set(false);\n },\n complete: () => this.deleting.set(false)\n });\n }\n }\n\n /**\n * Subject sent along with the delete request: the value of the configured subject property,\n * falling back to the object ID when there is no such property or it carries no value.\n */\n #itemSubject(item: DmsObject): string {\n const property = this.context?.subjectProperty;\n const value = property ? item.data[property] : undefined;\n return value == null ? item.id : String(value);\n }\n\n /**\n * Subject shown for an errored object. A DELETE response only echoes `system:objectId`, so the\n * configured subject property is normally absent from it — fall back to the subject that was\n * sent for that object, and then to its ID.\n */\n #resultSubject(result: ObjectDeleteResult, subjects: Map<string, string>): string {\n const property = this.context?.subjectProperty;\n const value = property ? result.properties?.[property]?.value : undefined;\n return value == null ? (subjects.get(result.id) ?? result.id) : String(value);\n }\n\n #getErrorMessage(error: ObjectDeleteError): string {\n switch (error.status) {\n case 403:\n return this.translate.instant('yuv.action-menu.action.delete.error.403');\n case 404:\n return this.translate.instant('yuv.action-menu.action.delete.error.404');\n default:\n return this.translate.instant('yuv.action-menu.action.delete.error.default');\n }\n }\n\n cancel() {\n this.#dialogRef.close();\n }\n}\n","<yuv-dialog [headertitle]=\"'yuv.action-menu.action.delete.dms.object.label' | translate\">\n <main class=\"yuv-delete\" [ngClass]=\"{ deleting: deleting() }\">\n <mat-progress-bar mode=\"indeterminate\" class=\"progress-bar\"></mat-progress-bar>\n\n @if (errors().length) {\n <ul class=\"errors\">\n @for (e of errors(); track $index) {\n <li class=\"error\">\n <span class=\"subject\">{{ e.subject }}</span>\n <span class=\"message\">{{ e.message }}</span>\n </li>\n }\n </ul>\n } @else {\n <p>{{ 'yuv.action-menu.action.delete.dms.object.confirm.message' | translate }}</p>\n }\n </main>\n <footer class=\"form-buttons\">\n <button ymtButton=\"secondary\" [disabled]=\"deleting()\" (click)=\"cancel()\">\n {{ 'yuv.action-menu.action.delete.dms.object.confirm.cancel' | translate }}\n </button>\n\n <button ymtButton=\"primary\" [disabled]=\"deleting() || !!errors().length\" (click)=\"run()\">\n {{ 'yuv.action-menu.action.delete.dms.object.confirm.ok' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n","import { inject } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { DmsObject, IdmService, ObjectLockingService, RetentionService, TranslateService } from '@yuuvis/client-core';\nimport { map, Observable, of } from 'rxjs';\nimport { AbstractContextAction, Action, ACTION_ICON, ActionSupport, BASE_ACTION, SelectionRange } from '../../models';\nimport { ActionPriorityLevel } from '../../services';\nimport { DeleteComponent } from './delete/delete.component';\n\nexport class DeleteAction extends AbstractContextAction implements Action {\n readonly #translate = inject(TranslateService);\n readonly #dialog = inject(MatDialog);\n readonly #retention = inject(RetentionService);\n readonly #idmService = inject(IdmService);\n readonly #objectLocking = inject(ObjectLockingService);\n\n id = BASE_ACTION.delete;\n label = this.#translate.instant('yuv.action-menu.action.delete.dms.object.label');\n description = this.#translate.instant('yuv.action-menu.action.delete.dms.object.description');\n priority = ActionPriorityLevel.LEVEL_8;\n icon = ACTION_ICON.delete;\n group = 'common';\n range = SelectionRange.MULTI_SELECT;\n supports: ActionSupport = {\n pattern: '*'\n };\n\n isDisabled(items: DmsObject[]): Observable<boolean> {\n const lockState = this.#objectLocking.getLockState(items[0]);\n if (!lockState.locked) return of(false);\n return this.#idmService.getUserById(lockState.ownerId || '').pipe(\n map((user) => {\n const userName = user ? user.title || user.email || user.id : null;\n this.description = userName\n ? this.#translate.instant('yuv.action-menu.action.unlock.description-locked-by-other', { user: userName })\n : this.#translate.instant('yuv.action-menu.action.unlock.description-locked-by-unknown-user');\n return true;\n })\n );\n }\n\n isExecutable(items: DmsObject[]): Observable<boolean> {\n const dmsObject = items[0];\n return of(\n !!dmsObject.permissions &&\n dmsObject.permissions.deleteObject &&\n !this.#retention.getRetentionState(dmsObject).underRetention\n );\n }\n\n run(items: DmsObject[]): Observable<boolean> {\n this.#dialog.open(DeleteComponent, {\n data: {\n items,\n context: this.context\n }\n });\n return of(true);\n }\n}\n","import { inject } from '@angular/core';\nimport { DmsObject, DmsService, SystemType, TranslateService } from '@yuuvis/client-core';\nimport { Observable, of } from 'rxjs';\nimport { AbstractContextAction, Action, ACTION_ICON, ActionSupport, BASE_ACTION, SelectionRange } from '../../models';\nimport { ActionPriorityLevel } from '../../services';\n\nexport class DownloadAction extends AbstractContextAction implements Action {\n readonly #translate = inject(TranslateService);\n readonly #dmsService = inject(DmsService);\n\n id = BASE_ACTION.download;\n label = this.#translate.instant('yuv.action-menu.action.download.dms.object.content.label');\n description = this.#translate.instant('yuv.action-menu.action.download.dms.object.content.description');\n priority = ActionPriorityLevel.LEVEL_2;\n icon = ACTION_ICON.download;\n group = 'common';\n range = SelectionRange.MULTI_SELECT;\n supports: ActionSupport = {\n types: [SystemType.DOCUMENT]\n };\n\n isExecutable(selection: DmsObject[]): Observable<boolean> {\n const noContentMatch = (Array.isArray(selection) ? selection : [selection]).find((e) => !e.content);\n if (selection.length < 1) return of(false);\n return of(!noContentMatch);\n }\n\n run(selection: DmsObject[]): Observable<boolean> {\n this.#dmsService.downloadContent(Array.isArray(selection) ? selection : [selection]);\n return of(true);\n }\n}\n","import { Injectable, Injector, Signal, inject, runInInjectionContext } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DmsObject, Utils } from '@yuuvis/client-core';\nimport { Observable, forkJoin, map, of, switchMap } from 'rxjs';\nimport { CopyAction } from '../actions/copy-action/copy-action';\nimport { CutAction } from '../actions/cut-action/cut-action';\nimport { DeleteAction } from '../actions/delete-action/delete-action';\nimport { DownloadAction } from '../actions/download-action/download-action';\nimport { ContextmenuComponent } from '../components/contextmenu/contextmenu.component';\nimport { Action, ActionClass, ActionContext, ActionOptions, BASE_ACTION, SelectionRange } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ActionsService {\n readonly injector = inject(Injector);\n #dialog = inject(MatDialog);\n readonly iconRegistry = inject(MatIconRegistry);\n\n private _registeredActions: Record<string, ActionClass> = {};\n\n /**\n * Registers actions that can be used in the application.\n * @param a Array of actions to register, each action must have an id and a\n * class that extends ActionClass\n */\n registerActions(actions: { id: string; action: ActionClass }[]): void {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n Array.isArray(actions) &&\n actions.forEach((action) => {\n this._registeredActions[action.id] = action.action;\n });\n }\n\n /**\n * Conceals actions that are no longer needed or should not be available.\n * This will remove the actions from the registered actions list.\n * @param actionIDs Array of action IDs to conceal\n */\n concealActions(actionIDs: string[]): void {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n Array.isArray(actionIDs) && actionIDs.forEach((id) => delete this._registeredActions[id]);\n }\n\n /**\n * Returns all actions that are executable for the given selection.\n * An action is only taken into account when its `range` matches the size of\n * the current selection, so a `SelectionRange.SINGLE_SELECT` action is never\n * offered for a multi selection.\n * @param selection Array of DmsObjects to check for executable actions\n * @param options options to filter the actions\n * @returns Observable of actions that are executable for the given selection\n */\n getActions(selection: DmsObject[], options?: ActionOptions): Observable<Action[]> {\n const selections: Observable<{ action: Action; executable: boolean }>[] = this.getAvailableActions(options?.context)\n .filter((action) =>\n options?.exclude\n ? Array.isArray(options.exclude)\n ? !options.exclude.includes(action.id)\n : options.exclude instanceof RegExp\n ? !options.exclude.test(action.id)\n : true\n : true\n )\n .filter((action: Action) => this.matchesSelectionRange(action, selection))\n .map((action: Action) =>\n action.isExecutable(selection).pipe(\n map((executable: boolean) => ({\n action,\n executable\n }))\n )\n );\n\n if (selections.length === 0) return of([]);\n\n return forkJoin(selections).pipe(\n map((res: { action: Action; executable: boolean }[]) =>\n res.filter((result) => result.executable).map((executable) => executable.action)\n ),\n switchMap((actions: Action[]) => this.resolveDisabledState(actions, selection))\n );\n }\n\n /**\n * Checks whether an action supports the size of the given selection based on\n * its `range` property. Actions without a `range` are treated as\n * `SelectionRange.ANY`.\n * @param action Action to check\n * @param selection Array of DmsObjects the action should be applied to\n * @returns true if the action supports the size of the given selection\n */\n matchesSelectionRange(action: Action, selection: DmsObject[]): boolean {\n const count = selection?.length ?? 0;\n switch (action.range) {\n case SelectionRange.SINGLE_SELECT:\n return count === 1;\n case SelectionRange.MULTI_SELECT:\n return count >= 1;\n case SelectionRange.MULTI_SELECT_ONLY:\n return count > 1;\n default:\n return true;\n }\n }\n\n /**\n * Get all available actions. This includes the default actions and all registered actions but\n * without checking if they are executable.\n * @param context Context passed to the actions\n * @returns Array of available actions\n */\n getAvailableActions(context?: ActionContext): Action[] {\n let actions: Action[] = [];\n\n runInInjectionContext(this.injector, () => {\n actions = [...Object.values(this._registeredActions).map((action: ActionClass) => new action(context))];\n });\n return actions;\n }\n\n getActionsForType(objectTypeId: string, context?: ActionContext): Action[] {\n return this.getAvailableActions(context).filter((action: Action) =>\n this.#actionsSupportsType(action, objectTypeId)\n );\n }\n\n getActionById(id: string, context?: ActionContext): Action | undefined {\n return this.getAvailableActions(context).find((action) => action.id === id);\n }\n\n getActionsById(ids: string[], context?: ActionContext): Action[] {\n return this.getAvailableActions(context).filter((action: Action) => ids.includes(action.id));\n }\n\n /**\n * Resolves the disabled state for the given actions against the given selection.\n * Sets the `disabled` property on each action instance.\n * @param actions Array of actions to resolve\n * @param selection Array of DmsObjects to check against\n * @returns Observable emitting the same actions with `disabled` set\n */\n resolveDisabledState(actions: Action[], selection: DmsObject[]): Observable<Action[]> {\n if (actions.length === 0) return of([]);\n\n const disabledChecks = actions.map((action: Action) => {\n const resolve$ = action.isDisabled\n ? action.isDisabled(selection).pipe(\n map((disabled: boolean) => {\n action.disabled = disabled;\n return action;\n })\n )\n : of(Object.assign(action, { disabled: false }));\n\n // Recursively resolve children\n if (action.children?.length) {\n return resolve$.pipe(\n switchMap((action) => this.resolveDisabledState(action.children!, selection).pipe(map(() => action)))\n );\n }\n return resolve$;\n });\n\n return forkJoin(disabledChecks);\n }\n\n openContextMenu(\n actions: Signal<Action[]>,\n callback: (action: Action) => void,\n overlayOrigin: { x: number; y: number }\n ): void {\n if (actions().length)\n this.#dialog.open(ContextmenuComponent, {\n data: { actions, callback },\n panelClass: 'context-menu-dialog'\n // position: { top: `${overlayOrigin.y}`, left: `${overlayOrigin.x}` }\n });\n const width = 10;\n const hight = 10;\n\n setTimeout(() => {\n const dialog = document.querySelector('.context-menu-dialog') as HTMLElement;\n\n const dialogWidth = dialog.offsetWidth;\n const dialogHeight = dialog.offsetHeight;\n const screenW = window.innerWidth;\n const screenH = window.innerHeight;\n\n let left = overlayOrigin.x;\n let top = overlayOrigin.y;\n if (left + dialogWidth > screenW) {\n left = screenW - dialogWidth - width;\n }\n if (top + dialogHeight > screenH) {\n top = screenH - dialogHeight - hight;\n }\n\n dialog.style.position = 'fixed';\n dialog.style.left = `${left}px`;\n dialog.style.top = `${top}px`;\n });\n }\n\n /**\n * Registers a set of default actions that are commonly used in the application.\n * These actions include delete, download, copy and cut. This method can be called\n * during the initialization of the application to ensure that these actions\n * are available for use.\n */\n registerDefaultActions(): void {\n this.registerActions([\n { id: BASE_ACTION.delete, action: DeleteAction },\n { id: BASE_ACTION.download, action: DownloadAction },\n { id: BASE_ACTION.copy, action: CopyAction },\n { id: BASE_ACTION.cut, action: CutAction }\n ]);\n }\n\n #actionsSupportsType(action: Action, objectTypeId: string): boolean {\n const matchesTypes = action.supports.types ? action.supports.types.includes(objectTypeId) : false;\n const matchesSOTs = action.supports.sots ? action.supports.sots.includes(objectTypeId) : false;\n const matchesPattern = action.supports.pattern\n ? Utils.patternToRegExp(action.supports.pattern).test(objectTypeId)\n : false;\n return matchesTypes || matchesSOTs || matchesPattern;\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { ActionContext } from '../models';\n\nexport const ACTION_CONTEXT_TOKEN = new InjectionToken<ActionContext>('action-context');\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["TranslateService","i1"],"mappings":";;;;;;;;;;;;;;;;;;;AAGA;;AAEG;MAIU,aAAa,CAAA;+GAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YAFd,eAAe,CAAA,EAAA,CAAA,CAAA;AAEd,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,YAFd,eAAe,CAAA,EAAA,CAAA,CAAA;;4FAEd,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,eAAe;AAC1B,iBAAA;;;MCuBY,oBAAoB,CAAA;AAa/B,IAAA,WAAA,GAAA;AAZA,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAsB,EAAE,8EAAC;AACxC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAY,EAAE,gFAAC;QAChC,IAAA,CAAA,UAAU,GAAG,MAAM,EAA8B;AACzC,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE5C,QAAA,IAAA,CAAA,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;AACrC,QAAA,IAAA,CAAA,SAAS,GAAG,YAAY,CAAqB,WAAW,gFAAC;AAEzD,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MACvB,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAC,oFACpG;QAGC,iBAAiB,CAAC,MAAK;;YAErB,SAAS,CAAC,MAAK;;gBAEb,IAAI,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC;AAC1C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEA,aAAa,CAAC,EAAE,MAAM,EAA8B,EAAA;QAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC;+GAzBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,SAAA,EALpB,CAAC,UAAU,CAAC,mEAWM,OAAO,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EACS,WAAW,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtC1D,6nBAiBA,EAAA,MAAA,EAAA,CAAA,qlCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDQY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,UAAU,+BAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,qBAAA,EAAA,2BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAMvF,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;+BACE,iBAAiB,EAAA,OAAA,EAClB,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,EAAA,SAAA,EACxF,CAAC,UAAU,CAAC,EAAA,eAAA,EAGN,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6nBAAA,EAAA,MAAA,EAAA,CAAA,qlCAAA,CAAA,EAAA;AAQlB,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,OAAO,2FACS,WAAW,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE1BpD,MAAO,8BAA+B,SAAQ,qBAAqB,CAAA;AAMvE,IAAA,iBAAiB;AAEjB,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QALT,IAAA,CAAA,WAAW,GAAG,KAAK,CAAiB,IAAI,mFAAI,KAAK,EAAE,2BAA2B,EAAA,CAAG;AAEjF,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAoB,IAAI,wFAAC;QAKjD,MAAM,CAAC,MAAK;;;;;AAKV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE;YACtC,SAAS,CAAC,MAAK;AACb,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;gBACtC,IAAI,KAAK,KAAK,WAAW,IAAI,WAAW,KAAK,IAAI,CAAC,EAAE;AAClD,oBAAA,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC;oBAC/B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACnC;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAES,IAAA,kBAAkB,CAAC,KAAiB,EAAA;AAC3C,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;IACnC;+GA7BW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAL9B;AACT,YAAA,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,8BAA8B,EAAE;AACtE,YAAA,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS;AAC3C,SAAA,EAAA,QAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAEU,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAT1C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE;AACT,wBAAA,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,gCAAgC,EAAE;AACtE,wBAAA,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS;AAC3C;AACF,iBAAA;;sBAEE,KAAK;uBAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE;;;ACbpC,MAAM,WAAW,GAAG;AACvB,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,IAAI,EAAE,cAAc;AACpB,IAAA,GAAG,EAAE,aAAa;AAClB,IAAA,YAAY,EAAE;;;MCEL,qBAAqB,CAAA;AAEhC,IAAA,WAAA,CAAY,OAAuB,EAAA;AACjC,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;IACxB;AACD;IAyGW;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,cAAA,CAAA,eAAA,CAAA,GAAA,CAAA,CAAA,GAAA,eAAa;AACb,IAAA,cAAA,CAAA,cAAA,CAAA,cAAA,CAAA,GAAA,CAAA,CAAA,GAAA,cAAY;AACZ,IAAA,cAAA,CAAA,cAAA,CAAA,mBAAA,CAAA,GAAA,CAAA,CAAA,GAAA,mBAAiB;AACjB,IAAA,cAAA,CAAA,cAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAG;AACL,CAAC,EALW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;AAOnB,MAAM,WAAW,GAAG;AACzB,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,GAAG,EAAE,cAAc;AACnB,IAAA,QAAQ,EAAE,mBAAmB;AAC7B,IAAA,MAAM,EAAE;;;AChIH,MAAM,mBAAmB,GAAG;AACjC,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,QAAQ,EAAE;;;ACCZ;;;AAGG;AACH;MAIa,wBAAwB,CAAA;AAHrC,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAACA,kBAAgB,CAAC;AAC5C,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC;AACnC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAiBvD,IAAA;AAlBU,IAAA,SAAS;AACT,IAAA,cAAc;;AAGvB,IAAA,iBAAiB,CAAC,SAAoB,EAAA;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC;AAC7D,QAAA,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB;YAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACnF,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAY,iBAAiB,CAAC,CAAC,IAAI,CAC9D,GAAG,CAAC,CAAC,KAAK,KAAI;AACZ,YAAA,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,OAAO,CAAC;YACrE,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,EAAE,GAAG,IAAI;YAC9E,MAAM,WAAW,GAAG;AAClB,kBAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,2DAA2D,EAAE,EAAE,IAAI,EAAE;kBAC5F,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,kEAAkE,CAAC;AAC9F,YAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;QACrC,CAAC,CAAC,CACH;IACH;+GAnBW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cAFvB,MAAM,EAAA,CAAA,CAAA;;4FAEP,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACZK,MAAO,UAAW,SAAQ,qBAAqB,CAAA;AAArD,IAAA,WAAA,GAAA;;AACW,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC5C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAACA,kBAAgB,CAAC;AAE9C,QAAA,IAAA,CAAA,EAAE,GAAG,WAAW,CAAC,IAAI;QACrB,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,8CAA8C,CAAC;QAC/E,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,oDAAoD,CAAC;AAC3F,QAAA,IAAA,CAAA,QAAQ,GAAG,mBAAmB,CAAC,OAAO;AACtC,QAAA,IAAA,CAAA,IAAI,GAAG,WAAW,CAAC,IAAI;QACvB,IAAA,CAAA,KAAK,GAAG,QAAQ;AAChB,QAAA,IAAA,CAAA,KAAK,GAAG,cAAc,CAAC,YAAY;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAkB;AACxB,YAAA,OAAO,EAAE;SACV;IAWH;AAvBW,IAAA,iBAAiB;AACjB,IAAA,UAAU;AAanB,IAAA,YAAY,CAAC,KAAkB,EAAA;AAC7B,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;QAC1E,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;IAC5C;AAEA,IAAA,GAAG,CAAC,KAAkB,EAAA;AACpB,QAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;AACrE,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC;IACjB;AACD;;ACxBK,MAAO,SAAU,SAAQ,qBAAqB,CAAA;AAApD,IAAA,WAAA,GAAA;;AACW,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC5C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAACA,kBAAgB,CAAC;AAE9C,QAAA,IAAA,CAAA,EAAE,GAAG,WAAW,CAAC,GAAG;QACpB,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,6CAA6C,CAAC;QAC9E,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,mDAAmD,CAAC;AAC1F,QAAA,IAAA,CAAA,QAAQ,GAAG,mBAAmB,CAAC,OAAO;AACtC,QAAA,IAAA,CAAA,IAAI,GAAG,WAAW,CAAC,GAAG;QACtB,IAAA,CAAA,KAAK,GAAG,QAAQ;AAChB,QAAA,IAAA,CAAA,KAAK,GAAG,cAAc,CAAC,YAAY;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAkB;AACxB,YAAA,OAAO,EAAE;SACV;IAeH;AA3BW,IAAA,iBAAiB;AACjB,IAAA,UAAU;AAanB,IAAA,YAAY,CAAC,KAAkB,EAAA;AAC7B,QAAA,OAAO,EAAE,CACP,KAAK,CAAC,MAAM,GAAG,CAAC;YACd,KAAK,CAAC,KAAK,CACT,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,IAAI,IAAI,CAAC,WAAW,CAAC,YAAY,CAC7G,CACJ;IACH;AAEA,IAAA,GAAG,CAAC,KAAkB,EAAA;AACpB,QAAA,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;AACpE,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC;IACjB;AACD;;ACjBD;;AAEG;MASU,eAAe,CAAA;AAP5B,IAAA,WAAA,GAAA;AAQW,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AACxB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAACA,kBAAgB,CAAC;AACrD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAM,eAAe,CAAC;AACjC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,EAAC,YAA6B,EAAC;AAE3D,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAMb,EAAE,6EAAC;AAEL,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,+EAAC;AACxB,QAAA,IAAA,CAAA,WAAW,GAAgB,IAAI,CAAC,WAAW,CAAC,KAAK;AACjD,QAAA,IAAA,CAAA,OAAO,GAAkB,IAAI,CAAC,WAAW,CAAC,OAAO;AAuElD,IAAA;AAtFU,IAAA,WAAW;AAEpB,IAAA,WAAW;AACF,IAAA,UAAU;IAcnB,GAAG,GAAA;;;;QAID,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjG,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;AACjD,gBAAA,IAAI,EAAE,CAAC,GAAyB,KAAI;AAClC,oBAAA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAChC,MAAM,CAAC;AACL,0BAAE;AACE,4BAAA;AACE,gCAAA,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;gCAC5B,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC;gCAC9C,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM;AAC7C;AACF;0BACD,EAAE,CACP;AACD,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;oBACvB,IAAI,CAAC,MAAM,CAAC,MAAM;AAAE,wBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;gBAC7C,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,GAAsB,KAAI;AAChC,oBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC1B,CAAC;gBACD,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK;AACxC,aAAA,CAAC;QACJ;IACF;AAEA;;;AAGG;AACH,IAAA,YAAY,CAAC,IAAe,EAAA;AAC1B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe;AAC9C,QAAA,MAAM,KAAK,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS;AACxD,QAAA,OAAO,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAChD;AAEA;;;;AAIG;IACH,cAAc,CAAC,MAA0B,EAAE,QAA6B,EAAA;AACtE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe;AAC9C,QAAA,MAAM,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS;QACzE,OAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;IAC/E;AAEA,IAAA,gBAAgB,CAAC,KAAwB,EAAA;AACvC,QAAA,QAAQ,KAAK,CAAC,MAAM;AAClB,YAAA,KAAK,GAAG;gBACN,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,yCAAyC,CAAC;AAC1E,YAAA,KAAK,GAAG;gBACN,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,yCAAyC,CAAC;AAC1E,YAAA;gBACE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,6CAA6C,CAAC;;IAElF;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;IACzB;+GAtFW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5B5B,gmCA2BA,EAAA,MAAA,EAAA,CAAA,0vCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAiB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,kBAAkB,kLAAnF,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAI1B,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,CAAC,EAAA,QAAA,EAAA,gmCAAA,EAAA,MAAA,EAAA,CAAA,0vCAAA,CAAA,EAAA;;;AEhBxG,MAAO,YAAa,SAAQ,qBAAqB,CAAA;AAAvD,IAAA,WAAA,GAAA;;AACW,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAACD,kBAAgB,CAAC;AACrC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;AAC3B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACrC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAEtD,QAAA,IAAA,CAAA,EAAE,GAAG,WAAW,CAAC,MAAM;QACvB,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,gDAAgD,CAAC;QACjF,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,sDAAsD,CAAC;AAC7F,QAAA,IAAA,CAAA,QAAQ,GAAG,mBAAmB,CAAC,OAAO;AACtC,QAAA,IAAA,CAAA,IAAI,GAAG,WAAW,CAAC,MAAM;QACzB,IAAA,CAAA,KAAK,GAAG,QAAQ;AAChB,QAAA,IAAA,CAAA,KAAK,GAAG,cAAc,CAAC,YAAY;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAkB;AACxB,YAAA,OAAO,EAAE;SACV;IAkCH;AAjDW,IAAA,UAAU;AACV,IAAA,OAAO;AACP,IAAA,UAAU;AACV,IAAA,WAAW;AACX,IAAA,cAAc;AAavB,IAAA,UAAU,CAAC,KAAkB,EAAA;AAC3B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QACvC,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAC/D,GAAG,CAAC,CAAC,IAAI,KAAI;YACX,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI;YAClE,IAAI,CAAC,WAAW,GAAG;AACjB,kBAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,2DAA2D,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;kBACvG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,kEAAkE,CAAC;AAC/F,YAAA,OAAO,IAAI;QACb,CAAC,CAAC,CACH;IACH;AAEA,IAAA,YAAY,CAAC,KAAkB,EAAA;AAC7B,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC;AAC1B,QAAA,OAAO,EAAE,CACP,CAAC,CAAC,SAAS,CAAC,WAAW;YACrB,SAAS,CAAC,WAAW,CAAC,YAAY;YAClC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,cAAc,CAC/D;IACH;AAEA,IAAA,GAAG,CAAC,KAAkB,EAAA;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE;AACjC,YAAA,IAAI,EAAE;gBACJ,KAAK;gBACL,OAAO,EAAE,IAAI,CAAC;AACf;AACF,SAAA,CAAC;AACF,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC;IACjB;AACD;;ACpDK,MAAO,cAAe,SAAQ,qBAAqB,CAAA;AAAzD,IAAA,WAAA,GAAA;;AACW,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAACA,kBAAgB,CAAC;AACrC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAEzC,QAAA,IAAA,CAAA,EAAE,GAAG,WAAW,CAAC,QAAQ;QACzB,IAAA,CAAA,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,0DAA0D,CAAC;QAC3F,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,gEAAgE,CAAC;AACvG,QAAA,IAAA,CAAA,QAAQ,GAAG,mBAAmB,CAAC,OAAO;AACtC,QAAA,IAAA,CAAA,IAAI,GAAG,WAAW,CAAC,QAAQ;QAC3B,IAAA,CAAA,KAAK,GAAG,QAAQ;AAChB,QAAA,IAAA,CAAA,KAAK,GAAG,cAAc,CAAC,YAAY;AACnC,QAAA,IAAA,CAAA,QAAQ,GAAkB;AACxB,YAAA,KAAK,EAAE,CAAC,UAAU,CAAC,QAAQ;SAC5B;IAYH;AAxBW,IAAA,UAAU;AACV,IAAA,WAAW;AAapB,IAAA,YAAY,CAAC,SAAsB,EAAA;AACjC,QAAA,MAAM,cAAc,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;AACnG,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;AAC1C,QAAA,OAAO,EAAE,CAAC,CAAC,cAAc,CAAC;IAC5B;AAEA,IAAA,GAAG,CAAC,SAAsB,EAAA;QACxB,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC;AACpF,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC;IACjB;AACD;;MChBY,cAAc,CAAA;AAH3B,IAAA,WAAA,GAAA;AAIW,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACpC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;AAClB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC;QAEvC,IAAA,CAAA,kBAAkB,GAAgC,EAAE;AAgN7D,IAAA;AAnNC,IAAA,OAAO;AAKP;;;;AAIG;AACH,IAAA,eAAe,CAAC,OAA8C,EAAA;;AAE5D,QAAA,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;AACpB,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;gBACzB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM;AACpD,YAAA,CAAC,CAAC;IACN;AAEA;;;;AAIG;AACH,IAAA,cAAc,CAAC,SAAmB,EAAA;;QAEhC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC3F;AAEA;;;;;;;;AAQG;IACH,UAAU,CAAC,SAAsB,EAAE,OAAuB,EAAA;QACxD,MAAM,UAAU,GAA0D,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO;aAChH,MAAM,CAAC,CAAC,MAAM,KACb,OAAO,EAAE;cACL,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;kBAC3B,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACrC,kBAAE,OAAO,CAAC,OAAO,YAAY;sBACzB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACjC,sBAAE;cACJ,IAAI;AAET,aAAA,MAAM,CAAC,CAAC,MAAc,KAAK,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC;aACxE,GAAG,CAAC,CAAC,MAAc,KAClB,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CACjC,GAAG,CAAC,CAAC,UAAmB,MAAM;YAC5B,MAAM;YACN;SACD,CAAC,CAAC,CACJ,CACF;AAEH,QAAA,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC;QAE1C,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAC9B,GAAG,CAAC,CAAC,GAA8C,KACjD,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,MAAM,CAAC,CACjF,EACD,SAAS,CAAC,CAAC,OAAiB,KAAK,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAChF;IACH;AAEA;;;;;;;AAOG;IACH,qBAAqB,CAAC,MAAc,EAAE,SAAsB,EAAA;AAC1D,QAAA,MAAM,KAAK,GAAG,SAAS,EAAE,MAAM,IAAI,CAAC;AACpC,QAAA,QAAQ,MAAM,CAAC,KAAK;YAClB,KAAK,cAAc,CAAC,aAAa;gBAC/B,OAAO,KAAK,KAAK,CAAC;YACpB,KAAK,cAAc,CAAC,YAAY;gBAC9B,OAAO,KAAK,IAAI,CAAC;YACnB,KAAK,cAAc,CAAC,iBAAiB;gBACnC,OAAO,KAAK,GAAG,CAAC;AAClB,YAAA;AACE,gBAAA,OAAO,IAAI;;IAEjB;AAEA;;;;;AAKG;AACH,IAAA,mBAAmB,CAAC,OAAuB,EAAA;QACzC,IAAI,OAAO,GAAa,EAAE;AAE1B,QAAA,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAK;YACxC,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,MAAmB,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AACzG,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,OAAO;IAChB;IAEA,iBAAiB,CAAC,YAAoB,EAAE,OAAuB,EAAA;QAC7D,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAc,KAC7D,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC,CAChD;IACH;IAEA,aAAa,CAAC,EAAU,EAAE,OAAuB,EAAA;QAC/C,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IAC7E;IAEA,cAAc,CAAC,GAAa,EAAE,OAAuB,EAAA;QACnD,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAc,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9F;AAEA;;;;;;AAMG;IACH,oBAAoB,CAAC,OAAiB,EAAE,SAAsB,EAAA;AAC5D,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC;QAEvC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAc,KAAI;AACpD,YAAA,MAAM,QAAQ,GAAG,MAAM,CAAC;AACtB,kBAAE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,CAC/B,GAAG,CAAC,CAAC,QAAiB,KAAI;AACxB,oBAAA,MAAM,CAAC,QAAQ,GAAG,QAAQ;AAC1B,oBAAA,OAAO,MAAM;AACf,gBAAA,CAAC,CAAC;AAEN,kBAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;;AAGlD,YAAA,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC3B,gBAAA,OAAO,QAAQ,CAAC,IAAI,CAClB,SAAS,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAS,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC,CAAC,CACtG;YACH;AACA,YAAA,OAAO,QAAQ;AACjB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,QAAQ,CAAC,cAAc,CAAC;IACjC;AAEA,IAAA,eAAe,CACb,OAAyB,EACzB,QAAkC,EAClC,aAAuC,EAAA;QAEvC,IAAI,OAAO,EAAE,CAAC,MAAM;AAClB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE;AACtC,gBAAA,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;AAC3B,gBAAA,UAAU,EAAE;;AAEb,aAAA,CAAC;QACJ,MAAM,KAAK,GAAG,EAAE;QAChB,MAAM,KAAK,GAAG,EAAE;QAEhB,UAAU,CAAC,MAAK;YACd,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,sBAAsB,CAAgB;AAE5E,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW;AACtC,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY;AACxC,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU;AACjC,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW;AAElC,YAAA,IAAI,IAAI,GAAG,aAAa,CAAC,CAAC;AAC1B,YAAA,IAAI,GAAG,GAAG,aAAa,CAAC,CAAC;AACzB,YAAA,IAAI,IAAI,GAAG,WAAW,GAAG,OAAO,EAAE;AAChC,gBAAA,IAAI,GAAG,OAAO,GAAG,WAAW,GAAG,KAAK;YACtC;AACA,YAAA,IAAI,GAAG,GAAG,YAAY,GAAG,OAAO,EAAE;AAChC,gBAAA,GAAG,GAAG,OAAO,GAAG,YAAY,GAAG,KAAK;YACtC;AAEA,YAAA,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO;YAC/B,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA,EAAG,IAAI,IAAI;YAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAA,EAAG,GAAG,IAAI;AAC/B,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;AAKG;IACH,sBAAsB,GAAA;QACpB,IAAI,CAAC,eAAe,CAAC;YACnB,EAAE,EAAE,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE;YAChD,EAAE,EAAE,EAAE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE;YACpD,EAAE,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE;YAC5C,EAAE,EAAE,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS;AACzC,SAAA,CAAC;IACJ;IAEA,oBAAoB,CAAC,MAAc,EAAE,YAAoB,EAAA;QACvD,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,KAAK;QACjG,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,KAAK;AAC9F,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;AACrC,cAAE,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY;cAChE,KAAK;AACT,QAAA,OAAO,YAAY,IAAI,WAAW,IAAI,cAAc;IACtD;+GApNW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAd,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCXY,oBAAoB,GAAG,IAAI,cAAc,CAAgB,gBAAgB;;ACHtF;;AAEG;;;;"}
@@ -1,43 +1,16 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, input, computed, Component, signal, Injectable, output } from '@angular/core';
2
+ import { signal, inject, computed, Injectable, input, ChangeDetectionStrategy, Component, output } from '@angular/core';
3
+ import { toSignal, toObservable } from '@angular/core/rxjs-interop';
3
4
  import * as i1 from '@angular/material/icon';
4
5
  import { MatIconModule } from '@angular/material/icon';
5
6
  import * as i2 from '@angular/material/tooltip';
6
7
  import { MatTooltipModule } from '@angular/material/tooltip';
7
8
  import * as i2$1 from '@yuuvis/client-core';
8
- import { TranslateService, TranslatePipe, BaseObjectTypeField, SystemSOT, RetentionField, SystemType, Utils, YUV_USER, ObjectLockingService, TranslateModule } from '@yuuvis/client-core';
9
+ import { BaseObjectTypeField, SystemSOT, RetentionField, SystemType, Utils, YUV_USER, ObjectLockingService, IdmService, TranslateService, TranslatePipe, TranslateModule } from '@yuuvis/client-core';
9
10
  import { YmtBadge } from '@yuuvis/material/badge';
10
- import { NgClass } from '@angular/common';
11
+ import { map, combineLatest, switchMap, of, isObservable, startWith } from 'rxjs';
11
12
  import { _ } from '@ngx-translate/core';
12
-
13
- class BadgeChipComponent {
14
- constructor() {
15
- this.#translate = inject(TranslateService);
16
- this.badge = input.required(...(ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []));
17
- this.showLabel = input(false, ...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
18
- this.tooltip = computed(() => {
19
- const current = this.badge();
20
- const tooltip = this.#translate.instant(current.descriptionKey ?? current.labelKey);
21
- return typeof tooltip === 'string' && tooltip.toLocaleLowerCase().startsWith('!missing key:')
22
- ? this.#translate.instant(current.labelKey)
23
- : tooltip;
24
- }, ...(ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []));
25
- /**
26
- * Accessible name for the icon-only variant. Without a label the chip renders nothing
27
- * but an inert icon, so assistive technology has no name to announce — the tooltip is
28
- * a description, not a name, and it is mouse-only anyway. When the label is visible it
29
- * already names the chip, so no override is set.
30
- */
31
- this.ariaLabel = computed(() => (this.showLabel() ? null : this.#translate.instant(this.badge().labelKey)), ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
32
- }
33
- #translate;
34
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: BadgeChipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
35
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: BadgeChipComponent, isStandalone: true, selector: "yuv-badge-chip", inputs: { badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: true, transformFunction: null }, showLabel: { classPropertyName: "showLabel", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@let b = badge();\n\n<ymt-badge\n [severity]=\"b.severity ?? 'neutral'\"\n [matTooltip]=\"tooltip()\"\n class=\"badge-chip\"\n [attr.role]=\"showLabel() ? null : 'img'\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (b.svgIcon) {\n <mat-icon [svgIcon]=\"b.icon\" inert=\"true\" />\n } @else {\n <mat-icon inert=\"true\">{{ b.icon }}</mat-icon>\n }\n @if (showLabel()) {\n <span>{{ b.labelKey | translate }}</span>\n }\n</ymt-badge>\n", styles: [":host{display:flex}:host .badge-chip{gap:var(--ymt-spacing-xs);align-items:center;justify-content:center;padding:var(--ymt-spacing-xs);height:var(--ymt-spacing-xl)}:host .badge-chip mat-icon{width:var(--ymt-spacing-l);height:var(--ymt-spacing-m);font-size:var(--ymt-font-title-medium-size);line-height:var(--ymt-spacing-m)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: YmtBadge, selector: "ymt-badge", inputs: ["severity", "outline", "aura"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
36
- }
37
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: BadgeChipComponent, decorators: [{
38
- type: Component,
39
- args: [{ selector: 'yuv-badge-chip', imports: [MatIconModule, MatTooltipModule, YmtBadge, TranslatePipe], template: "@let b = badge();\n\n<ymt-badge\n [severity]=\"b.severity ?? 'neutral'\"\n [matTooltip]=\"tooltip()\"\n class=\"badge-chip\"\n [attr.role]=\"showLabel() ? null : 'img'\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (b.svgIcon) {\n <mat-icon [svgIcon]=\"b.icon\" inert=\"true\" />\n } @else {\n <mat-icon inert=\"true\">{{ b.icon }}</mat-icon>\n }\n @if (showLabel()) {\n <span>{{ b.labelKey | translate }}</span>\n }\n</ymt-badge>\n", styles: [":host{display:flex}:host .badge-chip{gap:var(--ymt-spacing-xs);align-items:center;justify-content:center;padding:var(--ymt-spacing-xs);height:var(--ymt-spacing-xl)}:host .badge-chip mat-icon{width:var(--ymt-spacing-l);height:var(--ymt-spacing-m);font-size:var(--ymt-font-title-medium-size);line-height:var(--ymt-spacing-m)}\n"] }]
40
- }], propDecorators: { badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: true }] }], showLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabel", required: false }] }] } });
13
+ import { NgClass } from '@angular/common';
41
14
 
42
15
  /**
43
16
  * Badge shown when an object is locked by another user.
@@ -52,7 +25,19 @@ const LOCK_BADGE = {
52
25
  /**
53
26
  * Applies if a lock tag exists and the current user is not the lock owner.
54
27
  */
55
- applies: (_dmsObject, ctx) => !!ctx.lockState?.locked && !ctx.lockState.lockedByCurrentUser
28
+ applies: (_dmsObject, ctx) => !!ctx.lockState?.locked && !ctx.lockState.lockedByCurrentUser,
29
+ /**
30
+ * Resolves the lock owner (user id stored in the lock tag) to a display name.
31
+ * Falls back to the raw id when the user cannot be resolved.
32
+ */
33
+ descriptionParams: (_dmsObject, ctx) => {
34
+ const ownerId = ctx.lockState?.ownerId;
35
+ if (!ownerId)
36
+ return {};
37
+ return ctx
38
+ .resolveUser(ownerId)
39
+ .pipe(map((user) => ({ user: user ? user.title || user.email || user.id : ownerId })));
40
+ }
56
41
  };
57
42
  /**
58
43
  * Badge shown when an object is locked by the current user.
@@ -174,6 +159,7 @@ class BadgeRegistryService {
174
159
  #store = signal({ main: [], buckets: new Map() }, ...(ngDevMode ? [{ debugName: "#store" }] : /* istanbul ignore next */ []));
175
160
  #currentUser = inject(YUV_USER, { optional: true }) ?? undefined;
176
161
  #objectLocking = inject(ObjectLockingService);
162
+ #idm = inject(IdmService);
177
163
  /**
178
164
  * Registers one or multiple badges in the registry.
179
165
  *
@@ -314,6 +300,17 @@ class BadgeRegistryService {
314
300
  });
315
301
  return filtered.filter((badge) => this.#isActive(badge, dmsObject)).sort(this.#byPriority);
316
302
  }
303
+ /**
304
+ * Builds the evaluation context for a badge against the given object. Used both
305
+ * for `applies` evaluation and for resolving {@link Badge.descriptionParams}.
306
+ */
307
+ createContext(dmsObject) {
308
+ return {
309
+ currentUser: this.#currentUser,
310
+ lockState: this.#objectLocking.getLockState(dmsObject),
311
+ resolveUser: (userId) => this.#idm.getUserById(userId)
312
+ };
313
+ }
317
314
  /**
318
315
  * Returns globals merged with the named bucket. Bucket entries with the same id
319
316
  * override globals (the bucket entry replaces the global entry in place, preserving
@@ -354,10 +351,7 @@ class BadgeRegistryService {
354
351
  * If neither applies nor rule is provided, the badge is considered inactive.
355
352
  */
356
353
  #isActive(badge, dmsObject) {
357
- const ctx = {
358
- currentUser: this.#currentUser,
359
- lockState: this.#objectLocking.getLockState(dmsObject)
360
- };
354
+ const ctx = this.createContext(dmsObject);
361
355
  if (badge.applies)
362
356
  return !!badge.applies(dmsObject, ctx);
363
357
  if (badge.rule)
@@ -372,6 +366,53 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImpo
372
366
  args: [{ providedIn: 'root' }]
373
367
  }] });
374
368
 
369
+ class BadgeChipComponent {
370
+ constructor() {
371
+ this.#translate = inject(TranslateService);
372
+ this.#registry = inject(BadgeRegistryService);
373
+ this.badge = input.required(...(ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []));
374
+ this.showLabel = input(false, ...(ngDevMode ? [{ debugName: "showLabel" }] : /* istanbul ignore next */ []));
375
+ /**
376
+ * The object the badge is shown for. Required to resolve {@link Badge.descriptionParams}
377
+ * (e.g. the name of the user holding a lock); without it the description renders as-is.
378
+ */
379
+ this.dmsObject = input(...(ngDevMode ? [undefined, { debugName: "dmsObject" }] : /* istanbul ignore next */ []));
380
+ /**
381
+ * Translated tooltip. Uses `descriptionKey` (interpolated with the badge's resolved
382
+ * `descriptionParams`) and falls back to `labelKey` when no description is available.
383
+ * While async params are pending, the description is shown without them.
384
+ */
385
+ this.tooltip = toSignal(combineLatest([toObservable(this.badge), toObservable(this.dmsObject)]).pipe(switchMap(([badge, dmsObject]) => this.#resolveParams(badge, dmsObject).pipe(map((params) => this.#translateTooltip(badge, params))))), { initialValue: '' });
386
+ /**
387
+ * Accessible name for the icon-only variant. Without a label the chip renders nothing
388
+ * but an inert icon, so assistive technology has no name to announce — the tooltip is
389
+ * a description, not a name, and it is mouse-only anyway. When the label is visible it
390
+ * already names the chip, so no override is set.
391
+ */
392
+ this.ariaLabel = computed(() => this.showLabel() ? null : this.#translate.instant(this.badge().labelKey), ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
393
+ }
394
+ #translate;
395
+ #registry;
396
+ #resolveParams(badge, dmsObject) {
397
+ if (!badge.descriptionParams || !dmsObject)
398
+ return of({});
399
+ const params = badge.descriptionParams(dmsObject, this.#registry.createContext(dmsObject));
400
+ return isObservable(params) ? params.pipe(startWith({})) : of(params);
401
+ }
402
+ #translateTooltip(badge, params) {
403
+ const tooltip = this.#translate.instant(badge.descriptionKey ?? badge.labelKey, params);
404
+ return typeof tooltip === 'string' && tooltip.toLocaleLowerCase().startsWith('!missing key:')
405
+ ? this.#translate.instant(badge.labelKey)
406
+ : tooltip;
407
+ }
408
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: BadgeChipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
409
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: BadgeChipComponent, isStandalone: true, selector: "yuv-badge-chip", inputs: { badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: true, transformFunction: null }, showLabel: { classPropertyName: "showLabel", publicName: "showLabel", isSignal: true, isRequired: false, transformFunction: null }, dmsObject: { classPropertyName: "dmsObject", publicName: "dmsObject", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@let b = badge();\n\n<ymt-badge\n class=\"badge-chip\"\n [severity]=\"b.severity ?? 'neutral'\"\n [matTooltip]=\"tooltip()\"\n [attr.role]=\"showLabel() ? null : 'img'\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (b.svgIcon) {\n <mat-icon [svgIcon]=\"b.icon\" inert=\"true\" />\n } @else {\n <mat-icon inert=\"true\">{{ b.icon }}</mat-icon>\n }\n @if (showLabel()) {\n <span>{{ b.labelKey | translate }}</span>\n }\n</ymt-badge>\n", styles: [":host{display:flex}:host .badge-chip{gap:var(--ymt-spacing-xs);align-items:center;justify-content:center;padding:var(--ymt-spacing-xs);height:var(--ymt-spacing-xl)}:host .badge-chip mat-icon{width:var(--ymt-spacing-l);height:var(--ymt-spacing-m);font-size:var(--ymt-font-title-medium-size);line-height:var(--ymt-spacing-m)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: YmtBadge, selector: "ymt-badge", inputs: ["severity", "outline", "aura"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
410
+ }
411
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: BadgeChipComponent, decorators: [{
412
+ type: Component,
413
+ args: [{ selector: 'yuv-badge-chip', imports: [MatIconModule, MatTooltipModule, YmtBadge, TranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let b = badge();\n\n<ymt-badge\n class=\"badge-chip\"\n [severity]=\"b.severity ?? 'neutral'\"\n [matTooltip]=\"tooltip()\"\n [attr.role]=\"showLabel() ? null : 'img'\"\n [attr.aria-label]=\"ariaLabel()\"\n>\n @if (b.svgIcon) {\n <mat-icon [svgIcon]=\"b.icon\" inert=\"true\" />\n } @else {\n <mat-icon inert=\"true\">{{ b.icon }}</mat-icon>\n }\n @if (showLabel()) {\n <span>{{ b.labelKey | translate }}</span>\n }\n</ymt-badge>\n", styles: [":host{display:flex}:host .badge-chip{gap:var(--ymt-spacing-xs);align-items:center;justify-content:center;padding:var(--ymt-spacing-xs);height:var(--ymt-spacing-xl)}:host .badge-chip mat-icon{width:var(--ymt-spacing-l);height:var(--ymt-spacing-m);font-size:var(--ymt-font-title-medium-size);line-height:var(--ymt-spacing-m)}\n"] }]
414
+ }], propDecorators: { badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: true }] }], showLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLabel", required: false }] }], dmsObject: [{ type: i0.Input, args: [{ isSignal: true, alias: "dmsObject", required: false }] }] } });
415
+
375
416
  class BadgeSelectComponent {
376
417
  constructor() {
377
418
  this.#registry = inject(BadgeRegistryService);
@@ -412,11 +453,11 @@ class TileBadgesComponent {
412
453
  }
413
454
  #registry;
414
455
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: TileBadgesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
415
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: TileBadgesComponent, isStandalone: true, selector: "yuv-tile-badges", inputs: { dmsObject: { classPropertyName: "dmsObject", publicName: "dmsObject", isSignal: true, isRequired: true, transformFunction: null }, badgeIds: { classPropertyName: "badgeIds", publicName: "badgeIds", isSignal: true, isRequired: false, transformFunction: null }, bucket: { classPropertyName: "bucket", publicName: "bucket", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@for (b of activeBadges(); track $index) {\n <yuv-badge-chip [badge]=\"b\" />\n}\n", styles: [":host{display:inline-flex;gap:var(--ymt-spacing-2xs);flex-wrap:wrap}\n"], dependencies: [{ kind: "component", type: BadgeChipComponent, selector: "yuv-badge-chip", inputs: ["badge", "showLabel"] }] }); }
456
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: TileBadgesComponent, isStandalone: true, selector: "yuv-tile-badges", inputs: { dmsObject: { classPropertyName: "dmsObject", publicName: "dmsObject", isSignal: true, isRequired: true, transformFunction: null }, badgeIds: { classPropertyName: "badgeIds", publicName: "badgeIds", isSignal: true, isRequired: false, transformFunction: null }, bucket: { classPropertyName: "bucket", publicName: "bucket", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@for (b of activeBadges(); track $index) {\n <yuv-badge-chip [badge]=\"b\" [dmsObject]=\"dmsObject()\" />\n}\n", styles: [":host{display:inline-flex;gap:var(--ymt-spacing-2xs);flex-wrap:wrap}\n"], dependencies: [{ kind: "component", type: BadgeChipComponent, selector: "yuv-badge-chip", inputs: ["badge", "showLabel", "dmsObject"] }] }); }
416
457
  }
417
458
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: TileBadgesComponent, decorators: [{
418
459
  type: Component,
419
- args: [{ selector: 'yuv-tile-badges', imports: [BadgeChipComponent], template: "@for (b of activeBadges(); track $index) {\n <yuv-badge-chip [badge]=\"b\" />\n}\n", styles: [":host{display:inline-flex;gap:var(--ymt-spacing-2xs);flex-wrap:wrap}\n"] }]
460
+ args: [{ selector: 'yuv-tile-badges', imports: [BadgeChipComponent], template: "@for (b of activeBadges(); track $index) {\n <yuv-badge-chip [badge]=\"b\" [dmsObject]=\"dmsObject()\" />\n}\n", styles: [":host{display:inline-flex;gap:var(--ymt-spacing-2xs);flex-wrap:wrap}\n"] }]
420
461
  }], propDecorators: { dmsObject: [{ type: i0.Input, args: [{ isSignal: true, alias: "dmsObject", required: true }] }], badgeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeIds", required: false }] }], bucket: [{ type: i0.Input, args: [{ isSignal: true, alias: "bucket", required: false }] }] } });
421
462
 
422
463
  /**