@yuuvis/client-framework 2.4.4 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/common/lib/components/busy-overlay/busy-overlay.component.d.ts +10 -0
  2. package/common/lib/components/busy-overlay/busy-overlay.interface.d.ts +4 -0
  3. package/common/lib/components/dialog/dialog.component.d.ts +5 -1
  4. package/common/lib/components/index.d.ts +1 -0
  5. package/common/lib/directives/busy-overlay.directive.d.ts +51 -13
  6. package/fesm2022/yuuvis-client-framework-actions.mjs +1 -1
  7. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
  8. package/fesm2022/yuuvis-client-framework-common.mjs +166 -74
  9. package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
  10. package/fesm2022/yuuvis-client-framework-forms.mjs +97 -76
  11. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
  12. package/fesm2022/yuuvis-client-framework-object-details.mjs +28 -32
  13. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
  14. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +2 -2
  15. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
  16. package/fesm2022/yuuvis-client-framework-object-relationship.mjs +3 -3
  17. package/fesm2022/yuuvis-client-framework-object-relationship.mjs.map +1 -1
  18. package/fesm2022/yuuvis-client-framework-object-summary.mjs +1 -1
  19. package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -1
  20. package/fesm2022/yuuvis-client-framework-object-versions.mjs +1 -1
  21. package/fesm2022/yuuvis-client-framework-object-versions.mjs.map +1 -1
  22. package/fesm2022/yuuvis-client-framework-tile-list.mjs +1 -1
  23. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
  24. package/fesm2022/yuuvis-client-framework-widget-grid.mjs +2 -2
  25. package/fesm2022/yuuvis-client-framework-widget-grid.mjs.map +1 -1
  26. package/forms/lib/elements/catalog/catalog.component.d.ts +4 -1
  27. package/forms/lib/elements/data-grid/model/data-grid.interface.d.ts +6 -0
  28. package/forms/lib/elements/organization/organization.component.d.ts +6 -10
  29. package/object-details/lib/object-details-header/object-details-header.component.d.ts +9 -7
  30. package/object-details/lib/object-details-shell/object-details-shell.component.d.ts +3 -1
  31. package/object-details/lib/object-details.component.d.ts +3 -1
  32. package/object-details/lib/object-metadata/object-metadata.component.d.ts +2 -2
  33. package/package.json +16 -16
@@ -13,7 +13,7 @@ import { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';
13
13
  import * as i4 from '@angular/material/table';
14
14
  import { MatTableModule } from '@angular/material/table';
15
15
  import * as i2 from '@yuuvis/client-core';
16
- import { SystemService, Situation, TranslateModule, TranslateService, Operator, OperatorLabel, Utils, LocaleNumberPipe, FileSizePipe, Classification, UserService, IdmService, YuvUser, SearchUtils, LocaleDatePipe, ClassificationPrefix } from '@yuuvis/client-core';
16
+ import { SystemService, Situation, TranslateModule, TranslateService, Operator, OperatorLabel, Utils, LocaleNumberPipe, FileSizePipe, Classification, IdmService, UserService, SearchUtils, LocaleDatePipe, ClassificationPrefix } from '@yuuvis/client-core';
17
17
  import { YUV_ICONS } from '@yuuvis/client-framework/icons';
18
18
  import { MetadataFormFieldComponent, ObjectMetadataElementLabelDirective } from '@yuuvis/client-framework/metadata-form';
19
19
  import { RendererDirective } from '@yuuvis/client-framework/renderer';
@@ -119,7 +119,7 @@ class EditTableDataComponent {
119
119
  useExisting: forwardRef(() => EditTableDataComponent),
120
120
  multi: true
121
121
  }
122
- ], ngImport: i0, template: "<yuv-dialog [headertitel]=\"'yuv.form.element.data.grid.edit.headline' | translate: { headline: header }\">\n <main>\n <div [formGroup]=\"tableForm\">\n <div class=\"fields\">\n @for (element of columns; track $index) {\n <div [attr.data-name]=\"element.name\" class=\"form-field\">\n <yuv-metadata-form-field [field]=\"element\" [formControlName]=\"element.name\" [situation]=\"situation\"></yuv-metadata-form-field>\n </div>\n }\n </div>\n </div>\n </main>\n\n <footer>\n <button ymtButton=\"secondary\" (click)=\"cancel()\">{{ 'yuv.form.element.data.grid.edit.cancel' | translate }}</button>\n <button ymtButton=\"primary\" (click)=\"submit()\" [disabled]=\"!tableForm.dirty || !tableForm.valid\">\n @if (adding) {\n {{ 'yuv.form.element.data.grid.edit.add' | translate }}\n } @else {\n {{ 'yuv.object-metadata.button.save' | translate }}\n }\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host .fields{padding:var(--ymt-spacing-m)}:host .fields .form-field:not(:last-child){margin-block-end:var(--ymt-spacing-s)}:host .err-msg{font:var(--ymt-font-body-subtle);color:var(--ymt-danger);padding:var(--ymt-spacing-2xs) 0;border:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitel"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: MetadataFormFieldComponent, selector: "yuv-metadata-form-field", inputs: ["formChangedSubject", "field", "situation"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
122
+ ], ngImport: i0, template: "<yuv-dialog [headertitel]=\"'yuv.form.element.data.grid.edit.headline' | translate: { headline: header }\">\n <main>\n <div [formGroup]=\"tableForm\">\n <div class=\"fields\">\n @for (element of columns; track $index) {\n <div [attr.data-name]=\"element.name\" class=\"form-field\">\n <yuv-metadata-form-field [field]=\"element\" [formControlName]=\"element.name\" [situation]=\"situation\"></yuv-metadata-form-field>\n </div>\n }\n </div>\n </div>\n </main>\n\n <footer>\n <button ymtButton=\"secondary\" (click)=\"cancel()\">{{ 'yuv.form.element.data.grid.edit.cancel' | translate }}</button>\n <button ymtButton=\"primary\" (click)=\"submit()\" [disabled]=\"!tableForm.dirty || !tableForm.valid\">\n @if (adding) {\n {{ 'yuv.form.element.data.grid.edit.add' | translate }}\n } @else {\n {{ 'yuv.object-metadata.button.save' | translate }}\n }\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host .fields{padding:var(--ymt-spacing-m)}:host .fields .form-field:not(:last-child){margin-block-end:var(--ymt-spacing-s)}:host .err-msg{font:var(--ymt-font-body-subtle);color:var(--ymt-danger);padding:var(--ymt-spacing-2xs) 0;border:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitle", "headertitel"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: MetadataFormFieldComponent, selector: "yuv-metadata-form-field", inputs: ["formChangedSubject", "field", "situation"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
123
123
  }
