@yuuvis/client-framework 3.16.0 → 3.17.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.
@@ -53,6 +53,7 @@
53
53
  "yuv.form.element.datetime.calendar.today": "Heute",
54
54
  "yuv.form.element.organization-set.classify.icon.title": "Gruppe",
55
55
  "yuv.form.element.organization.classify.icon.title": "Benutzer",
56
+ "yuv.form.element.organization.freetext.tooltip": "Freitext – kein aufgelöster Benutzer bzw. keine Gruppe",
56
57
  "yuv.form.element.reference.classify.icon.title": "Referenz",
57
58
  "yuv.form.element.reference.open.title": "Referenziertes Objekt öffnen",
58
59
  "yuv.form.element.range-select-date.custom.overlay.button.apply": "Anwenden",
@@ -171,18 +172,14 @@
171
172
  "yuv.smart-search.add-type": "Suchen…",
172
173
  "yuv.smart-search.cancel": "Abbrechen",
173
174
  "yuv.smart-search.combinator.and": "UND",
174
- "yuv.smart-search.combinator.or": "ODER",
175
175
  "yuv.smart-search.combinator.as-well-as": "sowie",
176
+ "yuv.smart-search.combinator.or": "ODER",
176
177
  "yuv.smart-search.condition.edit-aria": "Bedingung bearbeiten: {{label}}",
177
178
  "yuv.smart-search.condition.mark-dynamic": "Als auszufüllendes Feld festlegen",
178
179
  "yuv.smart-search.condition.remove": "Bedingung entfernen",
179
180
  "yuv.smart-search.condition.unmark-dynamic": "Aus auszufüllenden Feldern entfernen",
180
181
  "yuv.smart-search.condition.unset-value": "Kein Wert gesetzt",
181
182
  "yuv.smart-search.confirm": "Bestätigen",
182
- "yuv.smart-search.mode.empty": "Keine auszufüllenden Felder. Markieren Sie Bedingungen mit dem Blitz-Symbol, um sie hier hinzuzufügen.",
183
- "yuv.smart-search.mode.essentials": "Kompakt",
184
- "yuv.smart-search.mode.full": "Vollständige Suche",
185
- "yuv.smart-search.mode.label": "Suchmodus",
186
183
  "yuv.smart-search.date-preset.this-month": "Dieser Monat",
187
184
  "yuv.smart-search.date-preset.this-week": "Diese Woche",
188
185
  "yuv.smart-search.date-preset.this-year": "Dieses Jahr",
@@ -196,6 +193,10 @@
196
193
  "yuv.smart-search.fulltext.scope.metadata": "Nur Metadaten",
197
194
  "yuv.smart-search.fulltext.types.all": "Alle Typen",
198
195
  "yuv.smart-search.fulltext.types.label": "Auf Typen einschränken",
196
+ "yuv.smart-search.mode.empty": "Keine auszufüllenden Felder. Markieren Sie Bedingungen mit dem Blitz-Symbol, um sie hier hinzuzufügen.",
197
+ "yuv.smart-search.mode.essentials": "Kompakt",
198
+ "yuv.smart-search.mode.full": "Vollständige Suche",
199
+ "yuv.smart-search.mode.label": "Suchmodus",
199
200
  "yuv.smart-search.operator.change": "Operator ändern",
200
201
  "yuv.smart-search.operator.empty": "ist leer",
201
202
  "yuv.smart-search.operator.eq-false": "= falsch",
@@ -213,6 +214,7 @@
213
214
  "yuv.sort.tooltip": "Sortieren",
214
215
  "yuv.action.empty.selection": "",
215
216
  "yuv.tile-config.button.close": "Schließen",
217
+ "yuv.tile-config.error.title-required": "Ein Titel-Attribut ist erforderlich. Wählen Sie ein Attribut für den Titel aus.",
216
218
  "yuv.tile-config.button.reset": "Zurücksetzen",
217
219
  "yuv.tile-config.button.save": "Änderungen speichern",
218
220
  "yuv.tile-config.icon-select.pick": "Icon auswählen",
@@ -223,7 +225,6 @@
223
225
  "yuv.tile-config.slot.property.headline": "Attribut",
224
226
  "yuv.tile-config.title": "Trefferlistenkonfiguration für {{bucket}}",
225
227
  "yuv.tile-config.trigger.tooltip": "Trefferlistenkonfiguration",
226
- "yuv.tile-config.warning.empty": "Eine leere Kachel-Konfiguration kann nicht gespeichert werden. Stattdessen wird die Standardkonfiguration verwendet.",
227
228
  "yuv.tile-list.item.actions-menu.button.tooltip": "Aktionsmenü öffnen",
