iss-ctrl 0.0.18 → 0.0.20

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 (25) hide show
  1. package/fesm2022/{iss-ctrl-iss-ctrl-C_ZiixeF.mjs → iss-ctrl-iss-ctrl-BnwwafES.mjs} +390 -202
  2. package/fesm2022/iss-ctrl-iss-ctrl-BnwwafES.mjs.map +1 -0
  3. package/fesm2022/{iss-ctrl-load-event-DIPikCdF.mjs → iss-ctrl-load-event-BcWMow3s.mjs} +3 -3
  4. package/fesm2022/{iss-ctrl-load-event-DIPikCdF.mjs.map → iss-ctrl-load-event-BcWMow3s.mjs.map} +1 -1
  5. package/fesm2022/{iss-ctrl-load-options-event-DOlkFXz5.mjs → iss-ctrl-load-options-event-sTdrxJYn.mjs} +3 -3
  6. package/fesm2022/{iss-ctrl-load-options-event-DOlkFXz5.mjs.map → iss-ctrl-load-options-event-sTdrxJYn.mjs.map} +1 -1
  7. package/fesm2022/{iss-ctrl-load-value-event-BjsuFpPf.mjs → iss-ctrl-load-value-event-BG9zEexV.mjs} +3 -3
  8. package/fesm2022/{iss-ctrl-load-value-event-BjsuFpPf.mjs.map → iss-ctrl-load-value-event-BG9zEexV.mjs.map} +1 -1
  9. package/fesm2022/{iss-ctrl-note.field-CakHrlcq.mjs → iss-ctrl-note.field-DyOSzuIi.mjs} +2 -2
  10. package/fesm2022/{iss-ctrl-note.field-CakHrlcq.mjs.map → iss-ctrl-note.field-DyOSzuIi.mjs.map} +1 -1
  11. package/fesm2022/{iss-ctrl-replace-api-keys-C-G34VNS.mjs → iss-ctrl-replace-api-keys-CzJkn7fK.mjs} +2 -2
  12. package/fesm2022/{iss-ctrl-replace-api-keys-C-G34VNS.mjs.map → iss-ctrl-replace-api-keys-CzJkn7fK.mjs.map} +1 -1
  13. package/fesm2022/{iss-ctrl-set-value-event-C-uD228s.mjs → iss-ctrl-set-value-event-B800MsyP.mjs} +2 -2
  14. package/fesm2022/{iss-ctrl-set-value-event-C-uD228s.mjs.map → iss-ctrl-set-value-event-B800MsyP.mjs.map} +1 -1
  15. package/fesm2022/{iss-ctrl-table.field-Ce1KnlZO.mjs → iss-ctrl-table.field-CJmtpHsh.mjs} +4 -4
  16. package/fesm2022/{iss-ctrl-table.field-Ce1KnlZO.mjs.map → iss-ctrl-table.field-CJmtpHsh.mjs.map} +1 -1
  17. package/fesm2022/{iss-ctrl-trigger-based-on-json-value-D5S3shyl.mjs → iss-ctrl-trigger-based-on-json-value-C5x0hyWn.mjs} +2 -2
  18. package/fesm2022/{iss-ctrl-trigger-based-on-json-value-D5S3shyl.mjs.map → iss-ctrl-trigger-based-on-json-value-C5x0hyWn.mjs.map} +1 -1
  19. package/fesm2022/{iss-ctrl-user-picker.field-C7DZ3ck2.mjs → iss-ctrl-user-picker.field-CJqIvkMM.mjs} +13 -6
  20. package/fesm2022/iss-ctrl-user-picker.field-CJqIvkMM.mjs.map +1 -0
  21. package/fesm2022/iss-ctrl.mjs +1 -1
  22. package/package.json +1 -1
  23. package/types/iss-ctrl.d.ts +49 -13
  24. package/fesm2022/iss-ctrl-iss-ctrl-C_ZiixeF.mjs.map +0 -1
  25. package/fesm2022/iss-ctrl-user-picker.field-C7DZ3ck2.mjs.map +0 -1
@@ -1648,11 +1648,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1648
1648
  }]
1649
1649
  }], propDecorators: { disabledDays: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledDays", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], minTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "minTime", required: false }] }], maxTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxTime", required: false }] }], hijriCalendar: [{ type: i0.Input, args: [{ isSignal: true, alias: "hijriCalendar", required: false }] }], emitHijri: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitHijri", required: false }] }] } });
1650
1650
 