124
124
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: EditTableDataComponent, decorators: [{
125
125
  type: Component,
@@ -197,7 +197,17 @@ class DataGridComponent {
197
197
  });
198
198
  this.#loadData = effect(() => {
199
199
  const formElement = this.formElement();
200
- untracked(() => formElement && this.#updateTable(formElement['elements'], formElement['value'] || []));
200
+ const elements = formElement ? formElement['elements'] : [];
201
+ let data = formElement ? formElement['value'] || [] : [];
202
+ const columns = elements.map((e) => e.name);
203
+ data = data.map((row) => {
204
+ const obj = {};
205
+ for (let i = 0; i < columns.length; i++) {
206
+ obj[columns[i]] = row[i];
207
+ }
208
+ return obj;
209
+ });
210
+ untracked(() => formElement && this.#updateTable(elements, data));
201
211
  });
202
212
  this.#sourceData = effect(() => {
203
213
  const dataSource = this.dataSource();
@@ -285,6 +295,7 @@ class DataGridComponent {
285
295
  }
286
296
  const displayedColumns = [...this.displayedColumns().map((col) => col.columnDef)];
287
297
  this.displayedColumnsWithActions.set(displayedColumns);
298
+ const cleandColumns = displayedColumns.filter((col) => col !== 'actions');
288
299
  this.dataSource.set(data);
289
300
  }
290
301
  writeValue(obj) {
@@ -999,16 +1010,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
999
1010
  type: Input
1000
1011
  }] } });
1001
1012
 
1002
- // function mapOrginationNode<T extends { id: string; title: string }, U extends { user: { id: string } }>(node: T[], innerValue: U[]) {
1003
- // return node
1004
- // .filter((e) => !innerValue?.some((value) => value.user.id === e.id))
1005
- // .map((user) => ({ label: user.title, value: { user, state: {} } }) as AutocompleteItem);
1006
- // }
1007
- const mapOrginationNode = (innerValue) => map$1((node) => node
1008
- .filter((e) => !innerValue?.some((value) => value.user.id === e.id))
1009
- .map((user) => ({ label: user.title, value: { user, state: {} } })));
1013
+ const mapOrganizationNode = (innerValue) => map$1((node) => node
1014
+ .filter((e) => !innerValue?.some((value) => value?.id === e.id))
1015
+ .map((e) => ({
1016
+ label: e.title,
1017
+ value: {
1018
+ id: e.id,
1019
+ title: e.title,
1020
+ type: 'user' in e ? 'user' : 'role'
1021
+ }
1022
+ })));
1010
1023
  /**
1011
- * Creates form input for organisation values.
1024
+ * Creates form input for organization values.
1012
1025
  *
1013
1026
  * @example
1014
1027
  * <yuv-organization [multiselect]="true"></yuv-organization>
@@ -1017,8 +1030,8 @@ class OrganizationComponent extends AbstractMatFormField {
1017
1030
  constructor() {
1018
1031
  super(...arguments);
1019
1032
  this.#system = inject(SystemService);
1020
- this.#userService = inject(UserService);
1021
1033
  this.#idmService = inject(IdmService);
1034
+ this.#userService = inject(UserService);
1022
1035
  this.#dRef = inject(DestroyRef);
1023
1036
  this.translate = inject(TranslateService);
1024
1037
  this.minLength = 2;
@@ -1038,25 +1051,31 @@ class OrganizationComponent extends AbstractMatFormField {
1038
1051
  /**
1039
1052
  * Additional semantics for the form element.
1040
1053
  */
