@yuuvis/client-framework 3.20.1 → 3.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-client-framework-badges.mjs","sources":["../../../../../libs/yuuvis/client-framework/badges/src/lib/badge-chip/badge-chip.component.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/badge-chip/badge-chip.component.html","../../../../../libs/yuuvis/client-framework/badges/src/lib/default-badges/lock.badge.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/default-badges/retention.badge.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/utils/badge.utils.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/services/badge.service.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/badge-select/badge-select.component.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/badge-select/badge-select.component.html","../../../../../libs/yuuvis/client-framework/badges/src/lib/tile-badges/tile-badges.component.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/tile-badges/tile-badges.component.html","../../../../../libs/yuuvis/client-framework/badges/src/yuuvis-client-framework-badges.ts"],"sourcesContent":["import { Component, computed, inject, input } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtBadge } from '@yuuvis/material/badge';\nimport { Badge } from '../models';\n@Component({\n selector: 'yuv-badge-chip',\n imports: [MatIconModule, MatTooltipModule, YmtBadge, TranslatePipe],\n templateUrl: './badge-chip.component.html',\n styleUrls: ['./badge-chip.component.scss']\n})\nexport class BadgeChipComponent {\n readonly #translate = inject(TranslateService);\n\n badge = input.required<Badge>();\n showLabel = input<boolean>(false);\n\n readonly tooltip = computed<string>(() => {\n const current = this.badge();\n const tooltip = this.#translate.instant(current.descriptionKey ?? current.labelKey);\n\n return typeof tooltip === 'string' && tooltip.toLocaleLowerCase().startsWith('!missing key:')\n ? this.#translate.instant(current.labelKey)\n : tooltip;\n });\n\n /**\n * Accessible name for the icon-only variant. Without a label the chip renders nothing\n * but an inert icon, so assistive technology has no name to announce — the tooltip is\n * a description, not a name, and it is mouse-only anyway. When the label is visible it\n * already names the chip, so no override is set.\n */\n readonly ariaLabel = computed<string | null>(() => (this.showLabel() ? null : this.#translate.instant(this.badge().labelKey)));\n}\n","@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","import { _ as marker } from '@ngx-translate/core';\nimport { Badge } from '../models';\n\n/**\n * Badge shown when an object is locked by another user.\n */\nexport const LOCK_BADGE: Badge = {\n id: 'yuv.badge.lock',\n labelKey: marker('yuv.badge.lock.label'),\n descriptionKey: marker('yuv.badge.lock.description'),\n icon: 'lock',\n severity: 'danger',\n priority: 10,\n /**\n * Applies if a lock tag exists and the current user is not the lock owner.\n */\n applies: (_dmsObject, ctx) => !!ctx.lockState?.locked && !ctx.lockState.lockedByCurrentUser\n};\n\n/**\n * Badge shown when an object is locked by the current user.\n */\nexport const LOCK_SELF_BADGE: Badge = {\n id: 'yuv.badge.lock.self',\n labelKey: marker('yuv.badge.lock.self.label'),\n descriptionKey: marker('yuv.badge.lock.self.description'),\n icon: 'lock_person',\n severity: 'success',\n priority: 10,\n variantOf: 'yuv.badge.lock',\n /**\n * Applies if a lock tag exists and the current user is the lock owner.\n */\n applies: (_dmsObject, ctx) => !!ctx.lockState?.locked && ctx.lockState.lockedByCurrentUser\n};\n","import { _ as marker } from '@ngx-translate/core';\nimport { BaseObjectTypeField, RetentionField, SystemSOT, SystemType } from '@yuuvis/client-core';\nimport { Badge } from '../models/badge.models';\n\n/**\n * Badge definition for DMS objects that are subject to a destruction retention policy.\n *\n * This badge is displayed when a DMS object has the `DESTRUCTION_RETENTION` secondary object type\n * assigned and an active or ongoing retention period. It helps users identify objects that are\n * legally or organizationally protected from deletion during their retention period.\n *\n * **Applies when:**\n * - The object includes the `SystemSOT.DESTRUCTION_RETENTION` secondary object type.\n * - A retention start date (`RetentionField.RETENTION_START`) is present.\n * - The retention period has started (start date is in the past), or an end date is set and\n * still lies in the future.\n *\n * @remarks\n * - `severity` is set to `'danger'` to visually emphasize the retention constraint.\n * - `priority` is `20`, which controls the display order relative to other badges.\n * - `supports` limits the badge to documents, so selection UIs such as the tile\n * config do not offer it for folder types. It only scopes configurability -\n * `applies` still governs rendering, so an object under retention keeps its\n * badge regardless.\n */ export const RETENTION_BADGE: Badge = {\n id: 'yuv.badge.retention',\n labelKey: marker('yuv.badge.retention.label'),\n descriptionKey: marker('yuv.badge.retention.description'),\n icon: 'gavel',\n severity: 'danger',\n priority: 20,\n supports: { types: [SystemType.DOCUMENT] },\n applies: (dmsObject) => {\n const sots = dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] as string[] | undefined;\n if (!sots?.includes(SystemSOT.DESTRUCTION_RETENTION)) return false;\n const startRetention = dmsObject.data[RetentionField.RETENTION_START] as string | undefined;\n if (!startRetention) return false;\n const now = new Date();\n const start = new Date(startRetention);\n const endRetention = dmsObject.data[RetentionField.RETENTION_END] as string | undefined;\n const end = endRetention ? new Date(endRetention) : null;\n return start < now || (end !== null && end > now);\n }\n};\n","import { BaseObjectTypeField, DmsObject, Utils, VirtualObjectType } from '@yuuvis/client-core';\nimport { Badge, BadgeRule } from '../models/badge.models';\n\n/**\n * Evaluates a single badge rule against a given DMS object.\n *\n * Supported operations:\n * - `isSet`: returns `true` when the field value is not `undefined`, `null`, or an empty string.\n * - `equals`: returns `true` when the field value strictly equals `rule.value`.\n * - `tagPresent`: returns `true` when the configured tags field contains a tag whose first element equals `rule.value`.\n *\n * @param rule Badge rule definition to evaluate.\n * @param dmsObject Source object containing field data.\n * @returns `true` if the rule matches; otherwise `false`.\n */\nexport function evaluateRule(rule: BadgeRule, dmsObject: DmsObject): boolean {\n switch (rule.op) {\n case 'isSet': {\n const value = dmsObject.data[rule.field];\n return value !== undefined && value !== null && value !== '';\n }\n case 'equals': {\n return dmsObject.data[rule.field] === rule.value;\n }\n case 'tagPresent': {\n const tagsField = rule.field || BaseObjectTypeField.TAGS;\n const tags = dmsObject.data[tagsField] as unknown[][] | undefined;\n return !!tags?.some((tag) => Array.isArray(tag) && tag[0] === rule.value);\n }\n default:\n return false;\n }\n}\n\n/**\n * Checks whether a badge may be configured for the given object type.\n *\n * A badge without {@link Badge.supports} is unrestricted and matches every\n * type. Otherwise the type's `objectType` and its `sots` are matched against\n * the badge's `types` / `sots` lists and its `pattern`; a single hit is enough.\n *\n * Called without an object type (no type context available) the badge is kept,\n * so callers that do not know the type never lose badges.\n *\n * @param badge Badge to check.\n * @param objectType Type the selection UI is currently configuring.\n * @returns `true` if the badge may be offered for that type; otherwise `false`.\n */\nexport function badgeSupportsType(badge: Badge, objectType?: VirtualObjectType): boolean {\n const supports = badge.supports;\n if (!supports) return true;\n if (!objectType) return true;\n\n const typeIds = [objectType.objectType, ...(objectType.sots ?? [])].filter((id): id is string => !!id);\n return typeIds.some(\n (id) =>\n !!supports.types?.includes(id) ||\n !!supports.sots?.includes(id) ||\n (!!supports.pattern && Utils.patternToRegExp(supports.pattern).test(id))\n );\n}\n","import { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { DmsObject, ObjectLockingService, YUV_USER } from '@yuuvis/client-core';\nimport { LOCK_BADGE, LOCK_SELF_BADGE, RETENTION_BADGE } from '../default-badges';\nimport { Badge, BadgeContext } from '../models/badge.models';\nimport { evaluateRule } from '../utils';\n\ninterface StoredBadges {\n main: Badge[];\n buckets: Map<string, Badge[]>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class BadgeRegistryService {\n readonly #store = signal<StoredBadges>({ main: [], buckets: new Map() });\n readonly #currentUser = inject(YUV_USER, { optional: true }) ?? undefined;\n readonly #objectLocking = inject(ObjectLockingService);\n\n /**\n * Registers one or multiple badges in the registry.\n *\n * If a badge with the same id already exists in the same scope, it is replaced.\n * Otherwise, the badge is added to the scope.\n *\n * @param badges An array of badges to register.\n * @param bucket Optional bucket id (typically an APP_ID). If omitted, badges are\n * registered globally and visible to every consumer. If provided,\n * badges are scoped to that bucket and only visible when consumers\n * query with the matching bucket.\n *\n * @see {@link Badge}\n */\n registerBadges(badges: Badge[], bucket?: string): void {\n this.#store.update((current) => {\n const next: StoredBadges = { main: current.main, buckets: new Map(current.buckets) };\n if (bucket === undefined) {\n next.main = this.#mergeInto(current.main, badges);\n } else {\n const existing = current.buckets.get(bucket) ?? [];\n next.buckets.set(bucket, this.#mergeInto(existing, badges));\n }\n return next;\n });\n }\n\n /**\n * Registers the default badges into the registry.\n *\n * Initializes three built-in badge types:\n * - LOCK_BADGE: Indicates objects locked by other users\n * - LOCK_SELF_BADGE: Indicates objects locked by the current user\n * - RETENTION_BADGE: Indicates objects under retention hold\n *\n * @param bucket Optional bucket id. If omitted, defaults are registered globally.\n *\n * @see {@link Badge}\n */\n registerDefaultBadges(bucket?: string): void {\n this.registerBadges([LOCK_BADGE, LOCK_SELF_BADGE, RETENTION_BADGE], bucket);\n }\n\n /**\n * Unregisters one or multiple badges from the registry by id.\n *\n * Operates only on the specified scope: omitting `bucket` removes from the global\n * scope only, providing `bucket` removes from that bucket only.\n *\n * @param id A single badge id or an array of badge ids to remove.\n * @param bucket Optional bucket id.\n */\n unregister(id: string | string[], bucket?: string): void {\n const ids = Array.isArray(id) ? id : [id];\n this.#store.update((current) => {\n const next: StoredBadges = { main: current.main, buckets: new Map(current.buckets) };\n if (bucket === undefined) {\n next.main = current.main.filter((badge) => !ids.includes(badge.id));\n } else {\n const existing = current.buckets.get(bucket);\n if (existing) {\n next.buckets.set(\n bucket,\n existing.filter((badge) => !ids.includes(badge.id))\n );\n }\n }\n return next;\n });\n }\n\n /**\n * Returns a registered badge by id.\n *\n * Looks first in the given bucket (if any), then in the global scope.\n *\n * @param id The badge id.\n * @param bucket Optional bucket id.\n * @returns The matching badge, or undefined if no badge is registered with that id.\n */\n get(id: string, bucket?: string): Badge | undefined {\n const { main, buckets } = this.#store();\n if (bucket !== undefined) {\n const local = buckets.get(bucket)?.find((badge) => badge.id === id);\n if (local) return local;\n }\n return main.find((badge) => badge.id === id);\n }\n\n /**\n * Returns all registered badges across the global scope and every bucket.\n *\n * Bucket entries override globals with the same id; remaining duplicates between\n * buckets keep the first occurrence. Useful for tests and debug inspection.\n */\n all(): Badge[] {\n const { main, buckets } = this.#store();\n const byId = new Map<string, Badge>();\n for (const badge of main) byId.set(badge.id, badge);\n for (const list of buckets.values()) {\n for (const badge of list) byId.set(badge.id, badge);\n }\n return Array.from(byId.values());\n }\n\n /**\n * Returns a reactive list of badges visible in the given scope.\n *\n * The returned signal recomputes whenever the registry changes. The list contains\n * the global badges merged with the named bucket's badges (bucket entries override\n * globals with the same id), sorted by ascending priority. At equal priority,\n * globals come first, then bucket-local badges.\n *\n * @param bucket Optional bucket id.\n */\n getBadgesForBucket(bucket?: string): Signal<Badge[]> {\n return computed(() => this.#visibleScope(bucket).sort(this.#byPriority));\n }\n\n /**\n * Resolves all active badges for a given object in the given scope.\n *\n * The visible scope is `main ∪ bucket`. Variants only resolve when their parent id\n * is present in the visible scope. If `idFilter` is provided, only badges whose id\n * (or whose variant's parent id) is in the filter are considered. The resulting\n * list is sorted by ascending priority.\n *\n * @param dmsObject The object to evaluate badges against.\n * @param options Optional bucket and id filter.\n */\n getActiveBadges(dmsObject: DmsObject, options?: { bucket?: string; idFilter?: string[] }): Badge[] {\n const visible = this.#visibleScope(options?.bucket);\n const idFilter = options?.idFilter;\n const filtered = visible.filter((badge) => {\n if (badge.variantOf !== undefined) {\n const parentVisible = visible.some((parent) => parent.id === badge.variantOf);\n if (!parentVisible) return false;\n return idFilter ? idFilter.includes(badge.variantOf) : true;\n }\n return idFilter ? idFilter.includes(badge.id) : true;\n });\n return filtered.filter((badge) => this.#isActive(badge, dmsObject)).sort(this.#byPriority);\n }\n\n /**\n * Returns globals merged with the named bucket. Bucket entries with the same id\n * override globals (the bucket entry replaces the global entry in place, preserving\n * the global's position). At equal priority, globals appear first.\n */\n #visibleScope(bucket?: string): Badge[] {\n const { main, buckets } = this.#store();\n if (bucket === undefined) return [...main];\n const local = buckets.get(bucket);\n if (!local || local.length === 0) return [...main];\n const localById = new Map(local.map((badge) => [badge.id, badge]));\n const merged: Badge[] = main.map((global) => localById.get(global.id) ?? global);\n const additions = local.filter((badge) => !main.some((global) => global.id === badge.id));\n return [...merged, ...additions];\n }\n\n readonly #byPriority = (first: Badge, second: Badge): number => (first.priority ?? 0) - (second.priority ?? 0);\n\n /**\n * Merges incoming badges into an existing list, replacing entries with the same id\n * in place and appending new ones at the end.\n */\n #mergeInto(existing: Badge[], incoming: Badge[]): Badge[] {\n const next = [...existing];\n for (const badge of incoming) {\n const idx = next.findIndex((current) => current.id === badge.id);\n if (idx === -1) next.push(badge);\n else next[idx] = badge;\n }\n return next;\n }\n\n /**\n * Evaluates whether a badge applies to the given object.\n *\n * A custom {@link Badge.applies} function has precedence over rule evaluation.\n * If neither applies nor rule is provided, the badge is considered inactive.\n */\n #isActive(badge: Badge, dmsObject: DmsObject): boolean {\n const ctx: BadgeContext = {\n currentUser: this.#currentUser,\n lockState: this.#objectLocking.getLockState(dmsObject)\n };\n if (badge.applies) return !!badge.applies(dmsObject, ctx);\n if (badge.rule) return evaluateRule(badge.rule, dmsObject);\n return false;\n }\n}\n","import { NgClass } from '@angular/common';\nimport { Component, Signal, computed, inject, input, output } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule, VirtualObjectType } from '@yuuvis/client-core';\nimport { Badge } from '../models';\nimport { BadgeRegistryService } from '../services/badge.service';\nimport { badgeSupportsType } from '../utils';\n\n@Component({\n selector: 'yuv-tile-badge-select',\n imports: [NgClass, MatIconModule, TranslateModule],\n templateUrl: './badge-select.component.html',\n styleUrls: ['./badge-select.component.scss']\n})\nexport class BadgeSelectComponent {\n readonly #registry = inject(BadgeRegistryService);\n\n selectedBadgeIds = input<string[]>([]);\n bucket = input<string | undefined>();\n /**\n * Type currently being configured. Badges that declare `supports` are only\n * offered for the types they support. Omitting it offers every badge.\n */\n objectType = input<VirtualObjectType | undefined>();\n badgeSelect = output<Badge>();\n\n readonly badges: Signal<Badge[]> = computed<Badge[]>(() => {\n const objectType = this.objectType();\n return this.#registry\n .getBadgesForBucket(this.bucket())()\n .filter((badge) => badge.variantOf === undefined && badgeSupportsType(badge, objectType));\n });\n}\n","<div class=\"badges\">\n @for (b of badges(); track b.id) {\n <button type=\"button\" [ngClass]=\"{ selected: selectedBadgeIds().includes(b.id) }\" (click)=\"badgeSelect.emit(b)\">\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 <span>{{ b.labelKey | translate }}</span>\n </button>\n } @empty {\n <span class=\"empty\">\n {{ 'yuv.badge.empty.selection' | translate }}\n </span>\n }\n</div>\n","import { Component, computed, inject, input } from '@angular/core';\nimport { DmsObject } from '@yuuvis/client-core';\nimport { BadgeChipComponent } from '../badge-chip/badge-chip.component';\nimport { Badge } from '../models/badge.models';\nimport { BadgeRegistryService } from '../services/badge.service';\n\n@Component({\n selector: 'yuv-tile-badges',\n imports: [BadgeChipComponent],\n templateUrl: './tile-badges.component.html',\n styleUrls: ['./tile-badges.component.scss']\n})\nexport class TileBadgesComponent {\n readonly #registry = inject(BadgeRegistryService);\n\n dmsObject = input.required<DmsObject>();\n badgeIds = input<string[] | undefined>();\n bucket = input<string | undefined>();\n\n readonly activeBadges = computed<Badge[]>(() =>\n this.#registry.getActiveBadges(this.dmsObject(), {\n bucket: this.bucket(),\n idFilter: this.badgeIds()\n })\n );\n}\n","@for (b of activeBadges(); track $index) {\n <yuv-badge-chip [badge]=\"b\" />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["marker","i2"],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-client-framework-badges.mjs","sources":["../../../../../libs/yuuvis/client-framework/badges/src/lib/default-badges/lock.badge.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/default-badges/retention.badge.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/utils/badge.utils.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/services/badge.service.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/badge-chip/badge-chip.component.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/badge-chip/badge-chip.component.html","../../../../../libs/yuuvis/client-framework/badges/src/lib/badge-select/badge-select.component.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/badge-select/badge-select.component.html","../../../../../libs/yuuvis/client-framework/badges/src/lib/tile-badges/tile-badges.component.ts","../../../../../libs/yuuvis/client-framework/badges/src/lib/tile-badges/tile-badges.component.html","../../../../../libs/yuuvis/client-framework/badges/src/yuuvis-client-framework-badges.ts"],"sourcesContent":["import { _ as marker } from '@ngx-translate/core';\nimport { map } from 'rxjs';\nimport { Badge } from '../models';\n\n/**\n * Badge shown when an object is locked by another user.\n */\nexport const LOCK_BADGE: Badge = {\n id: 'yuv.badge.lock',\n labelKey: marker('yuv.badge.lock.label'),\n descriptionKey: marker('yuv.badge.lock.description'),\n icon: 'lock',\n severity: 'danger',\n priority: 10,\n /**\n * Applies if a lock tag exists and the current user is not the lock owner.\n */\n applies: (_dmsObject, ctx) => !!ctx.lockState?.locked && !ctx.lockState.lockedByCurrentUser,\n /**\n * Resolves the lock owner (user id stored in the lock tag) to a display name.\n * Falls back to the raw id when the user cannot be resolved.\n */\n descriptionParams: (_dmsObject, ctx) => {\n const ownerId = ctx.lockState?.ownerId;\n if (!ownerId) return {};\n return ctx\n .resolveUser(ownerId)\n .pipe(map((user) => ({ user: user ? user.title || user.email || user.id : ownerId })));\n }\n};\n\n/**\n * Badge shown when an object is locked by the current user.\n */\nexport const LOCK_SELF_BADGE: Badge = {\n id: 'yuv.badge.lock.self',\n labelKey: marker('yuv.badge.lock.self.label'),\n descriptionKey: marker('yuv.badge.lock.self.description'),\n icon: 'lock_person',\n severity: 'success',\n priority: 10,\n variantOf: 'yuv.badge.lock',\n /**\n * Applies if a lock tag exists and the current user is the lock owner.\n */\n applies: (_dmsObject, ctx) => !!ctx.lockState?.locked && ctx.lockState.lockedByCurrentUser\n};\n","import { _ as marker } from '@ngx-translate/core';\nimport { BaseObjectTypeField, RetentionField, SystemSOT, SystemType } from '@yuuvis/client-core';\nimport { Badge } from '../models/badge.models';\n\n/**\n * Badge definition for DMS objects that are subject to a destruction retention policy.\n *\n * This badge is displayed when a DMS object has the `DESTRUCTION_RETENTION` secondary object type\n * assigned and an active or ongoing retention period. It helps users identify objects that are\n * legally or organizationally protected from deletion during their retention period.\n *\n * **Applies when:**\n * - The object includes the `SystemSOT.DESTRUCTION_RETENTION` secondary object type.\n * - A retention start date (`RetentionField.RETENTION_START`) is present.\n * - The retention period has started (start date is in the past), or an end date is set and\n * still lies in the future.\n *\n * @remarks\n * - `severity` is set to `'danger'` to visually emphasize the retention constraint.\n * - `priority` is `20`, which controls the display order relative to other badges.\n * - `supports` limits the badge to documents, so selection UIs such as the tile\n * config do not offer it for folder types. It only scopes configurability -\n * `applies` still governs rendering, so an object under retention keeps its\n * badge regardless.\n */ export const RETENTION_BADGE: Badge = {\n id: 'yuv.badge.retention',\n labelKey: marker('yuv.badge.retention.label'),\n descriptionKey: marker('yuv.badge.retention.description'),\n icon: 'gavel',\n severity: 'danger',\n priority: 20,\n supports: { types: [SystemType.DOCUMENT] },\n applies: (dmsObject) => {\n const sots = dmsObject.data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] as string[] | undefined;\n if (!sots?.includes(SystemSOT.DESTRUCTION_RETENTION)) return false;\n const startRetention = dmsObject.data[RetentionField.RETENTION_START] as string | undefined;\n if (!startRetention) return false;\n const now = new Date();\n const start = new Date(startRetention);\n const endRetention = dmsObject.data[RetentionField.RETENTION_END] as string | undefined;\n const end = endRetention ? new Date(endRetention) : null;\n return start < now || (end !== null && end > now);\n }\n};\n","import { BaseObjectTypeField, DmsObject, Utils, VirtualObjectType } from '@yuuvis/client-core';\nimport { Badge, BadgeRule } from '../models/badge.models';\n\n/**\n * Evaluates a single badge rule against a given DMS object.\n *\n * Supported operations:\n * - `isSet`: returns `true` when the field value is not `undefined`, `null`, or an empty string.\n * - `equals`: returns `true` when the field value strictly equals `rule.value`.\n * - `tagPresent`: returns `true` when the configured tags field contains a tag whose first element equals `rule.value`.\n *\n * @param rule Badge rule definition to evaluate.\n * @param dmsObject Source object containing field data.\n * @returns `true` if the rule matches; otherwise `false`.\n */\nexport function evaluateRule(rule: BadgeRule, dmsObject: DmsObject): boolean {\n switch (rule.op) {\n case 'isSet': {\n const value = dmsObject.data[rule.field];\n return value !== undefined && value !== null && value !== '';\n }\n case 'equals': {\n return dmsObject.data[rule.field] === rule.value;\n }\n case 'tagPresent': {\n const tagsField = rule.field || BaseObjectTypeField.TAGS;\n const tags = dmsObject.data[tagsField] as unknown[][] | undefined;\n return !!tags?.some((tag) => Array.isArray(tag) && tag[0] === rule.value);\n }\n default:\n return false;\n }\n}\n\n/**\n * Checks whether a badge may be configured for the given object type.\n *\n * A badge without {@link Badge.supports} is unrestricted and matches every\n * type. Otherwise the type's `objectType` and its `sots` are matched against\n * the badge's `types` / `sots` lists and its `pattern`; a single hit is enough.\n *\n * Called without an object type (no type context available) the badge is kept,\n * so callers that do not know the type never lose badges.\n *\n * @param badge Badge to check.\n * @param objectType Type the selection UI is currently configuring.\n * @returns `true` if the badge may be offered for that type; otherwise `false`.\n */\nexport function badgeSupportsType(badge: Badge, objectType?: VirtualObjectType): boolean {\n const supports = badge.supports;\n if (!supports) return true;\n if (!objectType) return true;\n\n const typeIds = [objectType.objectType, ...(objectType.sots ?? [])].filter((id): id is string => !!id);\n return typeIds.some(\n (id) =>\n !!supports.types?.includes(id) ||\n !!supports.sots?.includes(id) ||\n (!!supports.pattern && Utils.patternToRegExp(supports.pattern).test(id))\n );\n}\n","import { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { DmsObject, IdmService, ObjectLockingService, YUV_USER } from '@yuuvis/client-core';\nimport { LOCK_BADGE, LOCK_SELF_BADGE, RETENTION_BADGE } from '../default-badges';\nimport { Badge, BadgeContext } from '../models/badge.models';\nimport { evaluateRule } from '../utils';\n\ninterface StoredBadges {\n main: Badge[];\n buckets: Map<string, Badge[]>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class BadgeRegistryService {\n readonly #store = signal<StoredBadges>({ main: [], buckets: new Map() });\n readonly #currentUser = inject(YUV_USER, { optional: true }) ?? undefined;\n readonly #objectLocking = inject(ObjectLockingService);\n readonly #idm = inject(IdmService);\n\n /**\n * Registers one or multiple badges in the registry.\n *\n * If a badge with the same id already exists in the same scope, it is replaced.\n * Otherwise, the badge is added to the scope.\n *\n * @param badges An array of badges to register.\n * @param bucket Optional bucket id (typically an APP_ID). If omitted, badges are\n * registered globally and visible to every consumer. If provided,\n * badges are scoped to that bucket and only visible when consumers\n * query with the matching bucket.\n *\n * @see {@link Badge}\n */\n registerBadges(badges: Badge[], bucket?: string): void {\n this.#store.update((current) => {\n const next: StoredBadges = { main: current.main, buckets: new Map(current.buckets) };\n if (bucket === undefined) {\n next.main = this.#mergeInto(current.main, badges);\n } else {\n const existing = current.buckets.get(bucket) ?? [];\n next.buckets.set(bucket, this.#mergeInto(existing, badges));\n }\n return next;\n });\n }\n\n /**\n * Registers the default badges into the registry.\n *\n * Initializes three built-in badge types:\n * - LOCK_BADGE: Indicates objects locked by other users\n * - LOCK_SELF_BADGE: Indicates objects locked by the current user\n * - RETENTION_BADGE: Indicates objects under retention hold\n *\n * @param bucket Optional bucket id. If omitted, defaults are registered globally.\n *\n * @see {@link Badge}\n */\n registerDefaultBadges(bucket?: string): void {\n this.registerBadges([LOCK_BADGE, LOCK_SELF_BADGE, RETENTION_BADGE], bucket);\n }\n\n /**\n * Unregisters one or multiple badges from the registry by id.\n *\n * Operates only on the specified scope: omitting `bucket` removes from the global\n * scope only, providing `bucket` removes from that bucket only.\n *\n * @param id A single badge id or an array of badge ids to remove.\n * @param bucket Optional bucket id.\n */\n unregister(id: string | string[], bucket?: string): void {\n const ids = Array.isArray(id) ? id : [id];\n this.#store.update((current) => {\n const next: StoredBadges = { main: current.main, buckets: new Map(current.buckets) };\n if (bucket === undefined) {\n next.main = current.main.filter((badge) => !ids.includes(badge.id));\n } else {\n const existing = current.buckets.get(bucket);\n if (existing) {\n next.buckets.set(\n bucket,\n existing.filter((badge) => !ids.includes(badge.id))\n );\n }\n }\n return next;\n });\n }\n\n /**\n * Returns a registered badge by id.\n *\n * Looks first in the given bucket (if any), then in the global scope.\n *\n * @param id The badge id.\n * @param bucket Optional bucket id.\n * @returns The matching badge, or undefined if no badge is registered with that id.\n */\n get(id: string, bucket?: string): Badge | undefined {\n const { main, buckets } = this.#store();\n if (bucket !== undefined) {\n const local = buckets.get(bucket)?.find((badge) => badge.id === id);\n if (local) return local;\n }\n return main.find((badge) => badge.id === id);\n }\n\n /**\n * Returns all registered badges across the global scope and every bucket.\n *\n * Bucket entries override globals with the same id; remaining duplicates between\n * buckets keep the first occurrence. Useful for tests and debug inspection.\n */\n all(): Badge[] {\n const { main, buckets } = this.#store();\n const byId = new Map<string, Badge>();\n for (const badge of main) byId.set(badge.id, badge);\n for (const list of buckets.values()) {\n for (const badge of list) byId.set(badge.id, badge);\n }\n return Array.from(byId.values());\n }\n\n /**\n * Returns a reactive list of badges visible in the given scope.\n *\n * The returned signal recomputes whenever the registry changes. The list contains\n * the global badges merged with the named bucket's badges (bucket entries override\n * globals with the same id), sorted by ascending priority. At equal priority,\n * globals come first, then bucket-local badges.\n *\n * @param bucket Optional bucket id.\n */\n getBadgesForBucket(bucket?: string): Signal<Badge[]> {\n return computed(() => this.#visibleScope(bucket).sort(this.#byPriority));\n }\n\n /**\n * Resolves all active badges for a given object in the given scope.\n *\n * The visible scope is `main ∪ bucket`. Variants only resolve when their parent id\n * is present in the visible scope. If `idFilter` is provided, only badges whose id\n * (or whose variant's parent id) is in the filter are considered. The resulting\n * list is sorted by ascending priority.\n *\n * @param dmsObject The object to evaluate badges against.\n * @param options Optional bucket and id filter.\n */\n getActiveBadges(dmsObject: DmsObject, options?: { bucket?: string; idFilter?: string[] }): Badge[] {\n const visible = this.#visibleScope(options?.bucket);\n const idFilter = options?.idFilter;\n const filtered = visible.filter((badge) => {\n if (badge.variantOf !== undefined) {\n const parentVisible = visible.some((parent) => parent.id === badge.variantOf);\n if (!parentVisible) return false;\n return idFilter ? idFilter.includes(badge.variantOf) : true;\n }\n return idFilter ? idFilter.includes(badge.id) : true;\n });\n return filtered.filter((badge) => this.#isActive(badge, dmsObject)).sort(this.#byPriority);\n }\n\n /**\n * Builds the evaluation context for a badge against the given object. Used both\n * for `applies` evaluation and for resolving {@link Badge.descriptionParams}.\n */\n createContext(dmsObject: DmsObject): BadgeContext {\n return {\n currentUser: this.#currentUser,\n lockState: this.#objectLocking.getLockState(dmsObject),\n resolveUser: (userId) => this.#idm.getUserById(userId)\n };\n }\n\n /**\n * Returns globals merged with the named bucket. Bucket entries with the same id\n * override globals (the bucket entry replaces the global entry in place, preserving\n * the global's position). At equal priority, globals appear first.\n */\n #visibleScope(bucket?: string): Badge[] {\n const { main, buckets } = this.#store();\n if (bucket === undefined) return [...main];\n const local = buckets.get(bucket);\n if (!local || local.length === 0) return [...main];\n const localById = new Map(local.map((badge) => [badge.id, badge]));\n const merged: Badge[] = main.map((global) => localById.get(global.id) ?? global);\n const additions = local.filter((badge) => !main.some((global) => global.id === badge.id));\n return [...merged, ...additions];\n }\n\n readonly #byPriority = (first: Badge, second: Badge): number => (first.priority ?? 0) - (second.priority ?? 0);\n\n /**\n * Merges incoming badges into an existing list, replacing entries with the same id\n * in place and appending new ones at the end.\n */\n #mergeInto(existing: Badge[], incoming: Badge[]): Badge[] {\n const next = [...existing];\n for (const badge of incoming) {\n const idx = next.findIndex((current) => current.id === badge.id);\n if (idx === -1) next.push(badge);\n else next[idx] = badge;\n }\n return next;\n }\n\n /**\n * Evaluates whether a badge applies to the given object.\n *\n * A custom {@link Badge.applies} function has precedence over rule evaluation.\n * If neither applies nor rule is provided, the badge is considered inactive.\n */\n #isActive(badge: Badge, dmsObject: DmsObject): boolean {\n const ctx = this.createContext(dmsObject);\n if (badge.applies) return !!badge.applies(dmsObject, ctx);\n if (badge.rule) return evaluateRule(badge.rule, dmsObject);\n return false;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { DmsObject, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { YmtBadge } from '@yuuvis/material/badge';\nimport { combineLatest, isObservable, map, Observable, of, startWith, switchMap } from 'rxjs';\nimport { Badge, BadgeDescriptionParams } from '../models';\nimport { BadgeRegistryService } from '../services/badge.service';\n\n@Component({\n selector: 'yuv-badge-chip',\n imports: [MatIconModule, MatTooltipModule, YmtBadge, TranslatePipe],\n templateUrl: './badge-chip.component.html',\n styleUrls: ['./badge-chip.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class BadgeChipComponent {\n readonly #translate = inject(TranslateService);\n readonly #registry = inject(BadgeRegistryService);\n\n badge = input.required<Badge>();\n showLabel = input<boolean>(false);\n /**\n * The object the badge is shown for. Required to resolve {@link Badge.descriptionParams}\n * (e.g. the name of the user holding a lock); without it the description renders as-is.\n */\n dmsObject = input<DmsObject | undefined>();\n\n /**\n * Translated tooltip. Uses `descriptionKey` (interpolated with the badge's resolved\n * `descriptionParams`) and falls back to `labelKey` when no description is available.\n * While async params are pending, the description is shown without them.\n */\n readonly tooltip = toSignal(\n combineLatest([toObservable(this.badge), toObservable(this.dmsObject)]).pipe(\n switchMap(([badge, dmsObject]) =>\n this.#resolveParams(badge, dmsObject).pipe(map((params) => this.#translateTooltip(badge, params)))\n )\n ),\n { initialValue: '' }\n );\n\n /**\n * Accessible name for the icon-only variant. Without a label the chip renders nothing\n * but an inert icon, so assistive technology has no name to announce — the tooltip is\n * a description, not a name, and it is mouse-only anyway. When the label is visible it\n * already names the chip, so no override is set.\n */\n readonly ariaLabel = computed<string | null>(() =>\n this.showLabel() ? null : this.#translate.instant(this.badge().labelKey)\n );\n\n #resolveParams(badge: Badge, dmsObject: DmsObject | undefined): Observable<BadgeDescriptionParams> {\n if (!badge.descriptionParams || !dmsObject) return of({});\n const params = badge.descriptionParams(dmsObject, this.#registry.createContext(dmsObject));\n return isObservable(params) ? params.pipe(startWith({})) : of(params);\n }\n\n #translateTooltip(badge: Badge, params: BadgeDescriptionParams): string {\n const tooltip = this.#translate.instant(badge.descriptionKey ?? badge.labelKey, params);\n return typeof tooltip === 'string' && tooltip.toLocaleLowerCase().startsWith('!missing key:')\n ? this.#translate.instant(badge.labelKey)\n : tooltip;\n }\n}\n","@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","import { NgClass } from '@angular/common';\nimport { Component, Signal, computed, inject, input, output } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TranslateModule, VirtualObjectType } from '@yuuvis/client-core';\nimport { Badge } from '../models';\nimport { BadgeRegistryService } from '../services/badge.service';\nimport { badgeSupportsType } from '../utils';\n\n@Component({\n selector: 'yuv-tile-badge-select',\n imports: [NgClass, MatIconModule, TranslateModule],\n templateUrl: './badge-select.component.html',\n styleUrls: ['./badge-select.component.scss']\n})\nexport class BadgeSelectComponent {\n readonly #registry = inject(BadgeRegistryService);\n\n selectedBadgeIds = input<string[]>([]);\n bucket = input<string | undefined>();\n /**\n * Type currently being configured. Badges that declare `supports` are only\n * offered for the types they support. Omitting it offers every badge.\n */\n objectType = input<VirtualObjectType | undefined>();\n badgeSelect = output<Badge>();\n\n readonly badges: Signal<Badge[]> = computed<Badge[]>(() => {\n const objectType = this.objectType();\n return this.#registry\n .getBadgesForBucket(this.bucket())()\n .filter((badge) => badge.variantOf === undefined && badgeSupportsType(badge, objectType));\n });\n}\n","<div class=\"badges\">\n @for (b of badges(); track b.id) {\n <button type=\"button\" [ngClass]=\"{ selected: selectedBadgeIds().includes(b.id) }\" (click)=\"badgeSelect.emit(b)\">\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 <span>{{ b.labelKey | translate }}</span>\n </button>\n } @empty {\n <span class=\"empty\">\n {{ 'yuv.badge.empty.selection' | translate }}\n </span>\n }\n</div>\n","import { Component, computed, inject, input } from '@angular/core';\nimport { DmsObject } from '@yuuvis/client-core';\nimport { BadgeChipComponent } from '../badge-chip/badge-chip.component';\nimport { Badge } from '../models/badge.models';\nimport { BadgeRegistryService } from '../services/badge.service';\n\n@Component({\n selector: 'yuv-tile-badges',\n imports: [BadgeChipComponent],\n templateUrl: './tile-badges.component.html',\n styleUrls: ['./tile-badges.component.scss']\n})\nexport class TileBadgesComponent {\n readonly #registry = inject(BadgeRegistryService);\n\n dmsObject = input.required<DmsObject>();\n badgeIds = input<string[] | undefined>();\n bucket = input<string | undefined>();\n\n readonly activeBadges = computed<Badge[]>(() =>\n this.#registry.getActiveBadges(this.dmsObject(), {\n bucket: this.bucket(),\n idFilter: this.badgeIds()\n })\n );\n}\n","@for (b of activeBadges(); track $index) {\n <yuv-badge-chip [badge]=\"b\" [dmsObject]=\"dmsObject()\" />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["marker","i2"],"mappings":"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"}
@@ -3,7 +3,7 @@ import { inject, signal, Injectable, input, linkedSignal, computed, effect, untr
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { DmsService, UserService, ObjectLockingService, ContentStreamField, EventService, YuvEventType, TranslatePipe } from '@yuuvis/client-core';
5
5
  import { MediaViewerService, defaultViewers, DASHLET_MESSAGE_EVENTS, YuvMediaViewerComponent, MailComponent } from '@yuuvis/media-viewer';
6
- import { tap as tap$1 } from 'rxjs';
6
+ import { tap as tap$1, map, filter, switchMap, EMPTY } from 'rxjs';
7
7
  import { tap } from 'rxjs/operators';
8
8
 
9
9
  /* eslint-disable id-length */
@@ -49,8 +49,12 @@ class ObjectPreviewService {
49
49
  ? `/api/dms/objects/${id}/versions/${version}/contents/renditions/slide?timeout=50000`
50
50
  : `/api/dms/objects/${id}/versions/${version}/contents/file`;
51
51
  }
52
- const base = mimeType === 'image/tiff' ? `/api/dms/objects/${id}/contents/renditions/slide` : `/api/dms/objects/${id}/contents/file`;
53
- return contentStreamId ? `${base}${base.includes('?') ? '&' : '?'}_cs=${encodeURIComponent(contentStreamId)}` : base;
52
+ const base = mimeType === 'image/tiff'
53
+ ? `/api/dms/objects/${id}/contents/renditions/slide`
54
+ : `/api/dms/objects/${id}/contents/file`;
55
+ return contentStreamId
56
+ ? `${base}${base.includes('?') ? '&' : '?'}_cs=${encodeURIComponent(contentStreamId)}`
57
+ : base;
54
58
  }
55
59
  getEmailViewerDetails(object, version, MAIL_APP_ID = 'appSystemmail:') {
56
60
  return {
@@ -167,51 +171,30 @@ class ObjectPreviewComponent {
167
171
  });
168
172
  }, ...(ngDevMode ? [{ debugName: "#objectIdEffect" }] : /* istanbul ignore next */ []));