228
229
  "yuv.upload-progress-overlay.error.403": "Sie haben nicht die erforderlichen Berechtigungen, um die Datei hochzuladen.",
229
230
  "yuv.upload-progress-overlay.error.default": "Die Datei konnte nicht hochgeladen werden.",
@@ -38,6 +38,7 @@
38
38
  "yuv.clipboard.text.cut.multiple": "{{count}} elements cut out",
39
39
  "yuv.clipboard.text.cut.single": "1 element cut out",
40
40
  "yuv.calendar.time.label": "Time",
41
+ "yuv.form.element.catalog.option.none": "No selection",
41
42
  "yuv.form.element.data.grid.add-row.button.tooltip": "Add row",
42
43
  "yuv.form.element.data.grid.add.headline": "Add new row",
43
44
  "yuv.form.element.data.grid.edit": "Edit",
@@ -49,10 +50,10 @@
49
50
  "yuv.form.element.data.grid.row.button.actions.tooltip": "Open actions menu",
50
51
  "yuv.form.element.datetime.calendar.cancel": "Cancel",
51
52
  "yuv.form.element.datetime.calendar.select": "Select",
52
- "yuv.form.element.catalog.option.none": "No selection",
53
53
  "yuv.form.element.datetime.calendar.today": "Today",
54
54
  "yuv.form.element.organization-set.classify.icon.title": "Group",
55
55
  "yuv.form.element.organization.classify.icon.title": "User",
56
+ "yuv.form.element.organization.freetext.tooltip": "Free text – not a resolved user or group",
56
57
  "yuv.form.element.reference.classify.icon.title": "Reference",
57
58
  "yuv.form.element.reference.open.title": "Open referenced object",
58
59
  "yuv.form.element.range-select-date.custom.overlay.button.apply": "Apply",
@@ -171,18 +172,14 @@
171
172
  "yuv.smart-search.add-type": "Search...",
172
173
  "yuv.smart-search.cancel": "Cancel",
173
174
  "yuv.smart-search.combinator.and": "AND",
174
- "yuv.smart-search.combinator.or": "OR",
175
175
  "yuv.smart-search.combinator.as-well-as": "as well as",
176
+ "yuv.smart-search.combinator.or": "OR",
176
177
  "yuv.smart-search.condition.edit-aria": "Edit condition: {{label}}",
177
178
  "yuv.smart-search.condition.mark-dynamic": "Make this an input field",
178
179
  "yuv.smart-search.condition.remove": "Remove condition",
179
180
  "yuv.smart-search.condition.unmark-dynamic": "Remove from input fields",
180
181
  "yuv.smart-search.condition.unset-value": "Value not set",
181
182
  "yuv.smart-search.confirm": "Confirm",
182
- "yuv.smart-search.mode.empty": "No input fields available. Mark conditions with the lightning icon to add them here.",
183
- "yuv.smart-search.mode.essentials": "Essentials",
184
- "yuv.smart-search.mode.full": "Full search",
185
- "yuv.smart-search.mode.label": "Search mode",
186
183
  "yuv.smart-search.date-preset.this-month": "This month",
187
184
  "yuv.smart-search.date-preset.this-week": "This week",
188
185
  "yuv.smart-search.date-preset.this-year": "This year",
@@ -196,6 +193,10 @@
196
193
  "yuv.smart-search.fulltext.scope.metadata": "Metadata only",
197
194
  "yuv.smart-search.fulltext.types.all": "All types",
198
195
  "yuv.smart-search.fulltext.types.label": "Limit to types",
196
+ "yuv.smart-search.mode.empty": "No input fields available. Mark conditions with the lightning icon to add them here.",
197
+ "yuv.smart-search.mode.essentials": "Essentials",
198
+ "yuv.smart-search.mode.full": "Full search",
199
+ "yuv.smart-search.mode.label": "Search mode",
199
200
  "yuv.smart-search.operator.change": "Modify operator",
200
201
  "yuv.smart-search.operator.empty": "is empty",
201
202
  "yuv.smart-search.operator.eq-false": "= false",
@@ -213,6 +214,7 @@
213
214
  "yuv.sort.tooltip": "Sort",
214
215
  "yuv.action.empty.selection": "",
215
216
  "yuv.tile-config.button.close": "Close",
217
+ "yuv.tile-config.error.title-required": "A title attribute is required. Select an attribute for the title slot.",
216
218
  "yuv.tile-config.button.reset": "Reset",
217
219
  "yuv.tile-config.button.save": "Save changes",