1041
- this.#organizationType = Classification.STRING_ORGANIZATION;
1054
+ // #organizationType: Classification = Classification.STRING_ORGANIZATION;
1055
+ this.#organizationType = computed(() => {
1056
+ const c = this.classifications();
1057
+ if (c?.length) {
1058
+ const classifications = this.#system.getClassifications(c);
1059
+ if (classifications.has(Classification.STRING_ORGANIZATION_SET)) {
1060
+ return Classification.STRING_ORGANIZATION_SET;
1061
+ }
1062
+ }
1063
+ return Classification.STRING_ORGANIZATION;
1064
+ });
1042
1065
  this.classifications = input(undefined);
1043
1066
  this.#filterRoles = computed(() => {
1067
+ const t = this.#organizationType();
1044
1068
  const c = this.classifications();
1045
1069
  if (c?.length) {
1046
1070
  const classifications = this.#system.getClassifications(c);
1047
- if (classifications.has(Classification.STRING_ORGANIZATION)) {
1048
- this.#organizationType = Classification.STRING_ORGANIZATION;
1071
+ if (t === Classification.STRING_ORGANIZATION) {
1049
1072
  return classifications.get(Classification.STRING_ORGANIZATION).options;
1050
1073
  }
1051
- else if (classifications.has(Classification.STRING_ORGANIZATION_SET)) {
1052
- this.#organizationType = Classification.STRING_ORGANIZATION_SET;
1074
+ else if (t === Classification.STRING_ORGANIZATION_SET) {
1053
1075
  return classifications.get(Classification.STRING_ORGANIZATION_SET).options;
1054
1076
  }
1055
- return [];
1056
- }
1057
- else {
1058
- return [];
1059
1077
  }
1078
+ return [];
1060
1079
  });
1061
1080
  /**
1062
1081
  * Will prevent the input from being changed (default: false)
@@ -1075,8 +1094,8 @@ class OrganizationComponent extends AbstractMatFormField {
1075
1094
  this.propagateChange = (_) => { };
1076
1095
  }
1077
1096
  #system;
1078
- #userService;
1079
1097
  #idmService;
1098
+ #userService;
1080
1099
  #dRef;
1081
1100
  set innerValue(iv) {
1082
1101
  this._innerValue = iv || [];
@@ -1087,13 +1106,14 @@ class OrganizationComponent extends AbstractMatFormField {
1087
1106
  /**
1088
1107
  * Additional semantics for the form element.
1089
1108
  */
1109
+ // #organizationType: Classification = Classification.STRING_ORGANIZATION;
1090
1110
  #organizationType;
1091
1111
  #filterRoles;
