iss-ctrl 0.0.20 → 0.0.21

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-BnwwafES.mjs → iss-ctrl-iss-ctrl-BKu6a5HF.mjs} +645 -591
  2. package/fesm2022/iss-ctrl-iss-ctrl-BKu6a5HF.mjs.map +1 -0
  3. package/fesm2022/{iss-ctrl-load-event-BcWMow3s.mjs → iss-ctrl-load-event-bOt6IlIo.mjs} +3 -3
  4. package/fesm2022/{iss-ctrl-load-event-BcWMow3s.mjs.map → iss-ctrl-load-event-bOt6IlIo.mjs.map} +1 -1
  5. package/fesm2022/{iss-ctrl-load-options-event-sTdrxJYn.mjs → iss-ctrl-load-options-event-CxyAyNMe.mjs} +3 -3
  6. package/fesm2022/{iss-ctrl-load-options-event-sTdrxJYn.mjs.map → iss-ctrl-load-options-event-CxyAyNMe.mjs.map} +1 -1
  7. package/fesm2022/{iss-ctrl-load-value-event-BG9zEexV.mjs → iss-ctrl-load-value-event-DJKJ5S3h.mjs} +3 -3
  8. package/fesm2022/{iss-ctrl-load-value-event-BG9zEexV.mjs.map → iss-ctrl-load-value-event-DJKJ5S3h.mjs.map} +1 -1
  9. package/fesm2022/{iss-ctrl-note.field-DyOSzuIi.mjs → iss-ctrl-note.field-B_Lbp28X.mjs} +2 -2
  10. package/fesm2022/{iss-ctrl-note.field-DyOSzuIi.mjs.map → iss-ctrl-note.field-B_Lbp28X.mjs.map} +1 -1
  11. package/fesm2022/{iss-ctrl-replace-api-keys-CzJkn7fK.mjs → iss-ctrl-replace-api-keys-C0XYQW4i.mjs} +2 -2
  12. package/fesm2022/{iss-ctrl-replace-api-keys-CzJkn7fK.mjs.map → iss-ctrl-replace-api-keys-C0XYQW4i.mjs.map} +1 -1
  13. package/fesm2022/{iss-ctrl-set-value-event-B800MsyP.mjs → iss-ctrl-set-value-event-CgXhi0Bv.mjs} +2 -2
  14. package/fesm2022/{iss-ctrl-set-value-event-B800MsyP.mjs.map → iss-ctrl-set-value-event-CgXhi0Bv.mjs.map} +1 -1
  15. package/fesm2022/{iss-ctrl-table.field-CJmtpHsh.mjs → iss-ctrl-table.field-B5FxF6hn.mjs} +2 -2
  16. package/fesm2022/{iss-ctrl-table.field-CJmtpHsh.mjs.map → iss-ctrl-table.field-B5FxF6hn.mjs.map} +1 -1
  17. package/fesm2022/{iss-ctrl-trigger-based-on-json-value-C5x0hyWn.mjs → iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs} +2 -2
  18. package/fesm2022/{iss-ctrl-trigger-based-on-json-value-C5x0hyWn.mjs.map → iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs.map} +1 -1
  19. package/fesm2022/{iss-ctrl-user-picker.field-CJqIvkMM.mjs → iss-ctrl-user-picker.field-BH63sZ-X.mjs} +2 -2
  20. package/fesm2022/{iss-ctrl-user-picker.field-CJqIvkMM.mjs.map → iss-ctrl-user-picker.field-BH63sZ-X.mjs.map} +1 -1
  21. package/fesm2022/iss-ctrl.mjs +1 -1
  22. package/package.json +1 -1
  23. package/types/iss-ctrl.d.ts +20 -2
  24. package/upgrade.scss +30 -18
  25. package/fesm2022/iss-ctrl-iss-ctrl-BnwwafES.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Pipe, input, signal, output, Component, CUSTOM_ELEMENTS_SCHEMA, InjectionToken, inject, Injectable, effect, HostListener, Directive, computed, ChangeDetectionStrategy, ElementRef, contentChild, isSignal, Injector, DestroyRef } from '@angular/core';
2
+ import { Pipe, input, signal, output, inject, Injector, Component, CUSTOM_ELEMENTS_SCHEMA, InjectionToken, Injectable, effect, HostListener, Directive, computed, ChangeDetectionStrategy, ElementRef, contentChild, isSignal, DestroyRef } from '@angular/core';
3
3
  import * as i1$2 from '@angular/forms';
4
- import { FormControl, ReactiveFormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormGroup, FormsModule, Validators, ControlContainer } from '@angular/forms';
4
+ import { FormControl, NgControl, ReactiveFormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormGroup, FormsModule, Validators, ControlContainer } from '@angular/forms';
5
5
  import * as i1 from '@angular/material/checkbox';
6
6
  import { MatCheckboxModule } from '@angular/material/checkbox';
7
7
  import * as i4 from '@angular/material/chips';