1651
- class HintsComponent {
1651
+ class Hints {
1652
1652
  hints = input([], ...(ngDevMode ? [{ debugName: "hints" }] : /* istanbul ignore next */ []));
1653
1653
  touched = input(false, ...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
1654
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: HintsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1655
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: HintsComponent, isStandalone: true, selector: "iss-ctrl-hints", inputs: { hints: { classPropertyName: "hints", publicName: "hints", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1654
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: Hints, deps: [], target: i0.ɵɵFactoryTarget.Component });
1655
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: Hints, isStandalone: true, selector: "iss-ctrl-hints", inputs: { hints: { classPropertyName: "hints", publicName: "hints", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1656
1656
  @if (hints().length) {
1657
1657
  <div class="d-flex align-items-center flex-wrap gap-2 mb-3">
1658
1658
  @for (hint of hints(); track $index) {
@@ -1678,7 +1678,7 @@ class HintsComponent {
1678
1678
  }
1679
1679
  `, isInline: true, dependencies: [{ kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
1680
1680
  }
1681
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: HintsComponent, decorators: [{
1681
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: Hints, decorators: [{
1682
1682
  type: Component,
1683
1683
  args: [{
1684
1684
  selector: "iss-ctrl-hints",
@@ -1939,14 +1939,14 @@ class FilePickerControl extends ControlBase {
1939
1939
 
1940
1940
  <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
1941
1941
  <!--<iss-viewer-attachment (deleteOut)="onDelete($event)" [field]="filesValue()" [uploading]="uploading()"/>-->
1942
- `, isInline: true, styles: [".file-uploader{--uploader-height: 150px;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer}.file-uploader --input{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:.75rem}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: Droppable, selector: "[droppable]", outputs: ["onDrop"] }, { kind: "component", type: HintsComponent, selector: "iss-ctrl-hints", inputs: ["hints", "touched"] }] });
1942
+ `, isInline: true, styles: [".file-uploader{--uploader-height: 150px;--uploader-width: 100%;--uploader-bg: var(--off-white);--uploader-border: 1px dashed var(--dark-gray);--uploader-radius: var(--box-radius);--uploader-padding: 1rem;height:var(--uploader-height);background-color:var(--uploader-bg);border:var(--uploader-border);border-radius:var(--uploader-radius);padding:var(--uploader-padding);text-align:center;cursor:pointer}.file-uploader --input{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:.75rem}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: Droppable, selector: "[droppable]", outputs: ["onDrop"] }, { kind: "component", type: Hints, selector: "iss-ctrl-hints", inputs: ["hints", "touched"] }] });
1943
1943
  }
1944
1944
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: FilePickerControl, decorators: [{
1945
1945
  type: Component,
1946
1946
  args: [{ selector: "iss-ctrl-file-picker", schemas: [CUSTOM_ELEMENTS_SCHEMA], imports: [
1947
1947
  ReactiveFormsModule,
1948
1948
  Droppable,
1949
- HintsComponent,
1949
+ Hints,
1950
1950
  ], providers: [
1951
1951
  { provide: NG_VALUE_ACCESSOR, useExisting: FilePickerControl, multi: true }
1952
1952
  ], template: `
@@ -2091,7 +2091,7 @@ class InputControl extends ControlBase {
2091
2091
  </div>
2092
2092
  <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
2093
2093
  </mat-form-field>
2094
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i1$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: HintsComponent, selector: "iss-ctrl-hints", inputs: ["hints", "touched"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatInputModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2094
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i1$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: Hints, selector: "iss-ctrl-hints", inputs: ["hints", "touched"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatInputModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2095
2095
  }
2096
2096
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: InputControl, decorators: [{
2097
2097
  type: Component,
@@ -2102,7 +2102,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2102
2102
  imports: [
2103
2103
  ReactiveFormsModule,
2104
2104
  MatFormFieldModule,
2105
- HintsComponent,
2105
+ Hints,
2106
2106
  MatInput,
2107
2107
  MatInputModule,
2108
2108
  ],
@@ -5596,7 +5596,7 @@ class TextareaControl extends ControlBase {
5596
5596
  </textarea>
5597
5597
  <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
5598
5598
  </mat-form-field>
5599
- `, isInline: true, dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: HintsComponent, selector: "iss-ctrl-hints", inputs: ["hints", "touched"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i1$1.MatLabel, selector: "mat-label" }] });
5599
+ `, isInline: true, dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: Hints, selector: "iss-ctrl-hints", inputs: ["hints", "touched"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i1$1.MatLabel, selector: "mat-label" }] });
5600
5600
  }
5601
5601
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TextareaControl, decorators: [{
5602
5602
  type: Component,
@@ -5605,7 +5605,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
5605
5605
  imports: [
5606
5606
  MatFormField,
5607
5607
  MatInput,
5608
- HintsComponent,
5608
+ Hints,
5609
5609
  FormsModule,
5610
5610
  ReactiveFormsModule,
5611
5611
  MatFormFieldModule,
@@ -6049,7 +6049,8 @@ class FieldEvent {
6049
6049
  * | `visible()` | `boolean` | Whether the field is rendered at all. |
6050
6050
  * | `loading()` | `boolean` | Shows the field's own loading state. |
6051
6051
  * | `config` | `FieldConfig` | Per-type configuration — see {@link FieldConfig}. |
6052
- * | `validation` | `any` | Synchronous validation rules. |
6052
+ * | `validation` | `any` | Synchronous validation rules, exactly as the JSON declared them. |
6053
+ * | `validationFns` | `Record<string, Function>` | Validator factory behind each active rule, resolved by the outlet. |
6053
6054
  * | `asyncValidation` | `FieldAsyncValidation` | Remote validation rules. |
6054
6055
  * | `events` | `FieldEvent[]` | Cross-field reactions (show, hide, set value, …). |
6055
6056
  * | `children` | `IssField[]` | Nested fields, used by table and group fields. |
@@ -6073,6 +6074,10 @@ class IssField {
6073
6074
  wasVisible = signal(true, ...(ngDevMode ? [{ debugName: "wasVisible" }] : /* istanbul ignore next */ []));
6074
6075
  events;
6075
6076
  validation;
6077
+ // The lazily imported factory behind each active rule in `validation`, keyed by rule name.
6078
+ // The factories are kept beside the rules instead of inside them so `validation` stays the
6079
+ // object the JSON declared: what a rule says is the API's, how it is applied is ours.
6080
+ validationFns = {};
6076
6081
  asyncValidation;
6077
6082
  children;
6078
6083
  apiResponse = new BehaviorSubject(null);
@@ -6163,6 +6168,18 @@ const VALIDATORS = {
6163
6168
  fileSize: () => Promise.resolve().then(function () { return file_validator; }).then((c) => c.FileValidators.size),
6164
6169
  fileType: () => Promise.resolve().then(function () { return file_validator; }).then((c) => c.FileValidators.type),
6165
6170
  };
6171
+ /**
6172
+ * Whether a rule in a field's `validation` is switched on.
6173
+ *
6174
+ * The rule's value is the argument its validator is built with, so it is also what says
6175
+ * whether the rule applies at all: `{ "required": false }` is an optional field, not a
6176
+ * required one, and a rule the API left out or sent as null is off the same way. Values
6177
+ * that are falsy but meaningful — `0`, `""` — are rules, so only the three off states are
6178
+ * rejected here.
6179
+ */
6180
+ function isActiveValidationRule(value) {
6181
+ return value !== undefined && value !== null && value !== false;
6182
+ }
6166
6183
 
6167
6184
  class FormEngine {
6168
6185
  // Fields are stored per host FormGroup, never on the service itself: a single root
@@ -6247,9 +6264,11 @@ class FormEngine {
6247
6264
  trackChangesValidations(field, form) {
6248
6265
  const changes$ = [];
6249
6266
  const masterNames = new Set();
6250
- const iterateOn = Object.entries(field.validation);
6267
+ // A rule that names another field — `beforeDate`, say — carries that name as its value, and
6268
+ // `processTrackChanges` ignores every value that is not a string.
6269
+ const iterateOn = Object.entries(field.validation ?? {});
6251
6270
  iterateOn.forEach((validationObj) => {
6252
- this.processTrackChanges(validationObj[1].value, masterNames, changes$, field, form);
6271
+ this.processTrackChanges(validationObj[1], masterNames, changes$, field, form);
6253
6272
  });
6254
6273
  return merge(...changes$);
6255
6274
  }
@@ -6281,8 +6300,10 @@ class FormEngine {
6281
6300
  changes$.push(this.#mapMasterFieldValueChangesToFieldChanges(masterField, masterCtrl));
6282
6301
  }
6283
6302
  }
6303
+ // A field carries validation only where a rule is actually switched on: one sent as `false`
6304
+ // or `null` says the field is free of it, so it counts for nothing here.
6284
6305
  fieldHasValidation(field) {
6285
- return !!(field.validation && Object.values(field.validation).filter((v) => v).length);
6306
+ return !!field.validation && Object.values(field.validation).some(isActiveValidationRule);
6286
6307
  }
6287
6308
  fieldHasAsyncValidation(field) {
6288
6309
  return !!(field.asyncValidation && Object.values(field.asyncValidation).filter((v) => v).length);
@@ -6290,7 +6311,7 @@ class FormEngine {
6290
6311
  isFormValid(form, fields) {
6291
6312
  return fields.map((childField) => {
6292
6313
  const currentCtrl = form.get(childField.name);
6293
- if (childField.validation?.required() && childField.visible() && childField.mode() === "edit" && currentCtrl?.status !== "DISABLED") {
6314
+ if (isActiveValidationRule(childField.validation?.required) && childField.visible() && childField.mode() === "edit" && currentCtrl?.status !== "DISABLED") {
6294
6315
  return currentCtrl?.valid;
6295
6316
  }
6296
6317
  return true;
@@ -6316,8 +6337,15 @@ class FormEngine {
6316
6337
  }
6317
6338
  return registration;
6318
6339
  }
6340
+ // Builds each switched-on rule into its validator, out of the value the rule was given:
6341
+ // `{ "minLength": 3 }` is what makes the validator refuse two characters, and `{ "required":
6342
+ // false }` builds nothing at all. The field rides along as the second argument for the rules
6343
+ // that need their neighbours — `beforeDate` and friends — and is ignored by the rest.
6344
+ // A rule whose factory never resolved is skipped rather than called.
6319
6345
  #validatorsToNgValidators(field) {
6320
- return this.#mapNgValidators(field.validation).map((validatorValue) => validatorValue?.fn(field));
6346
+ return Object.entries(field.validation ?? {})
6347
+ .filter(([key, value]) => isActiveValidationRule(value) && typeof field.validationFns?.[key] === "function")
6348
+ .map(([key, value]) => field.validationFns[key](value, field));
6321
6349
  }
6322
6350
  #mapNgValidators(validationObj) {
6323
6351
  return Object.entries((validationObj ? validationObj : {}))
@@ -6383,22 +6411,22 @@ const COMPONENTS = {
6383
6411
  datetime: () => Promise.resolve().then(function () { return datetimePicker_field; }).then((c) => c.DatetimePickerField),
6384
6412
  date_range: () => Promise.resolve().then(function () { return dateRangePicker_field; }).then((c) => c.DateRangePickerField),
6385
6413
  attachment: () => Promise.resolve().then(function () { return filePicker_field; }).then((c) => c.FilePickerField),
6386
- userPicker: () => import('./iss-ctrl-user-picker.field-C7DZ3ck2.mjs').then((c) => c.UserPickerField),
6414
+ userPicker: () => import('./iss-ctrl-user-picker.field-CJqIvkMM.mjs').then((c) => c.UserPickerField),
6387
6415
  vehicle_plate: () => Promise.resolve().then(function () { return plate_field; }).then((c) => c.PlateField),
6388
- enrichment: () => import('./iss-ctrl-note.field-CakHrlcq.mjs').then((c) => c.NoteField),
6416
+ enrichment: () => import('./iss-ctrl-note.field-DyOSzuIi.mjs').then((c) => c.NoteField),
6389
6417
  mobile: () => Promise.resolve().then(function () { return mobile_field; }).then((c) => c.MobileField),
6390
- table: () => import('./iss-ctrl-table.field-Ce1KnlZO.mjs').then((c) => c.TableField),
6418
+ table: () => import('./iss-ctrl-table.field-CJmtpHsh.mjs').then((c) => c.TableField),
6391
6419
  chips: () => Promise.resolve().then(function () { return chips_field; }).then((c) => c.ChipsField),
6392
6420
  switch: () => Promise.resolve().then(function () { return slideToggle_field; }).then((c) => c.SlideToggleField),
6393
6421
  };
6394
6422
 
6395
6423
  const SERVICES = {
6396
- setValue: () => import('./iss-ctrl-set-value-event-C-uD228s.mjs').then((s) => s.SetValueEvent),
6424
+ setValue: () => import('./iss-ctrl-set-value-event-B800MsyP.mjs').then((s) => s.SetValueEvent),
6397
6425
  show: () => import('./iss-ctrl-show-event-BcRCwAfo.mjs').then((s) => s.ShowEvent),
6398
- load: () => import('./iss-ctrl-load-value-event-BjsuFpPf.mjs').then((s) => s.LoadValueEvent),
6399
- loadOptions: () => import('./iss-ctrl-load-options-event-DOlkFXz5.mjs').then((s) => s.LoadOptionsEvent),
6400
- triggerBasedOnJsonValue: () => import('./iss-ctrl-trigger-based-on-json-value-D5S3shyl.mjs').then((s) => s.TriggerBasedOnJsonValue),
6401
- replaceApiKeyDefaultImpl: () => import('./iss-ctrl-replace-api-keys-C-G34VNS.mjs').then((s) => s.ReplaceApiKeys),
6426
+ load: () => import('./iss-ctrl-load-value-event-BG9zEexV.mjs').then((s) => s.LoadValueEvent),
6427
+ loadOptions: () => import('./iss-ctrl-load-options-event-sTdrxJYn.mjs').then((s) => s.LoadOptionsEvent),
6428
+ triggerBasedOnJsonValue: () => import('./iss-ctrl-trigger-based-on-json-value-C5x0hyWn.mjs').then((s) => s.TriggerBasedOnJsonValue),
6429
+ replaceApiKeyDefaultImpl: () => import('./iss-ctrl-replace-api-keys-CzJkn7fK.mjs').then((s) => s.ReplaceApiKeys),
6402
6430
  };
6403
6431
 
6404
6432
  // Read-only counterpart of COMPONENTS: the component used to render a field's value
@@ -6585,6 +6613,11 @@ class Outlet {
6585
6613
  action.config.fn = configFn;
6586
6614
  }));
6587
6615
  }
6616
+ // Resolves the validator behind every rule the field switched on. `validation` itself is left
6617
+ // exactly as it arrived — the caller's own object, which it may still read and re-render — so
6618
+ // the factories land in `validationFns` and the rules keep the values they were given.
6619
+ // A rule that is off carries no validator: nothing is imported for it and nothing is built
6620
+ // from it, which is what makes `{ "required": false }` an optional field.
6588
6621
  async #loadFieldValidation(f) {
6589
6622
  if (!f.validation)
6590
6623
  return;
@@ -6593,13 +6626,10 @@ class Outlet {
6593
6626
  console.error(`${key} not found`);
6594
6627
  return false;
6595
6628
  }
6596
- return validation !== undefined && !validation?.hasOwnProperty("fn");
6629
+ return isActiveValidationRule(validation);
6597
6630
  });
6598
- await Promise.all(validationEntries.map(async ([key, validation]) => {
6599
- f.validation[key] = {
6600
- fn: await VALIDATORS[key](),
6601
- value: validation
6602
- };
6631
+ await Promise.all(validationEntries.map(async ([key]) => {
6632
+ f.validationFns[key] = await VALIDATORS[key]();
6603
6633
  }));
6604
6634
  }
6605
6635
  #listenToHostFormGroupChanges() {
@@ -6779,7 +6809,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
6779
6809
  args: [{ name: "translate" }]
6780
6810
  }] });
6781
6811
 
6782
- class ValidationMessageComponent {
6812
+ class ValidationMessage {
6783
6813
  errors = input.required(...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
6784
6814
  showMessage = input.required(...(ngDevMode ? [{ debugName: "showMessage" }] : /* istanbul ignore next */ []));
6785
6815
  getValidationMessage(error) {
@@ -6790,8 +6820,8 @@ class ValidationMessageComponent {
6790
6820
  }
6791
6821
  return errorMessageGenerator(error.value);
6792
6822
  }
6793
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ValidationMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6794
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ValidationMessageComponent, isStandalone: true, selector: "iss-validation-message-viewer", inputs: { errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: true, transformFunction: null }, showMessage: { classPropertyName: "showMessage", publicName: "showMessage", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
6823
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ValidationMessage, deps: [], target: i0.ɵɵFactoryTarget.Component });
6824
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ValidationMessage, isStandalone: true, selector: "iss-validation-message-viewer", inputs: { errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: true, transformFunction: null }, showMessage: { classPropertyName: "showMessage", publicName: "showMessage", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
6795
6825
  @if (errors() !== null && showMessage()) {
6796
6826
  <div class="messages">
6797
6827
  @for (error of errors() ?? {} | keyvalue; track error) {
@@ -6803,7 +6833,7 @@ class ValidationMessageComponent {
6803
6833
  }
6804
6834
  `, isInline: true, styles: [":host{display:block;position:relative}.messages{position:absolute;inset-inline:0;top:0;z-index:1}p{margin:0}\n"], dependencies: [{ kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
6805
6835
  }
6806
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ValidationMessageComponent, decorators: [{
6836
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ValidationMessage, decorators: [{
6807
6837
  type: Component,
6808
6838
  args: [{ selector: "iss-validation-message-viewer", imports: [
6809
6839
  KeyValuePipe,
@@ -7085,6 +7115,44 @@ var input_viewer = /*#__PURE__*/Object.freeze({
7085
7115
  InputViewer: InputViewer
7086
7116
  });
7087
7117
 
7118
+ /**
7119
+ * `<iss-field-viewer>` — read-only presentation of a single field as a
7120
+ * label / value row.
7121
+ *
7122
+ * Project the caption into the `label` slot and the rendered value into any
7123
+ * element carrying a `value` attribute:
7124
+ *
7125
+ * ```html
7126
+ * <iss-field-viewer>
7127
+ * <label>Request Type</label>
7128
+ * <span>value</span>
7129
+ * </iss-field-viewer>
7130
+ * ```
7131
+ *
7132
+ * The label sits in a fixed-width column, so every value in a stack of viewers
7133
+ * starts on the same vertical line. Override that column with the
7134
+ * `--field-viewer-label-width` custom property on any ancestor.
7135
+ * When no label is projected, the value spans the full width of the row.
7136
+ */
7137
+ class FieldViewer {
7138
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: FieldViewer, deps: [], target: i0.ɵɵFactoryTarget.Component });
7139
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: FieldViewer, isStandalone: true, selector: "iss-field-viewer", ngImport: i0, template: `
7140
+ <div class="field-viewer w-100">
7141
+ <span class="field-viewer__label"><ng-content select="label"></ng-content></span>
7142
+ <span class="field-viewer__value"><ng-content></ng-content></span>
7143
+ </div>
7144
+ `, isInline: true, styles: [":host{--field-viewer-label-width: 14rem;--field-viewer-gap: 1.5rem;--field-viewer-padding: .75rem 1rem;--field-viewer-label-fc: var(--dark-gray);--field-viewer-value-fc: var(--black);display:block;width:100%}.field-viewer{display:grid;grid-template-columns:var(--field-viewer-label-width) minmax(0,1fr);align-items:baseline;column-gap:var(--field-viewer-gap);padding:var(--field-viewer-padding);border-radius:var(--box-radius);font-size:.875rem;line-height:var(--default-line-height)}.field-viewer__label{color:var(--field-viewer-label-fc);font-weight:var(--font-regular);overflow-wrap:anywhere}.field-viewer__value{min-width:0;color:var(--field-viewer-value-fc);font-weight:var(--font-bold);overflow-wrap:anywhere}.field-viewer__label ::ng-deep label{display:block;margin:0;color:inherit;font:inherit}.field-viewer:not(:has(.field-viewer__label>*)){grid-template-columns:minmax(0,1fr)}.field-viewer:not(:has(.field-viewer__label>*)) .field-viewer__label{display:none}@media(max-width:575.98px){.field-viewer{grid-template-columns:minmax(0,1fr);row-gap:.25rem}}\n"] });
7145
+ }
7146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: FieldViewer, decorators: [{
7147
+ type: Component,
7148
+ args: [{ selector: "iss-field-viewer", imports: [], template: `
7149
+ <div class="field-viewer w-100">
7150
+ <span class="field-viewer__label"><ng-content select="label"></ng-content></span>
7151
+ <span class="field-viewer__value"><ng-content></ng-content></span>
7152
+ </div>
7153
+ `, styles: [":host{--field-viewer-label-width: 14rem;--field-viewer-gap: 1.5rem;--field-viewer-padding: .75rem 1rem;--field-viewer-label-fc: var(--dark-gray);--field-viewer-value-fc: var(--black);display:block;width:100%}.field-viewer{display:grid;grid-template-columns:var(--field-viewer-label-width) minmax(0,1fr);align-items:baseline;column-gap:var(--field-viewer-gap);padding:var(--field-viewer-padding);border-radius:var(--box-radius);font-size:.875rem;line-height:var(--default-line-height)}.field-viewer__label{color:var(--field-viewer-label-fc);font-weight:var(--font-regular);overflow-wrap:anywhere}.field-viewer__value{min-width:0;color:var(--field-viewer-value-fc);font-weight:var(--font-bold);overflow-wrap:anywhere}.field-viewer__label ::ng-deep label{display:block;margin:0;color:inherit;font:inherit}.field-viewer:not(:has(.field-viewer__label>*)){grid-template-columns:minmax(0,1fr)}.field-viewer:not(:has(.field-viewer__label>*)) .field-viewer__label{display:none}@media(max-width:575.98px){.field-viewer{grid-template-columns:minmax(0,1fr);row-gap:.25rem}}\n"] }]
7154
+ }] });
7155
+
7088
7156
  /**
7089
7157
  * `<iss-field-input>` — single line text, number, email or password entry.
7090
7158
  *
@@ -7132,10 +7200,13 @@ class InputField extends FieldBase {
7132
7200
  </iss-ctrl-input>
7133
7201
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7134
7202
  } @else {
7135
- <iss-viewer-input [field]="field"/>
7203
+ <iss-field-viewer>
7204
+ <label>{{ field.label() }}</label>
7205
+ <iss-viewer-input [field]="field"/>
7206
+ </iss-field-viewer>
7136
7207
  }
7137
7208
  }
7138
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: InputControl, selector: "iss-ctrl-input", inputs: ["type", "prefixIcon", "prefixText", "suffixIcon", "suffixText"], outputs: ["onPrefixClick", "onSuffixClick"] }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: InputViewer, selector: "iss-viewer-input" }], viewProviders: [VIEW_PROVIDER] });
7209
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: InputControl, selector: "iss-ctrl-input", inputs: ["type", "prefixIcon", "prefixText", "suffixIcon", "suffixText"], outputs: ["onPrefixClick", "onSuffixClick"] }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: InputViewer, selector: "iss-viewer-input" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
7139
7210
  }
7140
7211
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: InputField, decorators: [{
7141
7212
  type: Component,
@@ -7145,8 +7216,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7145
7216
  imports: [
7146
7217
  ReactiveFormsModule,
7147
7218
  InputControl,
7148
- ValidationMessageComponent,
7149
- InputViewer
7219
+ ValidationMessage,
7220
+ InputViewer,
7221
+ FieldViewer
7150
7222
  ],
7151
7223
  template: `
7152
7224
  @if (field.visible()) {
@@ -7165,7 +7237,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7165
7237
  </iss-ctrl-input>
7166
7238
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7167
7239
  } @else {
7168
- <iss-viewer-input [field]="field"/>
7240
+ <iss-field-viewer>
7241
+ <label>{{ field.label() }}</label>
7242
+ <iss-viewer-input [field]="field"/>
7243
+ </iss-field-viewer>
7169
7244
  }
7170
7245
  }
7171
7246
  `
@@ -7232,10 +7307,13 @@ class TextareaField extends FieldBase {
7232
7307
  </iss-ctrl-textarea>
7233
7308
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7234
7309
  } @else {
7235
- <iss-viewer-textarea [field]="field"/>
7310
+ <iss-field-viewer>
7311
+ <label>{{ field.label() }}</label>
7312
+ <iss-viewer-textarea [field]="field"/>
7313
+ </iss-field-viewer>
7236
7314
  }
7237
7315
  }
7238
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: TextareaControl, selector: "iss-ctrl-textarea" }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: TextareaViewer, selector: "iss-viewer-textarea" }], viewProviders: [VIEW_PROVIDER] });
7316
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: TextareaControl, selector: "iss-ctrl-textarea" }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: TextareaViewer, selector: "iss-viewer-textarea" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
7239
7317
  }
7240
7318
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TextareaField, decorators: [{
7241
7319
  type: Component,
@@ -7245,8 +7323,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7245
7323
  imports: [
7246
7324
  ReactiveFormsModule,
7247
7325
  TextareaControl,
7248
- ValidationMessageComponent,
7249
- TextareaViewer
7326
+ ValidationMessage,
7327
+ TextareaViewer,
7328
+ FieldViewer
7250
7329
  ],
7251
7330
  template: `
7252
7331
  @if (field.visible()) {
@@ -7256,7 +7335,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7256
7335
  </iss-ctrl-textarea>
7257
7336
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7258
7337
  } @else {
7259
- <iss-viewer-textarea [field]="field"/>
7338
+ <iss-field-viewer>
7339
+ <label>{{ field.label() }}</label>
7340
+ <iss-viewer-textarea [field]="field"/>
7341
+ </iss-field-viewer>
7260
7342
  }
7261
7343
  }
7262
7344
  `
@@ -7334,10 +7416,13 @@ class ChipsField extends FieldBase {
7334
7416
  <iss-ctrl-chips [formControlName]="field.name" [readonly]="field.config.readonly() ?? false"><label>{{ field.label() }}</label></iss-ctrl-chips>
7335
7417
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7336
7418
  } @else {
7337
- <iss-viewer-chips [field]="field"/>
7419
+ <iss-field-viewer>
7420
+ <label>{{ field.label() }}</label>
7421
+ <iss-viewer-chips [field]="field"/>
7422
+ </iss-field-viewer>
7338
7423
  }
7339
7424
  }
7340
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ChipsControl, selector: "iss-ctrl-chips" }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: ChipsViewer, selector: "iss-viewer-chips" }], viewProviders: [VIEW_PROVIDER] });
7425
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ChipsControl, selector: "iss-ctrl-chips" }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: ChipsViewer, selector: "iss-viewer-chips" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
7341
7426
  }
7342
7427
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ChipsField, decorators: [{
7343
7428
  type: Component,
@@ -7347,8 +7432,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7347
7432
  imports: [
7348
7433
  ReactiveFormsModule,
7349
7434
  ChipsControl,
7350
- ValidationMessageComponent,
7351
- ChipsViewer
7435
+ ValidationMessage,
7436
+ ChipsViewer,
7437
+ FieldViewer
7352
7438
  ],
7353
7439
  template: `
7354
7440
  @if (field.visible()) {
@@ -7356,7 +7442,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7356
7442
  <iss-ctrl-chips [formControlName]="field.name" [readonly]="field.config.readonly() ?? false"><label>{{ field.label() }}</label></iss-ctrl-chips>
7357
7443
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7358
7444
  } @else {
7359
- <iss-viewer-chips [field]="field"/>
7445
+ <iss-field-viewer>
7446
+ <label>{{ field.label() }}</label>
7447
+ <iss-viewer-chips [field]="field"/>
7448
+ </iss-field-viewer>
7360
7449
  }
7361
7450
  }
7362
7451
  `
@@ -7428,19 +7517,23 @@ class RadioField extends FieldBase {
7428
7517
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: RadioField, isStandalone: true, selector: "iss-field-radio", usesInheritance: true, ngImport: i0, template: `
7429
7518
  @if (field.visible()) {
7430
7519
  <div style="display: flex; flex-direction: column">
7431
- @if (!field.config.hideLabel()) {
7432
- <mat-label>{{ field.label() }}</mat-label>
7433
- }
7434
-
7435
7520
  @if (field.mode() === "edit") {
7521
+ @if (!field.config.hideLabel()) {
7522
+ <mat-label>{{ field.label() }}</mat-label>
7523
+ }
7436
7524
  <iss-ctrl-radio [formControlName]="field.name" [options]="field.options()" [readonly]="field.config.readonly() ?? false" (onChange)="onChange($event)"/>
7437
7525
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7438
7526
  } @else {
7439
- <iss-viewer-radio [field]="field"/>
7527
+ <iss-field-viewer>
7528
+ @if (!field.config.hideLabel()) {
7529
+ <label>{{ field.label() }}</label>
7530
+ }
7531
+ <iss-viewer-radio [field]="field"/>
7532
+ </iss-field-viewer>
7440
7533
  }
7441
7534
  </div>
7442
7535
  }
7443
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: RadioControl, selector: "iss-ctrl-radio", inputs: ["options"] }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: RadioViewer, selector: "iss-viewer-radio" }], viewProviders: [VIEW_PROVIDER] });
7536
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: RadioControl, selector: "iss-ctrl-radio", inputs: ["options"] }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: RadioViewer, selector: "iss-viewer-radio" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
7444
7537
  }
7445
7538
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RadioField, decorators: [{
7446
7539
  type: Component,
@@ -7451,21 +7544,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7451
7544
  ReactiveFormsModule,
7452
7545
  MatLabel,
7453
7546
  RadioControl,
7454
- ValidationMessageComponent,
7455
- RadioViewer
7547
+ ValidationMessage,
7548
+ RadioViewer,
7549
+ FieldViewer
7456
7550
  ],
7457
7551
  template: `
7458
7552
  @if (field.visible()) {
7459
7553
  <div style="display: flex; flex-direction: column">
7460
- @if (!field.config.hideLabel()) {
7461
- <mat-label>{{ field.label() }}</mat-label>
7462
- }
7463
-
7464
7554
  @if (field.mode() === "edit") {
7555
+ @if (!field.config.hideLabel()) {
7556
+ <mat-label>{{ field.label() }}</mat-label>
7557
+ }
7465
7558
  <iss-ctrl-radio [formControlName]="field.name" [options]="field.options()" [readonly]="field.config.readonly() ?? false" (onChange)="onChange($event)"/>
7466
7559
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7467
7560
  } @else {
7468
- <iss-viewer-radio [field]="field"/>
7561
+ <iss-field-viewer>
7562
+ @if (!field.config.hideLabel()) {
7563
+ <label>{{ field.label() }}</label>
7564
+ }
7565
+ <iss-viewer-radio [field]="field"/>
7566
+ </iss-field-viewer>
7469
7567
  }
7470
7568
  </div>
7471
7569
  }
@@ -7546,10 +7644,13 @@ class SelectField extends FieldBase {
7546
7644
  </iss-ctrl-select>
7547
7645
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7548
7646
  } @else {
7549
- <iss-viewer-select [field]="field"/>
7647
+ <iss-field-viewer>
7648
+ <label>{{ field.label() }}</label>
7649
+ <iss-viewer-select [field]="field"/>
7650
+ </iss-field-viewer>
7550
7651
  }
7551
7652
  }
7552
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: SelectControl, selector: "iss-ctrl-select", inputs: ["options", "height", "loading"], outputs: ["onQueryChange"] }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: SelectViewer, selector: "iss-viewer-select" }], viewProviders: [VIEW_PROVIDER] });
7653
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: SelectControl, selector: "iss-ctrl-select", inputs: ["options", "height", "loading"], outputs: ["onQueryChange"] }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: SelectViewer, selector: "iss-viewer-select" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
7553
7654
  }
7554
7655
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SelectField, decorators: [{
7555
7656
  type: Component,
@@ -7559,8 +7660,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7559
7660
  imports: [
7560
7661
  ReactiveFormsModule,
7561
7662
  SelectControl,
7562
- ValidationMessageComponent,
7563
- SelectViewer
7663
+ ValidationMessage,
7664
+ SelectViewer,
7665
+ FieldViewer
7564
7666
  ],
7565
7667
  template: `
7566
7668
  @if (field.visible()) {
@@ -7570,7 +7672,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7570
7672
  </iss-ctrl-select>
7571
7673
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7572
7674
  } @else {
7573
- <iss-viewer-select [field]="field"/>
7675
+ <iss-field-viewer>
7676
+ <label>{{ field.label() }}</label>
7677
+ <iss-viewer-select [field]="field"/>
7678
+ </iss-field-viewer>
7574
7679
  }
7575
7680
  }
7576
7681
  `
@@ -7634,10 +7739,13 @@ class MobileField extends FieldBase {
7634
7739
  <label>{{ field.label() }}</label>
7635
7740
  </iss-ctrl-mobile>
7636
7741
  } @else {
7637
- <iss-viewer-mobile [field]="field"/>
7742
+ <iss-field-viewer>
7743
+ <label>{{ field.label() }}</label>
7744
+ <iss-viewer-mobile [field]="field"/>
7745
+ </iss-field-viewer>
7638
7746
  }
7639
7747
  }
7640
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: MobileControl, selector: "iss-ctrl-mobile", inputs: ["preferredCountries"] }, { kind: "component", type: MobileViewer, selector: "iss-viewer-mobile" }], viewProviders: [VIEW_PROVIDER] });
7748
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: MobileControl, selector: "iss-ctrl-mobile", inputs: ["preferredCountries"] }, { kind: "component", type: MobileViewer, selector: "iss-viewer-mobile" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
7641
7749
  }
7642
7750
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MobileField, decorators: [{
7643
7751
  type: Component,
@@ -7647,7 +7755,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7647
7755
  imports: [
7648
7756
  ReactiveFormsModule,
7649
7757
  MobileControl,
7650
- MobileViewer
7758
+ MobileViewer,
7759
+ FieldViewer
7651
7760
  ],
7652
7761
  template: `
7653
7762
  @if (field.visible()) {
@@ -7656,7 +7765,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7656
7765
  <label>{{ field.label() }}</label>
7657
7766
  </iss-ctrl-mobile>
7658
7767
  } @else {
7659
- <iss-viewer-mobile [field]="field"/>
7768
+ <iss-field-viewer>
7769
+ <label>{{ field.label() }}</label>
7770
+ <iss-viewer-mobile [field]="field"/>
7771
+ </iss-field-viewer>
7660
7772
  }
7661
7773
  }
7662
7774
  `
@@ -7736,10 +7848,15 @@ class CheckboxField extends FieldBase {
7736
7848
  </iss-ctrl-checkbox>
7737
7849
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7738
7850
  } @else {
7739
- <iss-viewer-checkbox [field]="field"/>
7851
+ <iss-field-viewer>
7852
+ @if (!field.config.hideLabel()) {
7853
+ <label>{{ field.label() }}</label>
7854
+ }
7855
+ <iss-viewer-checkbox [field]="field"/>
7856
+ </iss-field-viewer>
7740
7857
  }
7741
7858
  }
7742
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CheckboxControl, selector: "iss-ctrl-checkbox", inputs: ["options"] }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: CheckboxViewer, selector: "iss-viewer-checkbox" }], viewProviders: [VIEW_PROVIDER] });
7859
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: CheckboxControl, selector: "iss-ctrl-checkbox", inputs: ["options"] }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: CheckboxViewer, selector: "iss-viewer-checkbox" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
7743
7860
  }
7744
7861
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CheckboxField, decorators: [{
7745
7862
  type: Component,
@@ -7749,8 +7866,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7749
7866
  imports: [
7750
7867
  ReactiveFormsModule,
7751
7868
  CheckboxControl,
7752
- ValidationMessageComponent,
7753
- CheckboxViewer
7869
+ ValidationMessage,
7870
+ CheckboxViewer,
7871
+ FieldViewer
7754
7872
  ],
7755
7873
  template: `
7756
7874
  @if (field.visible()) {
@@ -7762,7 +7880,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7762
7880
  </iss-ctrl-checkbox>
7763
7881
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7764
7882
  } @else {
7765
- <iss-viewer-checkbox [field]="field"/>
7883
+ <iss-field-viewer>
7884
+ @if (!field.config.hideLabel()) {
7885
+ <label>{{ field.label() }}</label>
7886
+ }
7887
+ <iss-viewer-checkbox [field]="field"/>
7888
+ </iss-field-viewer>
7766
7889
  }
7767
7890
  }
7768
7891
  `
@@ -7834,10 +7957,10 @@ class ToggleButtonField extends FieldBase {
7834
7957
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToggleButtonField, deps: null, target: i0.ɵɵFactoryTarget.Component });
7835
7958
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ToggleButtonField, isStandalone: true, selector: "iss-field-toggle-button", usesInheritance: true, ngImport: i0, template: `
7836
7959
  @if (field.visible()) {
7837
- @if (!field.config.hideLabel()) {
7838
- <mat-label>{{ field.label() }}</mat-label>
7839
- }
7840
7960
  @if (field.mode() === "edit") {
7961
+ @if (!field.config.hideLabel()) {
7962
+ <mat-label>{{ field.label() }}</mat-label>
7963
+ }
7841
7964
  <iss-ctrl-toggle-button
7842
7965
  [formControlName]="field.name"
7843
7966
  [options]="field.options()"
@@ -7847,10 +7970,15 @@ class ToggleButtonField extends FieldBase {
7847
7970
  />
7848
7971
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7849
7972
  } @else {
7850
- <iss-viewer-toggle-button [field]="field"/>
7973
+ <iss-field-viewer>
7974
+ @if (!field.config.hideLabel()) {
7975
+ <label>{{ field.label() }}</label>
7976
+ }
7977
+ <iss-viewer-toggle-button [field]="field"/>
7978
+ </iss-field-viewer>
7851
7979
  }
7852
7980
  }
7853
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: ToggleButtonControl, selector: "iss-ctrl-toggle-button", inputs: ["options"] }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: ToggleButtonViewer, selector: "iss-viewer-toggle-button" }], viewProviders: [VIEW_PROVIDER] });
7981
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: ToggleButtonControl, selector: "iss-ctrl-toggle-button", inputs: ["options"] }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: ToggleButtonViewer, selector: "iss-viewer-toggle-button" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
7854
7982
  }