1092
1112
  writeValue(value) {
1093
- if (this.#organizationType === Classification.STRING_ORGANIZATION) {
1113
+ if (this.#organizationType() === Classification.STRING_ORGANIZATION) {
1094
1114
  if (value) {
1095
1115
  this.value = value;
1096
- this.resolveFn(value);
1116
+ this.resolveFn(Array.isArray(value) ? value : [value]);
1097
1117
  }
1098
1118
  else {
1099
1119
  this.value = null;
@@ -1101,12 +1121,8 @@ class OrganizationComponent extends AbstractMatFormField {
1101
1121
  }
1102
1122
  }
1103
1123
  else {
1104
- const val = Array.isArray(value) ? value.map((v) => (typeof v === 'string' ? JSON.parse(v) : v)) : value ? [JSON.parse(value)] : [];
1105
- this.innerValue = val;
1106
- this.value = val.map((v) => JSON.stringify(v));
1107
- if (!this.multiselect) {
1108
- this.value = this.value[0] || null;
1109
- }
1124
+ this.value = value;
1125
+ this.resolveFn(Array.isArray(value) ? value : [value]);
1110
1126
  }
1111
1127
  }
1112
1128
  registerOnChange(fn) {
@@ -1127,52 +1143,54 @@ class OrganizationComponent extends AbstractMatFormField {
1127
1143
  }
1128
1144
  }
1129
1145
  #getPropagateValue() {
1130
- const value = this.innerValue.map((v) => (this.withMetadata() ? { id: v.user.id, title: v.user.title } : v.user.id));
1146
+ const value = this.innerValue.map((v) => (this.withMetadata() ? { id: v.id, title: v.title } : v.id));
1131
1147
  return this.multiselect() ? value : value[0];
1132
1148
  }
1133
1149
  resolveFn(value) {
1134
- const obs = (value instanceof Array ? value : [value]).map((v) => {
1135
- const valueID = typeof v === 'string' ? v : v.id;
1136
- const match = this.innerValue.find((iv) => iv.user.id === valueID);
1137
- return match
1138
- ? of(match)
1139
- : this.#userService.getUserById(valueID).pipe(map$1((res) => ({
1140
- user: res,
1141
- state: {}
1142
- })), catchError((e) => {
1143
- const user = new YuvUser({ id: typeof v === 'string' ? v : v.id });
1144
- user.title = typeof v === 'string' ? v : v.title;
1145
- return of({
1146
- user,
1147
- state: {
1148
- notFound: e.status === 404
1149
- },
1150
- titleString: e.status === 404 ? this.translate.instant('yuv.form.element.organization.user.not-found') : undefined
1151
- });
1152
- }));
1153
- });
1154
- return forkJoin(obs).subscribe((data) => {
1150
+ // check if entry is a user
1151
+ const userRegExp = new RegExp('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$');
1152
+ const tasks = value.map((v) => v.match(userRegExp)
1153
+ ? this.#idmService.getUserById(v).pipe(map$1((res) => {
1154
+ return res
1155
+ ? {
1156
+ id: res.id,
1157
+ title: res.title,
1158
+ type: 'user'
1159
+ }
1160
+ : {
1161
+ id: v,
1162
+ title: v,
1163
+ type: 'user',
1164
+ notFound: true
1165
+ };
1166
+ }))
1167
+ : of({
1168
+ id: v,
1169
+ title: v,
1170
+ type: 'role'
1171
+ }));
1172
+ forkJoin(tasks).subscribe((data) => {
1155
1173
  this.innerValue = data;
1156
- const mapped = this.innerValue.map((u) => ({
1157
- label: u.user.title,
1158
- value: u
1174
+ const mapped = this.innerValue.map((n) => ({
1175
+ label: n.title,
1176
+ value: n
1159
1177
  }));
1160
1178
  this.acFormControl.setValue(this.multiselect() ? mapped : [mapped[0]], { emitEvent: false });
1161
1179
  this.acFormControl.updateValueAndValidity({ emitEvent: false });
1162
1180
  });
1163
1181
  }
1164
- #resolveOrgination(query, excludeMe, filterRoles) {
1165
- return this.#userService.queryUser(query, excludeMe, filterRoles).pipe(mapOrginationNode(this.innerValue), catchError(() => of([])));
1182
+ #resolveOrganization(query, excludeMe, filterRoles) {
1183
+ return this.#userService.queryUser(query, excludeMe, filterRoles).pipe(mapOrganizationNode(this.innerValue), catchError(() => of([])));
1166
1184
  }
1167
- #resolveOrginationSet(query, filterRoles) {
1168
- return this.#idmService.queryOrganizationEntity(query, filterRoles).pipe(mapOrginationNode(this.innerValue), catchError(() => of([])));
1185
+ #resolveOrganizationSet(query, filterRoles) {
1186
+ return this.#idmService.queryOrganizationEntity(query, filterRoles).pipe(mapOrganizationNode(this.innerValue), catchError(() => of([])));
1169
1187
  }