169
173
  this.#event
170
- .on(DASHLET_MESSAGE_EVENTS.OFFICE_DOCUMENT_UPDATE) //, DASHLET_MESSAGE_EVENTS.OFFICE_DOCUMENT_CONVERTED)
171
- .pipe(takeUntilDestroyed(),
172
- // delay(2000),
173
- // tap((e) => console.log({ e })),
174
- tap$1(() => this.#event.trigger(YuvEventType.DMS_OBJECT_CONTENT_UPDATED, { externalUpdate: true })))
174
+ .on(DASHLET_MESSAGE_EVENTS.OFFICE_DOCUMENT_UPDATE)
175
+ .pipe(takeUntilDestroyed(), tap$1(() => this.#event.trigger(YuvEventType.DMS_OBJECT_CONTENT_UPDATED, { externalUpdate: true })))
176
+ .subscribe();
177
+ // A conversion produces new content (new content stream, usually a new mime type): reload the DMS object so
178
+ // the viewer details are rebuilt for the converted file.
179
+ this.#event
180
+ .on(DASHLET_MESSAGE_EVENTS.OFFICE_DOCUMENT_CONVERTED)
181
+ .pipe(takeUntilDestroyed(), map((event) => event.data?.objectId ?? null),
182
+ // several previews may share the page — only reload the object shown here
183
+ filter((objectId) => !objectId || objectId === this.#currentObjectId()), switchMap(() => {
184
+ const id = this.#currentObjectId();
185
+ return id ? this.#objectPreviewService.getDmsObject(id) : EMPTY;
186
+ }), tap$1(() => this.#event.trigger(YuvEventType.DMS_OBJECT_CONTENT_UPDATED, { externalUpdate: true })))
175
187
  .subscribe();
176
188
  }
177
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: ObjectPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
178
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: ObjectPreviewComponent, isStandalone: true, selector: "yuv-object-preview", inputs: { objectId: { classPropertyName: "objectId", publicName: "objectId", isSignal: true, isRequired: false, transformFunction: null }, dmsObjectInput: { classPropertyName: "dmsObjectInput", publicName: "dmsObject", isSignal: true, isRequired: false, transformFunction: null }, version: { classPropertyName: "version", publicName: "version", isSignal: true, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
179
- @let viewerDetailsObj = viewerDetails();
180
- @if (viewerDetailsObj) {
181
- <yuv-media-viewer
182
- class="viewer"
183
- [id]="viewerDetailsObj.id"
184
- [type]="viewerDetailsObj.mimeType"
185
- [src]="viewerDetailsObj.mediaViewerSrc ?? null"
186
- [metadata]="viewerDetailsObj.metadata"
187
- />
188
- }
189
- @if (isTiff()) {
190
- <div class="tiff-warning">
191
- <div class="tiff-warning-text">{{ 'yuv.object-preview.tiff-warning' | translate }}</div>
192
- </div>
189
+ #currentObjectId() {
190
+ return this.dmsObject()?.id ?? this.objectId();
193
191
  }
194
- `, isInline: true, styles: [":host{--media-viewer-background-color: transparent;height:100%;overflow:hidden;display:grid;grid-auto-columns:1fr;grid-auto-rows:1fr;grid-template-columns:1fr;grid-template-rows:1fr max-content;gap:0px 0px;grid-template-areas:\"viewer\" \"message\"}.viewer{grid-area:viewer;background-color:var(--media-viewer-background-color)}.tiff-warning{grid-area:message;text-align:center;padding:var(--ymt-spacing-xs) 0;&-text{margin:var(--ymt-spacing-m)}}\n"], dependencies: [{ kind: "component", type: YuvMediaViewerComponent, selector: "yuv-media-viewer", inputs: ["id", "type", "metadata", "src"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
192
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: ObjectPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
193
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.20", type: ObjectPreviewComponent, isStandalone: true, selector: "yuv-object-preview", inputs: { objectId: { classPropertyName: "objectId", publicName: "objectId", isSignal: true, isRequired: false, transformFunction: null }, dmsObjectInput: { classPropertyName: "dmsObjectInput", publicName: "dmsObject", isSignal: true, isRequired: false, transformFunction: null }, version: { classPropertyName: "version", publicName: "version", isSignal: true, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@let viewerDetailsObj = viewerDetails();\n@if (viewerDetailsObj) {\n <yuv-media-viewer\n class=\"viewer\"\n [id]=\"viewerDetailsObj.id\"\n [type]=\"viewerDetailsObj.mimeType\"\n [src]=\"viewerDetailsObj.mediaViewerSrc ?? null\"\n [metadata]=\"viewerDetailsObj.metadata\"\n />\n}\n@if (isTiff()) {\n <div class=\"tiff-warning\">\n <div class=\"tiff-warning-text\">{{ 'yuv.object-preview.tiff-warning' | translate }}</div>\n </div>\n}\n", styles: [":host{--media-viewer-background-color: transparent;height:100%;overflow:hidden;display:grid;grid-auto-columns:1fr;grid-auto-rows:1fr;grid-template-columns:1fr;grid-template-rows:1fr max-content;gap:0px 0px;grid-template-areas:\"viewer\" \"message\"}.viewer{grid-area:viewer;background-color:var(--media-viewer-background-color)}.viewer ::ng-deep pdf-paging-area{display:flex;align-items:center}.viewer ::ng-deep pdf-paging-area .paging-right,.viewer ::ng-deep pdf-paging-area .paging-left{display:flex;align-items:center}.viewer ::ng-deep pdf-zoom-toolbar div{display:flex;align-items:center}.tiff-warning{grid-area:message;text-align:center;padding:var(--ymt-spacing-xs) 0}.tiff-warning-text{margin:var(--ymt-spacing-m)}\n"], dependencies: [{ kind: "component", type: YuvMediaViewerComponent, selector: "yuv-media-viewer", inputs: ["id", "type", "metadata", "src"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
195
194
  }
196
195
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.20", ngImport: i0, type: ObjectPreviewComponent, decorators: [{
197
196
  type: Component,
198
- args: [{ selector: 'yuv-object-preview', standalone: true, imports: [YuvMediaViewerComponent, TranslatePipe], template: `
199
- @let viewerDetailsObj = viewerDetails();
200
- @if (viewerDetailsObj) {
201
- <yuv-media-viewer
202
- class="viewer"
203
- [id]="viewerDetailsObj.id"
204
- [type]="viewerDetailsObj.mimeType"
205
- [src]="viewerDetailsObj.mediaViewerSrc ?? null"
206
- [metadata]="viewerDetailsObj.metadata"
207
- />
208
- }
209
- @if (isTiff()) {
210
- <div class="tiff-warning">
211
- <div class="tiff-warning-text">{{ 'yuv.object-preview.tiff-warning' | translate }}</div>
212
- </div>
213
- }
214
- `, styles: [":host{--media-viewer-background-color: transparent;height:100%;overflow:hidden;display:grid;grid-auto-columns:1fr;grid-auto-rows:1fr;grid-template-columns:1fr;grid-template-rows:1fr max-content;gap:0px 0px;grid-template-areas:\"viewer\" \"message\"}.viewer{grid-area:viewer;background-color:var(--media-viewer-background-color)}.tiff-warning{grid-area:message;text-align:center;padding:var(--ymt-spacing-xs) 0;&-text{margin:var(--ymt-spacing-m)}}\n"] }]
197
+ args: [{ selector: 'yuv-object-preview', standalone: true, imports: [YuvMediaViewerComponent, TranslatePipe], template: "@let viewerDetailsObj = viewerDetails();\n@if (viewerDetailsObj) {\n <yuv-media-viewer\n class=\"viewer\"\n [id]=\"viewerDetailsObj.id\"\n [type]=\"viewerDetailsObj.mimeType\"\n [src]=\"viewerDetailsObj.mediaViewerSrc ?? null\"\n [metadata]=\"viewerDetailsObj.metadata\"\n />\n}\n@if (isTiff()) {\n <div class=\"tiff-warning\">\n <div class=\"tiff-warning-text\">{{ 'yuv.object-preview.tiff-warning' | translate }}</div>\n </div>\n}\n", styles: [":host{--media-viewer-background-color: transparent;height:100%;overflow:hidden;display:grid;grid-auto-columns:1fr;grid-auto-rows:1fr;grid-template-columns:1fr;grid-template-rows:1fr max-content;gap:0px 0px;grid-template-areas:\"viewer\" \"message\"}.viewer{grid-area:viewer;background-color:var(--media-viewer-background-color)}.viewer ::ng-deep pdf-paging-area{display:flex;align-items:center}.viewer ::ng-deep pdf-paging-area .paging-right,.viewer ::ng-deep pdf-paging-area .paging-left{display:flex;align-items:center}.viewer ::ng-deep pdf-zoom-toolbar div{display:flex;align-items:center}.tiff-warning{grid-area:message;text-align:center;padding:var(--ymt-spacing-xs) 0}.tiff-warning-text{margin:var(--ymt-spacing-m)}\n"] }]
215
198
  }], ctorParameters: () => [], propDecorators: { objectId: [{ type: i0.Input, args: [{ isSignal: true, alias: "objectId", required: false }] }], dmsObjectInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "dmsObject", required: false }] }], version: [{ type: i0.Input, args: [{ isSignal: true, alias: "version", required: false }] }], metadata: [{ type: i0.Input, args: [{ isSignal: true, alias: "metadata", required: false }] }] } });
216
199
 
217
200
  class ObjectEmailPreviewComponent {
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-client-framework-object-preview.mjs","sources":["../../../../../libs/yuuvis/client-framework/object-preview/src/lib/services/object-preview.service.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/lib/components/object-preview/object-preview.component.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/lib/components/object-email-preview/object-email-preview.component.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/yuuvis-client-framework-object-preview.ts"],"sourcesContent":["/* eslint-disable id-length */\nimport { inject, Injectable, signal } from '@angular/core';\nimport { ContentStreamField, DmsObject, DmsService, ObjectLockingService, UserService } from '@yuuvis/client-core';\nimport { defaultViewers, EmailMetadata, MediaViewerService } from '@yuuvis/media-viewer';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { ViewerDataDefault, ViewerDataEmail } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ObjectPreviewService {\n readonly #dms = inject(DmsService);\n readonly #userService = inject(UserService);\n readonly #mediaViewerService = inject(MediaViewerService);\n readonly #objectLockingService = inject(ObjectLockingService);\n\n #dmsObject = signal<DmsObject | undefined>(undefined);\n\n dmsObject = this.#dmsObject.asReadonly();\n\n setDmsObject(object: DmsObject): void {\n this.#dmsObject.set(object);\n }\n\n getDmsObject(id: string): Observable<DmsObject> {\n return this.#dms.getDmsObject(id).pipe(tap((dmsObject) => this.#dmsObject.set(dmsObject)));\n }\n\n /**\n * Builds the media viewer source URL for an object's content.\n *\n * The URL of the *current* version is keyed on the content stream (`_cs=<contentStreamId>`) when one is\n * given. The viewers only reload when their `src` input is a *different string*: `DynamicViewerDirective`\n * `setInput`s the same viewer instance for a same-type update, `PdfComponent` skips `#loadPDF` for a src\n * it has already loaded and `ImageComponent` derives its cache-busting URL from `src()` alone. Without\n * the key a content replacement that keeps the mime type kept showing the previous file (the object id,\n * and therefore the URL, never changed). `ObjectPreviewComponent` rebuilds the details exactly when the\n * content stream changes, so the key changes exactly then — never on metadata-only saves.\n *\n * Versioned URLs (`/versions/{n}/…`) address immutable content and are returned unchanged.\n */\n getMediaViewerSrc(id: string, mimeType: string | undefined, version?: number, contentStreamId?: string): string {\n if (!mimeType) {\n return '';\n }\n if (version) {\n return mimeType === 'image/tiff'\n ? `/api/dms/objects/${id}/versions/${version}/contents/renditions/slide?timeout=50000`\n : `/api/dms/objects/${id}/versions/${version}/contents/file`;\n }\n const base = mimeType === 'image/tiff' ? `/api/dms/objects/${id}/contents/renditions/slide` : `/api/dms/objects/${id}/contents/file`;\n return contentStreamId ? `${base}${base.includes('?') ? '&' : '?'}_cs=${encodeURIComponent(contentStreamId)}` : base;\n }\n\n getEmailViewerDetails(object: DmsObject, version?: number, MAIL_APP_ID = 'appSystemmail:'): ViewerDataEmail {\n return {\n mediaViewerSrc: this.getMediaViewerSrc(object.id, object.content?.mimeType, version, object.content?.contentStreamId),\n id: object.id,\n mimeType: object.content?.mimeType,\n metadata: this.getEmailMetadata(object, MAIL_APP_ID)\n };\n }\n\n getEmailMetadata(object: DmsObject, MAIL_APP_ID = 'appSystemmail:'): EmailMetadata {\n return {\n type: 'EMAIL',\n header: {\n subject: object.data[`${MAIL_APP_ID}subject`] as string,\n sent: new Date(object.data[`${MAIL_APP_ID}sent`] as string),\n from: object.data[`${MAIL_APP_ID}from`] as string,\n to: object.data[`${MAIL_APP_ID}to`] as string[],\n cc: object.data[`${MAIL_APP_ID}cc`] as string[],\n bcc: object.data[`${MAIL_APP_ID}bcc`] as string[]\n },\n theme: 'light',\n attachments: object.data[`${MAIL_APP_ID}attachments`] as string[]\n };\n }\n\n getViewerDetails(object: DmsObject, version: number | undefined): ViewerDataEmail | ViewerDataDefault | undefined {\n if (object) {\n const type = object?.content && this.#mediaViewerService.getComponentType(object.content.mimeType);\n\n return this.#isEmailViewer(object)\n ? this.getEmailViewerDetails(object, version)\n : {\n mediaViewerSrc: this.getMediaViewerSrc(object.id, object.content?.mimeType, version, object.content?.contentStreamId),\n id: object.id,\n mimeType: object.content?.mimeType,\n metadata: {\n type,\n name: object.data[ContentStreamField.FILENAME] as string,\n dmsObject: object?.data,\n id: object?.id,\n editable: this.#isEditable(object),\n user: this.#userService.getCurrentUser(),\n theme: 'light',\n version,\n sendEvent:\n !!(\n object.content?.mimeType &&\n defaultViewers\n .filter((viewer) => viewer.type === 'OFFICE')\n .map((viewer) => viewer.mimeType.includes(object.content?.mimeType || '')).length\n ) || false\n }\n };\n }\n return undefined;\n }\n\n #isEditable(object: DmsObject): boolean {\n const state = this.#objectLockingService.getLockState(object);\n return state ? !state.locked || state.lockedByCurrentUser : true;\n }\n\n #isEmailViewer(object: DmsObject): boolean {\n return defaultViewers\n .filter((viewer) => viewer.type === 'EMAIL')[0]\n .mimeType.includes(object.data[ContentStreamField.MIME_TYPE] as string);\n }\n}\n","import { Component, computed, effect, inject, input, linkedSignal, untracked, WritableSignal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DmsObject, EventService, TranslatePipe, YuvEventType } from '@yuuvis/client-core';\nimport { DASHLET_MESSAGE_EVENTS, Metadata, YuvMediaViewerComponent } from '@yuuvis/media-viewer';\nimport { tap } from 'rxjs';\nimport { ObjectPreviewService } from '../../services/object-preview.service';\n\ninterface ViewerDetails {\n id: string;\n mimeType: string | undefined;\n mediaViewerSrc: string | undefined;\n metadata: Partial<Metadata>;\n}\n\n@Component({\n selector: 'yuv-object-preview',\n standalone: true,\n imports: [YuvMediaViewerComponent, TranslatePipe],\n template: `\n @let viewerDetailsObj = viewerDetails();\n @if (viewerDetailsObj) {\n <yuv-media-viewer\n class=\"viewer\"\n [id]=\"viewerDetailsObj.id\"\n [type]=\"viewerDetailsObj.mimeType\"\n [src]=\"viewerDetailsObj.mediaViewerSrc ?? null\"\n [metadata]=\"viewerDetailsObj.metadata\"\n />\n }\n @if (isTiff()) {\n <div class=\"tiff-warning\">\n <div class=\"tiff-warning-text\">{{ 'yuv.object-preview.tiff-warning' | translate }}</div>\n </div>\n }\n `,\n styles: [\n `\n :host {\n --media-viewer-background-color: transparent;\n height: 100%;\n overflow: hidden;\n display: grid;\n grid-auto-columns: 1fr;\n grid-auto-rows: 1fr;\n grid-template-columns: 1fr;\n grid-template-rows: 1fr max-content;\n gap: 0px 0px;\n grid-template-areas:\n 'viewer'\n 'message';\n }\n .viewer {\n grid-area: viewer;\n background-color: var(--media-viewer-background-color);\n ::ng-deep {\n pdf-paging-area {\n display: flex;\n align-items: center;\n\n .paging-right,\n .paging-left {\n display: flex;\n align-items: center;\n }\n }\n pdf-zoom-toolbar {\n div {\n display: flex;\n align-items: center;\n }\n }\n }\n }\n .tiff-warning {\n grid-area: message;\n text-align: center;\n padding: var(--ymt-spacing-xs) 0;\n\n &-text {\n margin: var(--ymt-spacing-m);\n }\n }\n `\n ]\n})\nexport class ObjectPreviewComponent {\n readonly #objectPreviewService = inject(ObjectPreviewService);\n readonly #event = inject(EventService);\n\n objectId = input<string | undefined>(undefined);\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n version = input<number | undefined>(undefined);\n dmsObject = this.#objectPreviewService.dmsObject;\n\n metadata = input<Partial<Metadata>>({});\n\n viewerDetails: WritableSignal<ViewerDetails | null> = linkedSignal({\n source: () => ({ object: this.dmsObject(), version: this.version(), metadata: this.metadata() }),\n computation: (source, previous): ViewerDetails | null => {\n const object = Array.isArray(source.object) ? source.object[0] : source.object;\n if (!object) {\n return null;\n }\n\n const prevSource = previous?.source;\n const prevObject = Array.isArray(prevSource?.object) ? prevSource?.object[0] : prevSource?.object;\n\n const contentChanged =\n !previous ||\n object.id !== prevObject?.id ||\n object.content?.contentStreamId !== prevObject?.content?.contentStreamId ||\n source.version !== prevSource?.version;\n\n if (contentChanged) {\n const details = this.#objectPreviewService.getViewerDetails(object, source.version);\n return details\n ? { ...details, metadata: { ...details.metadata, ...source.metadata } as Partial<Metadata> }\n : null;\n }\n\n return previous?.value\n ? ({ ...previous.value, metadata: { ...previous.value.metadata, ...source.metadata } } as ViewerDetails)\n : null;\n }\n });\n\n isTiff = computed(() => this.dmsObject()?.content?.mimeType === 'image/tiff');\n\n #objectIdEffect = effect(() => {\n const objectId = this.objectId();\n const dmsObject = this.dmsObjectInput();\n untracked(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n dmsObject && this.#objectPreviewService.setDmsObject(dmsObject);\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n objectId && !dmsObject && this.#objectPreviewService.getDmsObject(objectId).subscribe();\n });\n });\n\n constructor() {\n this.#event\n .on(DASHLET_MESSAGE_EVENTS.OFFICE_DOCUMENT_UPDATE) //, DASHLET_MESSAGE_EVENTS.OFFICE_DOCUMENT_CONVERTED)\n .pipe(\n takeUntilDestroyed(),\n // delay(2000),\n // tap((e) => console.log({ e })),\n tap(() => this.#event.trigger(YuvEventType.DMS_OBJECT_CONTENT_UPDATED, { externalUpdate: true }))\n )\n .subscribe();\n }\n}\n","import { Component, computed, effect, inject, input, untracked } from '@angular/core';\nimport { DmsObject } from '@yuuvis/client-core';\nimport { MailComponent } from '@yuuvis/media-viewer';\nimport { ObjectPreviewService } from '../../services/object-preview.service';\n\n@Component({\n selector: 'yuv-object-email-preview',\n standalone: true,\n imports: [MailComponent],\n template: `\n @let viewerDetailsObj = viewerDetails();\n @if (viewerDetailsObj) {\n <yuv-mail [id]=\"viewerDetailsObj.id\" [src]=\"viewerDetailsObj.mediaViewerSrc\" [metadata]=\"viewerDetailsObj.metadata\"></yuv-mail>\n }\n `,\n styles: `\n :host {\n height: 100%;\n }\n `\n})\nexport class ObjectEmailPreviewComponent {\n #objectPreviwService = inject(ObjectPreviewService);\n\n objectId = input<string | undefined>(undefined);\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n dmsObject = this.#objectPreviwService.dmsObject;\n\n #objectIdEffect = effect(() => {\n const objectId = this.objectId();\n const dmsObject = this.dmsObjectInput();\n\n untracked(() => {\n dmsObject && this.#objectPreviwService.setDmsObject(dmsObject);\n if (objectId && !dmsObject) {\n this.#objectPreviwService.getDmsObject(objectId).subscribe();\n }\n });\n });\n\n viewerDetails = computed(() => {\n const object = this.dmsObject();\n return object ? this.#objectPreviwService.getEmailViewerDetails(object) : undefined;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tap"],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-client-framework-object-preview.mjs","sources":["../../../../../libs/yuuvis/client-framework/object-preview/src/lib/services/object-preview.service.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/lib/components/object-preview/object-preview.component.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/lib/components/object-preview/object-preview.component.html","../../../../../libs/yuuvis/client-framework/object-preview/src/lib/components/object-email-preview/object-email-preview.component.ts","../../../../../libs/yuuvis/client-framework/object-preview/src/yuuvis-client-framework-object-preview.ts"],"sourcesContent":["/* eslint-disable id-length */\nimport { inject, Injectable, signal } from '@angular/core';\nimport { ContentStreamField, DmsObject, DmsService, ObjectLockingService, UserService } from '@yuuvis/client-core';\nimport { defaultViewers, EmailMetadata, MediaViewerService } from '@yuuvis/media-viewer';\nimport { Observable } from 'rxjs';\nimport { tap } from 'rxjs/operators';\nimport { ViewerDataDefault, ViewerDataEmail } from '../models';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ObjectPreviewService {\n readonly #dms = inject(DmsService);\n readonly #userService = inject(UserService);\n readonly #mediaViewerService = inject(MediaViewerService);\n readonly #objectLockingService = inject(ObjectLockingService);\n\n #dmsObject = signal<DmsObject | undefined>(undefined);\n\n dmsObject = this.#dmsObject.asReadonly();\n\n setDmsObject(object: DmsObject): void {\n this.#dmsObject.set(object);\n }\n\n getDmsObject(id: string): Observable<DmsObject> {\n return this.#dms.getDmsObject(id).pipe(tap((dmsObject) => this.#dmsObject.set(dmsObject)));\n }\n\n /**\n * Builds the media viewer source URL for an object's content.\n *\n * The URL of the *current* version is keyed on the content stream (`_cs=<contentStreamId>`) when one is\n * given. The viewers only reload when their `src` input is a *different string*: `DynamicViewerDirective`\n * `setInput`s the same viewer instance for a same-type update, `PdfComponent` skips `#loadPDF` for a src\n * it has already loaded and `ImageComponent` derives its cache-busting URL from `src()` alone. Without\n * the key a content replacement that keeps the mime type kept showing the previous file (the object id,\n * and therefore the URL, never changed). `ObjectPreviewComponent` rebuilds the details exactly when the\n * content stream changes, so the key changes exactly then — never on metadata-only saves.\n *\n * Versioned URLs (`/versions/{n}/…`) address immutable content and are returned unchanged.\n */\n getMediaViewerSrc(id: string, mimeType: string | undefined, version?: number, contentStreamId?: string): string {\n if (!mimeType) {\n return '';\n }\n if (version) {\n return mimeType === 'image/tiff'\n ? `/api/dms/objects/${id}/versions/${version}/contents/renditions/slide?timeout=50000`\n : `/api/dms/objects/${id}/versions/${version}/contents/file`;\n }\n const base =\n mimeType === 'image/tiff'\n ? `/api/dms/objects/${id}/contents/renditions/slide`\n : `/api/dms/objects/${id}/contents/file`;\n return contentStreamId\n ? `${base}${base.includes('?') ? '&' : '?'}_cs=${encodeURIComponent(contentStreamId)}`\n : base;\n }\n\n getEmailViewerDetails(object: DmsObject, version?: number, MAIL_APP_ID = 'appSystemmail:'): ViewerDataEmail {\n return {\n mediaViewerSrc: this.getMediaViewerSrc(\n object.id,\n object.content?.mimeType,\n version,\n object.content?.contentStreamId\n ),\n id: object.id,\n mimeType: object.content?.mimeType,\n metadata: this.getEmailMetadata(object, MAIL_APP_ID)\n };\n }\n\n getEmailMetadata(object: DmsObject, MAIL_APP_ID = 'appSystemmail:'): EmailMetadata {\n return {\n type: 'EMAIL',\n header: {\n subject: object.data[`${MAIL_APP_ID}subject`] as string,\n sent: new Date(object.data[`${MAIL_APP_ID}sent`] as string),\n from: object.data[`${MAIL_APP_ID}from`] as string,\n to: object.data[`${MAIL_APP_ID}to`] as string[],\n cc: object.data[`${MAIL_APP_ID}cc`] as string[],\n bcc: object.data[`${MAIL_APP_ID}bcc`] as string[]\n },\n theme: 'light',\n attachments: object.data[`${MAIL_APP_ID}attachments`] as string[]\n };\n }\n\n getViewerDetails(object: DmsObject, version: number | undefined): ViewerDataEmail | ViewerDataDefault | undefined {\n if (object) {\n const type = object?.content && this.#mediaViewerService.getComponentType(object.content.mimeType);\n\n return this.#isEmailViewer(object)\n ? this.getEmailViewerDetails(object, version)\n : {\n mediaViewerSrc: this.getMediaViewerSrc(\n object.id,\n object.content?.mimeType,\n version,\n object.content?.contentStreamId\n ),\n id: object.id,\n mimeType: object.content?.mimeType,\n metadata: {\n type,\n name: object.data[ContentStreamField.FILENAME] as string,\n dmsObject: object?.data,\n id: object?.id,\n editable: this.#isEditable(object),\n user: this.#userService.getCurrentUser(),\n theme: 'light',\n version,\n sendEvent:\n !!(\n object.content?.mimeType &&\n defaultViewers\n .filter((viewer) => viewer.type === 'OFFICE')\n .map((viewer) => viewer.mimeType.includes(object.content?.mimeType || '')).length\n ) || false\n }\n };\n }\n return undefined;\n }\n\n #isEditable(object: DmsObject): boolean {\n const state = this.#objectLockingService.getLockState(object);\n return state ? !state.locked || state.lockedByCurrentUser : true;\n }\n\n #isEmailViewer(object: DmsObject): boolean {\n return defaultViewers\n .filter((viewer) => viewer.type === 'EMAIL')[0]\n .mimeType.includes(object.data[ContentStreamField.MIME_TYPE] as string);\n }\n}\n","import { Component, computed, effect, inject, input, linkedSignal, untracked, WritableSignal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DmsObject, EventService, TranslatePipe, YuvEventType } from '@yuuvis/client-core';\nimport { DASHLET_MESSAGE_EVENTS, Metadata, OfficeDocumentMessage, YuvMediaViewerComponent } from '@yuuvis/media-viewer';\nimport { EMPTY, filter, map, switchMap, tap } from 'rxjs';\nimport { ObjectPreviewService } from '../../services/object-preview.service';\n\ninterface ViewerDetails {\n id: string;\n mimeType: string | undefined;\n mediaViewerSrc: string | undefined;\n metadata: Partial<Metadata>;\n}\n\n@Component({\n selector: 'yuv-object-preview',\n standalone: true,\n imports: [YuvMediaViewerComponent, TranslatePipe],\n templateUrl: `./object-preview.component.html`,\n styleUrls: [`./object-preview.component.scss`]\n})\nexport class ObjectPreviewComponent {\n readonly #objectPreviewService = inject(ObjectPreviewService);\n readonly #event = inject(EventService);\n\n objectId = input<string | undefined>(undefined);\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n version = input<number | undefined>(undefined);\n dmsObject = this.#objectPreviewService.dmsObject;\n\n metadata = input<Partial<Metadata>>({});\n\n viewerDetails: WritableSignal<ViewerDetails | null> = linkedSignal({\n source: () => ({ object: this.dmsObject(), version: this.version(), metadata: this.metadata() }),\n computation: (source, previous): ViewerDetails | null => {\n const object = Array.isArray(source.object) ? source.object[0] : source.object;\n if (!object) {\n return null;\n }\n\n const prevSource = previous?.source;\n const prevObject = Array.isArray(prevSource?.object) ? prevSource?.object[0] : prevSource?.object;\n\n const contentChanged =\n !previous ||\n object.id !== prevObject?.id ||\n object.content?.contentStreamId !== prevObject?.content?.contentStreamId ||\n source.version !== prevSource?.version;\n\n if (contentChanged) {\n const details = this.#objectPreviewService.getViewerDetails(object, source.version);\n return details\n ? { ...details, metadata: { ...details.metadata, ...source.metadata } as Partial<Metadata> }\n : null;\n }\n\n return previous?.value\n ? ({ ...previous.value, metadata: { ...previous.value.metadata, ...source.metadata } } as ViewerDetails)\n : null;\n }\n });\n\n isTiff = computed(() => this.dmsObject()?.content?.mimeType === 'image/tiff');\n\n #objectIdEffect = effect(() => {\n const objectId = this.objectId();\n const dmsObject = this.dmsObjectInput();\n untracked(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n dmsObject && this.#objectPreviewService.setDmsObject(dmsObject);\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n objectId && !dmsObject && this.#objectPreviewService.getDmsObject(objectId).subscribe();\n });\n });\n\n constructor() {\n this.#event\n .on(DASHLET_MESSAGE_EVENTS.OFFICE_DOCUMENT_UPDATE)\n .pipe(\n takeUntilDestroyed(),\n tap(() => this.#event.trigger(YuvEventType.DMS_OBJECT_CONTENT_UPDATED, { externalUpdate: true }))\n )\n .subscribe();\n\n // A conversion produces new content (new content stream, usually a new mime type): reload the DMS object so\n // the viewer details are rebuilt for the converted file.\n this.#event\n .on<string, OfficeDocumentMessage>(DASHLET_MESSAGE_EVENTS.OFFICE_DOCUMENT_CONVERTED)\n .pipe(\n takeUntilDestroyed(),\n map((event) => event.data?.objectId ?? null),\n // several previews may share the page — only reload the object shown here\n filter((objectId) => !objectId || objectId === this.#currentObjectId()),\n switchMap(() => {\n const id = this.#currentObjectId();\n return id ? this.#objectPreviewService.getDmsObject(id) : EMPTY;\n }),\n tap(() => this.#event.trigger(YuvEventType.DMS_OBJECT_CONTENT_UPDATED, { externalUpdate: true }))\n )\n .subscribe();\n }\n\n #currentObjectId(): string | undefined {\n return this.dmsObject()?.id ?? this.objectId();\n }\n}\n","@let viewerDetailsObj = viewerDetails();\n@if (viewerDetailsObj) {\n <yuv-media-viewer\n class=\"viewer\"\n [id]=\"viewerDetailsObj.id\"\n [type]=\"viewerDetailsObj.mimeType\"\n [src]=\"viewerDetailsObj.mediaViewerSrc ?? null\"\n [metadata]=\"viewerDetailsObj.metadata\"\n />\n}\n@if (isTiff()) {\n <div class=\"tiff-warning\">\n <div class=\"tiff-warning-text\">{{ 'yuv.object-preview.tiff-warning' | translate }}</div>\n </div>\n}\n","import { Component, computed, effect, inject, input, untracked } from '@angular/core';\nimport { DmsObject } from '@yuuvis/client-core';\nimport { MailComponent } from '@yuuvis/media-viewer';\nimport { ObjectPreviewService } from '../../services/object-preview.service';\n\n@Component({\n selector: 'yuv-object-email-preview',\n standalone: true,\n imports: [MailComponent],\n template: `\n @let viewerDetailsObj = viewerDetails();\n @if (viewerDetailsObj) {\n <yuv-mail [id]=\"viewerDetailsObj.id\" [src]=\"viewerDetailsObj.mediaViewerSrc\" [metadata]=\"viewerDetailsObj.metadata\"></yuv-mail>\n }\n `,\n styles: `\n :host {\n height: 100%;\n }\n `\n})\nexport class ObjectEmailPreviewComponent {\n #objectPreviwService = inject(ObjectPreviewService);\n\n objectId = input<string | undefined>(undefined);\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n dmsObject = this.#objectPreviwService.dmsObject;\n\n #objectIdEffect = effect(() => {\n const objectId = this.objectId();\n const dmsObject = this.dmsObjectInput();\n\n untracked(() => {\n dmsObject && this.#objectPreviwService.setDmsObject(dmsObject);\n if (objectId && !dmsObject) {\n this.#objectPreviwService.getDmsObject(objectId).subscribe();\n }\n });\n });\n\n viewerDetails = computed(() => {\n const object = this.dmsObject();\n return object ? this.#objectPreviwService.getEmailViewerDetails(object) : undefined;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tap"],"mappings":"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"}