@@ -145,6 +145,29 @@ class ControlBase {
145
145
  */
146
146
  onChange = output();
147
147
  ctrl = new FormControl(null);
148
+ /**
149
+ * Error state for the inner `mat-form-field`, derived from the **host** control.
150
+ *
151
+ * Material reads `errorState` off the `NgControl` bound to its own `matInput` — here that is
152
+ * {@link ControlBase.ctrl}, which carries no validators and is therefore always valid. Every
153
+ * error a consumer cares about (the field config's validators plus the control's own
154
+ * {@link ControlBase.validate}) lives on the host control instead, so without this matcher an
155
+ * invalid `iss-ctrl-*` would keep rendering the valid outline. Bind it on the `matInput` as
156
+ * `[errorStateMatcher]="errorStateMatcher"`.
157
+ */
158
+ errorStateMatcher = {
159
+ isErrorState: (_control, form) => {
160
+ const host = this.hostControl();
161
+ if (!host) {
162
+ return false;
163
+ }
164
+ return !!host.invalid && (!!host.touched || this.touched() || !!form?.submitted);
165
+ }
166
+ };
167
+ #injector = inject(Injector);
168
+ // Resolved lazily: injecting NgControl in the constructor would close the DI cycle through
169
+ // NG_VALUE_ACCESSOR, which every control provides with `useExisting`.
170
+ #hostControl = undefined;
148
171
  registerOnChange(fn) {
149
172
  this.onPropagateValue = fn;
150
173
  }
@@ -170,6 +193,16 @@ class ControlBase {
170
193
  validate(control) {
171
194
  return this.ctrl.errors;
172
195
  }
196
+ /**
197
+ * The `NgControl` this component is bound to from the outside (`formControlName`,
198
+ * `[formControl]` or `[ngModel]`), or `null` when it is used without one.
199
+ */
200
+ hostControl() {
201
+ if (this.#hostControl === undefined) {
202
+ this.#hostControl = this.#injector.get(NgControl, null, { self: true });
203
+ }
204
+ return this.#hostControl;
205
+ }
173
206
  /**
174
207
  * Whether the control currently holds no value.
175
208
  *
@@ -210,13 +243,13 @@ class ControlBase {
210
243
  this.onChange.emit(emissionValue);
211
244
  }
212
245
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ControlBase, deps: [], target: i0.ɵɵFactoryTarget.Component });
213
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: ControlBase, isStandalone: true, selector: "ng-component", inputs: { formControlName: { classPropertyName: "formControlName", publicName: "formControlName", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, minLength: { classPropertyName: "minLength", publicName: "minLength", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hints: { classPropertyName: "hints", publicName: "hints", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onChange: "onChange" }, host: { properties: { "class.iss-ctrl-empty": "isEmpty()" } }, ngImport: i0, template: ``, isInline: true });
246
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.9", type: ControlBase, isStandalone: true, selector: "ng-component", inputs: { formControlName: { classPropertyName: "formControlName", publicName: "formControlName", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, minLength: { classPropertyName: "minLength", publicName: "minLength", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, hints: { classPropertyName: "hints", publicName: "hints", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onChange: "onChange" }, host: { properties: { "class.iss-ctrl-empty": "isEmpty()" }, classAttribute: "iss-ctrl" }, ngImport: i0, template: ``, isInline: true });
214
247
  }
215
248
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ControlBase, decorators: [{
216
249
  type: Component,
217
250
  args: [{
218
251
  template: ``,
219
- host: { "[class.iss-ctrl-empty]": "isEmpty()" }
252
+ host: { "class": "iss-ctrl", "[class.iss-ctrl-empty]": "isEmpty()" }
220
253
  }]
221
254
  }], propDecorators: { formControlName: [{ type: i0.Input, args: [{ isSignal: true, alias: "formControlName", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], minLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minLength", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], hints: [{ type: i0.Input, args: [{ isSignal: true, alias: "hints", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], onChange: [{ type: i0.Output, args: ["onChange"] }] } });
222
255
 
@@ -421,31 +454,32 @@ class ChipsControl extends ControlBase {
421
454
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ChipsControl, deps: null, target: i0.ɵɵFactoryTarget.Component });
422
455
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ChipsControl, isStandalone: true, selector: "iss-ctrl-chips", providers: [
423
456
  { provide: NG_VALUE_ACCESSOR, useExisting: ChipsControl, multi: true }
424
- ], usesInheritance: true, ngImport: i0, template: `
425
- <mat-form-field floatLabel="auto" class="">
426
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
427
- <mat-label class="fs-16 fc-dark-gray">
428
- <ng-content select="label"></ng-content>
429
- </mat-label>
430
- <input
431
- matInput
432
- [placeholder]="placeholder()"
433
- [matChipInputFor]="chipGrid"
434
- [disabled]="disabled()"
435
- [readonly]="readonly()"
436
- (matChipInputTokenEnd)="add($event)"
437
- />
438
- </mat-form-field>
439
- <mat-chip-grid #chipGrid>
440
- @for (keyword of keywords(); track keyword) {
441
- <mat-chip-row (removed)="remove(keyword)">
442
- {{ keyword }}
443
- <button matChipRemove [disabled]="disabled() || readonly()">
444
- <ds-icon icon="trash" class="fc-red"></ds-icon>
445
- </button>
446
- </mat-chip-row>
447
- }
448
- </mat-chip-grid>
457
+ ], usesInheritance: true, ngImport: i0, template: `
458
+ <mat-form-field floatLabel="auto" class="">
459
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
460
+ <mat-label class="fs-16 fc-dark-gray">
461
+ <ng-content select="label"></ng-content>
462
+ </mat-label>
463
+ <input
464
+ matInput
465
+ [errorStateMatcher]="errorStateMatcher"
466
+ [placeholder]="placeholder()"
467
+ [matChipInputFor]="chipGrid"
468
+ [disabled]="disabled()"
469
+ [readonly]="readonly()"
470
+ (matChipInputTokenEnd)="add($event)"
471
+ />
472
+ </mat-form-field>
473
+ <mat-chip-grid #chipGrid>
474
+ @for (keyword of keywords(); track keyword) {
475
+ <mat-chip-row (removed)="remove(keyword)">
476
+ {{ keyword }}
477
+ <button matChipRemove [disabled]="disabled() || readonly()">
478
+ <ds-icon icon="trash" class="fc-red"></ds-icon>
479
+ </button>
480
+ </mat-chip-row>
481
+ }
482
+ </mat-chip-grid>
449
483
  `, isInline: true, dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "component", type: MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled", "readonly", "matChipInputDisabledInteractive"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { 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: "directive", type: MatChipRemove, selector: "[matChipRemove]" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i1$1.MatLabel, selector: "mat-label" }] });
450
484
  }
451
485
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ChipsControl, decorators: [{
@@ -466,31 +500,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
466
500
  providers: [
467
501
  { provide: NG_VALUE_ACCESSOR, useExisting: ChipsControl, multi: true }
468
502
  ],
469
- template: `
470
- <mat-form-field floatLabel="auto" class="">
471
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
472
- <mat-label class="fs-16 fc-dark-gray">
473
- <ng-content select="label"></ng-content>
474
- </mat-label>
475
- <input
476
- matInput
477
- [placeholder]="placeholder()"
478
- [matChipInputFor]="chipGrid"
479
- [disabled]="disabled()"
480
- [readonly]="readonly()"
481
- (matChipInputTokenEnd)="add($event)"
482
- />
483
- </mat-form-field>
484
- <mat-chip-grid #chipGrid>
485
- @for (keyword of keywords(); track keyword) {
486
- <mat-chip-row (removed)="remove(keyword)">
487
- {{ keyword }}
488
- <button matChipRemove [disabled]="disabled() || readonly()">
489
- <ds-icon icon="trash" class="fc-red"></ds-icon>
490
- </button>
491
- </mat-chip-row>
492
- }
493
- </mat-chip-grid>
503
+ template: `
504
+ <mat-form-field floatLabel="auto" class="">
505
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
506
+ <mat-label class="fs-16 fc-dark-gray">
507
+ <ng-content select="label"></ng-content>
508
+ </mat-label>
509
+ <input
510
+ matInput
511
+ [errorStateMatcher]="errorStateMatcher"
512
+ [placeholder]="placeholder()"
513
+ [matChipInputFor]="chipGrid"
514
+ [disabled]="disabled()"
515
+ [readonly]="readonly()"
516
+ (matChipInputTokenEnd)="add($event)"
517
+ />
518
+ </mat-form-field>
519
+ <mat-chip-grid #chipGrid>
520
+ @for (keyword of keywords(); track keyword) {
521
+ <mat-chip-row (removed)="remove(keyword)">
522
+ {{ keyword }}
523
+ <button matChipRemove [disabled]="disabled() || readonly()">
524
+ <ds-icon icon="trash" class="fc-red"></ds-icon>
525
+ </button>
526
+ </mat-chip-row>
527
+ }
528
+ </mat-chip-grid>
494
529
  `
495
530
  }]
496
531
  }] });
@@ -956,32 +991,33 @@ class DatePickerControl extends ControlBase {
956
991
  provideIssDateAdapter(),
957
992
  { provide: NG_VALUE_ACCESSOR, useExisting: DatePickerControl, multi: true },
958
993
  { provide: NG_VALIDATORS, useExisting: DatePickerControl, multi: true },
959
- ], usesInheritance: true, ngImport: i0, template: `
960
- <mat-form-field floatLabel="auto" class="">
961
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
962
- <mat-label class="fs-16 fc-dark-gray">
963
- <ng-content select="label"></ng-content>
964
- </mat-label>
965
- <input
966
- class="cursor-pointer"
967
- matInput
968
- readonly
969
- [matDatepicker]="picker"
970
- (click)="openPicker(picker)"
971
- [formControl]="ctrl"
972
- [readonly]="readonly()"
973
- [min]="minDate()"
974
- [max]="maxDate()"
975
- [matDatepickerFilter]="calendarDaysFilter"
976
- (dateChange)="emit($event)"
977
- />
978
- @if (ctrl.getRawValue()) {
979
- <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
980
- }
981
- <mat-datepicker-toggle matIconSuffix [for]="picker" [disabled]="readonly()"></mat-datepicker-toggle>
982
- <mat-datepicker #picker [panelClass]="isHijri() ? 'iss-hijri-calendar' : ''"></mat-datepicker>
983
-
984
- </mat-form-field>
994
+ ], usesInheritance: true, ngImport: i0, template: `
995
+ <mat-form-field floatLabel="auto" class="">
996
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
997
+ <mat-label class="fs-16 fc-dark-gray">
998
+ <ng-content select="label"></ng-content>
999
+ </mat-label>
1000
+ <input
1001
+ class="cursor-pointer"
1002
+ matInput
1003
+ [errorStateMatcher]="errorStateMatcher"
1004
+ readonly
1005
+ [matDatepicker]="picker"
1006
+ (click)="openPicker(picker)"
1007
+ [formControl]="ctrl"
1008
+ [readonly]="readonly()"
1009
+ [min]="minDate()"
1010
+ [max]="maxDate()"
1011
+ [matDatepickerFilter]="calendarDaysFilter"
1012
+ (dateChange)="emit($event)"
1013
+ />
1014
+ @if (ctrl.getRawValue()) {
1015
+ <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1016
+ }
1017
+ <mat-datepicker-toggle matIconSuffix [for]="picker" [disabled]="readonly()"></mat-datepicker-toggle>
1018
+ <mat-datepicker #picker [panelClass]="isHijri() ? 'iss-hijri-calendar' : ''"></mat-datepicker>
1019
+
1020
+ </mat-form-field>
985
1021
  `, isInline: true, styles: [""], dependencies: [{ 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.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i1$1.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: MatDatepickerModule }, { kind: "component", type: i2.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i2.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$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"] }] });
986
1022
  }
987
1023
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DatePickerControl, decorators: [{
@@ -991,32 +1027,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
991
1027
  provideIssDateAdapter(),
992
1028
  { provide: NG_VALUE_ACCESSOR, useExisting: DatePickerControl, multi: true },
993
1029
  { provide: NG_VALIDATORS, useExisting: DatePickerControl, multi: true },
994
- ], template: `
995
- <mat-form-field floatLabel="auto" class="">
996
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
997
- <mat-label class="fs-16 fc-dark-gray">
998
- <ng-content select="label"></ng-content>
999
- </mat-label>
1000
- <input
1001
- class="cursor-pointer"
1002
- matInput
1003
- readonly
1004
- [matDatepicker]="picker"
1005
- (click)="openPicker(picker)"
1006
- [formControl]="ctrl"
1007
- [readonly]="readonly()"
1008
- [min]="minDate()"
1009
- [max]="maxDate()"
1010
- [matDatepickerFilter]="calendarDaysFilter"
1011
- (dateChange)="emit($event)"
1012
- />
1013
- @if (ctrl.getRawValue()) {
1014
- <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1015
- }
1016
- <mat-datepicker-toggle matIconSuffix [for]="picker" [disabled]="readonly()"></mat-datepicker-toggle>
1017
- <mat-datepicker #picker [panelClass]="isHijri() ? 'iss-hijri-calendar' : ''"></mat-datepicker>
1018
-
1019
- </mat-form-field>
1030
+ ], template: `
1031
+ <mat-form-field floatLabel="auto" class="">
1032
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
1033
+ <mat-label class="fs-16 fc-dark-gray">
1034
+ <ng-content select="label"></ng-content>
1035
+ </mat-label>
1036
+ <input
1037
+ class="cursor-pointer"
1038
+ matInput
1039
+ [errorStateMatcher]="errorStateMatcher"
1040
+ readonly
1041
+ [matDatepicker]="picker"
1042
+ (click)="openPicker(picker)"
1043
+ [formControl]="ctrl"
1044
+ [readonly]="readonly()"
1045
+ [min]="minDate()"
1046
+ [max]="maxDate()"
1047
+ [matDatepickerFilter]="calendarDaysFilter"
1048
+ (dateChange)="emit($event)"
1049
+ />
1050
+ @if (ctrl.getRawValue()) {
1051
+ <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1052
+ }
1053
+ <mat-datepicker-toggle matIconSuffix [for]="picker" [disabled]="readonly()"></mat-datepicker-toggle>
1054
+ <mat-datepicker #picker [panelClass]="isHijri() ? 'iss-hijri-calendar' : ''"></mat-datepicker>
1055
+
1056
+ </mat-form-field>
1020
1057
  ` }]
1021
1058
  }], 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 }] }], hijriCalendar: [{ type: i0.Input, args: [{ isSignal: true, alias: "hijriCalendar", required: false }] }], emitHijri: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitHijri", required: false }] }] } });
1022
1059
 
@@ -1208,42 +1245,44 @@ class DateRangePickerControl extends ControlBase {
1208
1245
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: DateRangePickerControl, isStandalone: true, selector: "iss-ctrl-date-range-picker", inputs: { disabledDays: { classPropertyName: "disabledDays", publicName: "disabledDays", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, hijriCalendar: { classPropertyName: "hijriCalendar", publicName: "hijriCalendar", isSignal: true, isRequired: false, transformFunction: null }, emitHijri: { classPropertyName: "emitHijri", publicName: "emitHijri", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onDateRangeObjectChange: "onDateRangeObjectChange" }, providers: [
1209
1246
  provideIssDateAdapter(),
1210
1247
  { provide: NG_VALUE_ACCESSOR, useExisting: DateRangePickerControl, multi: true },
1211
- ], usesInheritance: true, ngImport: i0, template: `
1212
- <mat-form-field floatLabel="auto" class="">
1213
-
1214
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
1215
- <mat-label class="fs-16 fc-dark-gray">
1216
- <ng-content select="label"></ng-content>
1217
- </mat-label>
1218
- <mat-date-range-input
1219
- [formGroup]="range"
1220
- [rangePicker]="picker"
1221
- [min]="minDate()"
1222
- [max]="maxDate()"
1223
- [dateFilter]="calendarDaysFilter"
1224
- >
1225
- <input
1226
- matStartDate
1227
- formControlName="start"
1228
- [readonly]="readonly()"
1229
- placeholder="dd/mm/yyyy"
1230
- (click)="openPicker(picker)"
1231
- />
1232
- <input
1233
- matEndDate
1234
- formControlName="end"
1235
- [readonly]="readonly()"
1236
- placeholder="dd/mm/yyyy"
1237
- (click)="openPicker(picker)"
1238
- />
1239
- </mat-date-range-input>
1240
- @if (range.getRawValue().start || range.getRawValue().end) {
1241
- <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1242
- }
1243
- <mat-datepicker-toggle matSuffix [for]="picker" [disabled]="readonly()"></mat-datepicker-toggle>
1244
- <mat-date-range-picker #picker [panelClass]="isHijri() ? 'iss-hijri-calendar' : ''"></mat-date-range-picker>
1245
-
1246
- </mat-form-field>
1248
+ ], usesInheritance: true, ngImport: i0, template: `
1249
+ <mat-form-field floatLabel="auto" class="">
1250
+
1251
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
1252
+ <mat-label class="fs-16 fc-dark-gray">
1253
+ <ng-content select="label"></ng-content>
1254
+ </mat-label>
1255
+ <mat-date-range-input
1256
+ [formGroup]="range"
1257
+ [rangePicker]="picker"
1258
+ [min]="minDate()"
1259
+ [max]="maxDate()"
1260
+ [dateFilter]="calendarDaysFilter"
1261
+ >
1262
+ <input
1263
+ matStartDate
1264
+ [errorStateMatcher]="errorStateMatcher"
1265
+ formControlName="start"
1266
+ [readonly]="readonly()"
1267
+ placeholder="dd/mm/yyyy"
1268
+ (click)="openPicker(picker)"
1269
+ />
1270
+ <input
1271
+ matEndDate
1272
+ [errorStateMatcher]="errorStateMatcher"
1273
+ formControlName="end"
1274
+ [readonly]="readonly()"
1275
+ placeholder="dd/mm/yyyy"
1276
+ (click)="openPicker(picker)"
1277
+ />
1278
+ </mat-date-range-input>
1279
+ @if (range.getRawValue().start || range.getRawValue().end) {
1280
+ <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1281
+ }
1282
+ <mat-datepicker-toggle matSuffix [for]="picker" [disabled]="readonly()"></mat-datepicker-toggle>
1283
+ <mat-date-range-picker #picker [panelClass]="isHijri() ? 'iss-hijri-calendar' : ''"></mat-date-range-picker>
1284
+
1285
+ </mat-form-field>
1247
1286
  `, isInline: true, dependencies: [{ 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.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i2.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i2.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i2.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i2.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i2.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
1248
1287
  }
1249
1288
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: DateRangePickerControl, decorators: [{
@@ -1260,42 +1299,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1260
1299
  provideIssDateAdapter(),
1261
1300
  { provide: NG_VALUE_ACCESSOR, useExisting: DateRangePickerControl, multi: true },
1262
1301
  ],
1263
- template: `
1264
- <mat-form-field floatLabel="auto" class="">
1265
-
1266
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
1267
- <mat-label class="fs-16 fc-dark-gray">
1268
- <ng-content select="label"></ng-content>
1269
- </mat-label>
1270
- <mat-date-range-input
1271
- [formGroup]="range"
1272
- [rangePicker]="picker"
1273
- [min]="minDate()"
1274
- [max]="maxDate()"
1275
- [dateFilter]="calendarDaysFilter"
1276
- >
1277
- <input
1278
- matStartDate
1279
- formControlName="start"
1280
- [readonly]="readonly()"
1281
- placeholder="dd/mm/yyyy"
1282
- (click)="openPicker(picker)"
1283
- />
1284
- <input
1285
- matEndDate
1286
- formControlName="end"
1287
- [readonly]="readonly()"
1288
- placeholder="dd/mm/yyyy"
1289
- (click)="openPicker(picker)"
1290
- />
1291
- </mat-date-range-input>
1292
- @if (range.getRawValue().start || range.getRawValue().end) {
1293
- <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1294
- }
1295
- <mat-datepicker-toggle matSuffix [for]="picker" [disabled]="readonly()"></mat-datepicker-toggle>
1296
- <mat-date-range-picker #picker [panelClass]="isHijri() ? 'iss-hijri-calendar' : ''"></mat-date-range-picker>
1297
-
1298
- </mat-form-field>
1302
+ template: `
1303
+ <mat-form-field floatLabel="auto" class="">
1304
+
1305
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
1306
+ <mat-label class="fs-16 fc-dark-gray">
1307
+ <ng-content select="label"></ng-content>
1308
+ </mat-label>
1309
+ <mat-date-range-input
1310
+ [formGroup]="range"
1311
+ [rangePicker]="picker"
1312
+ [min]="minDate()"
1313
+ [max]="maxDate()"
1314
+ [dateFilter]="calendarDaysFilter"
1315
+ >
1316
+ <input
1317
+ matStartDate
1318
+ [errorStateMatcher]="errorStateMatcher"
1319
+ formControlName="start"
1320
+ [readonly]="readonly()"
1321
+ placeholder="dd/mm/yyyy"
1322
+ (click)="openPicker(picker)"
1323
+ />
1324
+ <input
1325
+ matEndDate
1326
+ [errorStateMatcher]="errorStateMatcher"
1327
+ formControlName="end"
1328
+ [readonly]="readonly()"
1329
+ placeholder="dd/mm/yyyy"
1330
+ (click)="openPicker(picker)"
1331
+ />
1332
+ </mat-date-range-input>
1333
+ @if (range.getRawValue().start || range.getRawValue().end) {
1334
+ <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1335
+ }
1336
+ <mat-datepicker-toggle matSuffix [for]="picker" [disabled]="readonly()"></mat-datepicker-toggle>
1337
+ <mat-date-range-picker #picker [panelClass]="isHijri() ? 'iss-hijri-calendar' : ''"></mat-date-range-picker>
1338
+
1339
+ </mat-form-field>
1299
1340
  `
1300
1341
  }]
1301
1342
  }], 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 }] }], hijriCalendar: [{ type: i0.Input, args: [{ isSignal: true, alias: "hijriCalendar", required: false }] }], emitHijri: [{ type: i0.Input, args: [{ isSignal: true, alias: "emitHijri", required: false }] }], onDateRangeObjectChange: [{ type: i0.Output, args: ["onDateRangeObjectChange"] }] } });
@@ -1381,28 +1422,29 @@ class TimePickerControl extends ControlBase {
1381
1422
  provideNativeDateAdapter(),
1382
1423
  { provide: NG_VALUE_ACCESSOR, useExisting: TimePickerControl, multi: true },
1383
1424
  { provide: NG_VALIDATORS, useExisting: TimePickerControl, multi: true },
1384
- ], usesInheritance: true, ngImport: i0, template: `
1385
- <mat-form-field floatLabel="auto" class="">
1386
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
1387
- <mat-label class="fs-16 fc-dark-gray">
1388
- <ng-content select="label"></ng-content>
1389
- </mat-label>
1390
- <input
1391
- matInput
1392
- [formControl]="ctrl"
1393
- [matTimepicker]="picker"
1394
- [matTimepickerMin]="minTime()"
1395
- [matTimepickerMax]="maxTime()"
1396
- [readonly]="readonly()"
1397
- readonly
1398
- />
1399
- @if (ctrl.getRawValue()) {
1400
- <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1401
- }
1402
- <mat-timepicker-toggle matIconSuffix [for]="picker" [disabled]="readonly()"/>
1403
- <mat-timepicker (selected)="emit($event)" [interval]="interval()" #picker/>
1404
-
1405
- </mat-form-field>
1425
+ ], usesInheritance: true, ngImport: i0, template: `
1426
+ <mat-form-field floatLabel="auto" class="">
1427
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
1428
+ <mat-label class="fs-16 fc-dark-gray">
1429
+ <ng-content select="label"></ng-content>
1430
+ </mat-label>
1431
+ <input
1432
+ matInput
1433
+ [errorStateMatcher]="errorStateMatcher"
1434
+ [formControl]="ctrl"
1435
+ [matTimepicker]="picker"
1436
+ [matTimepickerMin]="minTime()"
1437
+ [matTimepickerMax]="maxTime()"
1438
+ [readonly]="readonly()"
1439
+ readonly
1440
+ />
1441
+ @if (ctrl.getRawValue()) {
1442
+ <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1443
+ }
1444
+ <mat-timepicker-toggle matIconSuffix [for]="picker" [disabled]="readonly()"/>
1445
+ <mat-timepicker (selected)="emit($event)" [interval]="interval()" #picker/>
1446
+
1447
+ </mat-form-field>
1406
1448
  `, isInline: true, dependencies: [{ 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.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i1$1.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: MatTimepickerModule }, { kind: "component", type: i2$1.MatTimepicker, selector: "mat-timepicker", inputs: ["interval", "options", "disableRipple", "aria-label", "aria-labelledby", "panelClass"], outputs: ["selected", "opened", "closed"], exportAs: ["matTimepicker"] }, { kind: "directive", type: i2$1.MatTimepickerInput, selector: "input[matTimepicker]", inputs: ["value", "matTimepicker", "matTimepickerMin", "matTimepickerMax", "matTimepickerOpenOnClick", "disabled"], outputs: ["valueChange"], exportAs: ["matTimepickerInput"] }, { kind: "component", type: i2$1.MatTimepickerToggle, selector: "mat-timepicker-toggle", inputs: ["for", "aria-label", "aria-labelledby", "disabled", "tabIndex", "disableRipple"], exportAs: ["matTimepickerToggle"] }, { 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: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
1407
1449
  }
1408
1450
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TimePickerControl, decorators: [{
@@ -1418,28 +1460,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1418
1460
  { provide: NG_VALUE_ACCESSOR, useExisting: TimePickerControl, multi: true },
1419
1461
  { provide: NG_VALIDATORS, useExisting: TimePickerControl, multi: true },
1420
1462
  ],
1421
- template: `
1422
- <mat-form-field floatLabel="auto" class="">
1423
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
1424
- <mat-label class="fs-16 fc-dark-gray">
1425
- <ng-content select="label"></ng-content>
1426
- </mat-label>
1427
- <input
1428
- matInput
1429
- [formControl]="ctrl"
1430
- [matTimepicker]="picker"
1431
- [matTimepickerMin]="minTime()"
1432
- [matTimepickerMax]="maxTime()"
1433
- [readonly]="readonly()"
1434
- readonly
1435
- />
1436
- @if (ctrl.getRawValue()) {
1437
- <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1438
- }
1439
- <mat-timepicker-toggle matIconSuffix [for]="picker" [disabled]="readonly()"/>
1440
- <mat-timepicker (selected)="emit($event)" [interval]="interval()" #picker/>
1441
-
1442
- </mat-form-field>
1463
+ template: `
1464
+ <mat-form-field floatLabel="auto" class="">
1465
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
1466
+ <mat-label class="fs-16 fc-dark-gray">
1467
+ <ng-content select="label"></ng-content>
1468
+ </mat-label>
1469
+ <input
1470
+ matInput
1471
+ [errorStateMatcher]="errorStateMatcher"
1472
+ [formControl]="ctrl"
1473
+ [matTimepicker]="picker"
1474
+ [matTimepickerMin]="minTime()"
1475
+ [matTimepickerMax]="maxTime()"
1476
+ [readonly]="readonly()"
1477
+ readonly
1478
+ />
1479
+ @if (ctrl.getRawValue()) {
1480
+ <mat-icon matSuffix style="cursor: pointer" (click)="clear($event)">close</mat-icon>
1481
+ }
1482
+ <mat-timepicker-toggle matIconSuffix [for]="picker" [disabled]="readonly()"/>
1483
+ <mat-timepicker (selected)="emit($event)" [interval]="interval()" #picker/>
1484
+
1485
+ </mat-form-field>
1443
1486
  `,
1444
1487
  }]
1445
1488
  }], propDecorators: { interval: [{ type: i0.Input, args: [{ isSignal: true, alias: "interval", required: false }] }], minTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "minTime", required: false }] }], maxTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxTime", required: false }] }] } });
@@ -2052,45 +2095,46 @@ class InputControl extends ControlBase {
2052
2095
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: InputControl, isStandalone: true, selector: "iss-ctrl-input", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, prefixIcon: { classPropertyName: "prefixIcon", publicName: "prefixIcon", isSignal: true, isRequired: false, transformFunction: null }, prefixText: { classPropertyName: "prefixText", publicName: "prefixText", isSignal: true, isRequired: false, transformFunction: null }, suffixIcon: { classPropertyName: "suffixIcon", publicName: "suffixIcon", isSignal: true, isRequired: false, transformFunction: null }, suffixText: { classPropertyName: "suffixText", publicName: "suffixText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onPrefixClick: "onPrefixClick", onSuffixClick: "onSuffixClick" }, providers: [
2053
2096
  { provide: NG_VALUE_ACCESSOR, useExisting: InputControl, multi: true },
2054
2097
  { provide: NG_VALIDATORS, useExisting: InputControl, multi: true }
2055
- ], usesInheritance: true, ngImport: i0, template: `
2056
- <mat-form-field floatLabel="auto" class="">
2057
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
2058
- <mat-label class="fs-16 fc-dark-gray">
2059
- <ng-content select="label"></ng-content>
2060
- </mat-label>
2061
- <ng-content select="[issPrefix]"></ng-content>
2062
- <div (click)="emitPrefixClick()" class="cursor-pointer">
2063
- @if (prefixText()) {
2064
- <span matTextPrefix>{{ prefixText() }}</span>
2065
- }
2066
- @if (prefixIcon()) {
2067
- <ds-icon matPrefix icon="{{prefixIcon()}}"></ds-icon>
2068
- }
2069
- </div>
2070
- <input
2071
- matInput
2072
- (blur)="markAsTouched()"
2073
- (input)="emitValue()"
2074
- [formControl]="ctrl"
2075
- [attr.maxlength]="maxLength()"
2076
- [attr.minlength]="minLength()"
2077
- [attr.max]="max()"
2078
- [attr.min]="min()"
2079
- [placeholder]="placeholder()"
2080
- [readonly]="readonly()"
2081
- [type]="type()"
2082
- />
2083
- <ng-content select="[issSuffix]"></ng-content>
2084
- <div (click)="emitSuffixClick()" class="cursor-pointer">
2085
- @if (suffixText()) {
2086
- <span matTextSuffix>{{ suffixText() }}</span>
2087
- }
2088
- @if (suffixIcon()) {
2089
- <ds-icon matSuffix icon="{{suffixIcon()}}"></ds-icon>
2090
- }
2091
- </div>
2092
- <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
2093
- </mat-form-field>
2098
+ ], usesInheritance: true, ngImport: i0, template: `
2099
+ <mat-form-field floatLabel="auto" class="">
2100
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
2101
+ <mat-label class="fs-16 fc-dark-gray">
2102
+ <ng-content select="label"></ng-content>
2103
+ </mat-label>
2104
+ <ng-content select="[issPrefix]"></ng-content>
2105
+ <div (click)="emitPrefixClick()" class="cursor-pointer">
2106
+ @if (prefixText()) {
2107
+ <span matTextPrefix>{{ prefixText() }}</span>
2108
+ }
2109
+ @if (prefixIcon()) {
2110
+ <ds-icon matPrefix icon="{{prefixIcon()}}"></ds-icon>
2111
+ }
2112
+ </div>
2113
+ <input
2114
+ matInput
2115
+ [errorStateMatcher]="errorStateMatcher"
2116
+ (blur)="markAsTouched()"
2117
+ (input)="emitValue()"
2118
+ [formControl]="ctrl"
2119
+ [attr.maxlength]="maxLength()"
2120
+ [attr.minlength]="minLength()"
2121
+ [attr.max]="max()"
2122
+ [attr.min]="min()"
2123
+ [placeholder]="placeholder()"
2124
+ [readonly]="readonly()"
2125
+ [type]="type()"
2126
+ />
2127
+ <ng-content select="[issSuffix]"></ng-content>
2128
+ <div (click)="emitSuffixClick()" class="cursor-pointer">
2129
+ @if (suffixText()) {
2130
+ <span matTextSuffix>{{ suffixText() }}</span>
2131
+ }
2132
+ @if (suffixIcon()) {
2133
+ <ds-icon matSuffix icon="{{suffixIcon()}}"></ds-icon>
2134
+ }
2135
+ </div>
2136
+ <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
2137
+ </mat-form-field>
2094
2138
  `, 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
2139
  }
2096
2140
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: InputControl, decorators: [{
@@ -2110,45 +2154,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
2110
2154
  { provide: NG_VALUE_ACCESSOR, useExisting: InputControl, multi: true },
2111
2155
  { provide: NG_VALIDATORS, useExisting: InputControl, multi: true }
2112
2156
  ],
2113
- template: `
2114
- <mat-form-field floatLabel="auto" class="">
2115
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
2116
- <mat-label class="fs-16 fc-dark-gray">
2117
- <ng-content select="label"></ng-content>
2118
- </mat-label>
2119
- <ng-content select="[issPrefix]"></ng-content>
2120
- <div (click)="emitPrefixClick()" class="cursor-pointer">
2121
- @if (prefixText()) {
2122
- <span matTextPrefix>{{ prefixText() }}</span>
2123
- }
2124
- @if (prefixIcon()) {
2125
- <ds-icon matPrefix icon="{{prefixIcon()}}"></ds-icon>
2126
- }
2127
- </div>
2128
- <input
2129
- matInput
2130
- (blur)="markAsTouched()"
2131
- (input)="emitValue()"
2132
- [formControl]="ctrl"
2133
- [attr.maxlength]="maxLength()"
2134
- [attr.minlength]="minLength()"
2135
- [attr.max]="max()"
2136
- [attr.min]="min()"
2137
- [placeholder]="placeholder()"
2138
- [readonly]="readonly()"
2139
- [type]="type()"
2140
- />
2141
- <ng-content select="[issSuffix]"></ng-content>
2142
- <div (click)="emitSuffixClick()" class="cursor-pointer">
2143
- @if (suffixText()) {
2144
- <span matTextSuffix>{{ suffixText() }}</span>
2145
- }
2146
- @if (suffixIcon()) {
2147
- <ds-icon matSuffix icon="{{suffixIcon()}}"></ds-icon>
2148
- }
2149
- </div>
2150
- <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
2151
- </mat-form-field>
2157
+ template: `
2158
+ <mat-form-field floatLabel="auto" class="">
2159
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
2160
+ <mat-label class="fs-16 fc-dark-gray">
2161
+ <ng-content select="label"></ng-content>
2162
+ </mat-label>
2163
+ <ng-content select="[issPrefix]"></ng-content>
2164
+ <div (click)="emitPrefixClick()" class="cursor-pointer">
2165
+ @if (prefixText()) {
2166
+ <span matTextPrefix>{{ prefixText() }}</span>
2167
+ }
2168
+ @if (prefixIcon()) {
2169
+ <ds-icon matPrefix icon="{{prefixIcon()}}"></ds-icon>
2170
+ }
2171
+ </div>
2172
+ <input
2173
+ matInput
2174
+ [errorStateMatcher]="errorStateMatcher"
2175
+ (blur)="markAsTouched()"
2176
+ (input)="emitValue()"
2177
+ [formControl]="ctrl"
2178
+ [attr.maxlength]="maxLength()"
2179
+ [attr.minlength]="minLength()"
2180
+ [attr.max]="max()"
2181
+ [attr.min]="min()"
2182
+ [placeholder]="placeholder()"
2183
+ [readonly]="readonly()"
2184
+ [type]="type()"
2185
+ />
2186
+ <ng-content select="[issSuffix]"></ng-content>
2187
+ <div (click)="emitSuffixClick()" class="cursor-pointer">
2188
+ @if (suffixText()) {
2189
+ <span matTextSuffix>{{ suffixText() }}</span>
2190
+ }
2191
+ @if (suffixIcon()) {
2192
+ <ds-icon matSuffix icon="{{suffixIcon()}}"></ds-icon>
2193
+ }
2194
+ </div>
2195
+ <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
2196
+ </mat-form-field>
2152
2197
  `
2153
2198
  }]
2154
2199
  }], propDecorators: { type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], prefixIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefixIcon", required: false }] }], prefixText: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefixText", required: false }] }], suffixIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "suffixIcon", required: false }] }], suffixText: [{ type: i0.Input, args: [{ isSignal: true, alias: "suffixText", required: false }] }], onPrefixClick: [{ type: i0.Output, args: ["onPrefixClick"] }], onSuffixClick: [{ type: i0.Output, args: ["onSuffixClick"] }] } });
@@ -4446,67 +4491,68 @@ class MobileControl extends ControlBase {
4446
4491
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: MobileControl, isStandalone: true, selector: "iss-ctrl-mobile", inputs: { preferredCountries: { classPropertyName: "preferredCountries", publicName: "preferredCountries", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
4447
4492
  { provide: NG_VALUE_ACCESSOR, useExisting: MobileControl, multi: true },
4448
4493
  { provide: NG_VALIDATORS, useExisting: MobileControl, multi: true }
4449
- ], usesInheritance: true, ngImport: i0, template: `
4450
- <mat-form-field floatLabel="auto" cdkOverlayOrigin #trigger="cdkOverlayOrigin">
4451
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
4452
- <mat-label class="fs-16 fc-dark-gray">
4453
- <ng-content select="label"></ng-content>
4454
- </mat-label>
4455
- <div class="d-inline-flex align-items-center gap-1 country-flag" matPrefix (click)="toggleCountryCodeMenu()">
4456
- <img
4457
- ngSrc="./flags/{{selectedCountry().code.toLowerCase()}}.svg"
4458
- width="20"
4459
- height="20"
4460
- [alt]="selectedCountry().code.toLowerCase()"
4461
- class="country-flag--image"
4462
- [priority]="true"
4463
- >
4464
- <ds-icon icon="arrow-down" class="fs-12 fc-dark-gray"></ds-icon>
4465
- </div>
4466
- <input
4467
- matInput
4468
- type="tel"
4469
- autocomplete="off"
4470
- (blur)="markAsTouched()"
4471
- (keydown)="onInput($event)"
4472
- (input)="emit()"
4473
- [formControl]="ctrl"
4474
- [readonly]="readonly()"
4475
- [placeholder]="selectedCountry().placeholder"
4476
- />
4477
- </mat-form-field>
4478
- <ng-template
4479
- cdkConnectedOverlay
4480
- [cdkConnectedOverlayHasBackdrop]="true"
4481
- (backdropClick)="closeCountryCodeMenu()"
4482
- [cdkConnectedOverlayGrowAfterOpen]="true"
4483
- [cdkConnectedOverlayOrigin]="trigger"
4484
- [cdkConnectedOverlayOpen]="isOpen()"
4485
- >
4486
- <div class="country-dropdown bc-white box-shadow p-2">
4487
- <div class="search-container">
4488
- <mat-form-field>
4489
- <input matInput id="country-search-box" [formControl]="searchInput" (click)="$event.stopPropagation()"/>
4490
- </mat-form-field>
4491
- </div>
4492
- <ul class="country-list">
4493
- @for (country of filteredCountries(); track $index) {
4494
- <li
4495
- #countryEl
4496
- [ngClass]="country.order > 1 ? 'preferredCounty' : ''"
4497
- class="d-flex align-items-center gap-2 cursor-pointer p-2"
4498
- (click)="onSelectCountry(country)"
4499
- >
4500
- @defer (on viewport(countryEl)) {
4501
- <img ngSrc="./flags/{{country.code.toLowerCase()}}.svg" width="20" height="20" alt="" class="country-flag--image">
4502
- }
4503
- <span class="fs-12 fc-dark-gray">(+{{ country.dailCode }})</span>
4504
- <span class="fs-12 fc-black">{{ country.name }}</span>
4505
- </li>
4506
- }
4507
- </ul>
4508
- </div>
4509
- </ng-template>
4494
+ ], usesInheritance: true, ngImport: i0, template: `
4495
+ <mat-form-field floatLabel="auto" cdkOverlayOrigin #trigger="cdkOverlayOrigin">
4496
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
4497
+ <mat-label class="fs-16 fc-dark-gray">
4498
+ <ng-content select="label"></ng-content>
4499
+ </mat-label>
4500
+ <div class="d-inline-flex align-items-center gap-1 country-flag" matPrefix (click)="toggleCountryCodeMenu()">
4501
+ <img
4502
+ ngSrc="./flags/{{selectedCountry().code.toLowerCase()}}.svg"
4503
+ width="20"
4504
+ height="20"
4505
+ [alt]="selectedCountry().code.toLowerCase()"
4506
+ class="country-flag--image"
4507
+ [priority]="true"
4508
+ >
4509
+ <ds-icon icon="arrow-down" class="fs-12 fc-dark-gray"></ds-icon>
4510
+ </div>
4511
+ <input
4512
+ matInput
4513
+ type="tel"
4514
+ autocomplete="off"
4515
+ (blur)="markAsTouched()"
4516
+ (keydown)="onInput($event)"
4517
+ (input)="emit()"
4518
+ [formControl]="ctrl"
4519
+ [readonly]="readonly()"
4520
+ [placeholder]="selectedCountry().placeholder"
4521
+ [errorStateMatcher]="errorStateMatcher"
4522
+ />
4523
+ </mat-form-field>
4524
+ <ng-template
4525
+ cdkConnectedOverlay
4526
+ [cdkConnectedOverlayHasBackdrop]="true"
4527
+ (backdropClick)="closeCountryCodeMenu()"
4528
+ [cdkConnectedOverlayGrowAfterOpen]="true"
4529
+ [cdkConnectedOverlayOrigin]="trigger"
4530
+ [cdkConnectedOverlayOpen]="isOpen()"
4531
+ >
4532
+ <div class="country-dropdown bc-white box-shadow p-2">
4533
+ <div class="search-container">
4534
+ <mat-form-field>
4535
+ <input matInput id="country-search-box" [formControl]="searchInput" (click)="$event.stopPropagation()"/>
4536
+ </mat-form-field>
4537
+ </div>
4538
+ <ul class="country-list">
4539
+ @for (country of filteredCountries(); track $index) {
4540
+ <li
4541
+ #countryEl
4542
+ [ngClass]="country.order > 1 ? 'preferredCounty' : ''"
4543
+ class="d-flex align-items-center gap-2 cursor-pointer p-2"
4544
+ (click)="onSelectCountry(country)"
4545
+ >
4546
+ @defer (on viewport(countryEl)) {
4547
+ <img ngSrc="./flags/{{country.code.toLowerCase()}}.svg" width="20" height="20" alt="" class="country-flag--image">
4548
+ }
4549
+ <span class="fs-12 fc-dark-gray">(+{{ country.dailCode }})</span>
4550
+ <span class="fs-12 fc-black">{{ country.name }}</span>
4551
+ </li>
4552
+ }
4553
+ </ul>
4554
+ </div>
4555
+ </ng-template>
4510
4556
  `, isInline: true, styles: [".country-flag{border-inline-end:var(--input-border);padding-inline-end:.5rem;margin-inline-end:.5rem;cursor:pointer}\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: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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: "directive", type: MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i1$1.MatLabel, selector: "mat-label" }], deferBlockDependencies: [() => [NgOptimizedImage]] });
4511
4557
  }
4512
4558
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MobileControl, decorators: [{
@@ -4524,67 +4570,68 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
4524
4570
  ], providers: [
4525
4571
  { provide: NG_VALUE_ACCESSOR, useExisting: MobileControl, multi: true },
4526
4572
  { provide: NG_VALIDATORS, useExisting: MobileControl, multi: true }
4527
- ], template: `
4528
- <mat-form-field floatLabel="auto" cdkOverlayOrigin #trigger="cdkOverlayOrigin">
4529
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
4530
- <mat-label class="fs-16 fc-dark-gray">
4531
- <ng-content select="label"></ng-content>
4532
- </mat-label>
4533
- <div class="d-inline-flex align-items-center gap-1 country-flag" matPrefix (click)="toggleCountryCodeMenu()">
4534
- <img
4535
- ngSrc="./flags/{{selectedCountry().code.toLowerCase()}}.svg"
4536
- width="20"
4537
- height="20"
4538
- [alt]="selectedCountry().code.toLowerCase()"
4539
- class="country-flag--image"
4540
- [priority]="true"
4541
- >
4542
- <ds-icon icon="arrow-down" class="fs-12 fc-dark-gray"></ds-icon>
4543
- </div>
4544
- <input
4545
- matInput
4546
- type="tel"
4547
- autocomplete="off"
4548
- (blur)="markAsTouched()"
4549
- (keydown)="onInput($event)"
4550
- (input)="emit()"
4551
- [formControl]="ctrl"
4552
- [readonly]="readonly()"
4553
- [placeholder]="selectedCountry().placeholder"
4554
- />
4555
- </mat-form-field>
4556
- <ng-template
4557
- cdkConnectedOverlay
4558
- [cdkConnectedOverlayHasBackdrop]="true"
4559
- (backdropClick)="closeCountryCodeMenu()"
4560
- [cdkConnectedOverlayGrowAfterOpen]="true"
4561
- [cdkConnectedOverlayOrigin]="trigger"
4562
- [cdkConnectedOverlayOpen]="isOpen()"
4563
- >
4564
- <div class="country-dropdown bc-white box-shadow p-2">
4565
- <div class="search-container">
4566
- <mat-form-field>
4567
- <input matInput id="country-search-box" [formControl]="searchInput" (click)="$event.stopPropagation()"/>
4568
- </mat-form-field>
4569
- </div>
4570
- <ul class="country-list">
4571
- @for (country of filteredCountries(); track $index) {
4572
- <li
4573
- #countryEl
4574
- [ngClass]="country.order > 1 ? 'preferredCounty' : ''"
4575
- class="d-flex align-items-center gap-2 cursor-pointer p-2"
4576
- (click)="onSelectCountry(country)"
4577
- >
4578
- @defer (on viewport(countryEl)) {
4579
- <img ngSrc="./flags/{{country.code.toLowerCase()}}.svg" width="20" height="20" alt="" class="country-flag--image">
4580
- }
4581
- <span class="fs-12 fc-dark-gray">(+{{ country.dailCode }})</span>
4582
- <span class="fs-12 fc-black">{{ country.name }}</span>
4583
- </li>
4584
- }
4585
- </ul>
4586
- </div>
4587
- </ng-template>
4573
+ ], template: `
4574
+ <mat-form-field floatLabel="auto" cdkOverlayOrigin #trigger="cdkOverlayOrigin">
4575
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
4576
+ <mat-label class="fs-16 fc-dark-gray">
4577
+ <ng-content select="label"></ng-content>
4578
+ </mat-label>
4579
+ <div class="d-inline-flex align-items-center gap-1 country-flag" matPrefix (click)="toggleCountryCodeMenu()">
4580
+ <img
4581
+ ngSrc="./flags/{{selectedCountry().code.toLowerCase()}}.svg"
4582
+ width="20"
4583
+ height="20"
4584
+ [alt]="selectedCountry().code.toLowerCase()"
4585
+ class="country-flag--image"
4586
+ [priority]="true"
4587
+ >
4588
+ <ds-icon icon="arrow-down" class="fs-12 fc-dark-gray"></ds-icon>
4589
+ </div>
4590
+ <input
4591
+ matInput
4592
+ type="tel"
4593
+ autocomplete="off"
4594
+ (blur)="markAsTouched()"
4595
+ (keydown)="onInput($event)"
4596
+ (input)="emit()"
4597
+ [formControl]="ctrl"
4598
+ [readonly]="readonly()"
4599
+ [placeholder]="selectedCountry().placeholder"
4600
+ [errorStateMatcher]="errorStateMatcher"
4601
+ />
4602
+ </mat-form-field>
4603
+ <ng-template
4604
+ cdkConnectedOverlay
4605
+ [cdkConnectedOverlayHasBackdrop]="true"
4606
+ (backdropClick)="closeCountryCodeMenu()"
4607
+ [cdkConnectedOverlayGrowAfterOpen]="true"
4608
+ [cdkConnectedOverlayOrigin]="trigger"
4609
+ [cdkConnectedOverlayOpen]="isOpen()"
4610
+ >
4611
+ <div class="country-dropdown bc-white box-shadow p-2">
4612
+ <div class="search-container">
4613
+ <mat-form-field>
4614
+ <input matInput id="country-search-box" [formControl]="searchInput" (click)="$event.stopPropagation()"/>
4615
+ </mat-form-field>
4616
+ </div>
4617
+ <ul class="country-list">
4618
+ @for (country of filteredCountries(); track $index) {
4619
+ <li
4620
+ #countryEl
4621
+ [ngClass]="country.order > 1 ? 'preferredCounty' : ''"
4622
+ class="d-flex align-items-center gap-2 cursor-pointer p-2"
4623
+ (click)="onSelectCountry(country)"
4624
+ >
4625
+ @defer (on viewport(countryEl)) {
4626
+ <img ngSrc="./flags/{{country.code.toLowerCase()}}.svg" width="20" height="20" alt="" class="country-flag--image">
4627
+ }
4628
+ <span class="fs-12 fc-dark-gray">(+{{ country.dailCode }})</span>
4629
+ <span class="fs-12 fc-black">{{ country.name }}</span>
4630
+ </li>
4631
+ }
4632
+ </ul>
4633
+ </div>
4634
+ </ng-template>
4588
4635
  `, styles: [".country-flag{border-inline-end:var(--input-border);padding-inline-end:.5rem;margin-inline-end:.5rem;cursor:pointer}\n"] }]
4589
4636
  }], propDecorators: { preferredCountries: [{ type: i0.Input, args: [{ isSignal: true, alias: "preferredCountries", required: false }] }] } });
4590
4637
 
@@ -5301,6 +5348,11 @@ class SelectControl extends ControlBase {
5301
5348
  this.#queryEffectRef.destroy();
5302
5349
  this.#disabledEffectRef.destroy();
5303
5350
  }
5351
+ // the selection is the value here; `ctrl` doubles as the autocomplete's search box, so while
5352
+ // the user is typing a query it holds that string rather than the chosen options.
5353
+ isEmpty() {
5354
+ return this.selectedOptions().size === 0;
5355
+ }
5304
5356
  #addToSelectedOptionsMap(option) {
5305
5357
  if (option) {
5306
5358
  const selectedOption = option;
@@ -5344,67 +5396,67 @@ class SelectControl extends ControlBase {
5344
5396
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SelectControl, deps: null, target: i0.ɵɵFactoryTarget.Component });
5345
5397
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SelectControl, isStandalone: true, selector: "iss-ctrl-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onQueryChange: "onQueryChange" }, providers: [
5346
5398
  { provide: NG_VALUE_ACCESSOR, useExisting: SelectControl, multi: true },
5347
- ], queries: [{ propertyName: "optionTemplate", first: true, predicate: ["optionTemplate"], descendants: true, isSignal: true }, { propertyName: "cardViewerTemplate", first: true, predicate: ["cardViewerTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
5348
- <mat-form-field floatLabel="auto" class="">
5349
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
5350
- <mat-label class="fs-16 fc-dark-gray">
5351
- <ng-content select="label"></ng-content>
5352
- </mat-label>
5353
- <input [formControl]="ctrl" [matAutocomplete]="auto" [matChipInputFor]="chipGrid" [placeholder]="placeholder()" [readonly]="readonly()" (blur)="markAsTouched()" class="m-0" matInput/>
5354
- @if (!disabled()) {
5355
- @if (selectedOptions().size) {
5356
- <span matSuffix class="sfi sfi-close fs-18 fc-black cursor-pointer" (click)="clearSelection()"></span>
5357
- } @else {
5358
- <span matSuffix class="sfi sfi-arrow-down fs-18 fc-black cursor-pointer"></span>
5359
- }
5360
- }
5361
-
5362
- <mat-autocomplete #auto="matAutocomplete" (optionSelected)="captureValue($event)" [displayWith]="displayFn" autoActiveFirstOption hideSingleSelectionIndicator>
5363
- @if (loading()) {
5364
- <mat-option disabled="true">
5365
- <ds-icon icon="spinner" class="spin fc-coral fs-20"></ds-icon>
5366
- </mat-option>
5367
- } @else {
5368
- @if (filteredOptions().length) {
5369
- @if (multiple()) {
5370
- <mat-option (click)="toggleAllSelection()" value="_SELECT_ALL_OPTIONS_">
5371
- {{ allSelected() ? "deselect all" : "Select All" }}
5372
- </mat-option>
5373
- }
5374
- <cdk-virtual-scroll-viewport itemSize="5" [ngStyle]="{'height': height()}">
5375
- <mat-option *cdkVirtualFor="let option of filteredOptions()" [value]="option" [ngClass]="{'mdc-list-item__selected': option | selectStatus: selectedOptions()}">
5376
- @if (optionTemplate()) {
5377
- <ng-container *ngTemplateOutlet="optionTemplate(); context: { $implicit: option}"/>
5378
- } @else {
5379
- {{ option.label }}
5380
- }
5381
- </mat-option>
5382
- </cdk-virtual-scroll-viewport>
5383
- } @else {
5384
- <mat-option disabled="true">No Result Found</mat-option>
5385
- }
5386
- }
5387
- </mat-autocomplete>
5388
- </mat-form-field>
5389
-
5390
- <mat-chip-grid #chipGrid>
5391
- @if (multiple()) {
5392
- @for (chip of selectedOptions(); track chip[0]) {
5393
- <mat-chip-row (removed)="removeFromSelectedOptionsMap(chip[1])">
5394
- @if (cardViewerTemplate()) {
5395
- <ng-container
5396
- *ngTemplateOutlet="cardViewerTemplate(); context: { $implicit: chip[1]}"
5397
- />
5398
- } @else {
5399
- {{ chip[1].label }}
5400
- }
5401
- <button matChipRemove [disabled]="readonly()" [attr.aria-label]="'remove ' + chip[1].label">
5402
- <ds-icon icon="trash" class="fc-red"></ds-icon>
5403
- </button>
5404
- </mat-chip-row>
5405
- }
5406
- }
5407
- </mat-chip-grid>
5399
+ ], queries: [{ propertyName: "optionTemplate", first: true, predicate: ["optionTemplate"], descendants: true, isSignal: true }, { propertyName: "cardViewerTemplate", first: true, predicate: ["cardViewerTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
5400
+ <mat-form-field floatLabel="auto" class="">
5401
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
5402
+ <mat-label class="fs-16 fc-dark-gray">
5403
+ <ng-content select="label"></ng-content>
5404
+ </mat-label>
5405
+ <input [formControl]="ctrl" [matAutocomplete]="auto" [matChipInputFor]="chipGrid" [placeholder]="placeholder()" [readonly]="readonly()" [errorStateMatcher]="errorStateMatcher" (blur)="markAsTouched()" class="m-0" matInput/>
5406
+ @if (!disabled()) {
5407
+ @if (selectedOptions().size) {
5408
+ <span matSuffix class="sfi sfi-close fs-18 fc-black cursor-pointer" (click)="clearSelection()"></span>
5409
+ } @else {
5410
+ <span matSuffix class="sfi sfi-arrow-down fs-18 fc-black cursor-pointer"></span>
5411
+ }
5412
+ }
5413
+
5414
+ <mat-autocomplete #auto="matAutocomplete" (optionSelected)="captureValue($event)" [displayWith]="displayFn" autoActiveFirstOption hideSingleSelectionIndicator>
5415
+ @if (loading()) {
5416
+ <mat-option disabled="true">
5417
+ <ds-icon icon="spinner" class="spin fc-coral fs-20"></ds-icon>
5418
+ </mat-option>
5419
+ } @else {
5420
+ @if (filteredOptions().length) {
5421
+ @if (multiple()) {
5422
+ <mat-option (click)="toggleAllSelection()" value="_SELECT_ALL_OPTIONS_">
5423
+ {{ allSelected() ? "deselect all" : "Select All" }}
5424
+ </mat-option>
5425
+ }
5426
+ <cdk-virtual-scroll-viewport itemSize="5" [ngStyle]="{'height': height()}">
5427
+ <mat-option *cdkVirtualFor="let option of filteredOptions()" [value]="option" [ngClass]="{'mdc-list-item__selected': option | selectStatus: selectedOptions()}">
5428
+ @if (optionTemplate()) {
5429
+ <ng-container *ngTemplateOutlet="optionTemplate(); context: { $implicit: option}"/>
5430
+ } @else {
5431
+ {{ option.label }}
5432
+ }
5433
+ </mat-option>
5434
+ </cdk-virtual-scroll-viewport>
5435
+ } @else {
5436
+ <mat-option disabled="true">No Result Found</mat-option>
5437
+ }
5438
+ }
5439
+ </mat-autocomplete>
5440
+ </mat-form-field>
5441
+
5442
+ <mat-chip-grid #chipGrid>
5443
+ @if (multiple()) {
5444
+ @for (chip of selectedOptions(); track chip[0]) {
5445
+ <mat-chip-row (removed)="removeFromSelectedOptionsMap(chip[1])">
5446
+ @if (cardViewerTemplate()) {
5447
+ <ng-container
5448
+ *ngTemplateOutlet="cardViewerTemplate(); context: { $implicit: chip[1]}"
5449
+ />
5450
+ } @else {
5451
+ {{ chip[1].label }}
5452
+ }
5453
+ <button matChipRemove [disabled]="readonly()" [attr.aria-label]="'remove ' + chip[1].label">
5454
+ <ds-icon icon="trash" class="fc-red"></ds-icon>
5455
+ </button>
5456
+ </mat-chip-row>
5457
+ }
5458
+ }
5459
+ </mat-chip-grid>
5408
5460
  `, isInline: true, styles: [""], 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: MatAutocompleteModule }, { kind: "component", type: i2$2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i2$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i2$2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i1$1.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: 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.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i4.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i4.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled", "readonly", "matChipInputDisabledInteractive"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i4.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i4.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: SelectStatusPipe, name: "selectStatus" }] });
5409
5461
  }
5410
5462
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SelectControl, decorators: [{
@@ -5424,67 +5476,67 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
5424
5476
  NgTemplateOutlet,
5425
5477
  ], providers: [
5426
5478
  { provide: NG_VALUE_ACCESSOR, useExisting: SelectControl, multi: true },
5427
- ], template: `
5428
- <mat-form-field floatLabel="auto" class="">
5429
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
5430
- <mat-label class="fs-16 fc-dark-gray">
5431
- <ng-content select="label"></ng-content>
5432
- </mat-label>
5433
- <input [formControl]="ctrl" [matAutocomplete]="auto" [matChipInputFor]="chipGrid" [placeholder]="placeholder()" [readonly]="readonly()" (blur)="markAsTouched()" class="m-0" matInput/>
5434
- @if (!disabled()) {
5435
- @if (selectedOptions().size) {
5436
- <span matSuffix class="sfi sfi-close fs-18 fc-black cursor-pointer" (click)="clearSelection()"></span>
5437
- } @else {
5438
- <span matSuffix class="sfi sfi-arrow-down fs-18 fc-black cursor-pointer"></span>
5439
- }
5440
- }
5441
-
5442
- <mat-autocomplete #auto="matAutocomplete" (optionSelected)="captureValue($event)" [displayWith]="displayFn" autoActiveFirstOption hideSingleSelectionIndicator>
5443
- @if (loading()) {
5444
- <mat-option disabled="true">
5445
- <ds-icon icon="spinner" class="spin fc-coral fs-20"></ds-icon>
5446
- </mat-option>
5447
- } @else {
5448
- @if (filteredOptions().length) {
5449
- @if (multiple()) {
5450
- <mat-option (click)="toggleAllSelection()" value="_SELECT_ALL_OPTIONS_">
5451
- {{ allSelected() ? "deselect all" : "Select All" }}
5452
- </mat-option>
5453
- }
5454
- <cdk-virtual-scroll-viewport itemSize="5" [ngStyle]="{'height': height()}">
5455
- <mat-option *cdkVirtualFor="let option of filteredOptions()" [value]="option" [ngClass]="{'mdc-list-item__selected': option | selectStatus: selectedOptions()}">
5456
- @if (optionTemplate()) {
5457
- <ng-container *ngTemplateOutlet="optionTemplate(); context: { $implicit: option}"/>
5458
- } @else {
5459
- {{ option.label }}
5460
- }
5461
- </mat-option>
5462
- </cdk-virtual-scroll-viewport>
5463
- } @else {
5464
- <mat-option disabled="true">No Result Found</mat-option>
5465
- }
5466
- }
5467
- </mat-autocomplete>
5468
- </mat-form-field>
5469
-
5470
- <mat-chip-grid #chipGrid>
5471
- @if (multiple()) {
5472
- @for (chip of selectedOptions(); track chip[0]) {
5473
- <mat-chip-row (removed)="removeFromSelectedOptionsMap(chip[1])">
5474
- @if (cardViewerTemplate()) {
5475
- <ng-container
5476
- *ngTemplateOutlet="cardViewerTemplate(); context: { $implicit: chip[1]}"
5477
- />
5478
- } @else {
5479
- {{ chip[1].label }}
5480
- }
5481
- <button matChipRemove [disabled]="readonly()" [attr.aria-label]="'remove ' + chip[1].label">
5482
- <ds-icon icon="trash" class="fc-red"></ds-icon>
5483
- </button>
5484
- </mat-chip-row>
5485
- }
5486
- }
5487
- </mat-chip-grid>
5479
+ ], template: `
5480
+ <mat-form-field floatLabel="auto" class="">
5481
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
5482
+ <mat-label class="fs-16 fc-dark-gray">
5483
+ <ng-content select="label"></ng-content>
5484
+ </mat-label>
5485
+ <input [formControl]="ctrl" [matAutocomplete]="auto" [matChipInputFor]="chipGrid" [placeholder]="placeholder()" [readonly]="readonly()" [errorStateMatcher]="errorStateMatcher" (blur)="markAsTouched()" class="m-0" matInput/>
5486
+ @if (!disabled()) {
5487
+ @if (selectedOptions().size) {
5488
+ <span matSuffix class="sfi sfi-close fs-18 fc-black cursor-pointer" (click)="clearSelection()"></span>
5489
+ } @else {
5490
+ <span matSuffix class="sfi sfi-arrow-down fs-18 fc-black cursor-pointer"></span>
5491
+ }
5492
+ }
5493
+
5494
+ <mat-autocomplete #auto="matAutocomplete" (optionSelected)="captureValue($event)" [displayWith]="displayFn" autoActiveFirstOption hideSingleSelectionIndicator>
5495
+ @if (loading()) {
5496
+ <mat-option disabled="true">
5497
+ <ds-icon icon="spinner" class="spin fc-coral fs-20"></ds-icon>
5498
+ </mat-option>
5499
+ } @else {
5500
+ @if (filteredOptions().length) {
5501
+ @if (multiple()) {
5502
+ <mat-option (click)="toggleAllSelection()" value="_SELECT_ALL_OPTIONS_">
5503
+ {{ allSelected() ? "deselect all" : "Select All" }}
5504
+ </mat-option>
5505
+ }
5506
+ <cdk-virtual-scroll-viewport itemSize="5" [ngStyle]="{'height': height()}">
5507
+ <mat-option *cdkVirtualFor="let option of filteredOptions()" [value]="option" [ngClass]="{'mdc-list-item__selected': option | selectStatus: selectedOptions()}">
5508
+ @if (optionTemplate()) {
5509
+ <ng-container *ngTemplateOutlet="optionTemplate(); context: { $implicit: option}"/>
5510
+ } @else {
5511
+ {{ option.label }}
5512
+ }
5513
+ </mat-option>
5514
+ </cdk-virtual-scroll-viewport>
5515
+ } @else {
5516
+ <mat-option disabled="true">No Result Found</mat-option>
5517
+ }
5518
+ }
5519
+ </mat-autocomplete>
5520
+ </mat-form-field>
5521
+
5522
+ <mat-chip-grid #chipGrid>
5523
+ @if (multiple()) {
5524
+ @for (chip of selectedOptions(); track chip[0]) {
5525
+ <mat-chip-row (removed)="removeFromSelectedOptionsMap(chip[1])">
5526
+ @if (cardViewerTemplate()) {
5527
+ <ng-container
5528
+ *ngTemplateOutlet="cardViewerTemplate(); context: { $implicit: chip[1]}"
5529
+ />
5530
+ } @else {
5531
+ {{ chip[1].label }}
5532
+ }
5533
+ <button matChipRemove [disabled]="readonly()" [attr.aria-label]="'remove ' + chip[1].label">
5534
+ <ds-icon icon="trash" class="fc-red"></ds-icon>
5535
+ </button>
5536
+ </mat-chip-row>
5537
+ }
5538
+ }
5539
+ </mat-chip-grid>
5488
5540
  `, schemas: [CUSTOM_ELEMENTS_SCHEMA] }]
5489
5541
  }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], onQueryChange: [{ type: i0.Output, args: ["onQueryChange"] }], optionTemplate: [{ type: i0.ContentChild, args: ["optionTemplate", { isSignal: true }] }], cardViewerTemplate: [{ type: i0.ContentChild, args: ["cardViewerTemplate", { isSignal: true }] }] } });
5490
5542
 
@@ -5577,25 +5629,26 @@ class TextareaControl extends ControlBase {
5577
5629
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: TextareaControl, isStandalone: true, selector: "iss-ctrl-textarea", providers: [
5578
5630
  { provide: NG_VALUE_ACCESSOR, useExisting: TextareaControl, multi: true },
5579
5631
  { provide: NG_VALIDATORS, useExisting: TextareaControl, multi: true }
5580
- ], usesInheritance: true, ngImport: i0, template: `
5581
- <mat-form-field floatLabel="auto" class="custom-textarea">
5582
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
5583
- <mat-label class="fs-16 fc-dark-gray">
5584
- <ng-content select="label"></ng-content>
5585
- </mat-label>
5586
- <textarea
5587
- matInput
5588
- [placeholder]="placeholder()"
5589
- [formControl]="ctrl"
5590
- [attr.maxlength]="maxLength()"
5591
- [attr.minlength]="minLength()"
5592
- [readonly]="readonly()"
5593
- (input)="emitValue()"
5594
- (focusout)="markAsTouched()"
5595
- >
5596
- </textarea>
5597
- <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
5598
- </mat-form-field>
5632
+ ], usesInheritance: true, ngImport: i0, template: `
5633
+ <mat-form-field floatLabel="auto" class="custom-textarea">
5634
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
5635
+ <mat-label class="fs-16 fc-dark-gray">
5636
+ <ng-content select="label"></ng-content>
5637
+ </mat-label>
5638
+ <textarea
5639
+ matInput
5640
+ [errorStateMatcher]="errorStateMatcher"
5641
+ [placeholder]="placeholder()"
5642
+ [formControl]="ctrl"
5643
+ [attr.maxlength]="maxLength()"
5644
+ [attr.minlength]="minLength()"
5645
+ [readonly]="readonly()"
5646
+ (input)="emitValue()"
5647
+ (focusout)="markAsTouched()"
5648
+ >
5649
+ </textarea>
5650
+ <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
5651
+ </mat-form-field>
5599
5652
  `, 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
5653
  }
5601
5654
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: TextareaControl, decorators: [{
@@ -5615,25 +5668,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
5615
5668
  { provide: NG_VALIDATORS, useExisting: TextareaControl, multi: true }
5616
5669
  ],
5617
5670
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
5618
- template: `
5619
- <mat-form-field floatLabel="auto" class="custom-textarea">
5620
- <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
5621
- <mat-label class="fs-16 fc-dark-gray">
5622
- <ng-content select="label"></ng-content>
5623
- </mat-label>
5624
- <textarea
5625
- matInput
5626
- [placeholder]="placeholder()"
5627
- [formControl]="ctrl"
5628
- [attr.maxlength]="maxLength()"
5629
- [attr.minlength]="minLength()"
5630
- [readonly]="readonly()"
5631
- (input)="emitValue()"
5632
- (focusout)="markAsTouched()"
5633
- >
5634
- </textarea>
5635
- <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
5636
- </mat-form-field>
5671
+ template: `
5672
+ <mat-form-field floatLabel="auto" class="custom-textarea">
5673
+ <!-- Always rendered: upgrade.scss shows the floating label only while the projected <label> carries text, so an omitted or empty one collapses on its own. -->
5674
+ <mat-label class="fs-16 fc-dark-gray">
5675
+ <ng-content select="label"></ng-content>
5676
+ </mat-label>
5677
+ <textarea
5678
+ matInput
5679
+ [errorStateMatcher]="errorStateMatcher"
5680
+ [placeholder]="placeholder()"
5681
+ [formControl]="ctrl"
5682
+ [attr.maxlength]="maxLength()"
5683
+ [attr.minlength]="minLength()"
5684
+ [readonly]="readonly()"
5685
+ (input)="emitValue()"
5686
+ (focusout)="markAsTouched()"
5687
+ >
5688
+ </textarea>
5689
+ <iss-ctrl-hints [hints]="hints()" [touched]="touched()"/>
5690
+ </mat-form-field>
5637
5691
  `
5638
5692
  }]
5639
5693
  }] });
@@ -6411,22 +6465,22 @@ const COMPONENTS = {
6411
6465
  datetime: () => Promise.resolve().then(function () { return datetimePicker_field; }).then((c) => c.DatetimePickerField),
6412
6466
  date_range: () => Promise.resolve().then(function () { return dateRangePicker_field; }).then((c) => c.DateRangePickerField),
6413
6467
  attachment: () => Promise.resolve().then(function () { return filePicker_field; }).then((c) => c.FilePickerField),
6414
- userPicker: () => import('./iss-ctrl-user-picker.field-CJqIvkMM.mjs').then((c) => c.UserPickerField),
6468
+ userPicker: () => import('./iss-ctrl-user-picker.field-BH63sZ-X.mjs').then((c) => c.UserPickerField),
6415
6469
  vehicle_plate: () => Promise.resolve().then(function () { return plate_field; }).then((c) => c.PlateField),
6416
- enrichment: () => import('./iss-ctrl-note.field-DyOSzuIi.mjs').then((c) => c.NoteField),
6470
+ enrichment: () => import('./iss-ctrl-note.field-B_Lbp28X.mjs').then((c) => c.NoteField),
6417
6471
  mobile: () => Promise.resolve().then(function () { return mobile_field; }).then((c) => c.MobileField),
6418
- table: () => import('./iss-ctrl-table.field-CJmtpHsh.mjs').then((c) => c.TableField),
6472
+ table: () => import('./iss-ctrl-table.field-B5FxF6hn.mjs').then((c) => c.TableField),
6419
6473
  chips: () => Promise.resolve().then(function () { return chips_field; }).then((c) => c.ChipsField),
6420
6474
  switch: () => Promise.resolve().then(function () { return slideToggle_field; }).then((c) => c.SlideToggleField),
6421
6475
  };
6422
6476
 
6423
6477
  const SERVICES = {
6424
- setValue: () => import('./iss-ctrl-set-value-event-B800MsyP.mjs').then((s) => s.SetValueEvent),
6478
+ setValue: () => import('./iss-ctrl-set-value-event-CgXhi0Bv.mjs').then((s) => s.SetValueEvent),
6425
6479
  show: () => import('./iss-ctrl-show-event-BcRCwAfo.mjs').then((s) => s.ShowEvent),
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),
6480
+ load: () => import('./iss-ctrl-load-value-event-DJKJ5S3h.mjs').then((s) => s.LoadValueEvent),
6481
+ loadOptions: () => import('./iss-ctrl-load-options-event-CxyAyNMe.mjs').then((s) => s.LoadOptionsEvent),
6482
+ triggerBasedOnJsonValue: () => import('./iss-ctrl-trigger-based-on-json-value-2v1kLVHZ.mjs').then((s) => s.TriggerBasedOnJsonValue),
6483
+ replaceApiKeyDefaultImpl: () => import('./iss-ctrl-replace-api-keys-C0XYQW4i.mjs').then((s) => s.ReplaceApiKeys),
6430
6484
  };
6431
6485
 
6432
6486
  // Read-only counterpart of COMPONENTS: the component used to render a field's value
@@ -9626,4 +9680,4 @@ var time_validator = /*#__PURE__*/Object.freeze({
9626
9680
  */
9627
9681
 
9628
9682
  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
9683
+ //# sourceMappingURL=iss-ctrl-iss-ctrl-BKu6a5HF.mjs.map