7855
7983
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ToggleButtonField, decorators: [{
7856
7984
  type: Component,
@@ -7861,15 +7989,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7861
7989
  ReactiveFormsModule,
7862
7990
  MatLabel,
7863
7991
  ToggleButtonControl,
7864
- ValidationMessageComponent,
7865
- ToggleButtonViewer
7992
+ ValidationMessage,
7993
+ ToggleButtonViewer,
7994
+ FieldViewer
7866
7995
  ],
7867
7996
  template: `
7868
7997
  @if (field.visible()) {
7869
- @if (!field.config.hideLabel()) {
7870
- <mat-label>{{ field.label() }}</mat-label>
7871
- }
7872
7998
  @if (field.mode() === "edit") {
7999
+ @if (!field.config.hideLabel()) {
8000
+ <mat-label>{{ field.label() }}</mat-label>
8001
+ }
7873
8002
  <iss-ctrl-toggle-button
7874
8003
  [formControlName]="field.name"
7875
8004
  [options]="field.options()"
@@ -7879,7 +8008,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
7879
8008
  />
7880
8009
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7881
8010
  } @else {
7882
- <iss-viewer-toggle-button [field]="field"/>
8011
+ <iss-field-viewer>
8012
+ @if (!field.config.hideLabel()) {
8013
+ <label>{{ field.label() }}</label>
8014
+ }
8015
+ <iss-viewer-toggle-button [field]="field"/>
8016
+ </iss-field-viewer>
7883
8017
  }
7884
8018
  }
7885
8019
  `
@@ -7954,36 +8088,44 @@ class SlideToggleField extends FieldBase {
7954
8088
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SlideToggleField, deps: null, target: i0.ɵɵFactoryTarget.Component });
7955
8089
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SlideToggleField, isStandalone: true, selector: "iss-field-slide-toggle", usesInheritance: true, ngImport: i0, template: `
7956
8090
  @if (field.visible()) {
7957
- @if (!field.config.hideLabel()) {
7958
- <mat-label>{{ field.label() }}</mat-label>
7959
- }
7960
-
7961
8091
  @if (field.mode() === "edit") {
8092
+ @if (!field.config.hideLabel()) {
8093
+ <mat-label>{{ field.label() }}</mat-label>
8094
+ }
7962
8095
  <iss-ctrl-slide-toggle [formControlName]="field.name" [readonly]="field.config.readonly() ?? false" (onChange)="onChange($event)"/>
7963
8096
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7964
8097
  } @else {
7965
- <iss-viewer-slide-toggle [field]="field"/>
8098
+ <iss-field-viewer>
8099
+ @if (!field.config.hideLabel()) {
8100
+ <label>{{ field.label() }}</label>
8101
+ }
8102
+ <iss-viewer-slide-toggle [field]="field"/>
8103
+ </iss-field-viewer>
7966
8104
  }
7967
8105
  }
7968
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: SlideToggleControl, selector: "iss-ctrl-slide-toggle" }, { kind: "component", type: SlideToggleViewer, selector: "iss-viewer-slide-toggle" }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }], viewProviders: [VIEW_PROVIDER] });
8106
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: SlideToggleControl, selector: "iss-ctrl-slide-toggle" }, { kind: "component", type: SlideToggleViewer, selector: "iss-viewer-slide-toggle" }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
7969
8107
  }
7970
8108
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SlideToggleField, decorators: [{
7971
8109
  type: Component,
7972
8110
  args: [{
7973
8111
  selector: "iss-field-slide-toggle",
7974
8112
  viewProviders: [VIEW_PROVIDER],
7975
- imports: [ReactiveFormsModule, MatLabel, SlideToggleControl, SlideToggleViewer, ValidationMessageComponent],
8113
+ imports: [ReactiveFormsModule, MatLabel, SlideToggleControl, SlideToggleViewer, ValidationMessage, FieldViewer],
7976
8114
  template: `