218
220
  "yuv.tile-config.icon-select.pick": "Select icon",
@@ -223,7 +225,6 @@
223
225
  "yuv.tile-config.slot.property.headline": "Attributes",
224
226
  "yuv.tile-config.title": "Hit list configuration for {{bucket}}",
225
227
  "yuv.tile-config.trigger.tooltip": "Hit list configuration",
226
- "yuv.tile-config.warning.empty": "An empty tile configuration cannot be saved. The default configuration will be used instead.",
227
228
  "yuv.tile-list.item.actions-menu.button.tooltip": "Open actions menu",
228
229
  "yuv.upload-progress-overlay.error.403": "You do not have the required permissions to upload the file.",
229
230
  "yuv.upload-progress-overlay.error.default": "Unable to upload the file.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuuvis/client-framework",
3
- "version": "3.16.0",
3
+ "version": "3.17.0",
4
4
  "author": "OPTIMAL SYSTEMS GmbH <npm@optimal-systems.de>",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -8,16 +8,16 @@
8
8
  "@angular/common": "^21.2.19",
9
9
  "@angular/core": "^21.2.19",
10
10
  "angular-gridster2": "^21.0.1",
11
- "@yuuvis/client-core": "^3.16.0",
12
- "@yuuvis/client-shell-core": "^3.16.0",
13
- "@yuuvis/client-components": "^3.16.0",
11
+ "@yuuvis/client-core": "^3.17.0",
12
+ "@yuuvis/client-shell-core": "^3.17.0",
13
+ "@yuuvis/client-components": "^3.17.0",
14
14
  "ng-dynamic-component": "^10.8.2",
15
15
  "modern-normalize": "^3.0.1"
16
16
  },
