@yuuvis/client-framework 3.10.0 → 3.11.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.
@@ -315,7 +315,23 @@ class ObjectMetadataSectionComponent {
315
315
  this.expandedInput = input(false, { ...(ngDevMode ? { debugName: "expandedInput" } : /* istanbul ignore next */ {}), alias: 'expanded' });
316
316
  this.elementExtensions = input([], ...(ngDevMode ? [{ debugName: "elementExtensions" }] : /* istanbul ignore next */ []));
317
317
  this.readonly = input(...(ngDevMode ? [undefined, { debugName: "readonly" }] : /* istanbul ignore next */ []));
318
+ /**
319
+ * When `true`, the section's expand/collapse feature is removed: the content is
320
+ * always visible, cannot be collapsed, and the accordion toggle (arrow) is hidden.
321
+ */
322
+ this.skipExpand = input(...(ngDevMode ? [undefined, { debugName: "skipExpand" }] : /* istanbul ignore next */ []));
323
+ /**
324
+ * When `true`, the section header (title, icon and toggle) is not rendered while the
325
+ * content region is still shown. Typically combined with {@link skipExpand} to display
326
+ * a title-less, always-open section.
327
+ */
328
+ this.skipTitle = input(...(ngDevMode ? [undefined, { debugName: "skipTitle" }] : /* istanbul ignore next */ []));
318
329
  this.expanded = linkedSignal(this.expandedInput, ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
330
+ /**
331
+ * Effective expanded state. When `skipExpand` is set the section is always visible
332
+ * and cannot be collapsed, so it is treated as permanently expanded.
333
+ */
334
+ this.isExpanded = computed(() => !!this.skipExpand() || this.expanded(), ...(ngDevMode ? [{ debugName: "isExpanded" }] : /* istanbul ignore next */ []));
319
335
  this.busy = signal(false, ...(ngDevMode ? [{ debugName: "busy" }] : /* istanbul ignore next */ []));
320
336
  // linkedSignal instead of plain signal so that formOptions resets to undefined whenever
321
337
  // the section input changes (e.g. a different object is loaded). This ensures the form
@@ -327,7 +343,7 @@ class ObjectMetadataSectionComponent {
327
343
  // Load the object form when the section is first expanded.
328
344
  // Don't use rxResource here because it messes with the state of the formOptions.
329
345
  const section = this.section();
330
- const expanded = this.expanded();
346
+ const expanded = this.isExpanded();
331
347
  // untracked() reads formOptions without adding it as a reactive dependency of this
332
348
  // effect (which would cause an infinite loop). The guard ensures we only fetch once
333
349
  // per section: subsequent expand cycles reuse the existing formOptions so that any
@@ -362,7 +378,7 @@ class ObjectMetadataSectionComponent {
362
378
  // persist across collapse/expand cycles (mirrors the default form's `[hidden]` approach).
363
379
  this.#hasExpanded = signal(false, ...(ngDevMode ? [{ debugName: "#hasExpanded" }] : /* istanbul ignore next */ []));
364
380
  this.#expandTrackEffect = effect(() => {
365
- if (this.expanded())
381
+ if (this.isExpanded())
366
382
  this.#hasExpanded.set(true);
367
383
  }, ...(ngDevMode ? [{ debugName: "#expandTrackEffect" }] : /* istanbul ignore next */ []));
368
384
  this.renderCustom = computed(() => !!this.customTemplate() && this.#hasExpanded(), ...(ngDevMode ? [{ debugName: "renderCustom" }] : /* istanbul ignore next */ []));
@@ -396,6 +412,11 @@ class ObjectMetadataSectionComponent {
396
412
  // INBOUND command channel: reset/pristine triggered by the surrounding metadata form.
397
413
  #commandSubject;
398
414
  #setCustomStatus;
415
+ toggle() {
416
+ if (this.skipExpand())
417
+ return;
418
+ this.expanded.set(!this.expanded());
419
+ }
399
420
  resetForm() {
400
421
  if (this.customTemplate())
401
422
  this.#commandSubject.next({ type: 'reset' });
@@ -411,15 +432,15 @@ class ObjectMetadataSectionComponent {
411
432
  this.objectForm()?.setFormPristine();
412
433
  }
413
434
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: ObjectMetadataSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
414
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: ObjectMetadataSectionComponent, isStandalone: true, selector: "yuv-object-metadata-section", inputs: { section: { classPropertyName: "section", publicName: "section", isSignal: true, isRequired: true, transformFunction: null }, expandedInput: { classPropertyName: "expandedInput", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, elementExtensions: { classPropertyName: "elementExtensions", publicName: "elementExtensions", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { statusChanged: "statusChanged" }, host: { properties: { "class.invalid": "customTemplate() ? !!customStatus()?.invalid : objectForm()?.form?.invalid", "class.dirty": "customTemplate() ? !!customStatus()?.dirty : objectForm()?.form?.dirty" } }, viewQueries: [{ propertyName: "objectForm", first: true, predicate: ObjectFormComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@let _section = section();\n@let fo = formOptions();\n\n<h3>\n <button\n type=\"button\"\n [attr.aria-expanded]=\"expanded()\"\n class=\"accordion-trigger\"\n [attr.aria-controls]=\"'sect_' + _section.id\"\n [id]=\"'accordion_' + _section.id\"\n (click)=\"expanded.set(!expanded())\"\n [attr.aria-busy]=\"busy()\"\n >\n @if (_section.icon) {\n @if (_section.svgIcon) {\n <mat-icon [svgIcon]=\"_section.icon\" />\n } @else {\n <mat-icon>{{ _section.icon }}</mat-icon>\n }\n }\n <span>{{ _section.label }}</span>\n @if (busy()) {\n <mat-spinner diameter=\"24\" />\n }\n <mat-icon class=\"arr\">keyboard_arrow_down</mat-icon>\n </button>\n</h3>\n<div\n [id]=\"'sect_' + _section.id\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion_' + _section.id\"\n class=\"accordion-panel\"\n>\n @if (customTemplate()) {\n @if (renderCustom()) {\n <div [hidden]=\"!expanded()\">\n <ng-container *ngTemplateOutlet=\"customTemplate()!; context: { $implicit: sotContext() }\" />\n </div>\n }\n } @else if (fo) {\n <yuv-object-form\n #objectForm\n [hidden]=\"!expanded()\"\n [readonly]=\"readonly()\"\n [formOptions]=\"fo\"\n [elementExtensions]=\"elementExtensions()\"\n (statusChanged)=\"statusChanged.emit($event)\"\n />\n }\n</div>\n", styles: [":host{--section-state-border-color: var(--ymt-outline-variant);--section-state-outline-color: transparent;background-color:var(--_object-metadata-section-background);border:1px solid var(--section-state-border-color);border-radius:var(--_object-metadata-section-corner);outline:3px solid var(--section-state-outline-color)}:host.invalid{--section-state-border-color: var(--ymt-danger);--section-state-outline-color: rgb(from var(--ymt-danger) r g b /.2)}:host.dirty:not(.invalid){--section-state-border-color: var(--ymt-success);--section-state-outline-color: rgb(from var(--ymt-success) r g b /.2)}:host h3{margin:0;padding:0;display:flex}:host h3 button{margin:var(--ymt-spacing-2xs);border-radius:calc(var(--_object-metadata-section-corner) * .5);flex:1;padding:var(--ymt-spacing-xs);cursor:pointer;display:flex;gap:var(--ymt-spacing-xs);align-items:center;font-weight:700;color:var(--ymt-text-color-subtle);background-color:transparent;border:none}:host h3 button:hover{background-color:var(--ymt-hover-background)}:host h3 button:focus-visible{background-color:var(--ymt-hover-background);outline:2px solid var(--ymt-outline);outline-offset:-2px}:host h3 button[aria-expanded=true] mat-icon.arr{transform:rotate(180deg)}:host h3 button span{flex:1;text-align:start}:host h3 button mat-icon{margin-inline-end:var(--ymt-spacing-xs);transition:transform .3s ease}:host details{background-color:var(--_object-metadata-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner)}:host details:not(:last-child){margin-block-end:var(--ymt-spacing-m)}:host details[open] yuv-icon.arr{transform:rotate(180deg)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: ObjectFormComponent, selector: "yuv-object-form", inputs: ["formOptions", "inert", "readonly", "elementExtensions", "isInnerTableForm"], outputs: ["statusChanged", "onFormReady"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
435
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: ObjectMetadataSectionComponent, isStandalone: true, selector: "yuv-object-metadata-section", inputs: { section: { classPropertyName: "section", publicName: "section", isSignal: true, isRequired: true, transformFunction: null }, expandedInput: { classPropertyName: "expandedInput", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null }, elementExtensions: { classPropertyName: "elementExtensions", publicName: "elementExtensions", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, skipExpand: { classPropertyName: "skipExpand", publicName: "skipExpand", isSignal: true, isRequired: false, transformFunction: null }, skipTitle: { classPropertyName: "skipTitle", publicName: "skipTitle", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { statusChanged: "statusChanged" }, host: { properties: { "class.invalid": "customTemplate() ? !!customStatus()?.invalid : objectForm()?.form?.invalid", "class.dirty": "customTemplate() ? !!customStatus()?.dirty : objectForm()?.form?.dirty" } }, viewQueries: [{ propertyName: "objectForm", first: true, predicate: ObjectFormComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@let _section = section();\n@let fo = formOptions();\n\n@if (!skipTitle()) {\n <h3>\n <button\n type=\"button\"\n [attr.aria-expanded]=\"isExpanded()\"\n class=\"accordion-trigger\"\n [class.non-collapsible]=\"skipExpand()\"\n [attr.aria-controls]=\"'sect_' + _section.id\"\n [id]=\"'accordion_' + _section.id\"\n [disabled]=\"skipExpand()\"\n (click)=\"toggle()\"\n [attr.aria-busy]=\"busy()\"\n >\n @if (_section.icon) {\n @if (_section.svgIcon) {\n <mat-icon [svgIcon]=\"_section.icon\" aria-hidden=\"true\" />\n } @else {\n <mat-icon aria-hidden=\"true\">{{ _section.icon }}</mat-icon>\n }\n }\n <span>{{ _section.label }}</span>\n @if (busy()) {\n <mat-spinner diameter=\"24\" />\n }\n @if (!skipExpand()) {\n <mat-icon class=\"arr\" aria-hidden=\"true\">keyboard_arrow_down</mat-icon>\n }\n </button>\n </h3>\n}\n<div\n [id]=\"'sect_' + _section.id\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion_' + _section.id\"\n class=\"accordion-panel\"\n>\n @if (customTemplate()) {\n @if (renderCustom()) {\n <div [hidden]=\"!isExpanded()\">\n <ng-container *ngTemplateOutlet=\"customTemplate()!; context: { $implicit: sotContext() }\" />\n </div>\n }\n } @else if (fo) {\n <yuv-object-form\n #objectForm\n [hidden]=\"!isExpanded()\"\n [readonly]=\"readonly()\"\n [formOptions]=\"fo\"\n [elementExtensions]=\"elementExtensions()\"\n (statusChanged)=\"statusChanged.emit($event)\"\n />\n }\n</div>\n", styles: [":host{--section-state-border-color: var(--ymt-outline-variant);--section-state-outline-color: transparent;background-color:var(--_object-metadata-section-background);border:1px solid var(--section-state-border-color);border-radius:var(--_object-metadata-section-corner);outline:3px solid var(--section-state-outline-color)}:host.invalid{--section-state-border-color: var(--ymt-danger);--section-state-outline-color: rgb(from var(--ymt-danger) r g b /.2)}:host.dirty:not(.invalid){--section-state-border-color: var(--ymt-success);--section-state-outline-color: rgb(from var(--ymt-success) r g b /.2)}:host h3{margin:0;padding:0;display:flex}:host h3 button{margin:var(--ymt-spacing-2xs);border-radius:calc(var(--_object-metadata-section-corner) * .5);flex:1;padding:var(--ymt-spacing-xs);cursor:pointer;display:flex;gap:var(--ymt-spacing-xs);align-items:center;font-weight:700;color:var(--ymt-text-color-subtle);background-color:transparent;border:none}:host h3 button.non-collapsible{cursor:default}:host h3 button.non-collapsible:hover{background-color:transparent}:host h3 button:not(.non-collapsible):hover{background-color:var(--ymt-hover-background)}:host h3 button:focus-visible{background-color:var(--ymt-hover-background);outline:2px solid var(--ymt-outline);outline-offset:-2px}:host h3 button[aria-expanded=true] mat-icon.arr{transform:rotate(180deg)}:host h3 button span{flex:1;text-align:start}:host h3 button mat-icon{margin-inline-end:var(--ymt-spacing-xs);transition:transform .3s ease}:host details{background-color:var(--_object-metadata-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner)}:host details:not(:last-child){margin-block-end:var(--ymt-spacing-m)}:host details[open] yuv-icon.arr{transform:rotate(180deg)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2$1.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: ObjectFormComponent, selector: "yuv-object-form", inputs: ["formOptions", "inert", "readonly", "elementExtensions", "isInnerTableForm"], outputs: ["statusChanged", "onFormReady"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
415
436
  }
416
437
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: ObjectMetadataSectionComponent, decorators: [{
417
438
  type: Component,
418
439
  args: [{ selector: 'yuv-object-metadata-section', imports: [MatIconModule, MatProgressSpinnerModule, ObjectFormComponent, NgTemplateOutlet], host: {
419
440
  '[class.invalid]': 'customTemplate() ? !!customStatus()?.invalid : objectForm()?.form?.invalid',
420
441
  '[class.dirty]': 'customTemplate() ? !!customStatus()?.dirty : objectForm()?.form?.dirty'
421
- }, template: "@let _section = section();\n@let fo = formOptions();\n\n<h3>\n <button\n type=\"button\"\n [attr.aria-expanded]=\"expanded()\"\n class=\"accordion-trigger\"\n [attr.aria-controls]=\"'sect_' + _section.id\"\n [id]=\"'accordion_' + _section.id\"\n (click)=\"expanded.set(!expanded())\"\n [attr.aria-busy]=\"busy()\"\n >\n @if (_section.icon) {\n @if (_section.svgIcon) {\n <mat-icon [svgIcon]=\"_section.icon\" />\n } @else {\n <mat-icon>{{ _section.icon }}</mat-icon>\n }\n }\n <span>{{ _section.label }}</span>\n @if (busy()) {\n <mat-spinner diameter=\"24\" />\n }\n <mat-icon class=\"arr\">keyboard_arrow_down</mat-icon>\n </button>\n</h3>\n<div\n [id]=\"'sect_' + _section.id\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion_' + _section.id\"\n class=\"accordion-panel\"\n>\n @if (customTemplate()) {\n @if (renderCustom()) {\n <div [hidden]=\"!expanded()\">\n <ng-container *ngTemplateOutlet=\"customTemplate()!; context: { $implicit: sotContext() }\" />\n </div>\n }\n } @else if (fo) {\n <yuv-object-form\n #objectForm\n [hidden]=\"!expanded()\"\n [readonly]=\"readonly()\"\n [formOptions]=\"fo\"\n [elementExtensions]=\"elementExtensions()\"\n (statusChanged)=\"statusChanged.emit($event)\"\n />\n }\n</div>\n", styles: [":host{--section-state-border-color: var(--ymt-outline-variant);--section-state-outline-color: transparent;background-color:var(--_object-metadata-section-background);border:1px solid var(--section-state-border-color);border-radius:var(--_object-metadata-section-corner);outline:3px solid var(--section-state-outline-color)}:host.invalid{--section-state-border-color: var(--ymt-danger);--section-state-outline-color: rgb(from var(--ymt-danger) r g b /.2)}:host.dirty:not(.invalid){--section-state-border-color: var(--ymt-success);--section-state-outline-color: rgb(from var(--ymt-success) r g b /.2)}:host h3{margin:0;padding:0;display:flex}:host h3 button{margin:var(--ymt-spacing-2xs);border-radius:calc(var(--_object-metadata-section-corner) * .5);flex:1;padding:var(--ymt-spacing-xs);cursor:pointer;display:flex;gap:var(--ymt-spacing-xs);align-items:center;font-weight:700;color:var(--ymt-text-color-subtle);background-color:transparent;border:none}:host h3 button:hover{background-color:var(--ymt-hover-background)}:host h3 button:focus-visible{background-color:var(--ymt-hover-background);outline:2px solid var(--ymt-outline);outline-offset:-2px}:host h3 button[aria-expanded=true] mat-icon.arr{transform:rotate(180deg)}:host h3 button span{flex:1;text-align:start}:host h3 button mat-icon{margin-inline-end:var(--ymt-spacing-xs);transition:transform .3s ease}:host details{background-color:var(--_object-metadata-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner)}:host details:not(:last-child){margin-block-end:var(--ymt-spacing-m)}:host details[open] yuv-icon.arr{transform:rotate(180deg)}\n"] }]
422
- }], propDecorators: { objectForm: [{ type: i0.ViewChild, args: [i0.forwardRef(() => ObjectFormComponent), { isSignal: true }] }], section: [{ type: i0.Input, args: [{ isSignal: true, alias: "section", required: true }] }], expandedInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], elementExtensions: [{ type: i0.Input, args: [{ isSignal: true, alias: "elementExtensions", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], statusChanged: [{ type: i0.Output, args: ["statusChanged"] }] } });
442
+ }, template: "@let _section = section();\n@let fo = formOptions();\n\n@if (!skipTitle()) {\n <h3>\n <button\n type=\"button\"\n [attr.aria-expanded]=\"isExpanded()\"\n class=\"accordion-trigger\"\n [class.non-collapsible]=\"skipExpand()\"\n [attr.aria-controls]=\"'sect_' + _section.id\"\n [id]=\"'accordion_' + _section.id\"\n [disabled]=\"skipExpand()\"\n (click)=\"toggle()\"\n [attr.aria-busy]=\"busy()\"\n >\n @if (_section.icon) {\n @if (_section.svgIcon) {\n <mat-icon [svgIcon]=\"_section.icon\" aria-hidden=\"true\" />\n } @else {\n <mat-icon aria-hidden=\"true\">{{ _section.icon }}</mat-icon>\n }\n }\n <span>{{ _section.label }}</span>\n @if (busy()) {\n <mat-spinner diameter=\"24\" />\n }\n @if (!skipExpand()) {\n <mat-icon class=\"arr\" aria-hidden=\"true\">keyboard_arrow_down</mat-icon>\n }\n </button>\n </h3>\n}\n<div\n [id]=\"'sect_' + _section.id\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion_' + _section.id\"\n class=\"accordion-panel\"\n>\n @if (customTemplate()) {\n @if (renderCustom()) {\n <div [hidden]=\"!isExpanded()\">\n <ng-container *ngTemplateOutlet=\"customTemplate()!; context: { $implicit: sotContext() }\" />\n </div>\n }\n } @else if (fo) {\n <yuv-object-form\n #objectForm\n [hidden]=\"!isExpanded()\"\n [readonly]=\"readonly()\"\n [formOptions]=\"fo\"\n [elementExtensions]=\"elementExtensions()\"\n (statusChanged)=\"statusChanged.emit($event)\"\n />\n }\n</div>\n", styles: [":host{--section-state-border-color: var(--ymt-outline-variant);--section-state-outline-color: transparent;background-color:var(--_object-metadata-section-background);border:1px solid var(--section-state-border-color);border-radius:var(--_object-metadata-section-corner);outline:3px solid var(--section-state-outline-color)}:host.invalid{--section-state-border-color: var(--ymt-danger);--section-state-outline-color: rgb(from var(--ymt-danger) r g b /.2)}:host.dirty:not(.invalid){--section-state-border-color: var(--ymt-success);--section-state-outline-color: rgb(from var(--ymt-success) r g b /.2)}:host h3{margin:0;padding:0;display:flex}:host h3 button{margin:var(--ymt-spacing-2xs);border-radius:calc(var(--_object-metadata-section-corner) * .5);flex:1;padding:var(--ymt-spacing-xs);cursor:pointer;display:flex;gap:var(--ymt-spacing-xs);align-items:center;font-weight:700;color:var(--ymt-text-color-subtle);background-color:transparent;border:none}:host h3 button.non-collapsible{cursor:default}:host h3 button.non-collapsible:hover{background-color:transparent}:host h3 button:not(.non-collapsible):hover{background-color:var(--ymt-hover-background)}:host h3 button:focus-visible{background-color:var(--ymt-hover-background);outline:2px solid var(--ymt-outline);outline-offset:-2px}:host h3 button[aria-expanded=true] mat-icon.arr{transform:rotate(180deg)}:host h3 button span{flex:1;text-align:start}:host h3 button mat-icon{margin-inline-end:var(--ymt-spacing-xs);transition:transform .3s ease}:host details{background-color:var(--_object-metadata-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner)}:host details:not(:last-child){margin-block-end:var(--ymt-spacing-m)}:host details[open] yuv-icon.arr{transform:rotate(180deg)}\n"] }]
443
+ }], propDecorators: { objectForm: [{ type: i0.ViewChild, args: [i0.forwardRef(() => ObjectFormComponent), { isSignal: true }] }], section: [{ type: i0.Input, args: [{ isSignal: true, alias: "section", required: true }] }], expandedInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], elementExtensions: [{ type: i0.Input, args: [{ isSignal: true, alias: "elementExtensions", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], skipExpand: [{ type: i0.Input, args: [{ isSignal: true, alias: "skipExpand", required: false }] }], skipTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "skipTitle", required: false }] }], statusChanged: [{ type: i0.Output, args: ["statusChanged"] }] } });
423
444
 
424
445
  class ObjectMetadataComponent {
425
446
  constructor() {
@@ -746,7 +767,7 @@ class ObjectMetadataComponent {
746
767
  // fresh writable signal per <yuv-object-metadata> instance → per-object scope.
747
768
  // Element templates read it (read-only) via the metadata form field context.
748
769
  { provide: OBJECT_CONTEXT, useFactory: () => signal(undefined) }
749
- ], viewQueries: [{ propertyName: "objectForms", predicate: ObjectFormComponent, descendants: true, isSignal: true }, { propertyName: "objectMetadataSectionForms", predicate: ObjectMetadataSectionComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<main [yuvBusyOverlay]=\"busySaving() || busyLoading() || mainFormOptionsIsLoading()\">\n @if (empty()) {\n <p>{{ 'yuv.object-metadata.empty.message' | translate }}</p>\n }\n @if (!mainFormOptions()) {\n <yuv-object-form\n [readonly]=\"!hasWritePermission()\"\n [formOptions]=\"mainFormOptions()\"\n [elementExtensions]=\"elementExtensions()\"\n (statusChanged)=\"onFormStatusChanged('main', $event)\"\n />\n }\n @for (fo of flavorFormOptions(); track $index) {\n <yuv-object-metadata-section\n [readonly]=\"!hasWritePermission()\"\n [section]=\"fo\"\n [elementExtensions]=\"elementExtensions()\"\n [expanded]=\"$index === 0\"\n (statusChanged)=\"onFormStatusChanged(fo.id, $event)\"\n />\n }\n\n <!-- base data -->\n @let object = dmsObject() ?? dmsObject();\n @if (object && !disableBasicMetadata()) {\n <yuv-object-summary-data [dmsObject]=\"object\" />\n }\n</main>\n\n<footer [attr.inert]=\"disableControls() || !controlsVisible() || null\">\n <div class=\"container\">\n <button\n ymtButton=\"secondary\"\n button-size=\"small\"\n [disabled]=\"busySaving() || busyLoading()\"\n (click)=\"resetForm()\"\n [hidden]=\"!combinedFormState?.dirty\"\n [disabled]=\"!combinedFormState?.dirty\"\n >\n {{ 'yuv.object-metadata.button.reset' | translate }}\n </button>\n <button\n ymtButton=\"primary\"\n button-size=\"small\"\n (click)=\"save()\"\n [disabled]=\"!combinedFormState?.dirty || combinedFormState?.invalid || busySaving() || busyLoading()\"\n >\n {{ 'yuv.object-metadata.button.save' | translate }}\n </button>\n </div>\n</footer>\n", styles: [":host{--_object-metadata-panel-background: var(--object-metadata-panel-background, var(--ymt-surface-container-low));--_object-metadata-section-background: var(--object-metadata-section-background, var(--ymt-surface));--_object-metadata-section-corner: var(--object-metadata-section-corner, var(--ymt-corner-m));--_object-metadata-footer-background: var(--object-metadata-footer-background, var(--ymt-surface-container));--_object-metadata-footer-border: 1px solid var(--object-metadata-footer-border, var(--ymt-outline-variant));--_object-metadata-footer-indent: var(--object-metadata-footer-indent, var(--ymt-spacing-xs));--_object-metadata-footer-height: 4rem;--_object-metadata-footer-corner: var(--object-metadata-footer-corner, var(--ymt-corner-s));display:grid;grid-template-rows:1fr auto;grid-template-columns:1fr;height:100%;overflow:hidden;position:relative;background-color:var(--_object-metadata-panel-background)}:host.empty main{justify-content:center;align-items:center}:host.loading main>*{opacity:0}:host main{grid-row:1/span 3;grid-column:1;overflow-y:auto;width:100%;display:flex;flex-flow:column;padding:var(--ymt-spacing-3xl) var(--ymt-spacing-l) var(--_object-metadata-footer-height) var(--ymt-spacing-l)}:host footer{grid-row:-1;grid-column:1;padding:var(--_object-metadata-footer-indent);opacity:0;z-index:101}:host footer .container{background:var(--_object-metadata-footer-background);padding:var(--ymt-spacing-s);display:flex;align-items:center;justify-content:end;gap:var(--ymt-spacing-s);border-radius:var(--_object-metadata-footer-corner);border:var(--_object-metadata-footer-border)}:host footer:not([inert]){animation:controlsAppear .2s ease-in-out forwards}:host main yuv-object-metadata-section{margin-block-end:var(--ymt-spacing-m)}:host main yuv-object-summary-data{background-color:var(--_object-metadata-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner);padding:var(--ymt-spacing-m)}@keyframes controlsAppear{0%{opacity:0;translate:0 var(--ymt-spacing-m)}to{opacity:1;translate:0 0}}\n"], dependencies: [{ kind: "component", type: ObjectFormComponent, selector: "yuv-object-form", inputs: ["formOptions", "inert", "readonly", "elementExtensions", "isInnerTableForm"], outputs: ["statusChanged", "onFormReady"] }, { kind: "component", type: ObjectSummaryDataComponent, selector: "yuv-object-summary-data", inputs: ["dmsObject", "flavors", "showAppliedFlavors"] }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay", "yuvBusyOverlayConfig", "yuvBusyError"], outputs: ["yuvBusyErrorDismiss"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: ObjectMetadataSectionComponent, selector: "yuv-object-metadata-section", inputs: ["section", "expanded", "elementExtensions", "readonly"], outputs: ["statusChanged"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
770
+ ], viewQueries: [{ propertyName: "objectForms", predicate: ObjectFormComponent, descendants: true, isSignal: true }, { propertyName: "objectMetadataSectionForms", predicate: ObjectMetadataSectionComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<main [yuvBusyOverlay]=\"busySaving() || busyLoading() || mainFormOptionsIsLoading()\">\n @if (empty()) {\n <p>{{ 'yuv.object-metadata.empty.message' | translate }}</p>\n }\n @if (!mainFormOptions()) {\n <yuv-object-form\n [readonly]=\"!hasWritePermission()\"\n [formOptions]=\"mainFormOptions()\"\n [elementExtensions]=\"elementExtensions()\"\n (statusChanged)=\"onFormStatusChanged('main', $event)\"\n />\n }\n @for (fo of flavorFormOptions(); track $index) {\n <yuv-object-metadata-section\n [readonly]=\"!hasWritePermission()\"\n [section]=\"fo\"\n [elementExtensions]=\"elementExtensions()\"\n [expanded]=\"$index === 0\"\n (statusChanged)=\"onFormStatusChanged(fo.id, $event)\"\n />\n }\n\n <!-- base data -->\n @let object = dmsObject() ?? dmsObject();\n @if (object && !disableBasicMetadata()) {\n <yuv-object-summary-data [dmsObject]=\"object\" />\n }\n</main>\n\n<footer [attr.inert]=\"disableControls() || !controlsVisible() || null\">\n <div class=\"container\">\n <button\n ymtButton=\"secondary\"\n button-size=\"small\"\n [disabled]=\"busySaving() || busyLoading()\"\n (click)=\"resetForm()\"\n [hidden]=\"!combinedFormState?.dirty\"\n [disabled]=\"!combinedFormState?.dirty\"\n >\n {{ 'yuv.object-metadata.button.reset' | translate }}\n </button>\n <button\n ymtButton=\"primary\"\n button-size=\"small\"\n (click)=\"save()\"\n [disabled]=\"!combinedFormState?.dirty || combinedFormState?.invalid || busySaving() || busyLoading()\"\n >\n {{ 'yuv.object-metadata.button.save' | translate }}\n </button>\n </div>\n</footer>\n", styles: [":host{--_object-metadata-panel-background: var(--object-metadata-panel-background, var(--ymt-surface-container-low));--_object-metadata-section-background: var(--object-metadata-section-background, var(--ymt-surface));--_object-metadata-section-corner: var(--object-metadata-section-corner, var(--ymt-corner-m));--_object-metadata-footer-background: var(--object-metadata-footer-background, var(--ymt-surface-container));--_object-metadata-footer-border: 1px solid var(--object-metadata-footer-border, var(--ymt-outline-variant));--_object-metadata-footer-indent: var(--object-metadata-footer-indent, var(--ymt-spacing-xs));--_object-metadata-footer-height: 4rem;--_object-metadata-footer-corner: var(--object-metadata-footer-corner, var(--ymt-corner-s));display:grid;grid-template-rows:1fr auto;grid-template-columns:1fr;height:100%;overflow:hidden;position:relative;background-color:var(--_object-metadata-panel-background)}:host.empty main{justify-content:center;align-items:center}:host.loading main>*{opacity:0}:host main{grid-row:1/span 3;grid-column:1;overflow-y:auto;width:100%;display:flex;flex-flow:column;padding:var(--ymt-spacing-3xl) var(--ymt-spacing-l) var(--_object-metadata-footer-height) var(--ymt-spacing-l)}:host footer{grid-row:-1;grid-column:1;padding:var(--_object-metadata-footer-indent);opacity:0;z-index:101}:host footer .container{background:var(--_object-metadata-footer-background);padding:var(--ymt-spacing-s);display:flex;align-items:center;justify-content:end;gap:var(--ymt-spacing-s);border-radius:var(--_object-metadata-footer-corner);border:var(--_object-metadata-footer-border)}:host footer:not([inert]){animation:controlsAppear .2s ease-in-out forwards}:host main yuv-object-metadata-section{margin-block-end:var(--ymt-spacing-m)}:host main yuv-object-summary-data{background-color:var(--_object-metadata-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner);padding:var(--ymt-spacing-m)}@keyframes controlsAppear{0%{opacity:0;translate:0 var(--ymt-spacing-m)}to{opacity:1;translate:0 0}}\n"], dependencies: [{ kind: "component", type: ObjectFormComponent, selector: "yuv-object-form", inputs: ["formOptions", "inert", "readonly", "elementExtensions", "isInnerTableForm"], outputs: ["statusChanged", "onFormReady"] }, { kind: "component", type: ObjectSummaryDataComponent, selector: "yuv-object-summary-data", inputs: ["dmsObject", "flavors", "showAppliedFlavors"] }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay", "yuvBusyOverlayConfig", "yuvBusyError"], outputs: ["yuvBusyErrorDismiss"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: ObjectMetadataSectionComponent, selector: "yuv-object-metadata-section", inputs: ["section", "expanded", "elementExtensions", "readonly", "skipExpand", "skipTitle"], outputs: ["statusChanged"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
750
771
  }
751
772
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: ObjectMetadataComponent, decorators: [{
752
773
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-client-framework-object-details.mjs","sources":["../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-audit/object-audit.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-audit/object-audit.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details-header/object-details-header.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details-header/object-details-header.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details-shell/object-details-shell.service.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details-shell/object-details-shell.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details-shell/object-details-shell.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-metadata/object-metadata-section/object-metadata-section.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-metadata/object-metadata-section/object-metadata-section.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-metadata/object-metadata.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-metadata/object-metadata.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details.module.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-metadata/form-section-group.pipe.ts","../../../../../libs/yuuvis/client-framework/object-details/src/yuuvis-client-framework-object-details.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, input, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport {\n AuditEntry,\n AuditQueryResult,\n AuditService,\n DmsObject,\n EventService,\n LocaleDatePipe,\n TranslatePipe,\n YuvEvent,\n YuvEventType\n} from '@yuuvis/client-core';\nimport { BusyOverlayDirective } from '@yuuvis/client-framework/common';\nimport { YUV_ICONS } from '@yuuvis/client-framework/icons';\nimport { AuditRendererDirective } from '@yuuvis/client-framework/renderer';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\nimport { finalize } from 'rxjs';\n\n@Component({\n selector: 'yuv-object-audit',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n LocaleDatePipe,\n BusyOverlayDirective,\n TranslatePipe,\n MatIconModule,\n YmtIconButtonDirective,\n AuditRendererDirective\n ],\n templateUrl: './object-audit.component.html',\n styleUrl: './object-audit.component.scss'\n})\nexport class ObjectAuditComponent {\n readonly #auditService = inject(AuditService);\n readonly #eventService = inject(EventService);\n\n #objectID?: string;\n #objectTypeID?: string;\n\n icons = {\n filter: YUV_ICONS.filter,\n arrowNext: YUV_ICONS.arrowNext\n };\n\n auditsRes = signal<AuditQueryResult | undefined>(undefined);\n // TODO: please recheck that.\n // TODO: Remove this filter once the system:ren:text audit lifecycle planning is complete and the tag's\n // purpose is fully defined.\n // eslint-disable-next-line max-len\n // https://help.optimal-systems.com/yuuvis/Momentum/latest/index.html#_content_renditions_asynchronous_full_text_indexing.html\n items = computed<AuditEntry[]>(() =>\n (this.auditsRes()?.items ?? []).filter((i) => !i.detail.includes('[system:ren:text, 1]'))\n );\n error = signal(false);\n busy = signal(false);\n\n dmsObject = input<DmsObject | undefined>(undefined);\n\n #dmsObjectEffect = effect(() => {\n const dmsObject = this.dmsObject();\n if (!dmsObject) {\n this.#objectID = undefined;\n this.#objectTypeID = undefined;\n this.auditsRes.set(undefined);\n } else if (!this.#objectID || this.#objectID !== dmsObject.id) {\n this.#objectID = dmsObject.id;\n this.#objectTypeID = dmsObject.objectTypeId;\n this.query();\n } else {\n this.query();\n }\n });\n\n /**\n * A list of audits that should not be shown. Use the audit codes (like 100, 301, etc.).\n * This will also disable the corresponding filters.\n */\n skipActions = input<number[]>([]);\n\n /**\n * Whether or not to ignore admin and user separation of audit entries\n */\n allActions = input(false);\n\n get objectID(): string | undefined {\n return this.#objectID;\n }\n\n constructor() {\n this.#eventService\n .on(YuvEventType.DMS_OBJECT_UPDATED)\n .pipe(takeUntilDestroyed())\n .subscribe((event: YuvEvent) => {\n const dmsObject = event.data as DmsObject;\n // reload audit entries when update belongs to the current dms object\n if (dmsObject.id === this.objectID) {\n this.query();\n }\n });\n }\n\n /**\n * Execute a query from the search panel.\n */\n query(): void {\n this.#fetchAuditEntries();\n }\n\n goToPage(page: number): void {\n const currentAuditsRes = this.auditsRes();\n if (currentAuditsRes) {\n this.busy.set(true);\n this.#auditService\n .getPage(currentAuditsRes, page)\n .pipe(finalize(() => this.busy.set(false)))\n .subscribe({\n next: (res: AuditQueryResult) => {\n this.auditsRes.set(res);\n },\n error: () => {\n this.#onError();\n }\n });\n }\n }\n\n #onError(): void {\n this.auditsRes.set(undefined);\n this.error.set(true);\n }\n\n #fetchAuditEntries(): void {\n if (!this.#objectID || !this.#objectTypeID) return;\n this.error.set(false);\n this.busy.set(true);\n\n this.#auditService.getAuditEntries(this.#objectID, { skipActions: this.skipActions() }).subscribe({\n next: (res: AuditQueryResult) => {\n this.busy.set(false);\n this.auditsRes.set(res);\n },\n error: () => {\n this.busy.set(false);\n this.#onError();\n }\n });\n }\n}\n","@let auditsResult = auditsRes();\n\n<div\n class=\"yuv-audit\"\n [ngClass]=\"{ singleEntry: auditsResult?.items?.length === 1, onPage: auditsResult && auditsResult.page > 1 }\"\n [yuvBusyOverlay]=\"busy()\"\n [attr.aria-busy]=\"busy()\"\n>\n @if (error()) {\n <div class=\"error\" role=\"alert\">\n <div>{{ 'yuv.audit.fetch.error' | translate }}</div>\n </div>\n }\n\n @if (auditsResult) {\n <!-- list of audits -->\n @let resItems = items();\n @if (resItems.length) {\n <ul class=\"timeline\" [attr.aria-label]=\"'yuv.audit.timeline' | translate\">\n @for (item of resItems; track item.creationDate + '-' + item.action) {\n <li\n class=\"audit\"\n [attr.aria-labelledby]=\"'date-' + $index + ' content-' + $index + ' version-' + $index + ' creator-' + $index\"\n >\n <time [attr.datetime]=\"item.creationDate\" [id]=\"'date-' + $index\" class=\"date\">{{ item.creationDate | localeDate }}</time>\n <div class=\"node\">\n <div class=\"label\">\n <div class=\"content\" [id]=\"'content-' + $index\"><ng-container [yuvAuditRenderer]=\"item\" /></div>\n <span class=\"version\" [id]=\"'version-' + $index\">{{ 'yuv.audit.label.version' | translate: { version: item.version } }}</span>\n </div>\n <div class=\"creator meta\" [id]=\"'creator-' + $index\">{{ item.createdBy.title }}</div>\n </div>\n </li>\n }\n </ul>\n } @else {\n <div class=\"empty\" role=\"status\" translate>yuv.audit.result.empty</div>\n }\n\n <!-- controls -->\n @if (auditsResult.hasMoreItems || auditsResult.page > 1) {\n <div class=\"footer\" yuvOfflineDisabled>\n <nav class=\"paging\" [attr.aria-label]=\"'yuv.audit.label.paging' | translate\">\n <button\n ymtIconButton\n [attr.aria-label]=\"'yuv.audit.label.paging.prev' | translate\"\n [disabled]=\"auditsResult.page === 1\"\n (click)=\"goToPage(auditsResult.page - 1)\"\n >\n <mat-icon aria-hidden=\"true\">chevron_left</mat-icon>\n </button>\n <div\n class=\"page\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'yuv.audit.label.paging.current' | translate: { page: auditsResult.page }\"\n >\n <span aria-hidden=\"true\">{{ auditsResult.page }}</span>\n </div>\n <button\n ymtIconButton\n [attr.aria-label]=\"'yuv.audit.label.paging.next' | translate\"\n [disabled]=\"!auditsResult.hasMoreItems\"\n (click)=\"goToPage(auditsResult.page + 1)\"\n >\n <mat-icon aria-hidden=\"true\">chevron_right</mat-icon>\n </button>\n </nav>\n </div>\n }\n }\n</div>\n","\nimport { ChangeDetectionStrategy, Component, computed, inject, input, TemplateRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DmsObject, EventService, ObjectConfigService, VirtualObjectType, YuvEventType } from '@yuuvis/client-core';\nimport { RendererDirective, RendererDirectiveInput } from '@yuuvis/client-framework/renderer';\nimport { YmtPanesModule } from '@yuuvis/material/panes';\n\ninterface HeaderData {\n title: RendererDirectiveInput;\n description?: RendererDirectiveInput;\n icon: string;\n}\n\n/**\n * Component showing header data for a dms object. These will be\n * generated from the object config for the given object.\n *\n * You could inject a set of actions into the headers actions slot\n * by adding them to the components body:\n *\n * ```html\n * <yuv-object-details-header [dmsObject]=\"obj\">\n * <ng-template #yuvHeaderActions>...</ng-template>\n * </yuv-object-details-header>\n * ```\n */\n@Component({\n selector: 'yuv-object-details-header',\n imports: [MatIconModule, YmtPanesModule, RendererDirective],\n templateUrl: './object-details-header.component.html',\n styleUrl: './object-details-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ObjectDetailsHeaderComponent {\n #objectConfig = inject(ObjectConfigService);\n readonly #eventService = inject(EventService);\n\n dmsObject = input<DmsObject | undefined>(undefined);\n\n /**\n * Virtual object type to use for retrieving header data\n */\n type = input.required<VirtualObjectType>();\n /**\n * Bucket of the object config to retrieve header data from\n */\n bucket = input<string | undefined>(undefined);\n /** Template rendered in the actions area, aligned to the right of the title row. */\n actions = input<TemplateRef<unknown> | undefined>(undefined);\n /** Template rendered in the badges area, aligned to the right of the subtitle row. */\n badges = input<TemplateRef<unknown>>();\n\n headerData = computed<HeaderData | undefined>(() => {\n const object = this.dmsObject();\n const type = this.type();\n\n return object && type ? this.#setHeaderData() : undefined;\n });\n\n constructor() {\n this.#eventService\n .on(YuvEventType.DMS_OBJECT_UPDATED)\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.#setHeaderData());\n }\n\n #setHeaderData(): HeaderData | undefined {\n const object = this.dmsObject();\n if (!object) {\n return undefined;\n } else {\n const roc = this.#objectConfig.getResolvedObjectConfig(object.data, this.type(), this.bucket());\n return {\n title: roc.title,\n description: roc.description,\n icon: roc.icon?.value\n };\n }\n }\n}\n","@let dmsObj = dmsObject();\n@let headerD = headerData();\n@if (dmsObj && headerD) {\n <ymt-pane-header [icon]=\"headerD.icon\" [actions]=\"actions()\" [badges]=\"badges()\">\n <ng-template #yuvPaneHeaderTitle>\n <ng-container *yuvRenderer=\"headerD.title\" />\n </ng-template>\n <ng-template #yuvPaneHeaderSubtitle>\n <ng-container *yuvRenderer=\"headerD.description\" />\n </ng-template>\n </ymt-pane-header>\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { DmsObject, DmsService, TranslateService, Utils } from '@yuuvis/client-core';\nimport { finalize } from 'rxjs';\n\n@Injectable()\nexport class ObjectDetailsShellService {\n id = Utils.uuid();\n #dmsService = inject(DmsService);\n readonly translate = inject(TranslateService);\n\n #dmsObject = signal<DmsObject | undefined>(undefined);\n dmsObject = this.#dmsObject.asReadonly();\n\n contextError = signal<string | undefined>(undefined);\n busy = signal<boolean>(false);\n\n setDmsObject(dmsObject: DmsObject | undefined) {\n this.#dmsObject.set(dmsObject);\n this.contextError.set(undefined);\n }\n\n fetchDmsObject(id: string): void {\n this.busy.set(true);\n this.#dmsService\n .getDmsObject(id)\n .pipe(finalize(() => this.busy.set(false)))\n .subscribe({\n next: (dmsObject) => this.#dmsObject.set(dmsObject),\n error: () => {\n this.#dmsObject.set(undefined);\n this.contextError.set(this.translate.instant('yuv.object-metadata.context.load.error'));\n }\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, inject, input, signal, TemplateRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {\n DmsObject,\n EventService,\n RetentionState,\n VirtualObjectType,\n YuvEvent,\n YuvEventType\n} from '@yuuvis/client-core';\nimport { BusyOverlayDirective } from '@yuuvis/client-framework/common';\nimport { ObjectDetailsHeaderComponent } from '../object-details-header/object-details-header.component';\nimport { ObjectDetailsShellService } from './object-details-shell.service';\n\n/**\n * Wrapper component for details of a dms object. This component\n * provides a header based on the object configuration for the given object.\n * It will also take care of loading the object if you only provide the objects ID.\n */\n@Component({\n selector: 'yuv-object-details-shell',\n standalone: true,\n imports: [ObjectDetailsHeaderComponent, MatTooltipModule, BusyOverlayDirective],\n templateUrl: './object-details-shell.component.html',\n styleUrls: ['./object-details-shell.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ObjectDetailsShellComponent {\n #eventService = inject(EventService);\n #odShellService = inject(ObjectDetailsShellService);\n\n retentionState = signal<RetentionState | undefined>(undefined);\n contextError = this.#odShellService.contextError;\n dmsObject = this.#odShellService.dmsObject;\n busy = this.#odShellService.busy;\n\n /** Template rendered in the actions area, aligned to the right of the title row. */\n actions = input<TemplateRef<unknown> | undefined>(undefined);\n /** Template rendered in the badges area, aligned to the right of the subtitle row. */\n badges = input<TemplateRef<unknown>>();\n /**\n * Virtual object type to use for retrieving header data\n */\n type = input.required<VirtualObjectType>();\n /**\n * Bucket of the object config to retrieve header data from\n */\n bucket = input<string | undefined>(undefined);\n /**\n * Whether to hide the header\n */\n hideHeader = input<boolean>(false);\n\n constructor() {\n this.#eventService\n .on(YuvEventType.DMS_OBJECT_UPDATED, YuvEventType.DMS_OBJECT_DELETED)\n .pipe(takeUntilDestroyed())\n .subscribe((evt: YuvEvent) => {\n switch (evt.type) {\n case YuvEventType.DMS_OBJECT_UPDATED: {\n const obj = evt.data as DmsObject;\n const dmsObj = this.dmsObject();\n if (dmsObj?.id === obj.id) this.#odShellService.setDmsObject(obj);\n break;\n }\n case YuvEventType.DMS_OBJECT_DELETED: {\n if (evt.data?.id === this.dmsObject()?.id) {\n this.#odShellService.setDmsObject(undefined);\n }\n }\n }\n });\n }\n}\n","@let dmsObj = dmsObject();\n@if (dmsObj) {\n @if (!hideHeader()) {\n <yuv-object-details-header\n [dmsObject]=\"dmsObj\"\n [type]=\"type()\"\n [bucket]=\"bucket()\"\n [badges]=\"badges()\"\n [actions]=\"actions()\"\n />\n }\n <div class=\"content\" [yuvBusyOverlay]=\"busy()\">\n <ng-content />\n </div>\n} @else {\n <div class=\"empty\">\n @if (contextError()) {\n <div class=\"error\">{{ contextError() }}</div>\n } @else {\n <!-- EMPTY -->\n }\n </div>\n}\n","\nimport { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, effect, inject, input, linkedSignal, output, signal, untracked, viewChild } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { Situation, SystemService } from '@yuuvis/client-core';\nimport {\n FormStatusChangedEvent,\n IObjectFormElementExtension,\n ObjectFormComponent,\n ObjectFormOptions,\n SotRendererCommand,\n SotRendererContext,\n SotRendererRegistry\n} from '@yuuvis/client-framework/object-form';\nimport { Subject } from 'rxjs';\nimport { ObjectMetadataSectionInput } from './object-metadata-section.interface';\n\n@Component({\n selector: 'yuv-object-metadata-section',\n imports: [MatIconModule, MatProgressSpinnerModule, ObjectFormComponent, NgTemplateOutlet],\n templateUrl: './object-metadata-section.component.html',\n styleUrl: './object-metadata-section.component.scss',\n host: {\n '[class.invalid]': 'customTemplate() ? !!customStatus()?.invalid : objectForm()?.form?.invalid',\n '[class.dirty]': 'customTemplate() ? !!customStatus()?.dirty : objectForm()?.form?.dirty'\n }\n})\nexport class ObjectMetadataSectionComponent {\n #system = inject(SystemService);\n #sotRenderers = inject(SotRendererRegistry);\n\n objectForm = viewChild<ObjectFormComponent>(ObjectFormComponent);\n section = input.required<ObjectMetadataSectionInput>();\n expandedInput = input<boolean>(false, { alias: 'expanded' });\n elementExtensions = input<IObjectFormElementExtension[]>([]);\n readonly = input<boolean>();\n expanded = linkedSignal(this.expandedInput);\n\n busy = signal(false);\n\n // linkedSignal instead of plain signal so that formOptions resets to undefined whenever\n // the section input changes (e.g. a different object is loaded). This ensures the form\n // is reloaded with fresh data for the new section while still allowing .set() mutations\n // (user edits) to persist across collapse/expand cycles within the same section.\n formOptions = linkedSignal<ObjectMetadataSectionInput, ObjectFormOptions | undefined>({\n source: this.section,\n computation: () => undefined\n });\n #formOptionsEffect = effect(() => {\n // Load the object form when the section is first expanded.\n // Don't use rxResource here because it messes with the state of the formOptions.\n const section = this.section();\n const expanded = this.expanded();\n\n // untracked() reads formOptions without adding it as a reactive dependency of this\n // effect (which would cause an infinite loop). The guard ensures we only fetch once\n // per section: subsequent expand cycles reuse the existing formOptions so that any\n // user-edited values are not overwritten with the original section.data.\n if (expanded && !untracked(() => this.formOptions())) {\n this.busy.set(true);\n this.#system.getObjectTypeForm(section.id, section.situation || Situation.EDIT).subscribe({\n next: (formModel) => {\n this.formOptions.set({ formModel, data: section.data || {} });\n this.busy.set(false);\n },\n error: (err) => {\n console.error('Error loading form options', err);\n this.formOptions.set(undefined);\n this.busy.set(false);\n }\n });\n }\n });\n\n statusChanged = output<FormStatusChangedEvent>();\n\n /**\n * A custom SOT renderer registered for this section's SOT id, or undefined when\n * the default schema-driven form should be used.\n */\n customTemplate = computed(() => this.#sotRenderers.getSotTemplate(this.section().id, this.section().situation ?? Situation.EDIT));\n\n /**\n * Last status emitted by a custom renderer. Used to drive the host dirty/invalid\n * classes when the default `yuv-object-form` (and thus `objectForm()`) is absent.\n */\n customStatus = signal<FormStatusChangedEvent | undefined>(undefined);\n\n // Keep the custom renderer mounted once the section has been expanded so user edits\n // persist across collapse/expand cycles (mirrors the default form's `[hidden]` approach).\n #hasExpanded = signal(false);\n #expandTrackEffect = effect(() => {\n if (this.expanded()) this.#hasExpanded.set(true);\n });\n renderCustom = computed(() => !!this.customTemplate() && this.#hasExpanded());\n\n // INBOUND command channel: reset/pristine triggered by the surrounding metadata form.\n #commandSubject = new Subject<SotRendererCommand>();\n\n #setCustomStatus = (evt: FormStatusChangedEvent) => {\n this.customStatus.set(evt);\n this.statusChanged.emit(evt);\n };\n\n sotContext = computed<SotRendererContext>(() => {\n const section = this.section();\n const fo = this.formOptions();\n return {\n sot: section.id,\n situation: section.situation ?? Situation.EDIT,\n readonly: !!this.readonly(),\n formModel: fo?.formModel,\n data: fo?.data ?? section.data ?? {},\n setStatus: this.#setCustomStatus,\n command$: this.#commandSubject.asObservable()\n };\n });\n\n resetForm() {\n if (this.customTemplate()) this.#commandSubject.next({ type: 'reset' });\n else this.objectForm()?.resetForm();\n }\n\n setFormPristine() {\n if (this.customTemplate()) {\n this.#commandSubject.next({ type: 'pristine' });\n this.customStatus.set(undefined);\n } else this.objectForm()?.setFormPristine();\n }\n}\n","@let _section = section();\n@let fo = formOptions();\n\n<h3>\n <button\n type=\"button\"\n [attr.aria-expanded]=\"expanded()\"\n class=\"accordion-trigger\"\n [attr.aria-controls]=\"'sect_' + _section.id\"\n [id]=\"'accordion_' + _section.id\"\n (click)=\"expanded.set(!expanded())\"\n [attr.aria-busy]=\"busy()\"\n >\n @if (_section.icon) {\n @if (_section.svgIcon) {\n <mat-icon [svgIcon]=\"_section.icon\" />\n } @else {\n <mat-icon>{{ _section.icon }}</mat-icon>\n }\n }\n <span>{{ _section.label }}</span>\n @if (busy()) {\n <mat-spinner diameter=\"24\" />\n }\n <mat-icon class=\"arr\">keyboard_arrow_down</mat-icon>\n </button>\n</h3>\n<div\n [id]=\"'sect_' + _section.id\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion_' + _section.id\"\n class=\"accordion-panel\"\n>\n @if (customTemplate()) {\n @if (renderCustom()) {\n <div [hidden]=\"!expanded()\">\n <ng-container *ngTemplateOutlet=\"customTemplate()!; context: { $implicit: sotContext() }\" />\n </div>\n }\n } @else if (fo) {\n <yuv-object-form\n #objectForm\n [hidden]=\"!expanded()\"\n [readonly]=\"readonly()\"\n [formOptions]=\"fo\"\n [elementExtensions]=\"elementExtensions()\"\n (statusChanged)=\"statusChanged.emit($event)\"\n />\n }\n</div>\n","import {\n Component,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n output,\n signal,\n untracked,\n viewChildren,\n WritableSignal\n} from '@angular/core';\nimport { rxResource, toSignal } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport {\n DmsObject,\n DmsService,\n FlavoredDmsObject,\n NotificationService,\n ObjectLockingService,\n ObjectTypeFlavor,\n PendingChangesService,\n Situation,\n SystemService,\n TranslatePipe,\n TranslateService,\n UserService\n} from '@yuuvis/client-core';\nimport { BusyOverlayDirective } from '@yuuvis/client-framework/common';\nimport {\n FormStatusChangedEvent,\n IObjectFormElementExtension,\n ObjectFormComponent,\n ObjectFormOptions\n} from '@yuuvis/client-framework/object-form';\nimport { OBJECT_CONTEXT, ObjectContext } from '@yuuvis/client-framework/metadata-form';\nimport { ObjectSummaryDataComponent } from '@yuuvis/client-framework/object-summary';\nimport { RendererDirectiveInput } from '@yuuvis/client-framework/renderer';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { map, of, Subscription } from 'rxjs';\nimport { ObjectMetadataSectionComponent } from './object-metadata-section/object-metadata-section.component';\n\n@Component({\n selector: 'yuv-object-metadata',\n standalone: true,\n imports: [\n ObjectFormComponent,\n ObjectSummaryDataComponent,\n BusyOverlayDirective,\n TranslatePipe,\n MatButtonModule,\n MatIconModule,\n ReactiveFormsModule,\n ObjectMetadataSectionComponent,\n YmtButtonDirective\n ],\n templateUrl: './object-metadata.component.html',\n styleUrl: './object-metadata.component.scss',\n providers: [\n // fresh writable signal per <yuv-object-metadata> instance → per-object scope.\n // Element templates read it (read-only) via the metadata form field context.\n { provide: OBJECT_CONTEXT, useFactory: () => signal<ObjectContext | undefined>(undefined) }\n ],\n host: {\n '[class.empty]': 'empty()',\n '[class.loading]': 'busyLoading()'\n }\n})\nexport class ObjectMetadataComponent implements OnDestroy {\n #pendingChanges = inject(PendingChangesService);\n #notificationService = inject(NotificationService);\n translate = inject(TranslateService);\n #system = inject(SystemService);\n #dmsService = inject(DmsService);\n #userService = inject(UserService);\n #objectLocking = inject(ObjectLockingService);\n\n user = toSignal(this.#userService.user$);\n hasWritePermission = computed(() => {\n const flavoredDmsObject = this.flavoredDmsObject();\n const dmsObject = this.dmsObject();\n const obj = flavoredDmsObject ? flavoredDmsObject.object : dmsObject;\n const lockState = obj ? this.#objectLocking.getLockState(obj) : undefined;\n const lockedByOther = !!lockState?.locked && !lockState.lockedByCurrentUser;\n\n return lockedByOther ? false : obj?.permissions?.writeIndexData || false;\n });\n\n objectForms = viewChildren<ObjectFormComponent>(ObjectFormComponent);\n objectMetadataSectionForms = viewChildren<ObjectMetadataSectionComponent>(ObjectMetadataSectionComponent);\n\n #pendingTaskId?: string;\n\n #formSubscriptions: Subscription[] = [];\n\n busySaving = signal<boolean>(false);\n busyLoading = signal<boolean>(false);\n disableControls = input<boolean>(false);\n /**\n * Set to 'true' to disable the basic metadata form. This will hide\n * the basic metadata section that shows common object proeperties like\n * creation date, creator, version, etc.\n */\n disableBasicMetadata = input<boolean>(false);\n elementExtensions = input<IObjectFormElementExtension[]>([]);\n controlsVisible = signal<boolean>(false);\n empty = computed(\n () => !this.mainFormOptions() && this.flavorFormOptions().length === 0 && this.disableBasicMetadata()\n );\n\n // state of all individual forms\n #formStates: Map<string, FormStatusChangedEvent> = new Map<string, FormStatusChangedEvent>();\n\n baseData: {\n label: string;\n value: RendererDirectiveInput;\n }[] = [];\n\n /**\n * Form situation, if not set default will be 'EDIT'\n */\n situation = input<Situation>(Situation.EDIT);\n /**\n * Set to 'true' to prevent all metadata from being edited\n */\n formDisabled = signal<boolean>(false);\n\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n dmsObject = linkedSignal(this.dmsObjectInput);\n\n // Read-only OBJECT_CONTEXT is exposed to descendant element templates; the owner\n // keeps the writable handle and mirrors the current object into it. Nulls out when\n // no object is loaded (or the object is switched), so templates reset accordingly.\n #objectContext = inject(OBJECT_CONTEXT) as WritableSignal<ObjectContext | undefined>;\n #objectContextEffect = effect(() => {\n const obj = this.flavoredDmsObject()?.object ?? this.dmsObject();\n this.#objectContext.set(obj ? { id: obj.id, objectTypeId: obj.objectTypeId, data: obj.data } : undefined);\n });\n\n /**\n * @deprecated This input will be removed in the future.\n * Please migrate to using `dmsObject` and `flavors` inputs instead.\n */\n flavoredDmsObject = input<FlavoredDmsObject | undefined>();\n #flavoredDmsObjectEffect = effect(() => {\n const flavoredDmsObject = this.flavoredDmsObject();\n flavoredDmsObject && this.#init(flavoredDmsObject?.object, flavoredDmsObject?.flavors);\n });\n combinedFormState?: FormStatusChangedEvent;\n\n /**\n * Emits the updated `DmsObject` when metadata have been saved.\n */\n indexDataSaved = output<DmsObject>();\n /**\n * Emits the current state of the metadata form.\n */\n statusChanged = output<FormStatusChangedEvent>();\n\n /**\n * @deprecated once input flavoredDmsObject will be removed in the future.\n * this is not used anymore\n *\n */\n #legacyFlavors = signal<ObjectTypeFlavor[] | undefined>(undefined);\n /**\n * @deprecated once input flavoredDmsObject will be removed in the future.\n * this is not used anymore\n *\n */\n #init(object?: DmsObject, flavors?: ObjectTypeFlavor[]) {\n const o = this.dmsObject();\n if (object && (!o || o !== object)) {\n this.#legacyFlavors.set(flavors);\n this.#objectToForm(object);\n }\n if (object) this.dmsObject.set(object);\n }\n\n #mainFormOptionsResource = rxResource<ObjectFormOptions | undefined, DmsObject | undefined>({\n params: this.dmsObject,\n stream: ({ params }) => {\n if (!params) return of(undefined);\n return this.#system.getObjectTypeForms([params.objectTypeId], this.situation()).pipe(\n map((res) =>\n res[params.objectTypeId]\n ? {\n formModel: res[params.objectTypeId],\n data: params.data,\n disabled: this.formDisabled() || !params.permissions?.writeIndexData\n }\n : undefined\n )\n );\n }\n });\n // form of the dms object itself\n mainFormOptions = this.#mainFormOptionsResource.value;\n mainFormOptionsIsLoading = this.#mainFormOptionsResource.isLoading;\n\n flavors = input<ObjectTypeFlavor[] | undefined>(undefined);\n // forms of applied flavors\n flavorFormOptions = computed(() => {\n const object = this.dmsObject();\n const flavors = this.flavors() ?? this.#legacyFlavors();\n const mappedFlavors: Record<string, ObjectTypeFlavor> = (flavors || []).reduce(\n (acc, curr) => ({ ...acc, [curr.sot]: curr }),\n {}\n );\n if (!object) return [];\n return (flavors || [])\n .map((f) => f.sot)\n .map((id) => ({\n id,\n label: this.#system.getLocalizedLabel(id),\n icon: mappedFlavors[id]?.icon,\n svgIcon: mappedFlavors[id]?.svgIcon,\n data: object.data\n }));\n });\n\n /**\n * @deprecated once input flavoredDmsObject will be removed in the future.\n * this is not used anymore\n *\n */\n #objectToForm(object?: DmsObject) {\n if (object) {\n this.busyLoading.set(true);\n\n this.#system.getObjectTypeForms([object.objectTypeId], this.situation()).subscribe({\n next: (res) => {\n this.mainFormOptions.set(\n res[object.objectTypeId]\n ? {\n formModel: res[object.objectTypeId],\n data: object.data,\n disabled: this.formDisabled() || !object.permissions?.writeIndexData\n }\n : undefined\n );\n this.busyLoading.set(false);\n },\n error: () => {\n this.busyLoading.set(false);\n }\n });\n }\n }\n\n /**\n * Removed flavors leave their form section behind, but the matching entry in\n * `#formStates` lingers (a destroyed form emits no final status). Without pruning,\n * `#getCombinedFormState()` keeps merging that stale section's data into the save\n * payload, so the backend receives properties of a secondary object type that is\n * no longer assigned and rejects the update. Re-evaluate the combined state and\n * drop orphaned form states whenever the set of rendered forms changes.\n */\n #pruneFormStatesEffect = effect(() => {\n // track the rendered flavor forms so this re-runs whenever a flavor is added/removed\n this.flavorFormOptions();\n untracked(() => {\n const sizeBefore = this.#formStates.size;\n this.#getCombinedFormState();\n if (this.#formStates.size === sizeBefore) return;\n // a stale state was pruned: realign pending changes, controls and emitted status\n if (this.combinedFormState?.dirty) this.#startPending();\n else this.#finishPending();\n this.controlsVisible.set(!!this.combinedFormState?.dirty);\n if (this.combinedFormState) this.statusChanged.emit(this.combinedFormState);\n });\n });\n\n onFormStatusChanged(formId: string, evt: FormStatusChangedEvent) {\n this.#formStates.set(formId, evt);\n this.#getCombinedFormState();\n if (this.combinedFormState?.dirty) this.#startPending();\n else this.#finishPending();\n this.controlsVisible.set(!!this.combinedFormState?.dirty);\n if (this.combinedFormState) this.statusChanged.emit(this.combinedFormState);\n }\n\n /** IDs of the forms currently rendered: the main object form plus every applied flavor form. */\n #currentFormIds(): Set<string> {\n return new Set<string>(['main', ...this.flavorFormOptions().map((fo) => fo.id)]);\n }\n\n #getCombinedFormState(): FormStatusChangedEvent {\n const validIds = this.#currentFormIds();\n const combinedFormState = {\n dirty: false,\n indexdataChanged: false,\n invalid: false,\n data: {}\n };\n this.#formStates.forEach((s, id) => {\n // drop states of forms that are no longer rendered (e.g. a removed flavor) so\n // their data never reaches the save payload\n if (!validIds.has(id)) {\n this.#formStates.delete(id);\n return;\n }\n if (s.dirty) {\n combinedFormState.dirty = s.dirty;\n }\n if (s.indexdataChanged) {\n combinedFormState.indexdataChanged = s.indexdataChanged;\n }\n if (s.invalid) {\n combinedFormState.invalid = s.invalid;\n }\n combinedFormState.data = { ...combinedFormState.data, ...s.data };\n });\n this.combinedFormState = combinedFormState;\n return this.combinedFormState;\n }\n\n save() {\n // TODO: this.dmsObject should be this.dmsObject() once this.#init() is removed\n const object = this.dmsObject();\n if (object && this.combinedFormState) {\n this.busySaving.set(true);\n this.#dmsService.updateDmsObject(object.id, this.combinedFormState.data).subscribe({\n next: (updatedObject: DmsObject) => {\n this.dmsObject.set(updatedObject);\n this.setFormPristine();\n this.indexDataSaved.emit(updatedObject);\n this.#finishPending();\n this.controlsVisible.set(false);\n this.busySaving.set(false);\n },\n error: (err) => {\n this.#notificationService.error(\n '',\n // this.dmsObject?.title || '',\n err.status === 404\n ? this.translate.instant('yuv.object-metadata.context.load.error')\n : this.translate.instant('yuv.object-metadata.save.error')\n );\n this.controlsVisible.set(false);\n this.busySaving.set(false);\n }\n });\n }\n }\n /**\n * Reset te form to its initial state\n */\n resetForm() {\n if (this.objectForms()?.length) {\n this.objectForms().forEach((f) => f.resetForm());\n }\n\n if (this.objectMetadataSectionForms()?.length) {\n this.objectMetadataSectionForms().forEach((s) => s.resetForm());\n }\n (this.objectForms()?.length || this.objectMetadataSectionForms()?.length) && this.#formStates.clear();\n }\n\n updateFormValue(data: Record<string, unknown>) {\n if (this.objectForms()?.length) {\n this.objectForms().forEach((f) => f.setFormData(data));\n }\n }\n\n setFormPristine() {\n if (this.objectForms()?.length) {\n this.objectForms().forEach((f) => f.setFormPristine());\n }\n if (this.objectMetadataSectionForms()?.length) {\n this.objectMetadataSectionForms().forEach((s) => s.setFormPristine());\n }\n (this.objectForms()?.length || this.objectMetadataSectionForms()?.length) && this.#formStates.clear();\n }\n\n #startPending() {\n // because this method will be called every time the form status changes,\n // pending task will only be started once until it was finished\n if (!this.#pendingChanges.hasPendingTask(this.#pendingTaskId || ' ')) {\n this.#pendingTaskId = this.#pendingChanges.startTask(\n this.translate.instant('yuv.object-metadata.pending-changes.alert')\n );\n }\n }\n\n #finishPending() {\n if (this.#pendingTaskId) this.#pendingChanges.finishTask(this.#pendingTaskId);\n }\n\n ngOnDestroy(): void {\n this.#formSubscriptions.forEach((s) => s.unsubscribe());\n }\n}\n","<main [yuvBusyOverlay]=\"busySaving() || busyLoading() || mainFormOptionsIsLoading()\">\n @if (empty()) {\n <p>{{ 'yuv.object-metadata.empty.message' | translate }}</p>\n }\n @if (!mainFormOptions()) {\n <yuv-object-form\n [readonly]=\"!hasWritePermission()\"\n [formOptions]=\"mainFormOptions()\"\n [elementExtensions]=\"elementExtensions()\"\n (statusChanged)=\"onFormStatusChanged('main', $event)\"\n />\n }\n @for (fo of flavorFormOptions(); track $index) {\n <yuv-object-metadata-section\n [readonly]=\"!hasWritePermission()\"\n [section]=\"fo\"\n [elementExtensions]=\"elementExtensions()\"\n [expanded]=\"$index === 0\"\n (statusChanged)=\"onFormStatusChanged(fo.id, $event)\"\n />\n }\n\n <!-- base data -->\n @let object = dmsObject() ?? dmsObject();\n @if (object && !disableBasicMetadata()) {\n <yuv-object-summary-data [dmsObject]=\"object\" />\n }\n</main>\n\n<footer [attr.inert]=\"disableControls() || !controlsVisible() || null\">\n <div class=\"container\">\n <button\n ymtButton=\"secondary\"\n button-size=\"small\"\n [disabled]=\"busySaving() || busyLoading()\"\n (click)=\"resetForm()\"\n [hidden]=\"!combinedFormState?.dirty\"\n [disabled]=\"!combinedFormState?.dirty\"\n >\n {{ 'yuv.object-metadata.button.reset' | translate }}\n </button>\n <button\n ymtButton=\"primary\"\n button-size=\"small\"\n (click)=\"save()\"\n [disabled]=\"!combinedFormState?.dirty || combinedFormState?.invalid || busySaving() || busyLoading()\"\n >\n {{ 'yuv.object-metadata.button.save' | translate }}\n </button>\n </div>\n</footer>\n","import { Component, effect, inject, input, signal, TemplateRef, untracked } from '@angular/core';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport {\n DmsObject,\n ObjectTypeFlavor,\n TabGuardDirective,\n TranslatePipe,\n UserService,\n VirtualObjectType\n} from '@yuuvis/client-core';\nimport { ObjectPreviewComponent } from '@yuuvis/client-framework/object-preview';\nimport { ObjectAuditComponent } from './object-audit/object-audit.component';\nimport { ObjectDetailsShellComponent } from './object-details-shell/object-details-shell.component';\nimport { ObjectDetailsShellService } from './object-details-shell/object-details-shell.service';\nimport { ObjectMetadataComponent } from './object-metadata/object-metadata.component';\n\n@Component({\n selector: 'yuv-object-details',\n standalone: true,\n imports: [\n TranslatePipe,\n MatTabsModule,\n TabGuardDirective,\n ObjectDetailsShellComponent,\n ObjectPreviewComponent,\n ObjectMetadataComponent,\n ObjectAuditComponent\n ],\n providers: [ObjectDetailsShellService],\n templateUrl: './object-details.component.html',\n styleUrls: ['./object-details.component.scss']\n})\nexport class ObjectDetailsComponent {\n readonly #userService = inject(UserService);\n #odShellService = inject(ObjectDetailsShellService);\n\n isAdvancedUser = this.#userService.isAdvancedUser;\n\n currentUser = signal(this.#userService.getCurrentUser());\n\n /**\n * ID to store the components layout state (splitted tabs, gutter position)\n */\n layoutSettingsID = signal<string | undefined>(undefined);\n\n /**\n * DmsObject to show the details for.\n */\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n dmsObjectInputEffect = effect(() => {\n const o = this.dmsObjectInput();\n if (o) untracked(() => this.#odShellService.setDmsObject(o));\n });\n\n dmsObject = this.#odShellService.dmsObject;\n\n /**\n * Flavors to take into account. These flavors define for example the metadata\n * of an object.\n */\n flavors = input<ObjectTypeFlavor[]>([]);\n\n /**\n * Virtual object type to use for retrieving header data\n */\n type = input.required<VirtualObjectType>();\n\n /**\n * If the object config for the given type has been stored in a certain bucket, this\n * bucket can be provided here. If no bucket is set, the config will be retrieved\n * from the main object config\n */\n objectConfigBucket = input<string | undefined>(undefined);\n /**\n * ID of a DmsObject. The object will be fetched from the backend upfront.\n */\n objectId = input<string | undefined>(undefined);\n #objectIdEffect = effect(() => {\n const oid = this.objectId();\n if (oid) this.#odShellService.fetchDmsObject(oid);\n });\n /**\n * Whether to hide the header\n */\n hideHeader = input<boolean>(false);\n\n actions = input<TemplateRef<any> | undefined>(undefined);\n /** Template rendered in the badges area, aligned to the right of the subtitle row. */\n badges = input<TemplateRef<unknown>>();\n\n onIndexdataSaved(updatedObject: DmsObject) {\n this.#odShellService.setDmsObject(updatedObject);\n }\n\n // versionSelected(version: number) {\n // const nav = ['../..', 'version'];\n // this.#router.navigate([...nav, this.dmsObject?.version], { queryParams: { version }, relativeTo: this.#route });\n // }\n}\n","<yuv-object-details-shell\n [type]=\"type()\"\n [hideHeader]=\"hideHeader()\"\n [bucket]=\"objectConfigBucket()\"\n [actions]=\"actions()\"\n [badges]=\"badges()\"\n>\n @let dmsObj = dmsObject();\n <mat-tab-group yuvTabGuardDisable>\n <!-- content -->\n @if (dmsObj && dmsObj.content) {\n <mat-tab [label]=\"'yuv.object-details.tabs.content.title' | translate\">\n <ng-template matTabContent>\n <yuv-object-preview [dmsObject]=\"dmsObj\" />\n </ng-template>\n </mat-tab>\n }\n\n <!-- indexdata -->\n <mat-tab [label]=\"'yuv.object-metadata.tabs.indexdata.title' | translate\">\n <ng-template matTabContent>\n <yuv-object-metadata\n [dmsObject]=\"dmsObject()\"\n [flavors]=\"flavors()\"\n (indexDataSaved)=\"onIndexdataSaved($event)\"\n />\n </ng-template>\n </mat-tab>\n <!-- history -->\n <mat-tab [label]=\"'yuv.object-metadata.tabs.history.title' | translate\">\n <ng-template matTabContent> <yuv-object-audit [dmsObject]=\"dmsObj\" /> </ng-template\n ></mat-tab>\n </mat-tab-group>\n</yuv-object-details-shell>\n","import { NgModule } from '@angular/core';\nimport { RetentionBadgeComponent } from '@yuuvis/client-framework/common';\nimport { ObjectAuditComponent } from './object-audit/object-audit.component';\nimport { ObjectDetailsHeaderComponent } from './object-details-header/object-details-header.component';\nimport { ObjectDetailsShellComponent } from './object-details-shell/object-details-shell.component';\nimport { ObjectDetailsComponent } from './object-details.component';\nimport { ObjectMetadataSectionComponent } from './object-metadata/object-metadata-section/object-metadata-section.component';\nimport { ObjectMetadataComponent } from './object-metadata/object-metadata.component';\n\nconst cmp = [\n ObjectDetailsComponent,\n ObjectDetailsHeaderComponent,\n ObjectDetailsShellComponent,\n ObjectMetadataComponent,\n ObjectMetadataSectionComponent,\n ObjectAuditComponent,\n RetentionBadgeComponent\n];\n\n@NgModule({\n imports: cmp,\n exports: cmp\n})\nexport class YuvObjectDetailsModule {}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\n@Pipe({\n name: 'formSectionGroup',\n standalone: true \n})\nexport class FormSectionGroupPipe implements PipeTransform {\n transform(form: FormGroup, id: string): FormGroup {\n return form.get(id) as FormGroup;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-client-framework-object-details.mjs","sources":["../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-audit/object-audit.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-audit/object-audit.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details-header/object-details-header.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details-header/object-details-header.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details-shell/object-details-shell.service.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details-shell/object-details-shell.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details-shell/object-details-shell.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-metadata/object-metadata-section/object-metadata-section.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-metadata/object-metadata-section/object-metadata-section.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-metadata/object-metadata.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-metadata/object-metadata.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details.component.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details.component.html","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-details.module.ts","../../../../../libs/yuuvis/client-framework/object-details/src/lib/object-metadata/form-section-group.pipe.ts","../../../../../libs/yuuvis/client-framework/object-details/src/yuuvis-client-framework-object-details.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, inject, input, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport {\n AuditEntry,\n AuditQueryResult,\n AuditService,\n DmsObject,\n EventService,\n LocaleDatePipe,\n TranslatePipe,\n YuvEvent,\n YuvEventType\n} from '@yuuvis/client-core';\nimport { BusyOverlayDirective } from '@yuuvis/client-framework/common';\nimport { YUV_ICONS } from '@yuuvis/client-framework/icons';\nimport { AuditRendererDirective } from '@yuuvis/client-framework/renderer';\nimport { YmtIconButtonDirective } from '@yuuvis/material';\nimport { finalize } from 'rxjs';\n\n@Component({\n selector: 'yuv-object-audit',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n LocaleDatePipe,\n BusyOverlayDirective,\n TranslatePipe,\n MatIconModule,\n YmtIconButtonDirective,\n AuditRendererDirective\n ],\n templateUrl: './object-audit.component.html',\n styleUrl: './object-audit.component.scss'\n})\nexport class ObjectAuditComponent {\n readonly #auditService = inject(AuditService);\n readonly #eventService = inject(EventService);\n\n #objectID?: string;\n #objectTypeID?: string;\n\n icons = {\n filter: YUV_ICONS.filter,\n arrowNext: YUV_ICONS.arrowNext\n };\n\n auditsRes = signal<AuditQueryResult | undefined>(undefined);\n // TODO: please recheck that.\n // TODO: Remove this filter once the system:ren:text audit lifecycle planning is complete and the tag's\n // purpose is fully defined.\n // eslint-disable-next-line max-len\n // https://help.optimal-systems.com/yuuvis/Momentum/latest/index.html#_content_renditions_asynchronous_full_text_indexing.html\n items = computed<AuditEntry[]>(() =>\n (this.auditsRes()?.items ?? []).filter((i) => !i.detail.includes('[system:ren:text, 1]'))\n );\n error = signal(false);\n busy = signal(false);\n\n dmsObject = input<DmsObject | undefined>(undefined);\n\n #dmsObjectEffect = effect(() => {\n const dmsObject = this.dmsObject();\n if (!dmsObject) {\n this.#objectID = undefined;\n this.#objectTypeID = undefined;\n this.auditsRes.set(undefined);\n } else if (!this.#objectID || this.#objectID !== dmsObject.id) {\n this.#objectID = dmsObject.id;\n this.#objectTypeID = dmsObject.objectTypeId;\n this.query();\n } else {\n this.query();\n }\n });\n\n /**\n * A list of audits that should not be shown. Use the audit codes (like 100, 301, etc.).\n * This will also disable the corresponding filters.\n */\n skipActions = input<number[]>([]);\n\n /**\n * Whether or not to ignore admin and user separation of audit entries\n */\n allActions = input(false);\n\n get objectID(): string | undefined {\n return this.#objectID;\n }\n\n constructor() {\n this.#eventService\n .on(YuvEventType.DMS_OBJECT_UPDATED)\n .pipe(takeUntilDestroyed())\n .subscribe((event: YuvEvent) => {\n const dmsObject = event.data as DmsObject;\n // reload audit entries when update belongs to the current dms object\n if (dmsObject.id === this.objectID) {\n this.query();\n }\n });\n }\n\n /**\n * Execute a query from the search panel.\n */\n query(): void {\n this.#fetchAuditEntries();\n }\n\n goToPage(page: number): void {\n const currentAuditsRes = this.auditsRes();\n if (currentAuditsRes) {\n this.busy.set(true);\n this.#auditService\n .getPage(currentAuditsRes, page)\n .pipe(finalize(() => this.busy.set(false)))\n .subscribe({\n next: (res: AuditQueryResult) => {\n this.auditsRes.set(res);\n },\n error: () => {\n this.#onError();\n }\n });\n }\n }\n\n #onError(): void {\n this.auditsRes.set(undefined);\n this.error.set(true);\n }\n\n #fetchAuditEntries(): void {\n if (!this.#objectID || !this.#objectTypeID) return;\n this.error.set(false);\n this.busy.set(true);\n\n this.#auditService.getAuditEntries(this.#objectID, { skipActions: this.skipActions() }).subscribe({\n next: (res: AuditQueryResult) => {\n this.busy.set(false);\n this.auditsRes.set(res);\n },\n error: () => {\n this.busy.set(false);\n this.#onError();\n }\n });\n }\n}\n","@let auditsResult = auditsRes();\n\n<div\n class=\"yuv-audit\"\n [ngClass]=\"{ singleEntry: auditsResult?.items?.length === 1, onPage: auditsResult && auditsResult.page > 1 }\"\n [yuvBusyOverlay]=\"busy()\"\n [attr.aria-busy]=\"busy()\"\n>\n @if (error()) {\n <div class=\"error\" role=\"alert\">\n <div>{{ 'yuv.audit.fetch.error' | translate }}</div>\n </div>\n }\n\n @if (auditsResult) {\n <!-- list of audits -->\n @let resItems = items();\n @if (resItems.length) {\n <ul class=\"timeline\" [attr.aria-label]=\"'yuv.audit.timeline' | translate\">\n @for (item of resItems; track item.creationDate + '-' + item.action) {\n <li\n class=\"audit\"\n [attr.aria-labelledby]=\"'date-' + $index + ' content-' + $index + ' version-' + $index + ' creator-' + $index\"\n >\n <time [attr.datetime]=\"item.creationDate\" [id]=\"'date-' + $index\" class=\"date\">{{ item.creationDate | localeDate }}</time>\n <div class=\"node\">\n <div class=\"label\">\n <div class=\"content\" [id]=\"'content-' + $index\"><ng-container [yuvAuditRenderer]=\"item\" /></div>\n <span class=\"version\" [id]=\"'version-' + $index\">{{ 'yuv.audit.label.version' | translate: { version: item.version } }}</span>\n </div>\n <div class=\"creator meta\" [id]=\"'creator-' + $index\">{{ item.createdBy.title }}</div>\n </div>\n </li>\n }\n </ul>\n } @else {\n <div class=\"empty\" role=\"status\" translate>yuv.audit.result.empty</div>\n }\n\n <!-- controls -->\n @if (auditsResult.hasMoreItems || auditsResult.page > 1) {\n <div class=\"footer\" yuvOfflineDisabled>\n <nav class=\"paging\" [attr.aria-label]=\"'yuv.audit.label.paging' | translate\">\n <button\n ymtIconButton\n [attr.aria-label]=\"'yuv.audit.label.paging.prev' | translate\"\n [disabled]=\"auditsResult.page === 1\"\n (click)=\"goToPage(auditsResult.page - 1)\"\n >\n <mat-icon aria-hidden=\"true\">chevron_left</mat-icon>\n </button>\n <div\n class=\"page\"\n aria-live=\"polite\"\n [attr.aria-label]=\"'yuv.audit.label.paging.current' | translate: { page: auditsResult.page }\"\n >\n <span aria-hidden=\"true\">{{ auditsResult.page }}</span>\n </div>\n <button\n ymtIconButton\n [attr.aria-label]=\"'yuv.audit.label.paging.next' | translate\"\n [disabled]=\"!auditsResult.hasMoreItems\"\n (click)=\"goToPage(auditsResult.page + 1)\"\n >\n <mat-icon aria-hidden=\"true\">chevron_right</mat-icon>\n </button>\n </nav>\n </div>\n }\n }\n</div>\n","\nimport { ChangeDetectionStrategy, Component, computed, inject, input, TemplateRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DmsObject, EventService, ObjectConfigService, VirtualObjectType, YuvEventType } from '@yuuvis/client-core';\nimport { RendererDirective, RendererDirectiveInput } from '@yuuvis/client-framework/renderer';\nimport { YmtPanesModule } from '@yuuvis/material/panes';\n\ninterface HeaderData {\n title: RendererDirectiveInput;\n description?: RendererDirectiveInput;\n icon: string;\n}\n\n/**\n * Component showing header data for a dms object. These will be\n * generated from the object config for the given object.\n *\n * You could inject a set of actions into the headers actions slot\n * by adding them to the components body:\n *\n * ```html\n * <yuv-object-details-header [dmsObject]=\"obj\">\n * <ng-template #yuvHeaderActions>...</ng-template>\n * </yuv-object-details-header>\n * ```\n */\n@Component({\n selector: 'yuv-object-details-header',\n imports: [MatIconModule, YmtPanesModule, RendererDirective],\n templateUrl: './object-details-header.component.html',\n styleUrl: './object-details-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ObjectDetailsHeaderComponent {\n #objectConfig = inject(ObjectConfigService);\n readonly #eventService = inject(EventService);\n\n dmsObject = input<DmsObject | undefined>(undefined);\n\n /**\n * Virtual object type to use for retrieving header data\n */\n type = input.required<VirtualObjectType>();\n /**\n * Bucket of the object config to retrieve header data from\n */\n bucket = input<string | undefined>(undefined);\n /** Template rendered in the actions area, aligned to the right of the title row. */\n actions = input<TemplateRef<unknown> | undefined>(undefined);\n /** Template rendered in the badges area, aligned to the right of the subtitle row. */\n badges = input<TemplateRef<unknown>>();\n\n headerData = computed<HeaderData | undefined>(() => {\n const object = this.dmsObject();\n const type = this.type();\n\n return object && type ? this.#setHeaderData() : undefined;\n });\n\n constructor() {\n this.#eventService\n .on(YuvEventType.DMS_OBJECT_UPDATED)\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.#setHeaderData());\n }\n\n #setHeaderData(): HeaderData | undefined {\n const object = this.dmsObject();\n if (!object) {\n return undefined;\n } else {\n const roc = this.#objectConfig.getResolvedObjectConfig(object.data, this.type(), this.bucket());\n return {\n title: roc.title,\n description: roc.description,\n icon: roc.icon?.value\n };\n }\n }\n}\n","@let dmsObj = dmsObject();\n@let headerD = headerData();\n@if (dmsObj && headerD) {\n <ymt-pane-header [icon]=\"headerD.icon\" [actions]=\"actions()\" [badges]=\"badges()\">\n <ng-template #yuvPaneHeaderTitle>\n <ng-container *yuvRenderer=\"headerD.title\" />\n </ng-template>\n <ng-template #yuvPaneHeaderSubtitle>\n <ng-container *yuvRenderer=\"headerD.description\" />\n </ng-template>\n </ymt-pane-header>\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { DmsObject, DmsService, TranslateService, Utils } from '@yuuvis/client-core';\nimport { finalize } from 'rxjs';\n\n@Injectable()\nexport class ObjectDetailsShellService {\n id = Utils.uuid();\n #dmsService = inject(DmsService);\n readonly translate = inject(TranslateService);\n\n #dmsObject = signal<DmsObject | undefined>(undefined);\n dmsObject = this.#dmsObject.asReadonly();\n\n contextError = signal<string | undefined>(undefined);\n busy = signal<boolean>(false);\n\n setDmsObject(dmsObject: DmsObject | undefined) {\n this.#dmsObject.set(dmsObject);\n this.contextError.set(undefined);\n }\n\n fetchDmsObject(id: string): void {\n this.busy.set(true);\n this.#dmsService\n .getDmsObject(id)\n .pipe(finalize(() => this.busy.set(false)))\n .subscribe({\n next: (dmsObject) => this.#dmsObject.set(dmsObject),\n error: () => {\n this.#dmsObject.set(undefined);\n this.contextError.set(this.translate.instant('yuv.object-metadata.context.load.error'));\n }\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, inject, input, signal, TemplateRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport {\n DmsObject,\n EventService,\n RetentionState,\n VirtualObjectType,\n YuvEvent,\n YuvEventType\n} from '@yuuvis/client-core';\nimport { BusyOverlayDirective } from '@yuuvis/client-framework/common';\nimport { ObjectDetailsHeaderComponent } from '../object-details-header/object-details-header.component';\nimport { ObjectDetailsShellService } from './object-details-shell.service';\n\n/**\n * Wrapper component for details of a dms object. This component\n * provides a header based on the object configuration for the given object.\n * It will also take care of loading the object if you only provide the objects ID.\n */\n@Component({\n selector: 'yuv-object-details-shell',\n standalone: true,\n imports: [ObjectDetailsHeaderComponent, MatTooltipModule, BusyOverlayDirective],\n templateUrl: './object-details-shell.component.html',\n styleUrls: ['./object-details-shell.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ObjectDetailsShellComponent {\n #eventService = inject(EventService);\n #odShellService = inject(ObjectDetailsShellService);\n\n retentionState = signal<RetentionState | undefined>(undefined);\n contextError = this.#odShellService.contextError;\n dmsObject = this.#odShellService.dmsObject;\n busy = this.#odShellService.busy;\n\n /** Template rendered in the actions area, aligned to the right of the title row. */\n actions = input<TemplateRef<unknown> | undefined>(undefined);\n /** Template rendered in the badges area, aligned to the right of the subtitle row. */\n badges = input<TemplateRef<unknown>>();\n /**\n * Virtual object type to use for retrieving header data\n */\n type = input.required<VirtualObjectType>();\n /**\n * Bucket of the object config to retrieve header data from\n */\n bucket = input<string | undefined>(undefined);\n /**\n * Whether to hide the header\n */\n hideHeader = input<boolean>(false);\n\n constructor() {\n this.#eventService\n .on(YuvEventType.DMS_OBJECT_UPDATED, YuvEventType.DMS_OBJECT_DELETED)\n .pipe(takeUntilDestroyed())\n .subscribe((evt: YuvEvent) => {\n switch (evt.type) {\n case YuvEventType.DMS_OBJECT_UPDATED: {\n const obj = evt.data as DmsObject;\n const dmsObj = this.dmsObject();\n if (dmsObj?.id === obj.id) this.#odShellService.setDmsObject(obj);\n break;\n }\n case YuvEventType.DMS_OBJECT_DELETED: {\n if (evt.data?.id === this.dmsObject()?.id) {\n this.#odShellService.setDmsObject(undefined);\n }\n }\n }\n });\n }\n}\n","@let dmsObj = dmsObject();\n@if (dmsObj) {\n @if (!hideHeader()) {\n <yuv-object-details-header\n [dmsObject]=\"dmsObj\"\n [type]=\"type()\"\n [bucket]=\"bucket()\"\n [badges]=\"badges()\"\n [actions]=\"actions()\"\n />\n }\n <div class=\"content\" [yuvBusyOverlay]=\"busy()\">\n <ng-content />\n </div>\n} @else {\n <div class=\"empty\">\n @if (contextError()) {\n <div class=\"error\">{{ contextError() }}</div>\n } @else {\n <!-- EMPTY -->\n }\n </div>\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { Situation, SystemService } from '@yuuvis/client-core';\nimport {\n FormStatusChangedEvent,\n IObjectFormElementExtension,\n ObjectFormComponent,\n ObjectFormOptions,\n SotRendererCommand,\n SotRendererContext,\n SotRendererRegistry\n} from '@yuuvis/client-framework/object-form';\nimport { Subject } from 'rxjs';\nimport { ObjectMetadataSectionInput } from './object-metadata-section.interface';\n\n@Component({\n selector: 'yuv-object-metadata-section',\n imports: [MatIconModule, MatProgressSpinnerModule, ObjectFormComponent, NgTemplateOutlet],\n templateUrl: './object-metadata-section.component.html',\n styleUrl: './object-metadata-section.component.scss',\n host: {\n '[class.invalid]': 'customTemplate() ? !!customStatus()?.invalid : objectForm()?.form?.invalid',\n '[class.dirty]': 'customTemplate() ? !!customStatus()?.dirty : objectForm()?.form?.dirty'\n }\n})\nexport class ObjectMetadataSectionComponent {\n #system = inject(SystemService);\n #sotRenderers = inject(SotRendererRegistry);\n\n objectForm = viewChild<ObjectFormComponent>(ObjectFormComponent);\n section = input.required<ObjectMetadataSectionInput>();\n expandedInput = input<boolean>(false, { alias: 'expanded' });\n elementExtensions = input<IObjectFormElementExtension[]>([]);\n readonly = input<boolean>();\n\n /**\n * When `true`, the section's expand/collapse feature is removed: the content is\n * always visible, cannot be collapsed, and the accordion toggle (arrow) is hidden.\n */\n skipExpand = input<boolean>();\n\n /**\n * When `true`, the section header (title, icon and toggle) is not rendered while the\n * content region is still shown. Typically combined with {@link skipExpand} to display\n * a title-less, always-open section.\n */\n skipTitle = input<boolean>();\n\n expanded = linkedSignal(this.expandedInput);\n\n /**\n * Effective expanded state. When `skipExpand` is set the section is always visible\n * and cannot be collapsed, so it is treated as permanently expanded.\n */\n isExpanded = computed(() => !!this.skipExpand() || this.expanded());\n\n busy = signal(false);\n\n // linkedSignal instead of plain signal so that formOptions resets to undefined whenever\n // the section input changes (e.g. a different object is loaded). This ensures the form\n // is reloaded with fresh data for the new section while still allowing .set() mutations\n // (user edits) to persist across collapse/expand cycles within the same section.\n formOptions = linkedSignal<ObjectMetadataSectionInput, ObjectFormOptions | undefined>({\n source: this.section,\n computation: () => undefined\n });\n #formOptionsEffect = effect(() => {\n // Load the object form when the section is first expanded.\n // Don't use rxResource here because it messes with the state of the formOptions.\n const section = this.section();\n const expanded = this.isExpanded();\n\n // untracked() reads formOptions without adding it as a reactive dependency of this\n // effect (which would cause an infinite loop). The guard ensures we only fetch once\n // per section: subsequent expand cycles reuse the existing formOptions so that any\n // user-edited values are not overwritten with the original section.data.\n if (expanded && !untracked(() => this.formOptions())) {\n this.busy.set(true);\n this.#system.getObjectTypeForm(section.id, section.situation || Situation.EDIT).subscribe({\n next: (formModel) => {\n this.formOptions.set({ formModel, data: section.data || {} });\n this.busy.set(false);\n },\n error: (err) => {\n console.error('Error loading form options', err);\n this.formOptions.set(undefined);\n this.busy.set(false);\n }\n });\n }\n });\n\n statusChanged = output<FormStatusChangedEvent>();\n\n /**\n * A custom SOT renderer registered for this section's SOT id, or undefined when\n * the default schema-driven form should be used.\n */\n customTemplate = computed(() =>\n this.#sotRenderers.getSotTemplate(this.section().id, this.section().situation ?? Situation.EDIT)\n );\n\n /**\n * Last status emitted by a custom renderer. Used to drive the host dirty/invalid\n * classes when the default `yuv-object-form` (and thus `objectForm()`) is absent.\n */\n customStatus = signal<FormStatusChangedEvent | undefined>(undefined);\n\n // Keep the custom renderer mounted once the section has been expanded so user edits\n // persist across collapse/expand cycles (mirrors the default form's `[hidden]` approach).\n #hasExpanded = signal(false);\n #expandTrackEffect = effect(() => {\n if (this.isExpanded()) this.#hasExpanded.set(true);\n });\n renderCustom = computed(() => !!this.customTemplate() && this.#hasExpanded());\n\n // INBOUND command channel: reset/pristine triggered by the surrounding metadata form.\n #commandSubject = new Subject<SotRendererCommand>();\n\n #setCustomStatus = (evt: FormStatusChangedEvent) => {\n this.customStatus.set(evt);\n this.statusChanged.emit(evt);\n };\n\n sotContext = computed<SotRendererContext>(() => {\n const section = this.section();\n const fo = this.formOptions();\n return {\n sot: section.id,\n situation: section.situation ?? Situation.EDIT,\n readonly: !!this.readonly(),\n formModel: fo?.formModel,\n data: fo?.data ?? section.data ?? {},\n setStatus: this.#setCustomStatus,\n command$: this.#commandSubject.asObservable()\n };\n });\n\n toggle() {\n if (this.skipExpand()) return;\n this.expanded.set(!this.expanded());\n }\n\n resetForm() {\n if (this.customTemplate()) this.#commandSubject.next({ type: 'reset' });\n else this.objectForm()?.resetForm();\n }\n\n setFormPristine() {\n if (this.customTemplate()) {\n this.#commandSubject.next({ type: 'pristine' });\n this.customStatus.set(undefined);\n } else this.objectForm()?.setFormPristine();\n }\n}\n","@let _section = section();\n@let fo = formOptions();\n\n@if (!skipTitle()) {\n <h3>\n <button\n type=\"button\"\n [attr.aria-expanded]=\"isExpanded()\"\n class=\"accordion-trigger\"\n [class.non-collapsible]=\"skipExpand()\"\n [attr.aria-controls]=\"'sect_' + _section.id\"\n [id]=\"'accordion_' + _section.id\"\n [disabled]=\"skipExpand()\"\n (click)=\"toggle()\"\n [attr.aria-busy]=\"busy()\"\n >\n @if (_section.icon) {\n @if (_section.svgIcon) {\n <mat-icon [svgIcon]=\"_section.icon\" aria-hidden=\"true\" />\n } @else {\n <mat-icon aria-hidden=\"true\">{{ _section.icon }}</mat-icon>\n }\n }\n <span>{{ _section.label }}</span>\n @if (busy()) {\n <mat-spinner diameter=\"24\" />\n }\n @if (!skipExpand()) {\n <mat-icon class=\"arr\" aria-hidden=\"true\">keyboard_arrow_down</mat-icon>\n }\n </button>\n </h3>\n}\n<div\n [id]=\"'sect_' + _section.id\"\n role=\"region\"\n [attr.aria-labelledby]=\"'accordion_' + _section.id\"\n class=\"accordion-panel\"\n>\n @if (customTemplate()) {\n @if (renderCustom()) {\n <div [hidden]=\"!isExpanded()\">\n <ng-container *ngTemplateOutlet=\"customTemplate()!; context: { $implicit: sotContext() }\" />\n </div>\n }\n } @else if (fo) {\n <yuv-object-form\n #objectForm\n [hidden]=\"!isExpanded()\"\n [readonly]=\"readonly()\"\n [formOptions]=\"fo\"\n [elementExtensions]=\"elementExtensions()\"\n (statusChanged)=\"statusChanged.emit($event)\"\n />\n }\n</div>\n","import {\n Component,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n output,\n signal,\n untracked,\n viewChildren,\n WritableSignal\n} from '@angular/core';\nimport { rxResource, toSignal } from '@angular/core/rxjs-interop';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport {\n DmsObject,\n DmsService,\n FlavoredDmsObject,\n NotificationService,\n ObjectLockingService,\n ObjectTypeFlavor,\n PendingChangesService,\n Situation,\n SystemService,\n TranslatePipe,\n TranslateService,\n UserService\n} from '@yuuvis/client-core';\nimport { BusyOverlayDirective } from '@yuuvis/client-framework/common';\nimport {\n FormStatusChangedEvent,\n IObjectFormElementExtension,\n ObjectFormComponent,\n ObjectFormOptions\n} from '@yuuvis/client-framework/object-form';\nimport { OBJECT_CONTEXT, ObjectContext } from '@yuuvis/client-framework/metadata-form';\nimport { ObjectSummaryDataComponent } from '@yuuvis/client-framework/object-summary';\nimport { RendererDirectiveInput } from '@yuuvis/client-framework/renderer';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { map, of, Subscription } from 'rxjs';\nimport { ObjectMetadataSectionComponent } from './object-metadata-section/object-metadata-section.component';\n\n@Component({\n selector: 'yuv-object-metadata',\n standalone: true,\n imports: [\n ObjectFormComponent,\n ObjectSummaryDataComponent,\n BusyOverlayDirective,\n TranslatePipe,\n MatButtonModule,\n MatIconModule,\n ReactiveFormsModule,\n ObjectMetadataSectionComponent,\n YmtButtonDirective\n ],\n templateUrl: './object-metadata.component.html',\n styleUrl: './object-metadata.component.scss',\n providers: [\n // fresh writable signal per <yuv-object-metadata> instance → per-object scope.\n // Element templates read it (read-only) via the metadata form field context.\n { provide: OBJECT_CONTEXT, useFactory: () => signal<ObjectContext | undefined>(undefined) }\n ],\n host: {\n '[class.empty]': 'empty()',\n '[class.loading]': 'busyLoading()'\n }\n})\nexport class ObjectMetadataComponent implements OnDestroy {\n #pendingChanges = inject(PendingChangesService);\n #notificationService = inject(NotificationService);\n translate = inject(TranslateService);\n #system = inject(SystemService);\n #dmsService = inject(DmsService);\n #userService = inject(UserService);\n #objectLocking = inject(ObjectLockingService);\n\n user = toSignal(this.#userService.user$);\n hasWritePermission = computed(() => {\n const flavoredDmsObject = this.flavoredDmsObject();\n const dmsObject = this.dmsObject();\n const obj = flavoredDmsObject ? flavoredDmsObject.object : dmsObject;\n const lockState = obj ? this.#objectLocking.getLockState(obj) : undefined;\n const lockedByOther = !!lockState?.locked && !lockState.lockedByCurrentUser;\n\n return lockedByOther ? false : obj?.permissions?.writeIndexData || false;\n });\n\n objectForms = viewChildren<ObjectFormComponent>(ObjectFormComponent);\n objectMetadataSectionForms = viewChildren<ObjectMetadataSectionComponent>(ObjectMetadataSectionComponent);\n\n #pendingTaskId?: string;\n\n #formSubscriptions: Subscription[] = [];\n\n busySaving = signal<boolean>(false);\n busyLoading = signal<boolean>(false);\n disableControls = input<boolean>(false);\n /**\n * Set to 'true' to disable the basic metadata form. This will hide\n * the basic metadata section that shows common object proeperties like\n * creation date, creator, version, etc.\n */\n disableBasicMetadata = input<boolean>(false);\n elementExtensions = input<IObjectFormElementExtension[]>([]);\n controlsVisible = signal<boolean>(false);\n empty = computed(\n () => !this.mainFormOptions() && this.flavorFormOptions().length === 0 && this.disableBasicMetadata()\n );\n\n // state of all individual forms\n #formStates: Map<string, FormStatusChangedEvent> = new Map<string, FormStatusChangedEvent>();\n\n baseData: {\n label: string;\n value: RendererDirectiveInput;\n }[] = [];\n\n /**\n * Form situation, if not set default will be 'EDIT'\n */\n situation = input<Situation>(Situation.EDIT);\n /**\n * Set to 'true' to prevent all metadata from being edited\n */\n formDisabled = signal<boolean>(false);\n\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n dmsObject = linkedSignal(this.dmsObjectInput);\n\n // Read-only OBJECT_CONTEXT is exposed to descendant element templates; the owner\n // keeps the writable handle and mirrors the current object into it. Nulls out when\n // no object is loaded (or the object is switched), so templates reset accordingly.\n #objectContext = inject(OBJECT_CONTEXT) as WritableSignal<ObjectContext | undefined>;\n #objectContextEffect = effect(() => {\n const obj = this.flavoredDmsObject()?.object ?? this.dmsObject();\n this.#objectContext.set(obj ? { id: obj.id, objectTypeId: obj.objectTypeId, data: obj.data } : undefined);\n });\n\n /**\n * @deprecated This input will be removed in the future.\n * Please migrate to using `dmsObject` and `flavors` inputs instead.\n */\n flavoredDmsObject = input<FlavoredDmsObject | undefined>();\n #flavoredDmsObjectEffect = effect(() => {\n const flavoredDmsObject = this.flavoredDmsObject();\n flavoredDmsObject && this.#init(flavoredDmsObject?.object, flavoredDmsObject?.flavors);\n });\n combinedFormState?: FormStatusChangedEvent;\n\n /**\n * Emits the updated `DmsObject` when metadata have been saved.\n */\n indexDataSaved = output<DmsObject>();\n /**\n * Emits the current state of the metadata form.\n */\n statusChanged = output<FormStatusChangedEvent>();\n\n /**\n * @deprecated once input flavoredDmsObject will be removed in the future.\n * this is not used anymore\n *\n */\n #legacyFlavors = signal<ObjectTypeFlavor[] | undefined>(undefined);\n /**\n * @deprecated once input flavoredDmsObject will be removed in the future.\n * this is not used anymore\n *\n */\n #init(object?: DmsObject, flavors?: ObjectTypeFlavor[]) {\n const o = this.dmsObject();\n if (object && (!o || o !== object)) {\n this.#legacyFlavors.set(flavors);\n this.#objectToForm(object);\n }\n if (object) this.dmsObject.set(object);\n }\n\n #mainFormOptionsResource = rxResource<ObjectFormOptions | undefined, DmsObject | undefined>({\n params: this.dmsObject,\n stream: ({ params }) => {\n if (!params) return of(undefined);\n return this.#system.getObjectTypeForms([params.objectTypeId], this.situation()).pipe(\n map((res) =>\n res[params.objectTypeId]\n ? {\n formModel: res[params.objectTypeId],\n data: params.data,\n disabled: this.formDisabled() || !params.permissions?.writeIndexData\n }\n : undefined\n )\n );\n }\n });\n // form of the dms object itself\n mainFormOptions = this.#mainFormOptionsResource.value;\n mainFormOptionsIsLoading = this.#mainFormOptionsResource.isLoading;\n\n flavors = input<ObjectTypeFlavor[] | undefined>(undefined);\n // forms of applied flavors\n flavorFormOptions = computed(() => {\n const object = this.dmsObject();\n const flavors = this.flavors() ?? this.#legacyFlavors();\n const mappedFlavors: Record<string, ObjectTypeFlavor> = (flavors || []).reduce(\n (acc, curr) => ({ ...acc, [curr.sot]: curr }),\n {}\n );\n if (!object) return [];\n return (flavors || [])\n .map((f) => f.sot)\n .map((id) => ({\n id,\n label: this.#system.getLocalizedLabel(id),\n icon: mappedFlavors[id]?.icon,\n svgIcon: mappedFlavors[id]?.svgIcon,\n data: object.data\n }));\n });\n\n /**\n * @deprecated once input flavoredDmsObject will be removed in the future.\n * this is not used anymore\n *\n */\n #objectToForm(object?: DmsObject) {\n if (object) {\n this.busyLoading.set(true);\n\n this.#system.getObjectTypeForms([object.objectTypeId], this.situation()).subscribe({\n next: (res) => {\n this.mainFormOptions.set(\n res[object.objectTypeId]\n ? {\n formModel: res[object.objectTypeId],\n data: object.data,\n disabled: this.formDisabled() || !object.permissions?.writeIndexData\n }\n : undefined\n );\n this.busyLoading.set(false);\n },\n error: () => {\n this.busyLoading.set(false);\n }\n });\n }\n }\n\n /**\n * Removed flavors leave their form section behind, but the matching entry in\n * `#formStates` lingers (a destroyed form emits no final status). Without pruning,\n * `#getCombinedFormState()` keeps merging that stale section's data into the save\n * payload, so the backend receives properties of a secondary object type that is\n * no longer assigned and rejects the update. Re-evaluate the combined state and\n * drop orphaned form states whenever the set of rendered forms changes.\n */\n #pruneFormStatesEffect = effect(() => {\n // track the rendered flavor forms so this re-runs whenever a flavor is added/removed\n this.flavorFormOptions();\n untracked(() => {\n const sizeBefore = this.#formStates.size;\n this.#getCombinedFormState();\n if (this.#formStates.size === sizeBefore) return;\n // a stale state was pruned: realign pending changes, controls and emitted status\n if (this.combinedFormState?.dirty) this.#startPending();\n else this.#finishPending();\n this.controlsVisible.set(!!this.combinedFormState?.dirty);\n if (this.combinedFormState) this.statusChanged.emit(this.combinedFormState);\n });\n });\n\n onFormStatusChanged(formId: string, evt: FormStatusChangedEvent) {\n this.#formStates.set(formId, evt);\n this.#getCombinedFormState();\n if (this.combinedFormState?.dirty) this.#startPending();\n else this.#finishPending();\n this.controlsVisible.set(!!this.combinedFormState?.dirty);\n if (this.combinedFormState) this.statusChanged.emit(this.combinedFormState);\n }\n\n /** IDs of the forms currently rendered: the main object form plus every applied flavor form. */\n #currentFormIds(): Set<string> {\n return new Set<string>(['main', ...this.flavorFormOptions().map((fo) => fo.id)]);\n }\n\n #getCombinedFormState(): FormStatusChangedEvent {\n const validIds = this.#currentFormIds();\n const combinedFormState = {\n dirty: false,\n indexdataChanged: false,\n invalid: false,\n data: {}\n };\n this.#formStates.forEach((s, id) => {\n // drop states of forms that are no longer rendered (e.g. a removed flavor) so\n // their data never reaches the save payload\n if (!validIds.has(id)) {\n this.#formStates.delete(id);\n return;\n }\n if (s.dirty) {\n combinedFormState.dirty = s.dirty;\n }\n if (s.indexdataChanged) {\n combinedFormState.indexdataChanged = s.indexdataChanged;\n }\n if (s.invalid) {\n combinedFormState.invalid = s.invalid;\n }\n combinedFormState.data = { ...combinedFormState.data, ...s.data };\n });\n this.combinedFormState = combinedFormState;\n return this.combinedFormState;\n }\n\n save() {\n // TODO: this.dmsObject should be this.dmsObject() once this.#init() is removed\n const object = this.dmsObject();\n if (object && this.combinedFormState) {\n this.busySaving.set(true);\n this.#dmsService.updateDmsObject(object.id, this.combinedFormState.data).subscribe({\n next: (updatedObject: DmsObject) => {\n this.dmsObject.set(updatedObject);\n this.setFormPristine();\n this.indexDataSaved.emit(updatedObject);\n this.#finishPending();\n this.controlsVisible.set(false);\n this.busySaving.set(false);\n },\n error: (err) => {\n this.#notificationService.error(\n '',\n // this.dmsObject?.title || '',\n err.status === 404\n ? this.translate.instant('yuv.object-metadata.context.load.error')\n : this.translate.instant('yuv.object-metadata.save.error')\n );\n this.controlsVisible.set(false);\n this.busySaving.set(false);\n }\n });\n }\n }\n /**\n * Reset te form to its initial state\n */\n resetForm() {\n if (this.objectForms()?.length) {\n this.objectForms().forEach((f) => f.resetForm());\n }\n\n if (this.objectMetadataSectionForms()?.length) {\n this.objectMetadataSectionForms().forEach((s) => s.resetForm());\n }\n (this.objectForms()?.length || this.objectMetadataSectionForms()?.length) && this.#formStates.clear();\n }\n\n updateFormValue(data: Record<string, unknown>) {\n if (this.objectForms()?.length) {\n this.objectForms().forEach((f) => f.setFormData(data));\n }\n }\n\n setFormPristine() {\n if (this.objectForms()?.length) {\n this.objectForms().forEach((f) => f.setFormPristine());\n }\n if (this.objectMetadataSectionForms()?.length) {\n this.objectMetadataSectionForms().forEach((s) => s.setFormPristine());\n }\n (this.objectForms()?.length || this.objectMetadataSectionForms()?.length) && this.#formStates.clear();\n }\n\n #startPending() {\n // because this method will be called every time the form status changes,\n // pending task will only be started once until it was finished\n if (!this.#pendingChanges.hasPendingTask(this.#pendingTaskId || ' ')) {\n this.#pendingTaskId = this.#pendingChanges.startTask(\n this.translate.instant('yuv.object-metadata.pending-changes.alert')\n );\n }\n }\n\n #finishPending() {\n if (this.#pendingTaskId) this.#pendingChanges.finishTask(this.#pendingTaskId);\n }\n\n ngOnDestroy(): void {\n this.#formSubscriptions.forEach((s) => s.unsubscribe());\n }\n}\n","<main [yuvBusyOverlay]=\"busySaving() || busyLoading() || mainFormOptionsIsLoading()\">\n @if (empty()) {\n <p>{{ 'yuv.object-metadata.empty.message' | translate }}</p>\n }\n @if (!mainFormOptions()) {\n <yuv-object-form\n [readonly]=\"!hasWritePermission()\"\n [formOptions]=\"mainFormOptions()\"\n [elementExtensions]=\"elementExtensions()\"\n (statusChanged)=\"onFormStatusChanged('main', $event)\"\n />\n }\n @for (fo of flavorFormOptions(); track $index) {\n <yuv-object-metadata-section\n [readonly]=\"!hasWritePermission()\"\n [section]=\"fo\"\n [elementExtensions]=\"elementExtensions()\"\n [expanded]=\"$index === 0\"\n (statusChanged)=\"onFormStatusChanged(fo.id, $event)\"\n />\n }\n\n <!-- base data -->\n @let object = dmsObject() ?? dmsObject();\n @if (object && !disableBasicMetadata()) {\n <yuv-object-summary-data [dmsObject]=\"object\" />\n }\n</main>\n\n<footer [attr.inert]=\"disableControls() || !controlsVisible() || null\">\n <div class=\"container\">\n <button\n ymtButton=\"secondary\"\n button-size=\"small\"\n [disabled]=\"busySaving() || busyLoading()\"\n (click)=\"resetForm()\"\n [hidden]=\"!combinedFormState?.dirty\"\n [disabled]=\"!combinedFormState?.dirty\"\n >\n {{ 'yuv.object-metadata.button.reset' | translate }}\n </button>\n <button\n ymtButton=\"primary\"\n button-size=\"small\"\n (click)=\"save()\"\n [disabled]=\"!combinedFormState?.dirty || combinedFormState?.invalid || busySaving() || busyLoading()\"\n >\n {{ 'yuv.object-metadata.button.save' | translate }}\n </button>\n </div>\n</footer>\n","import { Component, effect, inject, input, signal, TemplateRef, untracked } from '@angular/core';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport {\n DmsObject,\n ObjectTypeFlavor,\n TabGuardDirective,\n TranslatePipe,\n UserService,\n VirtualObjectType\n} from '@yuuvis/client-core';\nimport { ObjectPreviewComponent } from '@yuuvis/client-framework/object-preview';\nimport { ObjectAuditComponent } from './object-audit/object-audit.component';\nimport { ObjectDetailsShellComponent } from './object-details-shell/object-details-shell.component';\nimport { ObjectDetailsShellService } from './object-details-shell/object-details-shell.service';\nimport { ObjectMetadataComponent } from './object-metadata/object-metadata.component';\n\n@Component({\n selector: 'yuv-object-details',\n standalone: true,\n imports: [\n TranslatePipe,\n MatTabsModule,\n TabGuardDirective,\n ObjectDetailsShellComponent,\n ObjectPreviewComponent,\n ObjectMetadataComponent,\n ObjectAuditComponent\n ],\n providers: [ObjectDetailsShellService],\n templateUrl: './object-details.component.html',\n styleUrls: ['./object-details.component.scss']\n})\nexport class ObjectDetailsComponent {\n readonly #userService = inject(UserService);\n #odShellService = inject(ObjectDetailsShellService);\n\n isAdvancedUser = this.#userService.isAdvancedUser;\n\n currentUser = signal(this.#userService.getCurrentUser());\n\n /**\n * ID to store the components layout state (splitted tabs, gutter position)\n */\n layoutSettingsID = signal<string | undefined>(undefined);\n\n /**\n * DmsObject to show the details for.\n */\n dmsObjectInput = input<DmsObject | undefined>(undefined, { alias: 'dmsObject' });\n dmsObjectInputEffect = effect(() => {\n const o = this.dmsObjectInput();\n if (o) untracked(() => this.#odShellService.setDmsObject(o));\n });\n\n dmsObject = this.#odShellService.dmsObject;\n\n /**\n * Flavors to take into account. These flavors define for example the metadata\n * of an object.\n */\n flavors = input<ObjectTypeFlavor[]>([]);\n\n /**\n * Virtual object type to use for retrieving header data\n */\n type = input.required<VirtualObjectType>();\n\n /**\n * If the object config for the given type has been stored in a certain bucket, this\n * bucket can be provided here. If no bucket is set, the config will be retrieved\n * from the main object config\n */\n objectConfigBucket = input<string | undefined>(undefined);\n /**\n * ID of a DmsObject. The object will be fetched from the backend upfront.\n */\n objectId = input<string | undefined>(undefined);\n #objectIdEffect = effect(() => {\n const oid = this.objectId();\n if (oid) this.#odShellService.fetchDmsObject(oid);\n });\n /**\n * Whether to hide the header\n */\n hideHeader = input<boolean>(false);\n\n actions = input<TemplateRef<any> | undefined>(undefined);\n /** Template rendered in the badges area, aligned to the right of the subtitle row. */\n badges = input<TemplateRef<unknown>>();\n\n onIndexdataSaved(updatedObject: DmsObject) {\n this.#odShellService.setDmsObject(updatedObject);\n }\n\n // versionSelected(version: number) {\n // const nav = ['../..', 'version'];\n // this.#router.navigate([...nav, this.dmsObject?.version], { queryParams: { version }, relativeTo: this.#route });\n // }\n}\n","<yuv-object-details-shell\n [type]=\"type()\"\n [hideHeader]=\"hideHeader()\"\n [bucket]=\"objectConfigBucket()\"\n [actions]=\"actions()\"\n [badges]=\"badges()\"\n>\n @let dmsObj = dmsObject();\n <mat-tab-group yuvTabGuardDisable>\n <!-- content -->\n @if (dmsObj && dmsObj.content) {\n <mat-tab [label]=\"'yuv.object-details.tabs.content.title' | translate\">\n <ng-template matTabContent>\n <yuv-object-preview [dmsObject]=\"dmsObj\" />\n </ng-template>\n </mat-tab>\n }\n\n <!-- indexdata -->\n <mat-tab [label]=\"'yuv.object-metadata.tabs.indexdata.title' | translate\">\n <ng-template matTabContent>\n <yuv-object-metadata\n [dmsObject]=\"dmsObject()\"\n [flavors]=\"flavors()\"\n (indexDataSaved)=\"onIndexdataSaved($event)\"\n />\n </ng-template>\n </mat-tab>\n <!-- history -->\n <mat-tab [label]=\"'yuv.object-metadata.tabs.history.title' | translate\">\n <ng-template matTabContent> <yuv-object-audit [dmsObject]=\"dmsObj\" /> </ng-template\n ></mat-tab>\n </mat-tab-group>\n</yuv-object-details-shell>\n","import { NgModule } from '@angular/core';\nimport { RetentionBadgeComponent } from '@yuuvis/client-framework/common';\nimport { ObjectAuditComponent } from './object-audit/object-audit.component';\nimport { ObjectDetailsHeaderComponent } from './object-details-header/object-details-header.component';\nimport { ObjectDetailsShellComponent } from './object-details-shell/object-details-shell.component';\nimport { ObjectDetailsComponent } from './object-details.component';\nimport { ObjectMetadataSectionComponent } from './object-metadata/object-metadata-section/object-metadata-section.component';\nimport { ObjectMetadataComponent } from './object-metadata/object-metadata.component';\n\nconst cmp = [\n ObjectDetailsComponent,\n ObjectDetailsHeaderComponent,\n ObjectDetailsShellComponent,\n ObjectMetadataComponent,\n ObjectMetadataSectionComponent,\n ObjectAuditComponent,\n RetentionBadgeComponent\n];\n\n@NgModule({\n imports: cmp,\n exports: cmp\n})\nexport class YuvObjectDetailsModule {}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\n@Pipe({\n name: 'formSectionGroup',\n standalone: true \n})\nexport class FormSectionGroupPipe implements PipeTransform {\n transform(form: FormGroup, id: string): FormGroup {\n return form.get(id) as FormGroup;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
@@ -530,7 +530,15 @@ class TileListComponent {
530
530
  // #region Effect Methods
531
531
  this.#flavorEffect = () => {
532
532
  const flavor = this.flavor();
533
- if (flavor)
533
+ // applyFlavor() toggles: calling it again with the flavor that's already applied
534
+ // clears it instead of being a no-op. Guard against re-invoking it for a flavor
535
+ // that's already in effect, otherwise any re-run of this effect with an
536
+ // equivalent-but-unchanged flavor (e.g. a consumer passing a new object reference
537
+ // with the same id on every render) flips appliedFlavor on/off, which re-maps the
538
+ // tiles and re-runs the query-list transformer on every flip — and if that
539
+ // downstream work causes this effect to be scheduled again, the on/off flipping
540
+ // repeats indefinitely instead of settling.
541
+ if (flavor && this.appliedFlavor?.id !== flavor.id)
534
542
  this.applyFlavor(flavor);
535
543
  };
536
544
  /** Bridges the inner query-list busy signal to the `busy` output. */