7977
8115
  @if (field.visible()) {
7978
- @if (!field.config.hideLabel()) {
7979
- <mat-label>{{ field.label() }}</mat-label>
7980
- }
7981
-
7982
8116
  @if (field.mode() === "edit") {
8117
+ @if (!field.config.hideLabel()) {
8118
+ <mat-label>{{ field.label() }}</mat-label>
8119
+ }
7983
8120
  <iss-ctrl-slide-toggle [formControlName]="field.name" [readonly]="field.config.readonly() ?? false" (onChange)="onChange($event)"/>
7984
8121
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
7985
8122
  } @else {
7986
- <iss-viewer-slide-toggle [field]="field"/>
8123
+ <iss-field-viewer>
8124
+ @if (!field.config.hideLabel()) {
8125
+ <label>{{ field.label() }}</label>
8126
+ }
8127
+ <iss-viewer-slide-toggle [field]="field"/>
8128
+ </iss-field-viewer>
7987
8129
  }
7988
8130
  }
7989
8131
  `
@@ -8202,18 +8344,22 @@ class PlateField extends FieldBase {
8202
8344
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PlateField, deps: null, target: i0.ɵɵFactoryTarget.Component });
8203
8345
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PlateField, isStandalone: true, selector: "iss-field-plate-number", usesInheritance: true, ngImport: i0, template: `
8204
8346
  @if (field.visible()) {
8205
- @if (!field.config.hideLabel()) {
8206
- <mat-label>{{ field.label() }}</mat-label>
8207
- }
8208
-
8209
8347
  @if (field.mode() === "edit") {
8348
+ @if (!field.config.hideLabel()) {
8349
+ <mat-label>{{ field.label() }}</mat-label>
8350
+ }
8210
8351
  <iss-ctrl-plate-number [formControlName]="field.name" [readonly]="field.config.readonly() ?? false" (onChange)="updateField($event)"/>
8211
8352
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
8212
8353
  } @else {
8213
- <iss-viewer-plate [field]="field"/>
8354
+ <iss-field-viewer>
8355
+ @if (!field.config.hideLabel()) {
8356
+ <label>{{ field.label() }}</label>
8357
+ }
8358
+ <iss-viewer-plate [field]="field"/>
8359
+ </iss-field-viewer>
8214
8360
  }
8215
8361
  }