17
17
  "dependencies": {
18
18
  "@angular/material": "^21.2.14",
19
19
  "@ngrx/signals": "^21.1.0",
20
- "@yuuvis/material": "^3.16.0",
20
+ "@yuuvis/material": "^3.17.0",
21
21
  "@yuuvis/media-viewer": "^4.0.0",
22
22
  "angular-split": "^20.0.0",
23
23
  "vis-network": "^10.0.2",
@@ -38,6 +38,13 @@ declare class BadgeChipComponent {
38
38
  badge: _angular_core.InputSignal<Badge>;
39
39
  showLabel: _angular_core.InputSignal<boolean>;
40
40
  readonly tooltip: _angular_core.Signal<string>;
41
+ /**
42
+ * Accessible name for the icon-only variant. Without a label the chip renders nothing
43
+ * but an inert icon, so assistive technology has no name to announce — the tooltip is
44
+ * a description, not a name, and it is mouse-only anyway. When the label is visible it
45
+ * already names the chip, so no override is set.
46
+ */
47
+ readonly ariaLabel: _angular_core.Signal<string | null>;
41
48
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BadgeChipComponent, never>;
42
49
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<BadgeChipComponent, "yuv-badge-chip", never, { "badge": { "alias": "badge"; "required": true; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
43
50
  }
@@ -66,7 +66,6 @@ declare class DataGridComponent implements ControlValueAccessor, Validator {
66
66
  selectedRow: _angular_core.WritableSignal<unknown>;
67
67
  isRequired: boolean;
68
68
  isInvalid: boolean;
69
- initalTableUpdate: boolean;
70
69
  icons: {
71
70
  add: any;
72
71
  more: any;
@@ -79,11 +78,16 @@ declare class DataGridComponent implements ControlValueAccessor, Validator {
79
78
  removeRow(element: any): void;
80
79
  propagateChange: (value: any) => void;
81
80
  onTouched: () => void;
81
+ /**
82
+ * Model → view only. Renders the incoming value (row objects or 2D arrays,
83
+ * which are converted via the column definitions) into the table. Never
84
+ * propagates back to the model — programmatic writes (setValue/patchValue/
85
+ * reset) and rebinds must not change the control's value or dirty state.
86
+ */
82
87
  writeValue(obj: any): void;
83
88
  registerOnChange(fn: any): void;
84
89
  registerOnTouched(fn: any): void;
85
90
  setDisabledState?(isDisabled: boolean): void;
86
- onValueChange(e: any): void;
87
91
  validate(control: ObjectFormControl): null;
88
92
  onHostFocusOut(ev: FocusEvent): void;
89
93
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataGridComponent, never>;
@@ -430,7 +434,9 @@ declare class OrganizationSetComponent extends AbstractMatFormField<string | str
430
434
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<OrganizationSetComponent, "yuv-organization-set", never, { "situation": { "alias": "situation"; "required": false; "isSignal": true; }; "multiselect": { "alias": "multiselect"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "withMetadata": { "alias": "withMetadata"; "required": false; "isSignal": true; }; "autocompleteMinLength": { "alias": "autocompleteMinLength"; "required": false; "isSignal": true; }; "classifications": { "alias": "classifications"; "required": false; "isSignal": true; }; "types": { "alias": "types"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
431
435
  }
432
436
 
433
- type OrganizationNode = OrganizationSetEntry & {
437
+ type OrganizationNode = Omit<OrganizationSetEntry, 'type'> & {
438
+ /** `text` marks a value typed by the user rather than resolved against IDM. */
439
+ type: 'user' | 'role' | 'text';
434
440
  notFound?: boolean;
435
441
  };
436
442
  type FormControlValue = string | {
@@ -441,21 +447,28 @@ type FormControlValue = string | {
441
447
  * Creates form input for organization values.
442
448
  *
443
449
  * @example
444
- * <yuv-organization [multiselect]="true"></yuv-organization>
450
+ * <yuv-organization [multiselect]="true" />
445
451
  */
446
452
  declare class OrganizationComponent extends AbstractMatFormField<FormControlValue | FormControlValue[] | undefined> implements ControlValueAccessor, OnInit, OnDestroy {
447
453
  #private;
448
454
  readonly translate: TranslateService;
449
455
  minLength: number;
450
456
  busy: _angular_core.WritableSignal<boolean>;
457
+ /**
458
+ * ENTER only — organization titles contain commas (`Lastname, Firstname (username)`),
459
+ * so committing free text on COMMA would split a typed name into two chips.
460
+ */
461
+ readonly separatorKeys: number[];
451
462
  acFormControl: FormControl<AutocompleteItem<unknown> | AutocompleteItem<unknown>[] | null | undefined>;
452
463
  ngControl: _angular_forms.NgControl | null;
453
464
  _innerValue: OrganizationNode[];
454
- set innerValue(iv: OrganizationNode[]);
465
+ set innerValue(iValue: OrganizationNode[]);
455
466
  get innerValue(): OrganizationNode[];
456
467
  autocompleteRes: AutocompleteItem[];
457
468
  /**
458
- * Possibles values are `EDIT` (default),`SEARCH`,`CREATE`. In search situation validation of the form element will be turned off, so you are able to enter search terms that do not meet the elements validators.
469
+ * Possibles values are `EDIT` (default),`SEARCH`,`CREATE`.
470
+ * In search situation validation of the form element will be turned off,
471
+ * so you are able to enter search terms that do not meet the elements validators.
459
472
  */
460
473
  situation: _angular_core.InputSignal<string | undefined>;
461
474
  /**
@@ -476,18 +489,25 @@ declare class OrganizationComponent extends AbstractMatFormField<FormControlValu
476
489
  * or, if set to false only the ID
477
490
  */
478
491
  withMetadata: _angular_core.InputSignal<boolean>;
492
+ /**
493
+ * Whether or not values that the autocomplete cannot resolve may be entered as free
494
+ * text (default: false). Can also be enabled per field through the `freeText` option
495
+ * of the organization classification, e.g. `id:organization[freeText]`.
496
+ */
497
+ allowFreeText: _angular_core.InputSignal<boolean>;
498
+ freeText: _angular_core.Signal<boolean>;
479
499
  propagateChange: (_: any) => void;
480
500
  writeValue(value: string | string[]): void;
481
501
  registerOnChange(fn: any): void;
482
502
  registerOnTouched(fn: any): void;
483
- private propagate;
484
503
  setDisabledState?(isDisabled: boolean): void;
485
504
  resolveFn(value: string[]): void;
486
505
  autocompleteFn(query: string): void;
487
506
  ngOnInit(): void;
488
507
  ngOnDestroy(): void;
508
+ private propagate;
489
509
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<OrganizationComponent, never>;
490
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OrganizationComponent, "yuv-organization", never, { "situation": { "alias": "situation"; "required": false; "isSignal": true; }; "multiselect": { "alias": "multiselect"; "required": false; "isSignal": true; }; "classifications": { "alias": "classifications"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "excludeMe": { "alias": "excludeMe"; "required": false; "isSignal": true; }; "withMetadata": { "alias": "withMetadata"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
510
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OrganizationComponent, "yuv-organization", never, { "situation": { "alias": "situation"; "required": false; "isSignal": true; }; "multiselect": { "alias": "multiselect"; "required": false; "isSignal": true; }; "classifications": { "alias": "classifications"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "excludeMe": { "alias": "excludeMe"; "required": false; "isSignal": true; }; "withMetadata": { "alias": "withMetadata"; "required": false; "isSignal": true; }; "allowFreeText": { "alias": "allowFreeText"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
491
511
  }
492
512
 
493
513
  interface RangeSelectDateValue {
@@ -61,6 +61,11 @@ declare class ObjectRelationshipComponent {
61
61
  * viewed but not added or removed.
62
62
  */
63
63
  readonly: _angular_core.InputSignal<boolean>;
64
+ /**
65
+ * Number of relations to load per request. Defaults to the search
66
+ * service's default query size when not set.
67
+ */
68
+ pageSize: _angular_core.InputSignal<number | undefined>;
64
69
  originObject: _angular_core.WritableSignal<DmsObject | null>;
65
70
  supportedRelationships: _angular_core.Signal<Relationship[]>;
66
71
  busy: _angular_core.WritableSignal<boolean>;
@@ -68,7 +73,7 @@ declare class ObjectRelationshipComponent {
68
73
  toggleMode(): void;
69
74
  addRelationship(): void;
70
75
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectRelationshipComponent, never>;
71
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ObjectRelationshipComponent, "yuv-object-relationship", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "objectId": { "alias": "objectId"; "required": true; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "relationActions": { "alias": "relationActions"; "required": false; "isSignal": true; }; }, { "mode": "modeChange"; }, never, never, true, never>;
76
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ObjectRelationshipComponent, "yuv-object-relationship", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "objectId": { "alias": "objectId"; "required": true; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "relationActions": { "alias": "relationActions"; "required": false; "isSignal": true; }; }, { "mode": "modeChange"; }, never, never, true, never>;
72
77
  }
73
78
 
74
79
  declare class YuvObjectRelationshipModule {
@@ -721,6 +721,11 @@ declare class PropertySelectComponent {
721
721
  filteredObjectTypeFields: _angular_core.Signal<TypeProperty[]>;
722
722
  objectTypesEffect: _angular_core.EffectRef;
723
723
  selectedProperty: _angular_core.InputSignal<ObjectConfigProperty | undefined>;
724
+ /**
725
+ * Whether the selected property may be removed from the slot. Mandatory
726
+ * slots (title) disable this so the slot can never be emptied.
727
+ */
728
+ allowRemove: _angular_core.InputSignal<boolean>;
724
729
  propertySelect: _angular_core.OutputEmitterRef<TypeProperty | undefined>;
725
730
  selectProperty(field: TypeProperty): void;
726
731
  selectPropertyOnKeydown(event: Event, field: TypeProperty): void;
@@ -729,7 +734,7 @@ declare class PropertySelectComponent {
729
734
  private getObjectTypeFields;
730
735
  private _getLabel;
731
736
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PropertySelectComponent, never>;
732
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PropertySelectComponent, "yuv-tile-property-select", never, { "objectType": { "alias": "objectType"; "required": false; "isSignal": true; }; "excludeProperties": { "alias": "excludeProperties"; "required": false; "isSignal": true; }; "selectedProperty": { "alias": "selectedProperty"; "required": false; "isSignal": true; }; }, { "propertySelect": "propertySelect"; }, never, never, true, never>;
737
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PropertySelectComponent, "yuv-tile-property-select", never, { "objectType": { "alias": "objectType"; "required": false; "isSignal": true; }; "excludeProperties": { "alias": "excludeProperties"; "required": false; "isSignal": true; }; "selectedProperty": { "alias": "selectedProperty"; "required": false; "isSignal": true; }; "allowRemove": { "alias": "allowRemove"; "required": false; "isSignal": true; }; }, { "propertySelect": "propertySelect"; }, never, never, true, never>;
733
738
  }
734
739
 
735
740
  declare class TileConfigTriggerComponent {
@@ -771,7 +776,13 @@ declare class TileConfigComponent {
771
776
  */
772
777
  excludeProperties: _angular_core.InputSignal<string[]>;
773
778
  get configChanged(): boolean;
774
- get isConfigEmpty(): boolean;
779
+ /**
780
+ * The title slot is mandatory. Edited configs without a title block the
781
+ * save. Entries set to `undefined` mark the stored config for deletion and
782
+ * are always valid.
783
+ */
784
+ get titleMissing(): boolean;
785
+ get titleMissingTypeLabels(): string;
775
786
  types: Signal<InnerType[]>;
776
787
  save: _angular_core.OutputEmitterRef<void>;
777
788
  canceled: _angular_core.OutputEmitterRef<void>;