@yuuvis/client-framework 3.20.0 → 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.
- package/fesm2022/yuuvis-client-framework-badges.mjs +80 -39
- package/fesm2022/yuuvis-client-framework-badges.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-datepicker.mjs +90 -34
- package/fesm2022/yuuvis-client-framework-datepicker.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-forms.mjs +14 -5
- package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-preview.mjs +25 -42
- package/fesm2022/yuuvis-client-framework-object-preview.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-smart-search.mjs +22 -3
- package/fesm2022/yuuvis-client-framework-smart-search.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-tile-list.mjs +1 -1
- package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
- package/lib/assets/i18n/de.json +1 -1
- package/lib/assets/i18n/en.json +5 -5
- package/package.json +6 -6
- package/types/yuuvis-client-framework-badges.d.ts +32 -2
- package/types/yuuvis-client-framework-datepicker.d.ts +16 -1
- package/types/yuuvis-client-framework-smart-search.d.ts +16 -1
|
@@ -1,43 +1,16 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
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 {
|
|
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 {
|
|
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":";;;;;;;;;;;;MAYa,kBAAkB,CAAA;AAN/B,IAAA,WAAA,GAAA;AAOW,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE9C,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,2EAAS;AAC/B,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAU,KAAK,gFAAC;AAExB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAS,MAAK;AACvC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE;AAC5B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC;AAEnF,YAAA,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,UAAU,CAAC,eAAe;kBACxF,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ;kBACxC,OAAO;AACb,QAAA,CAAC,8EAAC;AAEF;;;;;AAKG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAgB,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,gFAAC;AAC/H,IAAA;AArBU,IAAA,UAAU;+GADR,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZ/B,qcAkBA,EAAA,MAAA,EAAA,CAAA,uUAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDVY,aAAa,mLAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,SAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIvD,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;+BACE,gBAAgB,EAAA,OAAA,EACjB,CAAC,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,qcAAA,EAAA,MAAA,EAAA,CAAA,uUAAA,CAAA,EAAA;;;AELrE;;AAEG;AACI,MAAM,UAAU,GAAU;AAC/B,IAAA,EAAE,EAAE,gBAAgB;AACpB,IAAA,QAAQ,EAAEA,CAAM,CAAC,sBAAsB,CAAC;AACxC,IAAA,cAAc,EAAEA,CAAM,CAAC,4BAA4B,CAAC;AACpD,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,QAAQ,EAAE,EAAE;AACZ;;AAEG;IACH,OAAO,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;;AAG1E;;AAEG;AACI,MAAM,eAAe,GAAU;AACpC,IAAA,EAAE,EAAE,qBAAqB;AACzB,IAAA,QAAQ,EAAEA,CAAM,CAAC,2BAA2B,CAAC;AAC7C,IAAA,cAAc,EAAEA,CAAM,CAAC,iCAAiC,CAAC;AACzD,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,QAAQ,EAAE,SAAS;AACnB,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,SAAS,EAAE,gBAAgB;AAC3B;;AAEG;IACH,OAAO,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC;;;AC7BzE;;;;;;;;;;;;;;;;;;;;AAoBG,IAAQ,MAAM,eAAe,GAAU;AACxC,IAAA,EAAE,EAAE,qBAAqB;AACzB,IAAA,QAAQ,EAAEA,CAAM,CAAC,2BAA2B,CAAC;AAC7C,IAAA,cAAc,EAAEA,CAAM,CAAC,iCAAiC,CAAC;AACzD,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,QAAQ,EAAE,QAAQ;AAClB,IAAA,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AAC1C,IAAA,OAAO,EAAE,CAAC,SAAS,KAAI;QACrB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,yBAAyB,CAAyB;QAClG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,qBAAqB,CAAC;AAAE,YAAA,OAAO,KAAK;QAClE,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,CAAuB;AAC3F,QAAA,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO,KAAK;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC;QACtC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAuB;AACvF,QAAA,MAAM,GAAG,GAAG,YAAY,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI;AACxD,QAAA,OAAO,KAAK,GAAG,GAAG,KAAK,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,GAAG,CAAC;IACnD;;;ACvCF;;;;;;;;;;;AAWG;AACG,SAAU,YAAY,CAAC,IAAe,EAAE,SAAoB,EAAA;AAChE,IAAA,QAAQ,IAAI,CAAC,EAAE;QACb,KAAK,OAAO,EAAE;YACZ,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACxC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;QAC9D;QACA,KAAK,QAAQ,EAAE;AACb,YAAA,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK;QAClD;QACA,KAAK,YAAY,EAAE;YACjB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,IAAI,mBAAmB,CAAC,IAAI;YACxD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAA4B;YACjE,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC;QAC3E;AACA,QAAA;AACE,YAAA,OAAO,KAAK;;AAElB;AAEA;;;;;;;;;;;;;AAaG;AACG,SAAU,iBAAiB,CAAC,KAAY,EAAE,UAA8B,EAAA;AAC5E,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;AAC/B,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI;AAC1B,IAAA,IAAI,CAAC,UAAU;AAAE,QAAA,OAAO,IAAI;AAE5B,IAAA,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAmB,CAAC,CAAC,EAAE,CAAC;AACtG,IAAA,OAAO,OAAO,CAAC,IAAI,CACjB,CAAC,EAAE,KACD,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC9B,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;SAC5B,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAC3E;AACH;;MChDa,oBAAoB,CAAA;AACtB,IAAA,MAAM,GAAG,MAAM,CAAe,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,6EAAC;AAC/D,IAAA,YAAY,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,SAAS;AAChE,IAAA,cAAc,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAEtD;;;;;;;;;;;;;AAaG;IACH,cAAc,CAAC,MAAe,EAAE,MAAe,EAAA;QAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AAC7B,YAAA,MAAM,IAAI,GAAiB,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACpF,YAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;YACnD;iBAAO;AACL,gBAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;AAClD,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC7D;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;;;;;;;AAWG;AACH,IAAA,qBAAqB,CAAC,MAAe,EAAA;AACnC,QAAA,IAAI,CAAC,cAAc,CAAC,CAAC,UAAU,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC;IAC7E;AAEA;;;;;;;;AAQG;IACH,UAAU,CAAC,EAAqB,EAAE,MAAe,EAAA;AAC/C,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AAC7B,YAAA,MAAM,IAAI,GAAiB,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACpF,YAAA,IAAI,MAAM,KAAK,SAAS,EAAE;gBACxB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrE;iBAAO;gBACL,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC5C,IAAI,QAAQ,EAAE;oBACZ,IAAI,CAAC,OAAO,CAAC,GAAG,CACd,MAAM,EACN,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CACpD;gBACH;YACF;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;;;;AAQG;IACH,GAAG,CAAC,EAAU,EAAE,MAAe,EAAA;QAC7B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACvC,QAAA,IAAI,MAAM,KAAK,SAAS,EAAE;YACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;AACnE,YAAA,IAAI,KAAK;AAAE,gBAAA,OAAO,KAAK;QACzB;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;IAC9C;AAEA;;;;;AAKG;IACH,GAAG,GAAA;QACD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;AACvC,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAiB;QACrC,KAAK,MAAM,KAAK,IAAI,IAAI;YAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC;QACnD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE;YACnC,KAAK,MAAM,KAAK,IAAI,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC;QACrD;QACA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAClC;AAEA;;;;;;;;;AASG;AACH,IAAA,kBAAkB,CAAC,MAAe,EAAA;AAChC,QAAA,OAAO,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1E;AAEA;;;;;;;;;;AAUG;IACH,eAAe,CAAC,SAAoB,EAAE,OAAkD,EAAA;QACtF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC;AACnD,QAAA,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,KAAI;AACxC,YAAA,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;AACjC,gBAAA,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC;AAC7E,gBAAA,IAAI,CAAC,aAAa;AAAE,oBAAA,OAAO,KAAK;AAChC,gBAAA,OAAO,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI;YAC7D;AACA,YAAA,OAAO,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;AACtD,QAAA,CAAC,CAAC;QACF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IAC5F;AAEA;;;;AAIG;AACH,IAAA,aAAa,CAAC,MAAe,EAAA;QAC3B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE;QACvC,IAAI,MAAM,KAAK,SAAS;AAAE,YAAA,OAAO,CAAC,GAAG,IAAI,CAAC;QAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;AACjC,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC,GAAG,IAAI,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAY,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC;AAChF,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;AACzF,QAAA,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IAClC;IAES,WAAW,GAAG,CAAC,KAAY,EAAE,MAAa,KAAa,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;AAE9G;;;AAGG;IACH,UAAU,CAAC,QAAiB,EAAE,QAAiB,EAAA;AAC7C,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC;AAC1B,QAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC5B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YAChE,IAAI,GAAG,KAAK,CAAC,CAAC;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;AAC3B,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK;QACxB;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;;;;AAKG;IACH,SAAS,CAAC,KAAY,EAAE,SAAoB,EAAA;AAC1C,QAAA,MAAM,GAAG,GAAiB;YACxB,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,SAAS;SACtD;QACD,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;QACzD,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC;AAC1D,QAAA,OAAO,KAAK;IACd;+GAnMW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA,CAAA;;4FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCGrB,oBAAoB,CAAA;AANjC,IAAA,WAAA,GAAA;AAOW,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAEjD,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAW,EAAE,uFAAC;QACtC,IAAA,CAAA,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AACpC;;;AAGG;QACH,IAAA,CAAA,UAAU,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAiC;QACnD,IAAA,CAAA,WAAW,GAAG,MAAM,EAAS;AAEpB,QAAA,IAAA,CAAA,MAAM,GAAoB,QAAQ,CAAU,MAAK;AACxD,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE;YACpC,OAAO,IAAI,CAAC;AACT,iBAAA,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AACjC,iBAAA,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AAC7F,QAAA,CAAC,6EAAC;AACH,IAAA;AAjBU,IAAA,SAAS;+GADP,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,iiBCdjC,4hBAgBA,EAAA,MAAA,EAAA,CAAA,+dAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDNY,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,mLAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAItC,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,WACxB,CAAC,OAAO,EAAE,aAAa,EAAE,eAAe,CAAC,EAAA,QAAA,EAAA,4hBAAA,EAAA,MAAA,EAAA,CAAA,+dAAA,CAAA,EAAA;;;MEEvC,mBAAmB,CAAA;AANhC,IAAA,WAAA,GAAA;AAOW,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAEjD,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,+EAAa;QACvC,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAwB;QACxC,IAAA,CAAA,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAsB;AAE3B,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAU,MACxC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AAC/C,YAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA,CAAC,mFACH;AACF,IAAA;AAZU,IAAA,SAAS;+GADP,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZhC,qFAGA,EAAA,MAAA,EAAA,CAAA,wEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDKY,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAIjB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;+BACE,iBAAiB,EAAA,OAAA,EAClB,CAAC,kBAAkB,CAAC,EAAA,QAAA,EAAA,qFAAA,EAAA,MAAA,EAAA,CAAA,wEAAA,CAAA,EAAA;;;AER/B;;AAEG;;;;"}
|
|
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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"}
|
|
@@ -395,7 +395,11 @@ class DateInputElementComponent {
|
|
|
395
395
|
this.disabled = isDisabled;
|
|
396
396
|
}
|
|
397
397
|
_isValidInput(v) {
|
|
398
|
-
|
|
398
|
+
// digits only - parseInt alone would accept trailing garbage like '1x' and
|
|
399
|
+
// silently reduce it to 1
|
|
400
|
+
if (!/^\d+$/.test(`${v ?? ''}`))
|
|
401
|
+
return false;
|
|
402
|
+
const n = parseInt(`${v}`, 10);
|
|
399
403
|
return this._isNumber(n) && (!this.maxValue || n <= this.maxValue) && (!this.minValue || n >= this.minValue);
|
|
400
404
|
}
|
|
401
405
|
validate(c) {
|
|
@@ -1067,6 +1071,7 @@ class DateInputComponent {
|
|
|
1067
1071
|
this.date = null;
|
|
1068
1072
|
this._disabled = false;
|
|
1069
1073
|
this.invalid = signal(false, ...(ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []));
|
|
1074
|
+
this._dateInvalid = false;
|
|
1070
1075
|
this._refreshPlaceholder = true;
|
|
1071
1076
|
this._locale = this.datepickerService.DEFAULT_LANGUAGE;
|
|
1072
1077
|
this._withTime = false;
|
|
@@ -1117,12 +1122,20 @@ class DateInputComponent {
|
|
|
1117
1122
|
}
|
|
1118
1123
|
});
|
|
1119
1124
|
this._formStateSub = this.dateInputForm.statusChanges.subscribe({
|
|
1120
|
-
next: (
|
|
1121
|
-
this.
|
|
1125
|
+
next: () => {
|
|
1126
|
+
this._updateInvalidState();
|
|
1122
1127
|
}
|
|
1123
1128
|
});
|
|
1124
1129
|
}
|
|
1125
|
-
|
|
1130
|
+
/**
|
|
1131
|
+
* Reflects both sources of invalidity: a structurally incomplete/invalid form
|
|
1132
|
+
* (missing or out of range parts) and input that does not describe a real
|
|
1133
|
+
* calendar date (e.g. 31st of February). Both have to be taken into account
|
|
1134
|
+
* here because the form group may well be VALID while the entered parts still
|
|
1135
|
+
* do not add up to an existing date.
|
|
1136
|
+
*/
|
|
1137
|
+
_updateInvalidState() {
|
|
1138
|
+
const isInvalid = this.dateInputForm?.status === 'INVALID' || this._dateInvalid;
|
|
1126
1139
|
this.invalid.set(isInvalid);
|
|
1127
1140
|
if (isInvalid) {
|
|
1128
1141
|
this.datepickerService.setErrors({
|
|
@@ -1134,39 +1147,78 @@ class DateInputComponent {
|
|
|
1134
1147
|
}
|
|
1135
1148
|
}
|
|
1136
1149
|
_checkAndPropagateForm() {
|
|
1137
|
-
if (this.dateInputForm?.status
|
|
1138
|
-
|
|
1139
|
-
|
|
1150
|
+
if (this.dateInputForm?.status !== 'VALID') {
|
|
1151
|
+
// incomplete or out of range input, the status subscription reports the error
|
|
1152
|
+
return;
|
|
1140
1153
|
}
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
let hour = strHour?.length ? parseInt(strHour) : -1;
|
|
1149
|
-
if (this.hour12) {
|
|
1150
|
-
hour = this.currentDayPeriod === 'pm' && hour < 12 ? hour + 12 : hour;
|
|
1151
|
-
hour = this.currentDayPeriod === 'am' && hour === 12 ? 0 : hour;
|
|
1152
|
-
hour = hour === 24 ? 0 : hour;
|
|
1153
|
-
}
|
|
1154
|
-
dateString += `T${hour < 10 ? `0${hour}` : `${hour}`}:${g.controls['minute'].value}:00`;
|
|
1154
|
+
const parsed = this._formToDate(this.dateInputForm);
|
|
1155
|
+
if (!parsed.empty && !parsed.date) {
|
|
1156
|
+
// input that does not describe an existing date (e.g. 31.02.). Keep what the user
|
|
1157
|
+
// typed so it can be corrected, but do not propagate a silently shifted date
|
|
1158
|
+
this._dateInvalid = true;
|
|
1159
|
+
this._updateInvalidState();
|
|
1160
|
+
return;
|
|
1155
1161
|
}
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1162
|
+
this._dateInvalid = false;
|
|
1163
|
+
this.date = parsed.date;
|
|
1164
|
+
this.datepickerService.setValue(this.date);
|
|
1165
|
+
this._updateInvalidState();
|
|
1166
|
+
}
|
|
1167
|
+
_formToDate(group) {
|
|
1168
|
+
const keys = this.withTime ? ['day', 'month', 'year', 'hour', 'minute'] : ['day', 'month', 'year'];
|
|
1169
|
+
if (keys.every((key) => !`${group.controls[key].value ?? ''}`.length))
|
|
1170
|
+
return { date: null, empty: true };
|
|
1171
|
+
const invalid = { date: null, empty: false };
|
|
1172
|
+
const day = this._toInt(group.controls['day'].value);
|
|
1173
|
+
const month = this._toInt(group.controls['month'].value);
|
|
1174
|
+
// the year may be negative because of a locale year offset (e.g. locale 'th')
|
|
1175
|
+
const year = this._toInt(group.controls['year'].value, true);
|
|
1176
|
+
if (day === null || month === null || year === null)
|
|
1177
|
+
return invalid;
|
|
1178
|
+
if (month < 1 || month > 12 || day < 1 || day > this._daysInMonth(year, month))
|
|
1179
|
+
return invalid;
|
|
1180
|
+
const time = this._formToTime(group);
|
|
1181
|
+
if (!time)
|
|
1182
|
+
return invalid;
|
|
1183
|
+
// setFullYear with all three arguments assigns them at once, so no intermediate
|
|
1184
|
+
// rollover can happen, and it also covers years outside the parsable range
|
|
1185
|
+
const date = new Date(0);
|
|
1186
|
+
date.setFullYear(year, month - 1, day);
|
|
1187
|
+
date.setHours(time.hour, time.minute, 0, 0);
|
|
1188
|
+
// guard against any remaining shift (e.g. a local time skipped by a DST change)
|
|
1189
|
+
return date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day
|
|
1190
|
+
? { date, empty: false }
|
|
1191
|
+
: invalid;
|
|
1192
|
+
}
|
|
1193
|
+
_formToTime(group) {
|
|
1194
|
+
if (!this.withTime)
|
|
1195
|
+
return { hour: 0, minute: 0 };
|
|
1196
|
+
let hour = this._toInt(group.controls['hour'].value);
|
|
1197
|
+
const minute = this._toInt(group.controls['minute'].value);
|
|
1198
|
+
if (hour === null || minute === null)
|
|
1199
|
+
return null;
|
|
1200
|
+
if (this.hour12) {
|
|
1201
|
+
hour = this.currentDayPeriod === 'pm' && hour < 12 ? hour + 12 : hour;
|
|
1202
|
+
hour = this.currentDayPeriod === 'am' && hour === 12 ? 0 : hour;
|
|
1203
|
+
hour = hour === 24 ? 0 : hour;
|
|
1167
1204
|
}
|
|
1168
|
-
|
|
1169
|
-
|
|
1205
|
+
return hour > 23 || minute > 59 ? null : { hour, minute };
|
|
1206
|
+
}
|
|
1207
|
+
/**
|
|
1208
|
+
* Strict integer parse - unlike parseInt it rejects values with trailing
|
|
1209
|
+
* garbage ('1x') so those cannot slip through as a valid date part.
|
|
1210
|
+
*/
|
|
1211
|
+
_toInt(value, allowNegative = false) {
|
|
1212
|
+
const str = `${value ?? ''}`;
|
|
1213
|
+
if (!(allowNegative ? /^-?\d+$/ : /^\d+$/).test(str))
|
|
1214
|
+
return null;
|
|
1215
|
+
return parseInt(str, 10);
|
|
1216
|
+
}
|
|
1217
|
+
_daysInMonth(year, month) {
|
|
1218
|
+
// day 0 of the following month is the last day of the given month
|
|
1219
|
+
const last = new Date(0);
|
|
1220
|
+
last.setFullYear(year, month, 0);
|
|
1221
|
+
return last.getDate();
|
|
1170
1222
|
}
|
|
1171
1223
|
_focusInput(offset) {
|
|
1172
1224
|
const inputs = this._getFocusableElements();
|
|
@@ -1291,6 +1343,10 @@ class DateInputComponent {
|
|
|
1291
1343
|
this.dateInputForm.patchValue(this._getPatch(vc.value), {
|
|
1292
1344
|
emitEvent: false
|
|
1293
1345
|
});
|
|
1346
|
+
// the value comes from the outside (calendar, model), so any previously
|
|
1347
|
+
// entered non existing date is gone now
|
|
1348
|
+
this._dateInvalid = false;
|
|
1349
|
+
this._updateInvalidState();
|
|
1294
1350
|
// this.dateInputForm?.updateValueAndValidity()
|
|
1295
1351
|
}
|
|
1296
1352
|
}));
|