8216
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: PlateControl, selector: "iss-ctrl-plate-number" }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: PlateViewer, selector: "iss-viewer-plate" }], viewProviders: [VIEW_PROVIDER] });
8362
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: PlateControl, selector: "iss-ctrl-plate-number" }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: PlateViewer, selector: "iss-viewer-plate" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
8217
8363
  }
8218
8364
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PlateField, decorators: [{
8219
8365
  type: Component,
@@ -8223,21 +8369,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8223
8369
  imports: [
8224
8370
  ReactiveFormsModule,
8225
8371
  PlateControl,
8226
- ValidationMessageComponent,
8372
+ ValidationMessage,
8227
8373
  MatLabel,
8228
- PlateViewer
8374
+ PlateViewer,
8375
+ FieldViewer
8229
8376
  ],
8230
8377
  template: `
8231
8378
  @if (field.visible()) {
8232
- @if (!field.config.hideLabel()) {
8233
- <mat-label>{{ field.label() }}</mat-label>
8234
- }
8235
-
8236
8379
  @if (field.mode() === "edit") {
8380
+ @if (!field.config.hideLabel()) {
8381
+ <mat-label>{{ field.label() }}</mat-label>
8382
+ }
8237
8383
  <iss-ctrl-plate-number [formControlName]="field.name" [readonly]="field.config.readonly() ?? false" (onChange)="updateField($event)"/>
8238
8384
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
8239
8385
  } @else {
8240
- <iss-viewer-plate [field]="field"/>
8386
+ <iss-field-viewer>
8387
+ @if (!field.config.hideLabel()) {
8388
+ <label>{{ field.label() }}</label>
8389
+ }
8390
+ <iss-viewer-plate [field]="field"/>
8391
+ </iss-field-viewer>
8241
8392
  }
8242
8393
  }
8243
8394
  `
@@ -8562,10 +8713,10 @@ class FilePickerField extends FieldBase {
8562
8713
  super.ngOnDestroy();
8563
8714
  this.#valueEffect.destroy();
8564
8715
  }
8565
- // the outlet rewrites every validation entry into {fn, value}, so the extensions live under value
8716
+ // The accepted extensions are the `fileType` rule's own value, the same one its validator is
8717
+ // built from — a list, or the comma-separated string an older definition wrote it as.
8566
8718
  #acceptFactory() {
8567
- const fileType = this.field.validation?.["fileType"];
8568
- const extensions = fileType && fileType.hasOwnProperty("fn") ? fileType.value : fileType;
8719
+ const extensions = this.field.validation?.["fileType"];
8569
8720
  if (!extensions) {
8570
8721
  return "";
8571
8722
  }
@@ -8600,8 +8751,8 @@ class FilePickerField extends FieldBase {
8600
8751
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: FilePickerField, deps: null, target: i0.ɵɵFactoryTarget.Component });
8601
8752
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: FilePickerField, isStandalone: true, selector: "iss-field-file-picker", usesInheritance: true, ngImport: i0, template: `
8602
8753
  @if (field.visible()) {
8603
- <mat-label>{{ field.label() }}</mat-label>
8604
8754
  @if (field.mode() === "edit") {
8755
+ <mat-label>{{ field.label() }}</mat-label>
8605
8756
  <input type="hidden" [formControlName]="field.name">
8606
8757
  <!-- [showDeleteButton]="field.config.showDeleteButton" [showDownloadButton]="field.config.showDownloadButton"-->
8607
8758
  <iss-ctrl-file-picker
@@ -8616,10 +8767,13 @@ class FilePickerField extends FieldBase {
8616
8767
  />
8617
8768
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="ctrl.touched"/>
8618
8769
  } @else {
8619
- <iss-viewer-attachment [uploading]="uploading()" [field]="viewField()"/>
8770
+ <iss-field-viewer>
8771
+ <label>{{ field.label() }}</label>
8772
+ <iss-viewer-attachment [uploading]="uploading()" [field]="viewField()"/>
8773
+ </iss-field-viewer>
8620
8774
  }
8621
8775
  }
8622
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FilePickerControl, selector: "iss-ctrl-file-picker", inputs: ["accept", "showDownloadButton", "showDeleteButton", "uploading", "uploadedFiles", "uploadingError"] }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: AttachmentViewer, selector: "iss-viewer-attachment", inputs: ["uploading", "uploadingError"], outputs: ["deleteOut"] }, { kind: "directive", type: MatLabel$1, selector: "mat-label" }], viewProviders: [VIEW_PROVIDER] });
8776
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: FilePickerControl, selector: "iss-ctrl-file-picker", inputs: ["accept", "showDownloadButton", "showDeleteButton", "uploading", "uploadedFiles", "uploadingError"] }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: AttachmentViewer, selector: "iss-viewer-attachment", inputs: ["uploading", "uploadingError"], outputs: ["deleteOut"] }, { kind: "directive", type: MatLabel$1, selector: "mat-label" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
8623
8777
  }
8624
8778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: FilePickerField, decorators: [{
8625
8779
  type: Component,
@@ -8629,14 +8783,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8629
8783
  imports: [
8630
8784
  ReactiveFormsModule,
8631
8785
  FilePickerControl,
8632
- ValidationMessageComponent,
8786
+ ValidationMessage,
8633
8787
  AttachmentViewer,
8634
- MatLabel$1
8788
+ MatLabel$1,
8789
+ FieldViewer
8635
8790
  ],
8636
8791
  template: `
8637
8792
  @if (field.visible()) {
8638
- <mat-label>{{ field.label() }}</mat-label>
8639
8793
  @if (field.mode() === "edit") {
8794
+ <mat-label>{{ field.label() }}</mat-label>
8640
8795
  <input type="hidden" [formControlName]="field.name">
8641
8796
  <!-- [showDeleteButton]="field.config.showDeleteButton" [showDownloadButton]="field.config.showDownloadButton"-->
8642
8797
  <iss-ctrl-file-picker
@@ -8651,7 +8806,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8651
8806
  />
8652
8807
  <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="ctrl.touched"/>
8653
8808
  } @else {
8654
- <iss-viewer-attachment [uploading]="uploading()" [field]="viewField()"/>
8809
+ <iss-field-viewer>
8810
+ <label>{{ field.label() }}</label>
8811
+ <iss-viewer-attachment [uploading]="uploading()" [field]="viewField()"/>
8812
+ </iss-field-viewer>
8655
8813
  }
8656
8814
  }
8657
8815
  `
@@ -8715,10 +8873,13 @@ class TimePickerField extends FieldBase {
8715
8873
  <label>{{ field.label() }}</label>
8716
8874
  </iss-ctrl-time-picker>
8717
8875
  } @else {
8718
- <iss-viewer-time-picker [field]="field"/>
8876
+ <iss-field-viewer>
8877
+ <label>{{ field.label() }}</label>
8878
+ <iss-viewer-time-picker [field]="field"/>
8879
+ </iss-field-viewer>
8719
8880
  }
8720
8881
  }
8721
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: TimePickerControl, selector: "iss-ctrl-time-picker", inputs: ["interval", "minTime", "maxTime"] }, { kind: "component", type: TimePickerViewer, selector: "iss-viewer-time-picker" }], viewProviders: [VIEW_PROVIDER] });
8882
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: TimePickerControl, selector: "iss-ctrl-time-picker", inputs: ["interval", "minTime", "maxTime"] }, { kind: "component", type: TimePickerViewer, selector: "iss-viewer-time-picker" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
8722
8883
  }
8723
8884
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TimePickerField, decorators: [{
8724
8885
  type: Component,
@@ -8728,7 +8889,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8728
8889
  imports: [
8729
8890
  ReactiveFormsModule,
8730
8891
  TimePickerControl,
8731
- TimePickerViewer
8892
+ TimePickerViewer,
8893
+ FieldViewer
8732
8894
  ],
8733
8895
  template: `
8734
8896
  @if (field.visible()) {
@@ -8737,7 +8899,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8737
8899
  <label>{{ field.label() }}</label>
8738
8900
  </iss-ctrl-time-picker>
8739
8901
  } @else {
8740
- <iss-viewer-time-picker [field]="field"/>
8902
+ <iss-field-viewer>
8903
+ <label>{{ field.label() }}</label>
8904
+ <iss-viewer-time-picker [field]="field"/>
8905
+ </iss-field-viewer>
8741
8906
  }
8742
8907
  }