1170
1188
  autocompleteFn(query) {
1171
1189
  if (query.length >= this.minLength) {
1172
1190
  this.busy.set(true);
1173
- (this.#organizationType === Classification.STRING_ORGANIZATION
1174
- ? this.#resolveOrgination(query, this.excludeMe(), this.#filterRoles())
1175
- : this.#resolveOrginationSet(query, this.#filterRoles())).subscribe({
1191
+ (this.#organizationType() === Classification.STRING_ORGANIZATION
1192
+ ? this.#resolveOrganization(query, this.excludeMe(), this.#filterRoles())
1193
+ : this.#resolveOrganizationSet(query, this.#filterRoles())).subscribe({
1176
1194
  next: (res) => {
1177
1195
  this.busy.set(false);
1178
1196
  this.autocompleteRes = res;
@@ -1205,11 +1223,11 @@ class OrganizationComponent extends AbstractMatFormField {
1205
1223
  super.onNgOnDestroy();
1206
1224
  }
1207
1225
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: OrganizationComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1208
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: OrganizationComponent, isStandalone: true, selector: "yuv-organization", inputs: { situation: { classPropertyName: "situation", publicName: "situation", isSignal: true, isRequired: false, transformFunction: null }, multiselect: { classPropertyName: "multiselect", publicName: "multiselect", isSignal: true, isRequired: false, transformFunction: null }, classifications: { classPropertyName: "classifications", publicName: "classifications", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, excludeMe: { classPropertyName: "excludeMe", publicName: "excludeMe", isSignal: true, isRequired: false, transformFunction: null }, withMetadata: { classPropertyName: "withMetadata", publicName: "withMetadata", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: MatFormFieldControl, useExisting: OrganizationComponent }], usesInheritance: true, ngImport: i0, template: "<yuv-autocomplete\n [required]=\"required\"\n [busy]=\"busy()\"\n [formControl]=\"acFormControl\"\n #autocomplete\n [placeholder]=\"placeholder\"\n [disabled]=\"readonly()\"\n [autocompleteValues]=\"autocompleteRes\"\n [forceSelection]=\"true\"\n [distinctValues]=\"true\"\n (autocompleteFnc)=\"autocompleteFn($event)\"\n [multiple]=\"true\"\n [maxItems]=\"multiselect() ? -1 : 1\"\n>\n <!-- template for item inside the dropdown -->\n <ng-template #optionTemplate let-item>\n @if (item.value.user) {\n <span class=\"chip\">{{ item.value.user.title }}</span>\n }\n </ng-template>\n\n <!-- template for chip -->\n <ng-template #chipTemplate let-item>\n @if (item.value.user) {\n <span class=\"chip\" [ngClass]=\"{ notFound: item.value.state.notFound }\" [matTooltip]=\"item.value.titleString\">\n {{ item.value.user.title || '...' }}\n </span>\n }\n </ng-template>\n</yuv-autocomplete>\n\n<mat-icon class=\"ymt-icon--size-s\" [matTooltip]=\"'yuv.form.element.organization.classify.icon.title' | translate\">\n {{ multiselect() ? 'group' : 'person' }}\n</mat-icon>\n", styles: [":host{display:flex;align-items:center}:host .chip.notFound{color:var(--ymt-on-danger-container);text-decoration:line-through}:host .chip.notFound:before{content:\"!\";display:inline-block;background-color:var(--ymt-danger-container);color:#fff;border-radius:2px;padding-inline:.3em;text-decoration:none;margin-inline-end:.75em}:host yuv-autocomplete{flex:1}:host mat-icon{color:var(--ymt-text-color-subtle)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: YuvAutocompleteModule }, { kind: "component", type: i3$1.AutocompleteComponent, selector: "yuv-autocomplete", inputs: ["ariaLabel", "busy", "multiple", "distinctValues", "addOnBlur", "minLength", "maxItems", "forceSelection", "autocompleteValues"], outputs: ["autocompleteFnc", "acBlur"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
1226
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: OrganizationComponent, isStandalone: true, selector: "yuv-organization", inputs: { situation: { classPropertyName: "situation", publicName: "situation", isSignal: true, isRequired: false, transformFunction: null }, multiselect: { classPropertyName: "multiselect", publicName: "multiselect", isSignal: true, isRequired: false, transformFunction: null }, classifications: { classPropertyName: "classifications", publicName: "classifications", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, excludeMe: { classPropertyName: "excludeMe", publicName: "excludeMe", isSignal: true, isRequired: false, transformFunction: null }, withMetadata: { classPropertyName: "withMetadata", publicName: "withMetadata", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: MatFormFieldControl, useExisting: OrganizationComponent }], usesInheritance: true, ngImport: i0, template: "<yuv-autocomplete\n [required]=\"required\"\n [busy]=\"busy()\"\n [formControl]=\"acFormControl\"\n #autocomplete\n [placeholder]=\"placeholder\"\n [disabled]=\"readonly()\"\n [autocompleteValues]=\"autocompleteRes\"\n [forceSelection]=\"true\"\n [distinctValues]=\"true\"\n (autocompleteFnc)=\"autocompleteFn($event)\"\n [multiple]=\"true\"\n [maxItems]=\"multiselect() ? -1 : 1\"\n>\n <!-- template for item inside the dropdown -->\n <ng-template #optionTemplate let-item>\n @if (item.value) {\n <span class=\"chip\">{{ item.value.title }}</span>\n }\n </ng-template>\n\n <!-- template for chip -->\n <ng-template #chipTemplate let-item>\n @if (item.value) {\n <span class=\"chip\" [ngClass]=\"{ notFound: item.value.notFound }\" [matTooltip]=\"item.value.titleString\">\n {{ item.value.title || '...' }}\n </span>\n }\n </ng-template>\n</yuv-autocomplete>\n\n<mat-icon class=\"ymt-icon--size-s\" [matTooltip]=\"'yuv.form.element.organization.classify.icon.title' | translate\">\n {{ multiselect() ? 'group' : 'person' }}\n</mat-icon>\n", styles: [":host{display:flex;align-items:center}:host .chip.notFound{color:var(--ymt-on-danger-container);text-decoration:line-through}:host .chip.notFound:before{content:\"!\";display:inline-block;background-color:var(--ymt-danger-container);color:#fff;border-radius:2px;padding-inline:.3em;text-decoration:none;margin-inline-end:.75em}:host yuv-autocomplete{flex:1}:host mat-icon{color:var(--ymt-text-color-subtle)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: YuvAutocompleteModule }, { kind: "component", type: i3$1.AutocompleteComponent, selector: "yuv-autocomplete", inputs: ["ariaLabel", "busy", "multiple", "distinctValues", "addOnBlur", "minLength", "maxItems", "forceSelection", "autocompleteValues"], outputs: ["autocompleteFnc", "acBlur"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] }); }
1209
1227
  }
1210
1228
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: OrganizationComponent, decorators: [{
1211
1229
  type: Component,
1212
- args: [{ selector: 'yuv-organization', standalone: true, imports: [CommonModule, FormsModule, YuvAutocompleteModule, MatTooltipModule, MatIconModule, ReactiveFormsModule, TranslateModule], providers: [{ provide: MatFormFieldControl, useExisting: OrganizationComponent }], template: "<yuv-autocomplete\n [required]=\"required\"\n [busy]=\"busy()\"\n [formControl]=\"acFormControl\"\n #autocomplete\n [placeholder]=\"placeholder\"\n [disabled]=\"readonly()\"\n [autocompleteValues]=\"autocompleteRes\"\n [forceSelection]=\"true\"\n [distinctValues]=\"true\"\n (autocompleteFnc)=\"autocompleteFn($event)\"\n [multiple]=\"true\"\n [maxItems]=\"multiselect() ? -1 : 1\"\n>\n <!-- template for item inside the dropdown -->\n <ng-template #optionTemplate let-item>\n @if (item.value.user) {\n <span class=\"chip\">{{ item.value.user.title }}</span>\n }\n </ng-template>\n\n <!-- template for chip -->\n <ng-template #chipTemplate let-item>\n @if (item.value.user) {\n <span class=\"chip\" [ngClass]=\"{ notFound: item.value.state.notFound }\" [matTooltip]=\"item.value.titleString\">\n {{ item.value.user.title || '...' }}\n </span>\n }\n </ng-template>\n</yuv-autocomplete>\n\n<mat-icon class=\"ymt-icon--size-s\" [matTooltip]=\"'yuv.form.element.organization.classify.icon.title' | translate\">\n {{ multiselect() ? 'group' : 'person' }}\n</mat-icon>\n", styles: [":host{display:flex;align-items:center}:host .chip.notFound{color:var(--ymt-on-danger-container);text-decoration:line-through}:host .chip.notFound:before{content:\"!\";display:inline-block;background-color:var(--ymt-danger-container);color:#fff;border-radius:2px;padding-inline:.3em;text-decoration:none;margin-inline-end:.75em}:host yuv-autocomplete{flex:1}:host mat-icon{color:var(--ymt-text-color-subtle)}\n"] }]
1230
+ args: [{ selector: 'yuv-organization', standalone: true, imports: [CommonModule, FormsModule, YuvAutocompleteModule, MatTooltipModule, MatIconModule, ReactiveFormsModule, TranslateModule], providers: [{ provide: MatFormFieldControl, useExisting: OrganizationComponent }], template: "<yuv-autocomplete\n [required]=\"required\"\n [busy]=\"busy()\"\n [formControl]=\"acFormControl\"\n #autocomplete\n [placeholder]=\"placeholder\"\n [disabled]=\"readonly()\"\n [autocompleteValues]=\"autocompleteRes\"\n [forceSelection]=\"true\"\n [distinctValues]=\"true\"\n (autocompleteFnc)=\"autocompleteFn($event)\"\n [multiple]=\"true\"\n [maxItems]=\"multiselect() ? -1 : 1\"\n>\n <!-- template for item inside the dropdown -->\n <ng-template #optionTemplate let-item>\n @if (item.value) {\n <span class=\"chip\">{{ item.value.title }}</span>\n }\n </ng-template>\n\n <!-- template for chip -->\n <ng-template #chipTemplate let-item>\n @if (item.value) {\n <span class=\"chip\" [ngClass]=\"{ notFound: item.value.notFound }\" [matTooltip]=\"item.value.titleString\">\n {{ item.value.title || '...' }}\n </span>\n }\n </ng-template>\n</yuv-autocomplete>\n\n<mat-icon class=\"ymt-icon--size-s\" [matTooltip]=\"'yuv.form.element.organization.classify.icon.title' | translate\">\n {{ multiselect() ? 'group' : 'person' }}\n</mat-icon>\n", styles: [":host{display:flex;align-items:center}:host .chip.notFound{color:var(--ymt-on-danger-container);text-decoration:line-through}:host .chip.notFound:before{content:\"!\";display:inline-block;background-color:var(--ymt-danger-container);color:#fff;border-radius:2px;padding-inline:.3em;text-decoration:none;margin-inline-end:.75em}:host yuv-autocomplete{flex:1}:host mat-icon{color:var(--ymt-text-color-subtle)}\n"] }]
1213
1231
  }] });
1214
1232
 
1215
1233
  /**
@@ -1391,7 +1409,7 @@ class DateRangePickerComponent {
1391
1409
  this.#dialogRef.close(this.form.value.range);
1392
1410
  }
1393
1411
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: DateRangePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1394
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.15", type: DateRangePickerComponent, isStandalone: true, selector: "yuv-date-range-picker", inputs: { range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rangeChange: "rangeChange" }, ngImport: i0, template: "<yuv-dialog [headertitel]=\"'yuv.form.element.range-select-date.custom.overlay.title' | translate\">\n <main>\n <form id=\"date-range-picker-form\" [formGroup]=\"form\" (ngSubmit)=\"apply()\">\n <yuv-datetime-range [withTime]=\"false\" formControlName=\"range\"></yuv-datetime-range>\n </form>\n </main>\n <footer>\n <button form=\"date-range-picker-form\" ymtButton=\"primary\" [disabled]=\"form.invalid\">\n {{ 'yuv.form.element.range-select-date.custom.overlay.button.apply' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host form{display:grid;grid-template-columns:1fr auto;grid-template-rows:repeat(3,auto);grid-template-areas:\"title title\" \"input input\" \". button\";gap:var(--ymt-spacing-m);padding:var(--ymt-spacing-m)}:host form h2{grid-area:title;margin:0}:host form yuv-datetime-range{grid-area:input;border:1px solid var(--ymt-text-color-subtle);padding:1px 2px;border-radius:2px}:host form button{grid-area:button}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: DatetimeRangeComponent, selector: "yuv-datetime-range", inputs: ["withTime", "readonly", "operator", "situation"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitel"] }] }); }
1412
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.15", type: DateRangePickerComponent, isStandalone: true, selector: "yuv-date-range-picker", inputs: { range: { classPropertyName: "range", publicName: "range", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rangeChange: "rangeChange" }, ngImport: i0, template: "<yuv-dialog [headertitel]=\"'yuv.form.element.range-select-date.custom.overlay.title' | translate\">\n <main>\n <form id=\"date-range-picker-form\" [formGroup]=\"form\" (ngSubmit)=\"apply()\">\n <yuv-datetime-range [withTime]=\"false\" formControlName=\"range\"></yuv-datetime-range>\n </form>\n </main>\n <footer>\n <button form=\"date-range-picker-form\" ymtButton=\"primary\" [disabled]=\"form.invalid\">\n {{ 'yuv.form.element.range-select-date.custom.overlay.button.apply' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host form{display:grid;grid-template-columns:1fr auto;grid-template-rows:repeat(3,auto);grid-template-areas:\"title title\" \"input input\" \". button\";gap:var(--ymt-spacing-m);padding:var(--ymt-spacing-m)}:host form h2{grid-area:title;margin:0}:host form yuv-datetime-range{grid-area:input;border:1px solid var(--ymt-text-color-subtle);padding:1px 2px;border-radius:2px}:host form button{grid-area:button}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "component", type: DatetimeRangeComponent, selector: "yuv-datetime-range", inputs: ["withTime", "readonly", "operator", "situation"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitle", "headertitel"] }] }); }
1395
1413
  }
1396
1414
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: DateRangePickerComponent, decorators: [{
1397
1415
  type: Component,
@@ -1946,7 +1964,7 @@ class CatalogComponent extends AbstractMatFormField {
1946
1964
  this.options = input([]);
1947
1965
  this.#optionsEffect = effect(() => {
1948
1966
  untracked(() => {
1949
- this._options.set(this.options() || []);
1967
+ this.#setOptions(this.options() || [], false);
1950
1968
  });
1951
1969
  });
1952
1970
  /**
@@ -1957,14 +1975,9 @@ class CatalogComponent extends AbstractMatFormField {
1957
1975
  const cls = this.classifications();
1958
1976
  untracked(() => {
1959
1977
  const ce = this.#system.getClassifications(cls).get(Classification.STRING_CATALOG);
1960
- const ceTranslate = this.#system.getClassifications(cls).get(Classification.STRING_CATALOG_I18N);
1961
1978
  if (ce && ce.options) {
1962
1979
  this.#setOptions(ce.options, false);
1963
1980
  }
1964
- // i18n catalog
1965
- if (ceTranslate && ceTranslate.options) {
1966
- this.#setOptions(ceTranslate.options, true);
1967
- }
1968
1981
  });
1969
1982
  });
1970
1983
  /**
@@ -1986,14 +1999,21 @@ class CatalogComponent extends AbstractMatFormField {
1986
1999
  }
1987
2000
  #setOptions(options, translate) {
1988
2001
  if (translate) {
1989
- this._options.set(options.map((o) => this.translate.instant(o)));
2002
+ this._options.set(options.map((o) => ({
2003
+ label: this.translate.instant(o),
2004
+ value: o
2005
+ })));
1990
2006
  }
1991
2007
  else {
1992
- this._options.set(options);
2008
+ this._options.set(options.map((o) => ({
2009
+ label: o,
2010
+ value: o
2011
+ })));
1993
2012
  }
1994
2013
  }
1995
2014
  writeValue(value) {
1996
2015
  this.value = value;
2016
+ this.fc.setValue(value, { emitEvent: false });
1997
2017
  }
1998
2018
  registerOnChange(fn) {
1999
2019
  this.propagateChange = fn;
@@ -2024,11 +2044,11 @@ class CatalogComponent extends AbstractMatFormField {
2024
2044
  super.onNgOnDestroy();
2025
2045
  }
2026
2046
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: CatalogComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2027
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: CatalogComponent, isStandalone: true, selector: "yuv-catalog", inputs: { readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, classifications: { classPropertyName: "classifications", publicName: "classifications", isSignal: true, isRequired: false, transformFunction: null }, situation: { classPropertyName: "situation", publicName: "situation", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: MatFormFieldControl, useExisting: CatalogComponent }], usesInheritance: true, ngImport: i0, template: "<mat-select [multiple]=\"multiple()\" [disabled]=\"readonly()\" [formControl]=\"fc\">\n @for (o of _options(); track o) {\n <mat-option [value]=\"o\">{{ o }}</mat-option>\n }\n</mat-select>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i1$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i1$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
2047
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: CatalogComponent, isStandalone: true, selector: "yuv-catalog", inputs: { readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, classifications: { classPropertyName: "classifications", publicName: "classifications", isSignal: true, isRequired: false, transformFunction: null }, situation: { classPropertyName: "situation", publicName: "situation", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: MatFormFieldControl, useExisting: CatalogComponent }], usesInheritance: true, ngImport: i0, template: "<mat-select [multiple]=\"multiple()\" [disabled]=\"readonly()\" [formControl]=\"fc\">\n @for (o of _options(); track o) {\n <mat-option [value]=\"o.value\">{{ o.label }}</mat-option>\n }\n</mat-select>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i1$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i1$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] }); }
2028
2048
  }
2029
2049
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: CatalogComponent, decorators: [{
2030
2050
  type: Component,
2031
- args: [{ selector: 'yuv-catalog', imports: [CommonModule, MatSelectModule, ReactiveFormsModule], providers: [{ provide: MatFormFieldControl, useExisting: CatalogComponent }], template: "<mat-select [multiple]=\"multiple()\" [disabled]=\"readonly()\" [formControl]=\"fc\">\n @for (o of _options(); track o) {\n <mat-option [value]=\"o\">{{ o }}</mat-option>\n }\n</mat-select>\n" }]
2051
+ args: [{ selector: 'yuv-catalog', imports: [CommonModule, MatSelectModule, ReactiveFormsModule], providers: [{ provide: MatFormFieldControl, useExisting: CatalogComponent }], template: "<mat-select [multiple]=\"multiple()\" [disabled]=\"readonly()\" [formControl]=\"fc\">\n @for (o of _options(); track o) {\n <mat-option [value]=\"o.value\">{{ o.label }}</mat-option>\n }\n</mat-select>\n" }]
2032
2052
  }] });
2033
2053
 
2034
2054
  /**
@@ -2101,6 +2121,7 @@ class I18nCatalogComponent extends AbstractMatFormField {
2101
2121
  }
2102
2122
  writeValue(value) {
2103
2123
  this.value = value;
2124
+ this.fc.setValue(value, { emitEvent: false });
2104
2125
  }
2105
2126
  registerOnChange(fn) {
2106
2127
  this.propagateChange = fn;