8743
8908
  `
@@ -8815,9 +8980,9 @@ var datePicker_viewer = /*#__PURE__*/Object.freeze({
8815
8980
  */
8816
8981
  class DatePickerField extends FieldBase {
8817
8982
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DatePickerField, deps: null, target: i0.ɵɵFactoryTarget.Component });
8818
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DatePickerField, isStandalone: true, selector: "iss-field-date-picker", usesInheritance: true, ngImport: i0, template: `
8819
- @if (field.visible()) {
8820
- @if (field.mode() === "edit") {
8983
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DatePickerField, isStandalone: true, selector: "iss-field-date-picker", usesInheritance: true, ngImport: i0, template: `
8984
+ @if (field.visible()) {
8985
+ @if (field.mode() === "edit") {
8821
8986
  <iss-ctrl-date-picker
8822
8987
  [formControlName]="field.name"
8823
8988
  [minDate]="field.config.minDate() ?? null"
@@ -8825,15 +8990,18 @@ class DatePickerField extends FieldBase {
8825
8990
  [readonly]="field.config.readonly() ?? false"
8826
8991
  [hijriCalendar]="field.config.hijriCalendar() ?? false"
8827
8992
  [emitHijri]="field.config.emitHijri() ?? false"
8828
- >
8829
- <label>{{ field.label() }}</label>
8830
- </iss-ctrl-date-picker>
8831
- <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
8832
- } @else {
8833
- <iss-viewer-date-picker [field]="field"/>
8834
- }
8835
- }
8836
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: DatePickerControl, selector: "iss-ctrl-date-picker", inputs: ["disabledDays", "minDate", "maxDate", "hijriCalendar", "emitHijri"] }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: DatePickerViewer, selector: "iss-viewer-date-picker" }], viewProviders: [VIEW_PROVIDER] });
8993
+ >
8994
+ <label>{{ field.label() }}</label>
8995
+ </iss-ctrl-date-picker>
8996
+ <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
8997
+ } @else {
8998
+ <iss-field-viewer>
8999
+ <label>{{ field.label() }}</label>
9000
+ <iss-viewer-date-picker [field]="field"/>
9001
+ </iss-field-viewer>
9002
+ }
9003
+ }
9004
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: DatePickerControl, selector: "iss-ctrl-date-picker", inputs: ["disabledDays", "minDate", "maxDate", "hijriCalendar", "emitHijri"] }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: DatePickerViewer, selector: "iss-viewer-date-picker" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
8837
9005
  }
8838
9006
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DatePickerField, decorators: [{
8839
9007
  type: Component,
@@ -8843,12 +9011,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8843
9011
  imports: [
8844
9012
  ReactiveFormsModule,
8845
9013
  DatePickerControl,
8846
- ValidationMessageComponent,
8847
- DatePickerViewer
9014
+ ValidationMessage,
9015
+ DatePickerViewer,
9016
+ FieldViewer
8848
9017
  ],
8849
- template: `
8850
- @if (field.visible()) {
8851
- @if (field.mode() === "edit") {
9018
+ template: `
9019
+ @if (field.visible()) {
9020
+ @if (field.mode() === "edit") {
8852
9021
  <iss-ctrl-date-picker
8853
9022
  [formControlName]="field.name"
8854
9023
  [minDate]="field.config.minDate() ?? null"
@@ -8856,14 +9025,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8856
9025
  [readonly]="field.config.readonly() ?? false"
8857
9026
  [hijriCalendar]="field.config.hijriCalendar() ?? false"
8858
9027
  [emitHijri]="field.config.emitHijri() ?? false"
8859
- >
8860
- <label>{{ field.label() }}</label>
8861
- </iss-ctrl-date-picker>
8862
- <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
8863
- } @else {
8864
- <iss-viewer-date-picker [field]="field"/>
8865
- }
8866
- }
9028
+ >
9029
+ <label>{{ field.label() }}</label>
9030
+ </iss-ctrl-date-picker>
9031
+ <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
9032
+ } @else {
9033
+ <iss-field-viewer>
9034
+ <label>{{ field.label() }}</label>
9035
+ <iss-viewer-date-picker [field]="field"/>
9036
+ </iss-field-viewer>
9037
+ }
9038
+ }
8867
9039
  `
8868
9040
  }]
8869
9041
  }] });
@@ -8941,9 +9113,9 @@ var datetimePicker_viewer = /*#__PURE__*/Object.freeze({
8941
9113
  */
8942
9114
  class DatetimePickerField extends FieldBase {
8943
9115
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DatetimePickerField, deps: null, target: i0.ɵɵFactoryTarget.Component });
8944
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DatetimePickerField, isStandalone: true, selector: "iss-field-datetime-picker", usesInheritance: true, ngImport: i0, template: `
8945
- @if (field.visible()) {
8946
- @if (field.mode() === "edit") {
9116
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DatetimePickerField, isStandalone: true, selector: "iss-field-datetime-picker", usesInheritance: true, ngImport: i0, template: `
9117
+ @if (field.visible()) {
9118
+ @if (field.mode() === "edit") {
8947
9119
  <iss-ctrl-datetime-picker
8948
9120
  [formControlName]="field.name"
8949
9121
  [minDate]="field.config.minDate() ?? null"
@@ -8951,15 +9123,18 @@ class DatetimePickerField extends FieldBase {
8951
9123
  [readonly]="field.config.readonly() ?? false"
8952
9124
  [hijriCalendar]="field.config.hijriCalendar() ?? false"
8953
9125
  [emitHijri]="field.config.emitHijri() ?? false"
8954
- >
8955
- <label>{{ field.label() }}</label>
8956
- </iss-ctrl-datetime-picker>
8957
- <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
8958
- } @else {
8959
- <iss-viewer-datetime-picker [field]="field"/>
8960
- }
8961
- }
8962
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: DatetimePickerControl, selector: "iss-ctrl-datetime-picker", inputs: ["disabledDays", "minDate", "maxDate", "minTime", "maxTime", "hijriCalendar", "emitHijri"] }, { kind: "component", type: ValidationMessageComponent, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: DatePickerTimeViewer, selector: "iss-viewer-datetime-picker" }], viewProviders: [VIEW_PROVIDER] });
9126
+ >
9127
+ <label>{{ field.label() }}</label>
9128
+ </iss-ctrl-datetime-picker>
9129
+ <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
9130
+ } @else {
9131
+ <iss-field-viewer>
9132
+ <label>{{ field.label() }}</label>
9133
+ <iss-viewer-datetime-picker [field]="field"/>
9134
+ </iss-field-viewer>
9135
+ }
9136
+ }
9137
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: DatetimePickerControl, selector: "iss-ctrl-datetime-picker", inputs: ["disabledDays", "minDate", "maxDate", "minTime", "maxTime", "hijriCalendar", "emitHijri"] }, { kind: "component", type: ValidationMessage, selector: "iss-validation-message-viewer", inputs: ["errors", "showMessage"] }, { kind: "component", type: DatePickerTimeViewer, selector: "iss-viewer-datetime-picker" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
8963
9138
  }
8964
9139
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DatetimePickerField, decorators: [{
8965
9140
  type: Component,
@@ -8969,12 +9144,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8969
9144
  imports: [
8970
9145
  ReactiveFormsModule,
8971
9146
  DatetimePickerControl,
8972
- ValidationMessageComponent,
9147
+ ValidationMessage,
8973
9148
  DatePickerTimeViewer,
9149
+ FieldViewer
8974
9150
  ],
8975
- template: `
8976
- @if (field.visible()) {
8977
- @if (field.mode() === "edit") {
9151
+ template: `
9152
+ @if (field.visible()) {
9153
+ @if (field.mode() === "edit") {
8978
9154
  <iss-ctrl-datetime-picker
8979
9155
  [formControlName]="field.name"
8980
9156
  [minDate]="field.config.minDate() ?? null"
@@ -8982,14 +9158,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
8982
9158
  [readonly]="field.config.readonly() ?? false"
8983
9159
  [hijriCalendar]="field.config.hijriCalendar() ?? false"
8984
9160
  [emitHijri]="field.config.emitHijri() ?? false"
8985
- >
8986
- <label>{{ field.label() }}</label>
8987
- </iss-ctrl-datetime-picker>
8988
- <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
8989
- } @else {
8990
- <iss-viewer-datetime-picker [field]="field"/>
8991
- }
8992
- }
9161
+ >
9162
+ <label>{{ field.label() }}</label>
9163
+ </iss-ctrl-datetime-picker>
9164
+ <iss-validation-message-viewer [errors]="ctrl.errors" [showMessage]="!ctrl.untouched"/>
9165
+ } @else {
9166
+ <iss-field-viewer>
9167
+ <label>{{ field.label() }}</label>
9168
+ <iss-viewer-datetime-picker [field]="field"/>
9169
+ </iss-field-viewer>
9170
+ }
9171
+ }
8993
9172
  `
8994
9173
  }]
8995
9174
  }] });
@@ -9068,9 +9247,9 @@ var dateRangePicker_viewer = /*#__PURE__*/Object.freeze({
9068
9247
  */
9069
9248
  class DateRangePickerField extends FieldBase {
9070
9249
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DateRangePickerField, deps: null, target: i0.ɵɵFactoryTarget.Component });
9071
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DateRangePickerField, isStandalone: true, selector: "iss-field-date-range-picker", usesInheritance: true, ngImport: i0, template: `
9072
- @if (field.visible()) {
9073
- @if (field.mode() === "edit") {
9250
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DateRangePickerField, isStandalone: true, selector: "iss-field-date-range-picker", usesInheritance: true, ngImport: i0, template: `
9251
+ @if (field.visible()) {
9252
+ @if (field.mode() === "edit") {
9074
9253
  <iss-ctrl-date-range-picker
9075
9254
  [formControlName]="field.name"
9076
9255
  [minDate]="field.config.minDate() ?? null"
@@ -9078,14 +9257,17 @@ class DateRangePickerField extends FieldBase {
9078
9257
  [readonly]="field.config.readonly() ?? false"
9079
9258
  [hijriCalendar]="field.config.hijriCalendar() ?? false"
9080
9259
  [emitHijri]="field.config.emitHijri() ?? false"
9081
- >
9082
- <label>{{ field.label() }}</label>
9083
- </iss-ctrl-date-range-picker>
9084
- } @else {
9085
- <iss-viewer-date-range-picker [field]="field"/>
9086
- }
9087
- }
9088
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: DateRangePickerControl, selector: "iss-ctrl-date-range-picker", inputs: ["disabledDays", "minDate", "maxDate", "hijriCalendar", "emitHijri"], outputs: ["onDateRangeObjectChange"] }, { kind: "component", type: DateRangePickerViewer, selector: "iss-viewer-date-range-picker" }], viewProviders: [VIEW_PROVIDER] });
9260
+ >
9261
+ <label>{{ field.label() }}</label>
9262
+ </iss-ctrl-date-range-picker>
9263
+ } @else {
9264
+ <iss-field-viewer>
9265
+ <label>{{ field.label() }}</label>
9266
+ <iss-viewer-date-range-picker [field]="field"/>
9267
+ </iss-field-viewer>
9268
+ }
9269
+ }
9270
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: DateRangePickerControl, selector: "iss-ctrl-date-range-picker", inputs: ["disabledDays", "minDate", "maxDate", "hijriCalendar", "emitHijri"], outputs: ["onDateRangeObjectChange"] }, { kind: "component", type: DateRangePickerViewer, selector: "iss-viewer-date-range-picker" }, { kind: "component", type: FieldViewer, selector: "iss-field-viewer" }], viewProviders: [VIEW_PROVIDER] });
9089
9271
  }
9090
9272
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DateRangePickerField, decorators: [{
9091
9273
  type: Component,
@@ -9095,11 +9277,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9095
9277
  imports: [
9096
9278
  ReactiveFormsModule,
9097
9279
  DateRangePickerControl,
9098
- DateRangePickerViewer
9280
+ DateRangePickerViewer,
9281
+ FieldViewer
9099
9282
  ],
9100
- template: `
9101
- @if (field.visible()) {
9102
- @if (field.mode() === "edit") {
9283
+ template: `
9284
+ @if (field.visible()) {
9285
+ @if (field.mode() === "edit") {
9103
9286
  <iss-ctrl-date-range-picker
9104
9287
  [formControlName]="field.name"
9105
9288
  [minDate]="field.config.minDate() ?? null"
@@ -9107,13 +9290,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9107
9290
  [readonly]="field.config.readonly() ?? false"
9108
9291
  [hijriCalendar]="field.config.hijriCalendar() ?? false"
9109
9292
  [emitHijri]="field.config.emitHijri() ?? false"
9110
- >
9111
- <label>{{ field.label() }}</label>
9112
- </iss-ctrl-date-range-picker>
9113
- } @else {
9114
- <iss-viewer-date-range-picker [field]="field"/>
9115
- }
9116
- }
9293
+ >
9294
+ <label>{{ field.label() }}</label>
9295
+ </iss-ctrl-date-range-picker>
9296
+ } @else {
9297
+ <iss-field-viewer>
9298
+ <label>{{ field.label() }}</label>
9299
+ <iss-viewer-date-range-picker [field]="field"/>
9300
+ </iss-field-viewer>
9301
+ }
9302
+ }
9117
9303
  `
9118
9304
  }]
9119
9305
  }] });
@@ -9402,11 +9588,13 @@ var file_validator = /*#__PURE__*/Object.freeze({
9402
9588
  });
9403
9589
 
9404
9590
  class TimeValidator {
9405
- static beforeDate(field) {
9591
+ // The rule's value is the name of the field this one must not run past, so it arrives here
9592
+ // rather than being read back off the field.
9593
+ static beforeDate(otherFieldName) {
9406
9594
  const controlContainer = inject(ControlContainer);
9407
9595
  const parentForm = controlContainer.control;
9408
9596
  return (control) => {
9409
- const anotherControl = parentForm.get(field?.validation?.beforeDate?.value);
9597
+ const anotherControl = parentForm.get(otherFieldName);
9410
9598
  if (anotherControl) {
9411
9599
  const anotherControlValue = anotherControl.getRawValue();
9412
9600
  const controlValue = control.getRawValue();
@@ -9419,7 +9607,7 @@ class TimeValidator {
9419
9607
  return null;
9420
9608
  };
9421
9609
  }
9422
- static afterDate(field) {
9610
+ static afterDate(otherFieldName) {
9423
9611
  return (control) => {
9424
9612
  return null;
9425
9613
  };
@@ -9437,5 +9625,5 @@ var time_validator = /*#__PURE__*/Object.freeze({
9437
9625
  * Generated bundle index. Do not edit.
9438
9626
  */
9439
9627
 
9440
- export { PlateViewer as $, TimePickerField as A, DatePickerField as B, ControlBase as C, DatePickerControl as D, Employee as E, FieldBase as F, DatetimePickerField as G, HOST as H, IssField as I, DateRangePickerField as J, InputViewer as K, Loader as L, MobileControl as M, TextareaViewer as N, Outlet as O, PLACEHOLDER_REGEX as P, ChipsViewer as Q, RadioControl as R, SelectControl as S, TextareaControl as T, RadioViewer as U, VIEW_PROVIDER as V, SelectViewer as W, MobileViewer as X, CheckboxViewer as Y, ToggleButtonViewer as Z, SlideToggleViewer as _, ValidationMessageComponent as a, AttachmentViewer as a0, TimePickerViewer as a1, DatePickerViewer as a2, DatePickerTimeViewer as a3, DateRangePickerViewer as a4, DEFAULT_COUNTRY as a5, COUNTRIES as a6, DATE_FORMAT_ADAPTER as a7, DATETIME_FORMAT as a8, PLATE_LETTERS as a9, startOfHijriMonth as aA, getHijriDaysInMonth as aB, createHijriDate as aC, formatHijriDate as aD, parseHijriDate as aE, toHijriDisplay as aF, IssValidators as aG, FileValidators as aH, TimeValidator as aI, VALIDATION_MESSAGES as aa, COMPONENTS as ab, SERVICES as ac, VALIDATORS as ad, FIELD_DATA as ae, UI_LANGUAGE as af, ATTACHMENT_UPLOAD_URL as ag, ATTACHMENT_UPLOAD_RESPONSE_MAPPER as ah, ATTACHMENT_DOWNLOAD_URL as ai, USER_SEARCH_API as aj, HintsComponent as ak, Droppable as al, ArabicNumberPipe as am, FieldDataInjector as an, PlateLetterPipe as ao, SelectStatusPipe as ap, TranslatePipe as aq, FileHandler as ar, IssDateAdapter as as, provideIssDateAdapter as at, Phone as au, arrayFrom as av, formatFileSize as aw, HIJRI_LOCALE as ax, HIJRI_MONTH_NAMES as ay, getHijriParts as az, ViewerBase as b, FormEngine as c, CheckboxControl as d, ChipsControl as e, DateRangePickerControl as f, getPropertyByPath as g, DatetimePickerControl as h, FilePickerControl as i, InputControl as j, PlateControl as k, SlideToggleControl as l, TimePickerControl as m, ToggleButtonControl as n, InputField as o, TextareaField as p, ChipsField as q, replacePlaceholders as r, RadioField as s, SelectField as t, MobileField as u, CheckboxField as v, ToggleButtonField as w, SlideToggleField as x, PlateField as y, FilePickerField as z };
9441
- //# sourceMappingURL=iss-ctrl-iss-ctrl-C_ZiixeF.mjs.map
9628
+ export { SlideToggleViewer as $, FilePickerField as A, TimePickerField as B, ControlBase as C, DatePickerControl as D, Employee as E, FieldBase as F, DatePickerField as G, HOST as H, IssField as I, DatetimePickerField as J, DateRangePickerField as K, Loader as L, MobileControl as M, InputViewer as N, Outlet as O, PLACEHOLDER_REGEX as P, TextareaViewer as Q, RadioControl as R, SelectControl as S, TextareaControl as T, ChipsViewer as U, VIEW_PROVIDER as V, RadioViewer as W, SelectViewer as X, MobileViewer as Y, CheckboxViewer as Z, ToggleButtonViewer as _, ValidationMessage as a, PlateViewer as a0, AttachmentViewer as a1, TimePickerViewer as a2, DatePickerViewer as a3, DatePickerTimeViewer as a4, DateRangePickerViewer as a5, DEFAULT_COUNTRY as a6, COUNTRIES as a7, DATE_FORMAT_ADAPTER as a8, DATETIME_FORMAT as a9, HIJRI_MONTH_NAMES as aA, getHijriParts as aB, startOfHijriMonth as aC, getHijriDaysInMonth as aD, createHijriDate as aE, formatHijriDate as aF, parseHijriDate as aG, toHijriDisplay as aH, IssValidators as aI, FileValidators as aJ, TimeValidator as aK, PLATE_LETTERS as aa, VALIDATION_MESSAGES as ab, COMPONENTS as ac, SERVICES as ad, VALIDATORS as ae, isActiveValidationRule as af, FIELD_DATA as ag, UI_LANGUAGE as ah, ATTACHMENT_UPLOAD_URL as ai, ATTACHMENT_UPLOAD_RESPONSE_MAPPER as aj, ATTACHMENT_DOWNLOAD_URL as ak, USER_SEARCH_API as al, Hints as am, Droppable as an, ArabicNumberPipe as ao, FieldDataInjector as ap, PlateLetterPipe as aq, SelectStatusPipe as ar, TranslatePipe as as, FileHandler as at, IssDateAdapter as au, provideIssDateAdapter as av, Phone as aw, arrayFrom as ax, formatFileSize as ay, HIJRI_LOCALE as az, FieldViewer as b, ViewerBase as c, FormEngine as d, CheckboxControl as e, ChipsControl as f, getPropertyByPath as g, DateRangePickerControl as h, DatetimePickerControl as i, FilePickerControl as j, InputControl as k, PlateControl as l, SlideToggleControl as m, TimePickerControl as n, ToggleButtonControl as o, InputField as p, TextareaField as q, replacePlaceholders as r, ChipsField as s, RadioField as t, SelectField as u, MobileField as v, CheckboxField as w, ToggleButtonField as x, SlideToggleField as y, PlateField as z };
9629
+ //# sourceMappingURL=iss-ctrl-iss-ctrl-BnwwafES.mjs.map