@olafvv/ngx-dynamic-form 20.2.0 → 20.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -285,6 +285,7 @@ The library comes with a battle-tested set of built-in form controls utilizing *
285
285
 
286
286
  | Control Name | Description |
287
287
  | :---------------- | :------------------------------------------------------------------------------------ |
288
+ | **Autocomplete** | Advanced input with support for local filtering and async search functions. |
288
289
  | **Button** | Highly-customizable actionable button with a click callback. |
289
290
  | **Button toggle** | Horizontal toggle groupings ideal for single or multi-select radio behavior. |
290
291
  | **Checkbox** | Standard binary state checkbox. |
@@ -3,31 +3,33 @@ import { InjectionToken, Injectable, Inject, Optional, signal, input, Component,
3
3
  import * as i1 from '@angular/forms';
4
4
  import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';
5
5
  import { AsyncPipe, NgClass } from '@angular/common';
6
- import { BehaviorSubject, of, isObservable, map, startWith, distinctUntilChanged, Subscription } from 'rxjs';
7
- import * as i1$1 from '@angular/material/button-toggle';
8
- import { MatButtonToggleModule } from '@angular/material/button-toggle';
9
- import * as i2$1 from '@angular/material/form-field';
6
+ import { BehaviorSubject, Subject, merge, map, startWith, debounceTime, distinctUntilChanged, tap, switchMap, of, isObservable, Subscription } from 'rxjs';
7
+ import * as i3$1 from '@angular/material/autocomplete';
8
+ import { MatAutocompleteModule } from '@angular/material/autocomplete';
9
+ import { MatOptionModule } from '@angular/material/core';
10
+ import * as i1$1 from '@angular/material/form-field';
10
11
  import { MatFormFieldModule } from '@angular/material/form-field';
11
- import * as i1$2 from '@angular/material/button';
12
+ import * as i3 from '@angular/material/input';
13
+ import { MatInputModule, MatInput } from '@angular/material/input';
14
+ import * as i4 from '@angular/material/progress-spinner';
15
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
16
+ import * as i1$2 from '@angular/material/button-toggle';
17
+ import { MatButtonToggleModule } from '@angular/material/button-toggle';
18
+ import * as i1$3 from '@angular/material/button';
12
19
  import { MatButtonModule } from '@angular/material/button';
13
20
  import * as i2 from '@angular/material/checkbox';
14
21
  import { MatCheckboxModule } from '@angular/material/checkbox';
15
- import * as i4 from '@angular/material/datepicker';
22
+ import * as i4$1 from '@angular/material/datepicker';
16
23
  import { MatDatepickerModule } from '@angular/material/datepicker';
17
- import * as i3 from '@angular/material/input';
18
- import { MatInputModule, MatInput } from '@angular/material/input';
19
24
  import * as i5 from '@angular/material/icon';
20
25
  import { MatIconModule } from '@angular/material/icon';
21
- import * as i6 from '@angular/material/progress-spinner';
22
- import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
23
- import * as i2$2 from '@angular/material/radio';
26
+ import * as i2$1 from '@angular/material/radio';
24
27
  import { MatRadioModule } from '@angular/material/radio';
25
- import { MatOptionModule } from '@angular/material/core';
26
- import * as i3$1 from '@angular/material/select';
28
+ import * as i3$2 from '@angular/material/select';
27
29
  import { MatSelectModule } from '@angular/material/select';
28
- import * as i2$3 from '@angular/material/slide-toggle';
30
+ import * as i2$2 from '@angular/material/slide-toggle';
29
31
  import { MatSlideToggleModule } from '@angular/material/slide-toggle';
30
- import * as i3$2 from '@angular/cdk/text-field';
32
+ import * as i3$3 from '@angular/cdk/text-field';
31
33
 
32
34
  const DYNAMIC_FORM_FIELD_MAP$1 = new InjectionToken('DYNAMIC_FORM_FIELD_MAP');
33
35
 
@@ -197,6 +199,62 @@ class DynamicFormFieldBase {
197
199
  }
198
200
  }
199
201
 
202
+ class DynamicAutocompleteComponent extends DynamicFormFieldBase {
203
+ constructor() {
204
+ super(...arguments);
205
+ this.model = input.required(...(ngDevMode ? [{ debugName: "model" }] : []));
206
+ this.group = input.required(...(ngDevMode ? [{ debugName: "group" }] : []));
207
+ this.isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
208
+ this.focus$ = new Subject();
209
+ /**
210
+ * Used by mat-autocomplete to display the label of the selected option instead of the value.
211
+ */
212
+ this.displayFn = (value) => {
213
+ if (!value)
214
+ return '';
215
+ if (this.model().displayFn) {
216
+ return this.model().displayFn(value);
217
+ }
218
+ return value;
219
+ };
220
+ }
221
+ ngOnInit() {
222
+ this.filteredOptions$ = merge(this.control.valueChanges, this.focus$.pipe(map(() => this.control.value))).pipe(startWith(this.control.value ?? ''), debounceTime(this.model().debounceTime), distinctUntilChanged(), tap(() => {
223
+ if (this.model().searchFn)
224
+ this.isLoading.set(true);
225
+ }), switchMap((value) => this.getOptions(value)), tap(() => this.isLoading.set(false)));
226
+ }
227
+ onFocus() {
228
+ this.focus$.next();
229
+ }
230
+ getOptions(value) {
231
+ const searchString = typeof value === 'string' ? value.toLowerCase() : '';
232
+ if (this.model().searchFn) {
233
+ return this.model().searchFn(searchString);
234
+ }
235
+ return this.model().options$.pipe(map((options) => {
236
+ if (this.model().filterFn) {
237
+ return options.filter((opt) => this.model().filterFn(searchString, opt));
238
+ }
239
+ return options.filter((opt) => opt.label.toLowerCase().includes(searchString));
240
+ }));
241
+ }
242
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicAutocompleteComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
243
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicAutocompleteComponent, isStandalone: true, selector: "dynamic-autocomplete", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <input\n type=\"text\"\n matInput\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [matAutocomplete]=\"auto\"\n (focus)=\"onFocus()\" />\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\">\n @for (option of filteredOptions$ | async; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (isLoading()) {\n <div\n matSuffix\n class=\"loader-icon\">\n <mat-spinner\n diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n", styles: [":host{display:block;width:100%}:host mat-form-field{width:100%}:host .loader-icon{margin-right:8px;display:flex;align-items:center}\n"], 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i1$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.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: MatAutocompleteModule }, { kind: "component", type: i3$1.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: i3$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i3$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
244
+ }
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicAutocompleteComponent, decorators: [{
246
+ type: Component,
247
+ args: [{ imports: [
248
+ MatFormFieldModule,
249
+ MatInputModule,
250
+ MatAutocompleteModule,
251
+ MatOptionModule,
252
+ MatProgressSpinnerModule,
253
+ ReactiveFormsModule,
254
+ AsyncPipe
255
+ ], selector: 'dynamic-autocomplete', template: "<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <input\n type=\"text\"\n matInput\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [matAutocomplete]=\"auto\"\n (focus)=\"onFocus()\" />\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\">\n @for (option of filteredOptions$ | async; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (isLoading()) {\n <div\n matSuffix\n class=\"loader-icon\">\n <mat-spinner\n diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n", styles: [":host{display:block;width:100%}:host mat-form-field{width:100%}:host .loader-icon{margin-right:8px;display:flex;align-items:center}\n"] }]
256
+ }], propDecorators: { model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }], group: [{ type: i0.Input, args: [{ isSignal: true, alias: "group", required: true }] }] } });
257
+
200
258
  class DynamicButtonTogglesComponent extends DynamicFormFieldBase {
201
259
  constructor() {
202
260
  super(...arguments);
@@ -204,7 +262,7 @@ class DynamicButtonTogglesComponent extends DynamicFormFieldBase {
204
262
  this.group = input.required(...(ngDevMode ? [{ debugName: "group" }] : []));
205
263
  }
206
264
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicButtonTogglesComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
207
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicButtonTogglesComponent, isStandalone: true, selector: "dynamic-button-toggles", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div\n class=\"dynamic-button-toggles-wrapper\"\n [formGroup]=\"group()\">\n <mat-button-toggle-group\n [id]=\"id\"\n [formControlName]=\"model().name\"\n [multiple]=\"model().multiple\"\n [vertical]=\"model().vertical\">\n @for (option of model().options$ | async; track option.value) {\n <mat-button-toggle [value]=\"option.value\">{{ option.label }}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n</div>\n", styles: [".dynamic-button-toggles-wrapper{height:var(--mat-form-field-container-height, 56px);display:flex;align-items:center}.dynamic-button-toggles-wrapper label{font-size:var(--mat-typography-body2-font-size, 14px)}.dynamic-button-toggles-wrapper label.above{display:block;margin-bottom:8px}.dynamic-button-toggles-wrapper label.before{display:inline-block;margin-right:8px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i1$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i1$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
265
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicButtonTogglesComponent, isStandalone: true, selector: "dynamic-button-toggles", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div\n class=\"dynamic-button-toggles-wrapper\"\n [formGroup]=\"group()\">\n <mat-button-toggle-group\n [id]=\"id\"\n [formControlName]=\"model().name\"\n [multiple]=\"model().multiple\"\n [vertical]=\"model().vertical\">\n @for (option of model().options$ | async; track option.value) {\n <mat-button-toggle [value]=\"option.value\">{{ option.label }}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n</div>\n", styles: [".dynamic-button-toggles-wrapper{height:var(--mat-form-field-container-height, 56px);display:flex;align-items:center}.dynamic-button-toggles-wrapper label{font-size:var(--mat-typography-body2-font-size, 14px)}.dynamic-button-toggles-wrapper label.above{display:block;margin-bottom:8px}.dynamic-button-toggles-wrapper label.before{display:inline-block;margin-right:8px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i1$2.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i1$2.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
208
266
  }
209
267
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicButtonTogglesComponent, decorators: [{
210
268
  type: Component,
@@ -221,7 +279,7 @@ class DynamicButtonComponent extends DynamicFormFieldBase {
221
279
  this.model().clicked();
222
280
  }
223
281
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicButtonComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
224
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.16", type: DynamicButtonComponent, isStandalone: true, selector: "dynamic-button", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div class=\"dynamic-button-wrapper\">\n <button\n [matButton]=\"model().variant\"\n [id]=\"id\"\n [disabled]=\"model().disabled\"\n (click)=\"onClick()\">\n <span>{{ model().label }}</span>\n </button>\n</div>\n", styles: [".dynamic-button-wrapper{display:flex;align-items:center;height:var(--mat-form-field-container-height, 56px)}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }] }); }
282
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.16", type: DynamicButtonComponent, isStandalone: true, selector: "dynamic-button", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div class=\"dynamic-button-wrapper\">\n <button\n [matButton]=\"model().variant\"\n [id]=\"id\"\n [disabled]=\"model().disabled\"\n (click)=\"onClick()\">\n <span>{{ model().label }}</span>\n </button>\n</div>\n", styles: [".dynamic-button-wrapper{display:flex;align-items:center;height:var(--mat-form-field-container-height, 56px)}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }] }); }
225
283
  }
226
284
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicButtonComponent, decorators: [{
227
285
  type: Component,
@@ -288,6 +346,19 @@ class DynamicFormFieldOptionModel extends DynamicFormFieldValueModel {
288
346
  }
289
347
  }
290
348
 
349
+ const DYNAMIC_FORM_FIELD_AUTOCOMPLETE = 'autocomplete';
350
+ class DynamicAutocomplete extends DynamicFormFieldOptionModel {
351
+ constructor(config) {
352
+ super(config);
353
+ this.type = DYNAMIC_FORM_FIELD_AUTOCOMPLETE;
354
+ this.searchFn = config.searchFn;
355
+ this.filterFn = config.filterFn;
356
+ this.displayFn = config.displayFn;
357
+ this.debounceTime = config.debounceTime ?? 300;
358
+ this.placeholder = config.placeholder ?? config.label ?? '';
359
+ }
360
+ }
361
+
291
362
  const DYNAMIC_FORM_FIELD_BUTTON_TOGGLES = 'button-toggles';
292
363
  class DynamicButtonToggles extends DynamicFormFieldOptionModel {
293
364
  constructor(config) {
@@ -519,7 +590,7 @@ class DynamicDatepickerComponent extends DynamicFormFieldBase {
519
590
  this.group = input.required(...(ngDevMode ? [{ debugName: "group" }] : []));
520
591
  }
521
592
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicDatepickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
522
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicDatepickerComponent, isStandalone: true, selector: "dynamic-datepicker", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"model().id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <input\n matInput\n [min]=\"model().min\"\n [max]=\"model().max\"\n [matDatepicker]=\"picker\" />\n\n @if (model().hint) {\n <mat-hint>{{ model().hint }}</mat-hint>\n }\n\n <mat-datepicker-toggle\n matIconSuffix\n [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker\n #picker\n [startAt]=\"model().startAt\"\n [startView]=\"model().startView\"></mat-datepicker>\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.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: i4.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i4.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i4.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }] }); }
593
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicDatepickerComponent, isStandalone: true, selector: "dynamic-datepicker", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"model().id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <input\n matInput\n [min]=\"model().min\"\n [max]=\"model().max\"\n [matDatepicker]=\"picker\" />\n\n @if (model().hint) {\n <mat-hint>{{ model().hint }}</mat-hint>\n }\n\n <mat-datepicker-toggle\n matIconSuffix\n [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker\n #picker\n [startAt]=\"model().startAt\"\n [startView]=\"model().startView\"></mat-datepicker>\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i1$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.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: i4$1.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i4$1.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i4$1.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }] }); }
523
594
  }
524
595
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicDatepickerComponent, decorators: [{
525
596
  type: Component,
@@ -541,7 +612,7 @@ class DynamicInputComponent extends DynamicFormFieldBase {
541
612
  this.input().type = this.input().type === 'password' ? 'text' : 'password';
542
613
  }
543
614
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
544
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicInputComponent, isStandalone: true, selector: "dynamic-input", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "input", first: true, predicate: MatInput, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n @if (model().prefix) {\n <span matTextPrefix>{{ model().prefix }}</span>\n }\n\n <input\n matInput\n [type]=\"model().inputType\"\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [attr.min]=\"model().min\"\n [attr.max]=\"model().max\"\n [attr.minLength]=\"model().minLength\"\n [attr.maxLength]=\"model().maxLength\"\n [pattern]=\"model().pattern\"\n [autocomplete]=\"model().autocomplete\" />\n\n @if (typeIsPassword()) {\n <button\n matSuffix\n mat-icon-button\n (click)=\"togglePassword()\">\n @if (input().type === 'password') {\n <mat-icon fontIcon=\"visibility\"></mat-icon>\n } @else {\n <mat-icon fontIcon=\"visibility_off\"></mat-icon>\n }\n </button>\n }\n\n @if (showClear()) {\n <button\n matSuffix\n mat-icon-button\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n }\n\n @if (model().showLoader()) {\n <div\n matSuffix\n class=\"loader-icon\">\n <mat-spinner\n diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @if (model().maxLength) {\n <mat-hint align=\"end\">{{ maxCountText() }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n", styles: ["mat-form-field{width:100%}mat-form-field .loader-icon{padding:8px}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{appearance:none;margin:0}input[type=number]{appearance:textfield}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.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: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
615
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicInputComponent, isStandalone: true, selector: "dynamic-input", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "input", first: true, predicate: MatInput, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n @if (model().prefix) {\n <span matTextPrefix>{{ model().prefix }}</span>\n }\n\n <input\n matInput\n [type]=\"model().inputType\"\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [attr.min]=\"model().min\"\n [attr.max]=\"model().max\"\n [attr.minLength]=\"model().minLength\"\n [attr.maxLength]=\"model().maxLength\"\n [pattern]=\"model().pattern\"\n [autocomplete]=\"model().autocomplete\" />\n\n @if (typeIsPassword()) {\n <button\n matSuffix\n mat-icon-button\n (click)=\"togglePassword()\">\n @if (input().type === 'password') {\n <mat-icon fontIcon=\"visibility\"></mat-icon>\n } @else {\n <mat-icon fontIcon=\"visibility_off\"></mat-icon>\n }\n </button>\n }\n\n @if (showClear()) {\n <button\n matSuffix\n mat-icon-button\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n }\n\n @if (model().showLoader()) {\n <div\n matSuffix\n class=\"loader-icon\">\n <mat-spinner\n diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @if (model().maxLength) {\n <mat-hint align=\"end\">{{ maxCountText() }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n", styles: ["mat-form-field{width:100%}mat-form-field .loader-icon{padding:8px}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{appearance:none;margin:0}input[type=number]{appearance:textfield}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { 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: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.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: MatButtonModule }, { kind: "component", type: i1$3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
545
616
  }
546
617
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicInputComponent, decorators: [{
547
618
  type: Component,
@@ -555,7 +626,7 @@ class DynamicRadioGroupComponent extends DynamicFormFieldBase {
555
626
  this.group = input.required(...(ngDevMode ? [{ debugName: "group" }] : []));
556
627
  }
557
628
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicRadioGroupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
558
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicRadioGroupComponent, isStandalone: true, selector: "dynamic-radio-group", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div\n class=\"dynamic-radio-group-wrapper\"\n [formGroup]=\"group()\">\n @if (model().label) {\n <label>{{ model().label }}</label>\n }\n <mat-radio-group\n [formControlName]=\"model().name\"\n class=\"radio-group\"\n [class.inlint]=\"model().inline\">\n @for (option of model().options$ | async; track option.value) {\n <mat-radio-button\n [value]=\"option.value\"\n [labelPosition]=\"model().labelPosition\">\n {{ option.label }}\n </mat-radio-button>\n }\n </mat-radio-group>\n</div>\n", styles: [".dynamic-radio-group-wrapper label{display:block;font-size:var(--mat-typography-body2-font-size, 14px);margin-bottom:8px}.dynamic-radio-group-wrapper .radio-group:not(.inline){display:flex;flex-direction:column;align-items:flex-start}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i2$2.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i2$2.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
629
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicRadioGroupComponent, isStandalone: true, selector: "dynamic-radio-group", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<div\n class=\"dynamic-radio-group-wrapper\"\n [formGroup]=\"group()\">\n @if (model().label) {\n <label>{{ model().label }}</label>\n }\n <mat-radio-group\n [formControlName]=\"model().name\"\n class=\"radio-group\"\n [class.inlint]=\"model().inline\">\n @for (option of model().options$ | async; track option.value) {\n <mat-radio-button\n [value]=\"option.value\"\n [labelPosition]=\"model().labelPosition\">\n {{ option.label }}\n </mat-radio-button>\n }\n </mat-radio-group>\n</div>\n", styles: [".dynamic-radio-group-wrapper label{display:block;font-size:var(--mat-typography-body2-font-size, 14px);margin-bottom:8px}.dynamic-radio-group-wrapper .radio-group:not(.inline){display:flex;flex-direction:column;align-items:flex-start}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i2$1.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i2$1.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
559
630
  }
560
631
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicRadioGroupComponent, decorators: [{
561
632
  type: Component,
@@ -583,7 +654,7 @@ class DynamicSelectComponent extends DynamicFormFieldBase {
583
654
  this.group = input.required(...(ngDevMode ? [{ debugName: "group" }] : []));
584
655
  }
585
656
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
586
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicSelectComponent, isStandalone: true, selector: "dynamic-select", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"model().id\"\n color=\"primary\">\n <mat-label>{{ model().label }}</mat-label>\n\n <!-- Template for select without grouped options -->\n @if (model().options$ | async; as options) {\n @if (!model().native) {\n <mat-select\n [formControlName]=\"model().name\"\n [multiple]=\"model().multiple\">\n @for (option of options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n } @else {\n <select matNativeControl>\n @for (option of options; track option.value) {\n <option [value]=\"option.value\">\n {{ option.label }}\n </option>\n }\n </select>\n }\n }\n\n <!-- Template for select with grouped options -->\n @if (model().groupedOptions$ | async; as groupedOptions) {\n @if (!model().native) {\n <mat-select [formControlName]=\"model().name\">\n @for (group of groupedOptions; track group.name) {\n <mat-optgroup [label]=\"group.name\">\n @for (option of group.options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-optgroup>\n }\n </mat-select>\n } @else {\n <select matNativeControl>\n @for (group of groupedOptions; track group.name) {\n =\n <optgroup [label]=\"group.name\">\n @for (option of group.options; track option.value) {\n <option [value]=\"option.value\">\n {{ option.label }}\n </option>\n }\n </optgroup>\n }\n </select>\n }\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n", styles: ["mat-form-field{width:100%}mat-option{padding-top:8px;padding-bottom:8px}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3$1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i3$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i3$1.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.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: "pipe", type: AsyncPipe, name: "async" }] }); }
657
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicSelectComponent, isStandalone: true, selector: "dynamic-select", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"model().id\"\n color=\"primary\">\n <mat-label>{{ model().label }}</mat-label>\n\n <!-- Template for select without grouped options -->\n @if (model().options$ | async; as options) {\n @if (!model().native) {\n <mat-select\n [formControlName]=\"model().name\"\n [multiple]=\"model().multiple\">\n @for (option of options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n } @else {\n <select matNativeControl>\n @for (option of options; track option.value) {\n <option [value]=\"option.value\">\n {{ option.label }}\n </option>\n }\n </select>\n }\n }\n\n <!-- Template for select with grouped options -->\n @if (model().groupedOptions$ | async; as groupedOptions) {\n @if (!model().native) {\n <mat-select [formControlName]=\"model().name\">\n @for (group of groupedOptions; track group.name) {\n <mat-optgroup [label]=\"group.name\">\n @for (option of group.options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-optgroup>\n }\n </mat-select>\n } @else {\n <select matNativeControl>\n @for (group of groupedOptions; track group.name) {\n =\n <optgroup [label]=\"group.name\">\n @for (option of group.options; track option.value) {\n <option [value]=\"option.value\">\n {{ option.label }}\n </option>\n }\n </optgroup>\n }\n </select>\n }\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n", styles: ["mat-form-field{width:100%}mat-option{padding-top:8px;padding-bottom:8px}\n"], 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i3$2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i3$1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i3$1.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "ngmodule", type: MatOptionModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.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: "pipe", type: AsyncPipe, name: "async" }] }); }
587
658
  }
588
659
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicSelectComponent, decorators: [{
589
660
  type: Component,
@@ -597,7 +668,7 @@ class DynamicSlideToggleComponent extends DynamicFormFieldBase {
597
668
  this.group = input.required(...(ngDevMode ? [{ debugName: "group" }] : []));
598
669
  }
599
670
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicSlideToggleComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
600
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.16", type: DynamicSlideToggleComponent, isStandalone: true, selector: "dynamic-slide-toggle", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<ng-container [formGroup]=\"group()\">\n <mat-slide-toggle\n [formControlName]=\"model().name\"\n [labelPosition]=\"model().labelPosition\"\n [id]=\"id\">\n <span class=\"slide-toggle-label\">{{ model().label }}</span>\n </mat-slide-toggle>\n</ng-container>\n", styles: [".slide-toggle-label{margin-left:var(--slide-toggle-label-spacing, .5rem)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i2$3.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }] }); }
671
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.16", type: DynamicSlideToggleComponent, isStandalone: true, selector: "dynamic-slide-toggle", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "<ng-container [formGroup]=\"group()\">\n <mat-slide-toggle\n [formControlName]=\"model().name\"\n [labelPosition]=\"model().labelPosition\"\n [id]=\"id\">\n <span class=\"slide-toggle-label\">{{ model().label }}</span>\n </mat-slide-toggle>\n</ng-container>\n", styles: [".slide-toggle-label{margin-left:var(--slide-toggle-label-spacing, .5rem)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i2$2.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }] }); }
601
672
  }
602
673
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicSlideToggleComponent, decorators: [{
603
674
  type: Component,
@@ -632,7 +703,7 @@ class DynamicTextareaComponent extends DynamicFormFieldBase {
632
703
  return `${this.valueCount} / ${this.model().maxLength}`;
633
704
  }
634
705
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicTextareaComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
635
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicTextareaComponent, isStandalone: true, selector: "dynamic-textarea", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "textarea", first: true, predicate: MatInput, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <textarea\n matInput\n [cdkTextareaAutosize]=\"model().resize\"\n [cdkAutosizeMinRows]=\"model().rows\"\n [cdkAutosizeMaxRows]=\"model().resizeMaxRows\"\n [id]=\"id\"\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [attr.minLength]=\"model().minLength\"\n [attr.maxLength]=\"model().maxLength\"\n [rows]=\"model().rows\"\n [autocomplete]=\"model().autocomplete\">\n </textarea>\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @if (model().maxLength) {\n <mat-hint align=\"end\">{{ maxCountText }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n", styles: ["mat-form-field{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.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: i3$2.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
706
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DynamicTextareaComponent, isStandalone: true, selector: "dynamic-textarea", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "textarea", first: true, predicate: MatInput, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <textarea\n matInput\n [cdkTextareaAutosize]=\"model().resize\"\n [cdkAutosizeMinRows]=\"model().rows\"\n [cdkAutosizeMaxRows]=\"model().resizeMaxRows\"\n [id]=\"id\"\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [attr.minLength]=\"model().minLength\"\n [attr.maxLength]=\"model().maxLength\"\n [rows]=\"model().rows\"\n [autocomplete]=\"model().autocomplete\">\n </textarea>\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @if (model().maxLength) {\n <mat-hint align=\"end\">{{ maxCountText }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n", styles: ["mat-form-field{width:100%}\n"], 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.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i1$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.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: i3$3.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
636
707
  }
637
708
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DynamicTextareaComponent, decorators: [{
638
709
  type: Component,
@@ -640,6 +711,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
640
711
  }], propDecorators: { textarea: [{ type: i0.ViewChild, args: [i0.forwardRef(() => MatInput), { isSignal: true }] }], model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }], group: [{ type: i0.Input, args: [{ isSignal: true, alias: "group", required: true }] }] } });
641
712
 
642
713
  const DYNAMIC_FORM_FIELD_MAP = {
714
+ [DYNAMIC_FORM_FIELD_AUTOCOMPLETE]: DynamicAutocompleteComponent,
643
715
  [DYNAMIC_FORM_FIELD_BUTTON]: DynamicButtonComponent,
644
716
  [DYNAMIC_FORM_FIELD_BUTTON_TOGGLES]: DynamicButtonTogglesComponent,
645
717
  [DYNAMIC_FORM_FIELD_CHECKBOX]: DynamicCheckboxComponent,
@@ -991,5 +1063,5 @@ function obsToDynamicFormOptions(obs, labelFn, valueFn) {
991
1063
  * Generated bundle index. Do not edit.
992
1064
  */
993
1065
 
994
- export { DYNAMIC_FORM_FIELD_BUTTON, DYNAMIC_FORM_FIELD_BUTTON_TOGGLES, DYNAMIC_FORM_FIELD_CHECKBOX, DYNAMIC_FORM_FIELD_DATEPICKER, DYNAMIC_FORM_FIELD_INPUT, DYNAMIC_FORM_FIELD_MAP$1 as DYNAMIC_FORM_FIELD_MAP, DYNAMIC_FORM_FIELD_RADIO_GROUP, DYNAMIC_FORM_FIELD_READONLY, DYNAMIC_FORM_FIELD_SELECT, DYNAMIC_FORM_FIELD_SLIDE_TOGGLE, DYNAMIC_FORM_FIELD_STATIC_TEXT, DYNAMIC_FORM_FIELD_TEXTAREA, DynamicButton, DynamicButtonToggles, DynamicCheckbox, DynamicDatepicker, DynamicFormComponent, DynamicFormFieldBase, DynamicFormFieldModel, DynamicFormFieldOptionModel, DynamicFormFieldValueModel, DynamicFormService, DynamicFormValidators, DynamicInput, DynamicRadioGroup, DynamicReadonly, DynamicSelect, DynamicSlideToggle, DynamicStaticText, DynamicTextarea, RelationActionType, RelationOperator, arrToDynamicFormOptions, obsToDynamicFormOptions };
1066
+ export { DYNAMIC_FORM_FIELD_AUTOCOMPLETE, DYNAMIC_FORM_FIELD_BUTTON, DYNAMIC_FORM_FIELD_BUTTON_TOGGLES, DYNAMIC_FORM_FIELD_CHECKBOX, DYNAMIC_FORM_FIELD_DATEPICKER, DYNAMIC_FORM_FIELD_INPUT, DYNAMIC_FORM_FIELD_MAP$1 as DYNAMIC_FORM_FIELD_MAP, DYNAMIC_FORM_FIELD_RADIO_GROUP, DYNAMIC_FORM_FIELD_READONLY, DYNAMIC_FORM_FIELD_SELECT, DYNAMIC_FORM_FIELD_SLIDE_TOGGLE, DYNAMIC_FORM_FIELD_STATIC_TEXT, DYNAMIC_FORM_FIELD_TEXTAREA, DynamicAutocomplete, DynamicButton, DynamicButtonToggles, DynamicCheckbox, DynamicDatepicker, DynamicFormComponent, DynamicFormFieldBase, DynamicFormFieldModel, DynamicFormFieldOptionModel, DynamicFormFieldValueModel, DynamicFormService, DynamicFormValidators, DynamicInput, DynamicRadioGroup, DynamicReadonly, DynamicSelect, DynamicSlideToggle, DynamicStaticText, DynamicTextarea, RelationActionType, RelationOperator, arrToDynamicFormOptions, obsToDynamicFormOptions };
995
1067
  //# sourceMappingURL=olafvv-ngx-dynamic-form.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"olafvv-ngx-dynamic-form.mjs","sources":["../../../projects/ngx-dynamic-form/src/lib/models/tokens/dynamic-form-field-map.token.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-validations.service.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-form.service.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-value-model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-base.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.component.html","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-option-model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/slide-toggle/dynamic-slide-toggle.model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-validators.ts","../../../projects/ngx-dynamic-form/src/lib/models/types/dynamic-form-field-relation.type.ts","../../../projects/ngx-dynamic-form/src/lib/controls/static-text/dynamic-static-text.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/slide-toggle/dynamic-slide-toggle.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/slide-toggle/dynamic-slide-toggle.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/static-text/dynamic-static-text.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/static-text/dynamic-static-text.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.component.html","../../../projects/ngx-dynamic-form/src/lib/models/constants/dynamic-form-field-map.const.ts","../../../projects/ngx-dynamic-form/src/lib/models/constants/dynamic-relations.const.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-form-relations.service.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form-field/dynamic-form-field.component.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form-field/dynamic-form-field.component.html","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form/dynamic-form.component.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form/dynamic-form.component.html","../../../projects/ngx-dynamic-form/src/lib/utils/helpers.ts","../../../projects/ngx-dynamic-form/src/public-api.ts","../../../projects/ngx-dynamic-form/src/olafvv-ngx-dynamic-form.ts"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core';\nimport { DynamicFormField } from '../classes/dynamic-form-field-base';\n\nexport const DYNAMIC_FORM_FIELD_MAP = new InjectionToken<Record<string, Type<DynamicFormField<any>>>>('DYNAMIC_FORM_FIELD_MAP');\n","import { Injectable } from '@angular/core';\nimport { FormControl, ValidatorFn } from '@angular/forms';\nimport { DynamicFormValidator } from '../models/types/dynamic-form-validator.type';\n\n/** @ignore */\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormValidationsService {\n /**\n * Get all Validator Functions from the validator configuration\n * @param validatorConfig\n * @returns\n */\n public getValidatorFns(validatorConfig: DynamicFormValidator[]): ValidatorFn[] {\n return validatorConfig.map((v) => v.validator);\n }\n\n /**\n * Update the validators on a FormControl based on the provided validator configuration.\n * This will replace any existing validators on the control or removes all validators when none provided\n * @param validatorConfig\n * @param control\n */\n public updateValidators(validatorConfig: DynamicFormValidator[], control: FormControl): void {\n if (!validatorConfig || validatorConfig.length === 0) {\n control.clearValidators();\n } else {\n const validatorFns: ValidatorFn[] = this.getValidatorFns(validatorConfig);\n control.setValidators(validatorFns);\n }\n\n control.updateValueAndValidity();\n }\n}\n","import { Inject, Injectable, Optional, Type } from '@angular/core';\nimport { FormBuilder, FormControl, FormControlOptions, FormGroup } from '@angular/forms';\nimport { DynamicFormField } from '../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldModel } from '../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldValueConfig } from '../models/classes/dynamic-form-field-value-model';\nimport { DYNAMIC_FORM_FIELD_MAP } from '../models/tokens/dynamic-form-field-map.token';\nimport { DynamicFormConfig } from '../models/types/dynamic-form-config.type';\nimport { DynamicFormValidationsService } from './dynamic-validations.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormService {\n constructor(\n @Inject(DYNAMIC_FORM_FIELD_MAP) @Optional() private customMap: Record<string, Type<DynamicFormField>>,\n private fb: FormBuilder,\n private validatorsService: DynamicFormValidationsService\n ) {}\n\n /**\n * Check if there is a mapping provided to use custom form controls\n * @param model\n * @returns\n */\n public getCustomControlComponentType(model: DynamicFormFieldModel): Type<DynamicFormField<any>> | null {\n return this.customMap && this.customMap[model.type] ? this.customMap[model.type] : null;\n }\n\n /**\n * Create a FormGroup from the provided form configuration.\n * Returns a FormGroup.\n * @param {DynamicFormConfig} config Configuration object of a form\n * @returns {FormGroup}\n */\n public createFormGroup(config: DynamicFormConfig): FormGroup {\n const group: FormGroup = this.fb.group({});\n\n config.forEach((controlConfig) => {\n const controlOptions: FormControlOptions = {\n updateOn: controlConfig.updateOn,\n validators: this.validatorsService.getValidatorFns(controlConfig.validators)\n };\n\n const controlValueConfig = controlConfig as DynamicFormFieldValueConfig<unknown>;\n const control = new FormControl(\n { value: controlValueConfig.value ?? controlValueConfig.defaultValue, disabled: controlValueConfig.disabled },\n controlOptions\n );\n\n group.addControl(controlConfig.name, control);\n });\n\n return group;\n }\n}\n","import { signal, WritableSignal } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { DynamicFormFieldConfig } from '../types/dynamic-form-field-config.type';\nimport { DynamicFormFieldRelation } from '../types/dynamic-form-field-relation.type';\nimport { DynamicFormValidator } from '../types/dynamic-form-validator.type';\n\n/**\n * Base class for all DynamicFormFields\n */\nexport abstract class DynamicFormFieldModel {\n public id: string;\n public width: number;\n public label: string | null;\n public name: string;\n public hint: string | null;\n public validators: DynamicFormValidator[];\n public updateOn: 'submit' | 'blur' | 'change';\n public relations: DynamicFormFieldRelation[] | null;\n public disabledChange: Observable<boolean>;\n\n abstract readonly type: string;\n\n private readonly disabled$: BehaviorSubject<boolean>;\n private readonly $hidden: WritableSignal<boolean>;\n\n constructor(config: DynamicFormFieldConfig) {\n this.id = config.id ?? config.name;\n this.width = config.width ?? 100;\n this.label = config.label ?? null;\n this.name = config.name;\n this.hint = config.hint ?? null;\n this.validators = config.validators ?? [];\n this.updateOn = config.updateOn ?? 'change';\n this.relations = config.relations ?? null;\n\n // Create a disabled Subject and Observable to change the state of the FormControl inside DynamicFormFieldComponent by subscribing to disabledChange\n this.disabled$ = new BehaviorSubject(config.disabled ?? false);\n this.disabledChange = this.disabled$.asObservable();\n\n this.$hidden = signal(config.hidden ?? false);\n }\n\n get disabled(): boolean {\n return this.disabled$.getValue();\n }\n set disabled(disable: boolean) {\n this.disabled$.next(disable);\n }\n\n get hidden(): boolean {\n return this.$hidden();\n }\n set hidden(hidden: boolean) {\n this.$hidden.set(hidden);\n }\n}\n","import { BehaviorSubject } from 'rxjs';\nimport { DynamicFormFieldConfig } from '../types/dynamic-form-field-config.type';\nimport { DynamicFormFieldModel } from './dynamic-form-field-model';\n\nexport interface DynamicFormFieldValueConfig<T> extends DynamicFormFieldConfig {\n /**\n * The value of the control.\n * This value will change when the control is used.\n * @optional\n */\n value?: T;\n /**\n * The default value of the control when initializing or resetting the control.\n * @optional\n */\n defaultValue?: T;\n /**\n * A function that gets called everytime the value of the control changes.\n * Passes the value of the control as parameter.\n * If you don't want to get an event on every keystroke without delay, use the ReactiveFormsModule `valueChanges` Observable\n * @optional\n */\n valueChanged?: (val: T | null) => any;\n}\n\n/**\n * Base class for a DynamicFormField with a value\n */\nexport abstract class DynamicFormFieldValueModel<T = unknown> extends DynamicFormFieldModel {\n public defaultValue: T | null;\n\n private _value$: BehaviorSubject<T | null>;\n private _valueChanged: ((val: T | null) => any) | undefined;\n\n constructor(config: DynamicFormFieldValueConfig<T>) {\n super(config);\n\n this.defaultValue = config.defaultValue ?? null;\n\n const val: T | null = config.value ?? null;\n this._value$ = new BehaviorSubject(val);\n this._valueChanged = config.valueChanged;\n }\n\n get value(): T | null {\n return this._value$.getValue();\n }\n set value(val: T | null) {\n this._value$.next(val);\n if (this._valueChanged) {\n this._valueChanged(val);\n }\n }\n}\n","import { InputSignal } from '@angular/core';\nimport { AbstractControl, FormGroup } from '@angular/forms';\nimport { DynamicFormFieldModel } from './dynamic-form-field-model';\n\nexport interface DynamicFormField<M extends DynamicFormFieldModel = DynamicFormFieldModel> {\n group: InputSignal<FormGroup>;\n model: InputSignal<M>;\n}\n\n/**\n * Base class for the DynamicFormField component classes\n */\nexport abstract class DynamicFormFieldBase<M extends DynamicFormFieldModel = DynamicFormFieldModel> implements DynamicFormField<M> {\n abstract group: InputSignal<FormGroup>;\n abstract model: InputSignal<M>;\n\n get id(): string {\n return this.model().id ?? this.model().name;\n }\n\n get control(): AbstractControl {\n const ctrl = this.group().get(this.model().name);\n\n if (!ctrl) {\n throw new Error(`Provided FormGroup does not contain a control with the name ${this.model().name}`);\n }\n return ctrl;\n }\n\n get isValid(): boolean {\n return this.control.valid;\n }\n\n get isInvalid(): boolean {\n return this.control.invalid;\n }\n\n public resetControl() {\n this.group().get(this.model().name)?.reset();\n }\n\n public hasError(name: string): boolean {\n return this.control.hasError(name);\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicButtonToggles } from './dynamic-button-toggles.model';\n\n@Component({\n imports: [MatButtonToggleModule, ReactiveFormsModule, AsyncPipe, MatFormFieldModule],\n selector: 'dynamic-button-toggles',\n templateUrl: './dynamic-button-toggles.component.html',\n styleUrls: ['./dynamic-button-toggles.component.scss']\n})\nexport class DynamicButtonTogglesComponent extends DynamicFormFieldBase<DynamicButtonToggles> {\n public model = input.required<DynamicButtonToggles>();\n public group = input.required<FormGroup>();\n}\n","<div\n class=\"dynamic-button-toggles-wrapper\"\n [formGroup]=\"group()\">\n <mat-button-toggle-group\n [id]=\"id\"\n [formControlName]=\"model().name\"\n [multiple]=\"model().multiple\"\n [vertical]=\"model().vertical\">\n @for (option of model().options$ | async; track option.value) {\n <mat-button-toggle [value]=\"option.value\">{{ option.label }}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n</div>\n","import { Component, input } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicButton } from './dynamic-button.model';\n\n@Component({\n imports: [MatButtonModule],\n selector: 'dynamic-button',\n templateUrl: './dynamic-button.component.html',\n styleUrl: './dynamic-button.component.scss'\n})\nexport class DynamicButtonComponent extends DynamicFormFieldBase<DynamicButton> {\n public model = input.required<DynamicButton>();\n public group = input.required<FormGroup>();\n\n public onClick() {\n this.model().clicked();\n }\n}\n","<div class=\"dynamic-button-wrapper\">\n <button\n [matButton]=\"model().variant\"\n [id]=\"id\"\n [disabled]=\"model().disabled\"\n (click)=\"onClick()\">\n <span>{{ model().label }}</span>\n </button>\n</div>\n","import { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicCheckbox } from './dynamic-checkbox.model';\n\n@Component({\n selector: 'dynamic-checkbox',\n templateUrl: 'dynamic-checkbox.component.html',\n imports: [ReactiveFormsModule, MatCheckboxModule]\n})\nexport class DynamicCheckboxComponent extends DynamicFormFieldBase<DynamicCheckbox> {\n public model = input.required<DynamicCheckbox>();\n public group = input.required<FormGroup>();\n}\n","<ng-container [formGroup]=\"group()\">\n <mat-checkbox\n [checked]=\"model().checked\"\n [formControlName]=\"model().name\"\n [indeterminate]=\"model().indeterminate\"\n [labelPosition]=\"model().labelPosition\"\n [name]=\"model().name\"\n [id]=\"id\">\n <span class=\"checkbox-label\">{{ model().label }}</span>\n </mat-checkbox>\n</ng-container>\n","import { isObservable, map, Observable, of } from 'rxjs';\nimport { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from './dynamic-form-field-value-model';\n\nexport type DynamicOptionList<T> = DynamicFormFieldOption<T>[] | Observable<DynamicFormFieldOption<T>[]>;\n\nexport type DynamicGroupedOptionList<T> = DynamicFormFieldOptionGroup<T>[] | Observable<DynamicFormFieldOptionGroup<T>[]>;\n\n/**\n * Interface for the objects inside a list of options of Dynamic FormField\n */\nexport interface DynamicFormFieldOption<T> {\n /** The text shown as label */\n label: string;\n /** Extra line of text shown as subtitle */\n subTitle?: string;\n /** The value the option holds */\n value: T;\n}\n\n/**\n * Interface for a group op options inside a Dynamic FormField (optgroup)\n */\nexport interface DynamicFormFieldOptionGroup<T> {\n name: string;\n options: DynamicFormFieldOption<T>[];\n}\n\n/**\n * Base interface for any DynamicFormFieldConfig with options (e.g. DynamicSelectConfig or DynamicAutocompleteConfig).\n */\nexport interface DynamicFormFieldOptionConfig<T> extends DynamicFormFieldValueConfig<T> {\n options?: DynamicOptionList<T>;\n groupedOptions?: DynamicGroupedOptionList<T>;\n}\n\n/**\n * Base class for any DynamicFormField with options (e.g. DynamicSelect or DynamicAutocomplete)\n */\nexport abstract class DynamicFormFieldOptionModel<T> extends DynamicFormFieldValueModel<T> {\n public options$!: Observable<DynamicFormFieldOption<T>[]>;\n public groupedOptions$!: Observable<DynamicFormFieldOptionGroup<T>[]>;\n\n private _options: DynamicFormFieldOption<T>[] = [];\n private _groupedOptions: DynamicFormFieldOptionGroup<T>[] = [];\n\n constructor(config: DynamicFormFieldOptionConfig<T>) {\n super(config);\n\n if (!config.options && !config.groupedOptions) {\n console.error(`No options or groupedOptions provided for ${this.name}`);\n }\n\n if (config.options) {\n this.options$ = this.setOptions(config.options);\n } else if (config.groupedOptions) {\n this.groupedOptions$ = this.setGroupedOptions(config.groupedOptions);\n }\n }\n\n private setOptions(options: DynamicOptionList<T>): Observable<DynamicFormFieldOption<T>[]> {\n if (Array.isArray(options)) {\n this._options = options;\n return of(this._options);\n }\n\n if (isObservable(options)) {\n return options.pipe(\n map((o) => {\n this._options = o;\n return this._options;\n })\n );\n }\n\n return of([]);\n }\n\n private setGroupedOptions(groupedOptions: DynamicGroupedOptionList<T>): Observable<DynamicFormFieldOptionGroup<T>[]> {\n if (Array.isArray(groupedOptions)) {\n this._groupedOptions = groupedOptions;\n return of(this._groupedOptions);\n }\n\n if (isObservable(groupedOptions)) {\n return groupedOptions.pipe(\n map((o) => {\n this._groupedOptions = o;\n return this._groupedOptions;\n })\n );\n }\n\n return of([]);\n }\n}\n","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_BUTTON_TOGGLES = 'button-toggles';\n\nexport type DynamicButtonTogglesConfig = Omit<DynamicFormFieldOptionConfig<string | number | null>, 'label'> & {\n /** Whether to allow multiple options to be selected. Default is false */\n multiple?: boolean;\n /** Whether the toggle group is vertical. Default is false */\n vertical?: boolean;\n};\n\nexport class DynamicButtonToggles extends DynamicFormFieldOptionModel<string | number | null> {\n public multiple: boolean;\n public vertical: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_BUTTON_TOGGLES;\n\n constructor(config: DynamicButtonTogglesConfig) {\n super(config);\n\n this.multiple = config.multiple ?? false;\n this.vertical = config.vertical ?? false;\n }\n}\n","import { MatButtonAppearance } from '@angular/material/button';\nimport { DynamicFormFieldModel } from '../../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldConfig } from '../../models/types/dynamic-form-field-config.type';\n\nexport const DYNAMIC_FORM_FIELD_BUTTON = 'button';\n\ntype OmittedProperties = 'hint' | 'validators' | 'updateOn';\n\n/**\n * @TODO icon support\n */\nexport type DynamicButtonConfig = Omit<DynamicFormFieldConfig, OmittedProperties> & {\n /**\n * Label shown inside the button\n */\n label: string;\n /**\n * Variant of the button\n */\n variant?: MatButtonAppearance;\n /**\n * Function called when the button is clicked.\n * Provides no parameters.\n * @returns\n */\n clicked: () => any;\n};\n\nexport class DynamicButton extends DynamicFormFieldModel {\n public label: string | null;\n public variant: MatButtonAppearance;\n public clicked: () => any;\n\n public readonly type = DYNAMIC_FORM_FIELD_BUTTON;\n\n constructor(config: DynamicButtonConfig) {\n super(config);\n\n this.label = config.label;\n this.variant = config.variant ?? 'text';\n this.clicked = config.clicked;\n }\n}\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_CHECKBOX = 'checkbox';\n\nexport type DynamicCheckboxConfig = DynamicFormFieldValueConfig<boolean> & {\n labelPosition?: 'before' | 'after';\n indeterminate?: boolean;\n};\n\nexport class DynamicCheckbox extends DynamicFormFieldValueModel<boolean> {\n public labelPosition: 'before' | 'after';\n public indeterminate: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_CHECKBOX;\n\n constructor(config: DynamicCheckboxConfig) {\n super(config);\n\n this.value = config.value ?? false;\n\n this.labelPosition = config.labelPosition ?? 'after';\n this.indeterminate = config.indeterminate === true ? true : false;\n }\n\n get checked(): boolean {\n return this.value ?? false;\n }\n\n set checked(checked: boolean) {\n this.value = checked;\n }\n}\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_DATEPICKER = 'datepicker';\n\nexport type DynamicDatepickerControlValue = Date | object | string | null;\n\nexport type DynamicDatepickerConfig = DynamicFormFieldValueConfig<DynamicDatepickerControlValue> & {\n /** Maximum date selectable in the datepicker */\n max?: DynamicDatepickerControlValue;\n /** Minimum date selectable in the datepicker */\n min?: DynamicDatepickerControlValue;\n /** The initial date visible inside the datepicker when opening the picker */\n startAt?: DynamicDatepickerControlValue;\n /** The view the picker is initializing when opening */\n startView?: 'month' | 'year' | 'multi-year';\n};\n\nexport class DynamicDatepicker extends DynamicFormFieldValueModel<DynamicDatepickerControlValue> {\n public max: DynamicDatepickerControlValue | null;\n public min: DynamicDatepickerControlValue | null;\n public startAt: DynamicDatepickerControlValue | null;\n public startView: 'month' | 'year' | 'multi-year';\n\n public readonly type = DYNAMIC_FORM_FIELD_DATEPICKER;\n\n constructor(config: DynamicDatepickerConfig) {\n super(config);\n\n this.max = config.max ?? null;\n this.min = config.min ?? null;\n this.startAt = config.startAt ?? null;\n this.startView = config.startView ?? 'month';\n }\n}\n","import { signal, WritableSignal } from '@angular/core';\nimport { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_INPUT = 'input';\n\nexport type HtmlInputType = 'text' | 'number' | 'tel' | 'email' | 'password' | 'date' | 'time' | 'color';\nexport type DynamicInputValue = string | number | Date | null;\n\nexport type DynamicInputConfig = DynamicFormFieldValueConfig<DynamicInputValue> & {\n inputType?: HtmlInputType;\n placeholder?: string;\n max?: number;\n min?: number;\n maxLength?: number;\n minLength?: number;\n step?: number;\n pattern?: string | RegExp;\n autocomplete?: 'on' | 'off';\n prefix?: string;\n hideClearIcon?: boolean;\n showLoader?: WritableSignal<boolean>;\n};\n\nexport class DynamicInput extends DynamicFormFieldValueModel<DynamicInputValue> {\n public inputType: HtmlInputType;\n public placeholder: string;\n public max: number | null;\n public min: number | null;\n public maxLength: number | null;\n public minLength: number | null;\n public step: number | null;\n public pattern: string | RegExp;\n public autocomplete: 'on' | 'off';\n public prefix: string | null;\n public hideClearIcon: boolean;\n public showLoader: WritableSignal<boolean>;\n\n public readonly type = DYNAMIC_FORM_FIELD_INPUT;\n\n constructor(config: DynamicInputConfig) {\n super(config);\n\n this.inputType = config.inputType ?? 'text';\n this.placeholder = config.placeholder ?? config.label ?? '';\n this.max = config.max ?? null;\n this.min = config.min ?? null;\n this.maxLength = typeof config.maxLength === 'number' ? config.maxLength : null;\n this.minLength = typeof config.minLength === 'number' ? config.minLength : null;\n this.step = config.step ?? null;\n this.pattern = config.pattern ?? '';\n this.autocomplete = config.autocomplete ?? 'off';\n this.prefix = config.prefix ?? null;\n this.hideClearIcon = config.hideClearIcon ?? false;\n this.showLoader = config.showLoader ?? signal(false);\n }\n}\n","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_RADIO_GROUP = 'radio-group';\n\nexport type DynamicRadioGroupConfig = DynamicFormFieldOptionConfig<string | number | null> & {\n /** Placement of the option label. Default is 'before' */\n labelPosition?: 'before' | 'after';\n /** Whether the options are shown inline (horizontally). Default is false */\n inline?: boolean;\n};\n\nexport class DynamicRadioGroup extends DynamicFormFieldOptionModel<string | number | null> {\n public labelPosition: 'before' | 'after';\n public inline: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_RADIO_GROUP;\n\n constructor(config: DynamicRadioGroupConfig) {\n super(config);\n\n this.labelPosition = config.labelPosition ?? 'after';\n this.inline = config.inline ?? false;\n }\n}\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_READONLY = 'readonly';\nexport type DynamicReadonlyValue = string | number | null;\n\nexport type DynamicReadonlyConfig = DynamicFormFieldValueConfig<DynamicReadonlyValue>;\n\nexport class DynamicReadonly extends DynamicFormFieldValueModel<DynamicReadonlyValue> {\n public readonly type = DYNAMIC_FORM_FIELD_READONLY;\n\n constructor(config: DynamicReadonlyConfig) {\n super(config);\n }\n}\n","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_SELECT = 'select';\n\nexport type DynamicSelectConfig<T = string> = DynamicFormFieldOptionConfig<T> & {\n /**\n * Show the native dropdown instead of the Angular Material styled dropdown\n */\n native?: boolean;\n /**\n * Whether it is possible to select multiple options.\n * Default value is false\n */\n multiple?: boolean;\n};\n\nexport class DynamicSelect<T = string> extends DynamicFormFieldOptionModel<T> {\n public native: boolean;\n public multiple: boolean;\n\n public readonly type = DYNAMIC_FORM_FIELD_SELECT;\n\n constructor(config: DynamicSelectConfig<T>) {\n super(config);\n\n this.native = config.native ?? false;\n this.multiple = config.multiple ?? false;\n }\n}\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_SLIDE_TOGGLE = 'slide-toggle';\n\nexport type DynamicSlideToggleConfig = DynamicFormFieldValueConfig<boolean> & {\n /**\n * Whether the label appears before or after the slide toggle.\n * @default 'after'\n */\n labelPosition?: 'before' | 'after';\n};\n\nexport class DynamicSlideToggle extends DynamicFormFieldValueModel<boolean> {\n public labelPosition: 'before' | 'after';\n\n public readonly type: string = DYNAMIC_FORM_FIELD_SLIDE_TOGGLE;\n\n constructor(config: DynamicSlideToggleConfig) {\n super(config);\n\n this.value = config.value ?? false;\n this.labelPosition = config.labelPosition ?? 'after';\n }\n\n get checked(): boolean {\n return this.value ?? false;\n }\n\n set checked(checked: boolean) {\n this.value = checked;\n }\n}\n","import { Validators } from '@angular/forms';\nimport { DynamicFormValidator } from '../types/dynamic-form-validator.type';\n\nexport class DynamicFormValidators {\n /**\n * Default email validator, the value of the control has to be a valid email address\n * @param msg\n */\n static email(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Geen geldig emailadres';\n return { name: 'email', validator: Validators.email, message };\n }\n\n /**\n * Default min validator, the value has to be greater or equal than the the provided number\n * @param min number\n * @param msg\n */\n static min(min: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Minimum is ${min}`;\n return { name: 'min', validator: Validators.min(min), message };\n }\n\n /**\n * Default max validator, the value has to be less or equal than the the provided number\n * @param max number\n * @param msg\n */\n static max(max: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Maximum is ${max}`;\n return { name: 'max', validator: Validators.max(max), message };\n }\n\n /**\n * Default minLength validator, the value has to contain a minimum amount of characters\n * @param min number\n * @param msg\n */\n static minLength(min: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Minimaal ${min} tekens`;\n return { name: 'minLength', validator: Validators.min(min), message };\n }\n\n /**\n * Default maxLength validator, the value has to contain a maximum amount of characters\n * @param max number\n * @param msg\n */\n static maxLength(max: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Maximaal ${max} tekens`;\n return { name: 'maxLength', validator: Validators.max(max), message };\n }\n\n /**\n * Default pattern validator, the value of the control has to match the provided pattern\n * @param pattern: string | RegExp\n * @param msg\n */\n static pattern(pattern: string | RegExp, msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Geen geldige invoer';\n return { name: 'pattern', validator: Validators.pattern(pattern), message };\n }\n\n /**\n * Default required validator, the control must contain a value\n * @param msg\n */\n static required(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Dit veld is verplicht';\n\n return { name: 'required', validator: Validators.required, message };\n }\n\n /**\n * Default requiredTrue validator, the value of the control has to be true\n * @param msg\n */\n static requiredTrue(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Dit veld is verplicht';\n return { name: 'requiredTrue', validator: Validators.requiredTrue, message };\n }\n}\n","export enum RelationActionType {\n DISABLED = 'DISABLED',\n ENABLED = 'ENABLED',\n HIDDEN = 'HIDDEN',\n VISIBLE = 'VISIBLE',\n REQUIRED = 'REQUIRED',\n OPTIONAL = 'OPTIONAL'\n}\n\nexport enum RelationOperator {\n AND = 'AND',\n OR = 'OR'\n}\n\nexport type RelationCondition = {\n /** Name of a field in the same form this field is depended on */\n fieldName?: string;\n /**\n * Path to the related field.\n * This must be used when working with nested FormGroups and you want to relate a field in a different group.\n */\n path?: string;\n /** Method that returns true when the condition is met. The passed parameter is the value of the depended field */\n value: (val: any) => boolean;\n};\n\nexport type DynamicFormFieldRelation = {\n actionType: RelationActionType;\n conditions: RelationCondition[];\n operator?: RelationOperator;\n};\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models';\n\nexport const DYNAMIC_FORM_FIELD_STATIC_TEXT = 'static-text';\n\nexport type DynamicStaticTextValue = {\n title?: string;\n text?: string;\n};\n\nexport type DynamicStaticTextConfig = DynamicFormFieldValueConfig<DynamicStaticTextValue>;\n\nexport class DynamicStaticText extends DynamicFormFieldValueModel<DynamicStaticTextValue> {\n public readonly type = DYNAMIC_FORM_FIELD_STATIC_TEXT;\n\n constructor(config: DynamicStaticTextConfig) {\n super(config);\n }\n}\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_TEXTAREA = 'textarea';\nexport type DynamicTextareaValue = string | null;\n\nexport type DynamicTextareaConfig = DynamicFormFieldValueConfig<DynamicTextareaValue> & {\n /**\n * Placeholder text inside the textarea.\n * Only visible when the field is empty and in focus.\n */\n placeholder?: string;\n /**\n * Minimum amount of characters needed in the textarea\n */\n minLength?: number;\n /**\n * Maximum amount of characters it is possible to fill in the textarea\n */\n maxLength?: number;\n /**\n * Enables or disabled the browser natie autocomplete bubble when the control is in focus.\n * Default value is 'off'\n */\n autocomplete?: 'on' | 'off';\n /**\n * Amount of rows the textarea initializes on\n */\n rows?: number;\n /**\n * Whether the textare automatically resizes to fit its content\n */\n resize?: boolean;\n /**\n * Maximum amount of rows the textarea show resize to\n */\n resizeMaxRows?: number;\n};\n\nexport class DynamicTextarea extends DynamicFormFieldValueModel<DynamicTextareaValue> {\n public placeholder: string;\n public minLength: number | null;\n public maxLength: number | null;\n public autocomplete: 'on' | 'off';\n public rows: number;\n public resize: boolean;\n public resizeMaxRows: number | null;\n\n public readonly type = DYNAMIC_FORM_FIELD_TEXTAREA;\n\n constructor(config: DynamicTextareaConfig) {\n super(config);\n\n this.placeholder = config.placeholder ?? '';\n this.minLength = config.minLength ?? 0;\n this.maxLength = config.minLength ?? null;\n this.autocomplete = config.autocomplete ?? 'off';\n this.rows = config.rows ?? 3;\n this.resize = config.resize ?? true;\n this.resizeMaxRows = config.resizeMaxRows ?? null;\n }\n}\n","import { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicDatepicker } from './dynamic-datepicker.model';\n\n@Component({\n imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatDatepickerModule],\n selector: 'dynamic-datepicker',\n templateUrl: './dynamic-datepicker.component.html',\n styleUrl: './dynamic-datepicker.component.scss'\n})\nexport class DynamicDatepickerComponent extends DynamicFormFieldBase<DynamicDatepicker> {\n public model = input.required<DynamicDatepicker>();\n public group = input.required<FormGroup>();\n}\n","<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"model().id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <input\n matInput\n [min]=\"model().min\"\n [max]=\"model().max\"\n [matDatepicker]=\"picker\" />\n\n @if (model().hint) {\n <mat-hint>{{ model().hint }}</mat-hint>\n }\n\n <mat-datepicker-toggle\n matIconSuffix\n [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker\n #picker\n [startAt]=\"model().startAt\"\n [startView]=\"model().startView\"></mat-datepicker>\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n","import { Component, computed, input, viewChild } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicInput } from './dynamic-input.model';\n\n@Component({\n imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule],\n selector: 'dynamic-input',\n templateUrl: './dynamic-input.component.html',\n styleUrl: './dynamic-input.component.scss'\n})\nexport class DynamicInputComponent extends DynamicFormFieldBase<DynamicInput> {\n public input = viewChild.required<MatInput>(MatInput);\n\n public model = input.required<DynamicInput>();\n public group = input.required<FormGroup>();\n\n public typeIsPassword = computed(() => this.model().inputType === 'password');\n public valueCount = computed(() => (this.input()?.value ? this.input().value.length : 0));\n public maxCountText = computed(() => `${this.valueCount()} / ${this.model().maxLength}`);\n public showClear = computed(() => !!this.valueCount() && !this.control.disabled && !this.model().showLoader);\n\n public togglePassword(): void {\n this.input().type = this.input().type === 'password' ? 'text' : 'password';\n }\n}\n","<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n @if (model().prefix) {\n <span matTextPrefix>{{ model().prefix }}</span>\n }\n\n <input\n matInput\n [type]=\"model().inputType\"\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [attr.min]=\"model().min\"\n [attr.max]=\"model().max\"\n [attr.minLength]=\"model().minLength\"\n [attr.maxLength]=\"model().maxLength\"\n [pattern]=\"model().pattern\"\n [autocomplete]=\"model().autocomplete\" />\n\n @if (typeIsPassword()) {\n <button\n matSuffix\n mat-icon-button\n (click)=\"togglePassword()\">\n @if (input().type === 'password') {\n <mat-icon fontIcon=\"visibility\"></mat-icon>\n } @else {\n <mat-icon fontIcon=\"visibility_off\"></mat-icon>\n }\n </button>\n }\n\n @if (showClear()) {\n <button\n matSuffix\n mat-icon-button\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n }\n\n @if (model().showLoader()) {\n <div\n matSuffix\n class=\"loader-icon\">\n <mat-spinner\n diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @if (model().maxLength) {\n <mat-hint align=\"end\">{{ maxCountText() }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicRadioGroup } from './dynamic-radio-group.model';\n\n@Component({\n imports: [ReactiveFormsModule, MatRadioModule, AsyncPipe],\n selector: 'dynamic-radio-group',\n templateUrl: './dynamic-radio-group.component.html',\n styleUrls: ['./dynamic-radio-group.component.scss']\n})\nexport class DynamicRadioGroupComponent extends DynamicFormFieldBase<DynamicRadioGroup> {\n public model = input.required<DynamicRadioGroup>();\n public group = input.required<FormGroup>();\n}\n","<div\n class=\"dynamic-radio-group-wrapper\"\n [formGroup]=\"group()\">\n @if (model().label) {\n <label>{{ model().label }}</label>\n }\n <mat-radio-group\n [formControlName]=\"model().name\"\n class=\"radio-group\"\n [class.inlint]=\"model().inline\">\n @for (option of model().options$ | async; track option.value) {\n <mat-radio-button\n [value]=\"option.value\"\n [labelPosition]=\"model().labelPosition\">\n {{ option.label }}\n </mat-radio-button>\n }\n </mat-radio-group>\n</div>\n","import { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicReadonly } from './dynamic-readonly.model';\n\n@Component({\n imports: [ReactiveFormsModule],\n selector: 'dynamic-readonly',\n templateUrl: './dynamic-readonly.component.html',\n styleUrls: ['./dynamic-readonly.component.scss']\n})\nexport class DynamicReadonlyComponent extends DynamicFormFieldBase<DynamicReadonly> {\n public model = input.required<DynamicReadonly>();\n public group = input.required<FormGroup>();\n}\n","<div\n class=\"dynamic-form-field-readonly\"\n [formGroup]=\"group()\"\n [id]=\"model().id\">\n <div class=\"label\">{{ model().label }}</div>\n <span>{{ model().value }}</span>\n</div>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicSelect } from './dynamic-select.model';\n\n@Component({\n imports: [MatFormFieldModule, ReactiveFormsModule, MatSelectModule, MatOptionModule, AsyncPipe, MatInputModule],\n selector: 'dynamic-select',\n templateUrl: './dynamic-select.component.html',\n styleUrls: ['./dynamic-select.component.scss']\n})\nexport class DynamicSelectComponent extends DynamicFormFieldBase<DynamicSelect> {\n public model = input.required<DynamicSelect>();\n public group = input.required<FormGroup>();\n}\n","<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"model().id\"\n color=\"primary\">\n <mat-label>{{ model().label }}</mat-label>\n\n <!-- Template for select without grouped options -->\n @if (model().options$ | async; as options) {\n @if (!model().native) {\n <mat-select\n [formControlName]=\"model().name\"\n [multiple]=\"model().multiple\">\n @for (option of options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n } @else {\n <select matNativeControl>\n @for (option of options; track option.value) {\n <option [value]=\"option.value\">\n {{ option.label }}\n </option>\n }\n </select>\n }\n }\n\n <!-- Template for select with grouped options -->\n @if (model().groupedOptions$ | async; as groupedOptions) {\n @if (!model().native) {\n <mat-select [formControlName]=\"model().name\">\n @for (group of groupedOptions; track group.name) {\n <mat-optgroup [label]=\"group.name\">\n @for (option of group.options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-optgroup>\n }\n </mat-select>\n } @else {\n <select matNativeControl>\n @for (group of groupedOptions; track group.name) {\n =\n <optgroup [label]=\"group.name\">\n @for (option of group.options; track option.value) {\n <option [value]=\"option.value\">\n {{ option.label }}\n </option>\n }\n </optgroup>\n }\n </select>\n }\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n","import { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicSlideToggle } from './dynamic-slide-toggle.model';\n\n@Component({\n selector: 'dynamic-slide-toggle',\n templateUrl: 'dynamic-slide-toggle.component.html',\n styleUrl: 'dynamic-slide-toggle.component.scss',\n imports: [ReactiveFormsModule, MatSlideToggleModule]\n})\nexport class DynamicSlideToggleComponent extends DynamicFormFieldBase<DynamicSlideToggle> {\n public model = input.required<DynamicSlideToggle>();\n public group = input.required<FormGroup>();\n}\n","<ng-container [formGroup]=\"group()\">\n <mat-slide-toggle\n [formControlName]=\"model().name\"\n [labelPosition]=\"model().labelPosition\"\n [id]=\"id\">\n <span class=\"slide-toggle-label\">{{ model().label }}</span>\n </mat-slide-toggle>\n</ng-container>\n","import { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicStaticText } from './dynamic-static-text.model';\n\n@Component({\n selector: 'dynamic-static-text',\n templateUrl: 'dynamic-static-text.component.html',\n styleUrl: './dynamic-static-text.component.scss',\n imports: [ReactiveFormsModule]\n})\nexport class DynamicStaticTextComponent extends DynamicFormFieldBase<DynamicStaticText> {\n public model = input.required<DynamicStaticText>();\n public group = input.required<FormGroup>();\n}\n","<div class=\"dynamic-static-text\">\n @if (model().value?.title) {\n <h3 class=\"dynamic-static-text-title\">{{ model().value?.title }}</h3>\n }\n @if (model().value?.text) {\n <p class=\"dynamic-static-text-body\">{{ model().value?.text }}</p>\n }\n</div>\n","import { Component, input, viewChild } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicTextarea } from './dynamic-textarea.model';\n\n@Component({\n imports: [MatFormFieldModule, MatInputModule, ReactiveFormsModule],\n selector: 'dynamic-textarea',\n templateUrl: './dynamic-textarea.component.html',\n styles: ['mat-form-field {width: 100%;}']\n})\nexport class DynamicTextareaComponent extends DynamicFormFieldBase<DynamicTextarea> {\n public textarea = viewChild.required<MatInput>(MatInput);\n\n public model = input.required<DynamicTextarea>();\n public group = input.required<FormGroup>();\n\n get valueCount(): number {\n return this.textarea()?.value ? this.textarea().value.length : 0;\n }\n\n get maxCountText(): string {\n return `${this.valueCount} / ${this.model().maxLength}`;\n }\n}\n","<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <textarea\n matInput\n [cdkTextareaAutosize]=\"model().resize\"\n [cdkAutosizeMinRows]=\"model().rows\"\n [cdkAutosizeMaxRows]=\"model().resizeMaxRows\"\n [id]=\"id\"\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [attr.minLength]=\"model().minLength\"\n [attr.maxLength]=\"model().maxLength\"\n [rows]=\"model().rows\"\n [autocomplete]=\"model().autocomplete\">\n </textarea>\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @if (model().maxLength) {\n <mat-hint align=\"end\">{{ maxCountText }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n","import { Type } from '@angular/core';\nimport { DynamicButtonTogglesComponent } from '../../controls/button-toggles/dynamic-button-toggles.component';\nimport { DynamicButtonComponent } from '../../controls/button/dynamic-button.component';\nimport { DynamicCheckboxComponent } from '../../controls/checkbox/dynamic-checkbox.component';\nimport {\n DYNAMIC_FORM_FIELD_BUTTON,\n DYNAMIC_FORM_FIELD_BUTTON_TOGGLES,\n DYNAMIC_FORM_FIELD_CHECKBOX,\n DYNAMIC_FORM_FIELD_DATEPICKER,\n DYNAMIC_FORM_FIELD_INPUT,\n DYNAMIC_FORM_FIELD_RADIO_GROUP,\n DYNAMIC_FORM_FIELD_READONLY,\n DYNAMIC_FORM_FIELD_SELECT,\n DYNAMIC_FORM_FIELD_SLIDE_TOGGLE,\n DYNAMIC_FORM_FIELD_STATIC_TEXT,\n DYNAMIC_FORM_FIELD_TEXTAREA\n} from '../../controls/controls';\nimport { DynamicDatepickerComponent } from '../../controls/datepicker/dynamic-datepicker.component';\nimport { DynamicInputComponent } from '../../controls/input/dynamic-input.component';\nimport { DynamicRadioGroupComponent } from '../../controls/radio-group/dynamic-radio-group.component';\nimport { DynamicReadonlyComponent } from '../../controls/readonly/dynamic-readonly.component';\nimport { DynamicSelectComponent } from '../../controls/select/dynamic-select.component';\nimport { DynamicSlideToggleComponent } from '../../controls/slide-toggle/dynamic-slide-toggle.component';\nimport { DynamicStaticTextComponent } from '../../controls/static-text/dynamic-static-text.component';\nimport { DynamicTextareaComponent } from '../../controls/textarea/dynamic-textarea.component';\nimport { DynamicFormField } from '../classes/dynamic-form-field-base';\n\nexport const DYNAMIC_FORM_FIELD_MAP: Record<string, Type<DynamicFormField<any>>> = {\n [DYNAMIC_FORM_FIELD_BUTTON]: DynamicButtonComponent,\n [DYNAMIC_FORM_FIELD_BUTTON_TOGGLES]: DynamicButtonTogglesComponent,\n [DYNAMIC_FORM_FIELD_CHECKBOX]: DynamicCheckboxComponent,\n [DYNAMIC_FORM_FIELD_DATEPICKER]: DynamicDatepickerComponent,\n [DYNAMIC_FORM_FIELD_INPUT]: DynamicInputComponent,\n [DYNAMIC_FORM_FIELD_RADIO_GROUP]: DynamicRadioGroupComponent,\n [DYNAMIC_FORM_FIELD_READONLY]: DynamicReadonlyComponent,\n [DYNAMIC_FORM_FIELD_SELECT]: DynamicSelectComponent,\n [DYNAMIC_FORM_FIELD_SLIDE_TOGGLE]: DynamicSlideToggleComponent,\n [DYNAMIC_FORM_FIELD_STATIC_TEXT]: DynamicStaticTextComponent,\n [DYNAMIC_FORM_FIELD_TEXTAREA]: DynamicTextareaComponent\n};\n","import { Injector } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { DynamicFormValidationsService } from '../../services/dynamic-validations.service';\nimport { DynamicFormFieldModel } from '../classes/dynamic-form-field-model';\nimport { DynamicFormValidators } from '../classes/dynamic-form-validators';\nimport { RelationActionType } from '../types/dynamic-form-field-relation.type';\nimport { DynamicFormValidator } from '../types/dynamic-form-validator.type';\n\nexport interface DynamicRelationAction {\n type: RelationActionType;\n reversedType?: string;\n change(hasMatch: boolean, model: DynamicFormFieldModel, control: FormControl, injector: Injector): void;\n}\n\n/**\n * Relation action to disable/enable a form control.\n */\nconst DISABLE_ACTION: DynamicRelationAction = {\n type: RelationActionType.DISABLED,\n reversedType: RelationActionType.ENABLED,\n change(hasMatch, model) {\n model.disabled = hasMatch;\n }\n};\n\n/**\n * Relation action to toggle the visibility of a form control\n */\nconst HIDDEN_ACTION: DynamicRelationAction = {\n type: RelationActionType.HIDDEN,\n reversedType: RelationActionType.VISIBLE,\n change(hasMatch, model) {\n model.hidden = hasMatch;\n }\n};\n\n/**\n * Relation action to add or remove the required validator to a form control\n */\nconst REQUIRED_ACTION: DynamicRelationAction = {\n type: RelationActionType.REQUIRED,\n reversedType: RelationActionType.OPTIONAL,\n change(hasMatch, model, control, injector) {\n const hasRequiredValidation = !!model.validators.find((f) => f.name === 'required');\n let validators: DynamicFormValidator[];\n\n if (hasMatch) {\n // If the model already contains the required validator, return the model validators.\n // Otherwise, add the required validator\n validators = hasRequiredValidation ? model.validators : [...model.validators, DynamicFormValidators.required()];\n } else {\n validators = model.validators.filter((f) => f.name !== 'required');\n }\n\n injector.get(DynamicFormValidationsService).updateValidators(validators, control);\n }\n};\n\n/**\n * Export all Relation actions so the DynamicFormService can easily access all Relation actions.\n * This way if there are any new actions, all you have to do is add them here.\n * TODO: This can be potentially be expanded towords an InjectionToken to provide the possibility for custom relationactions.\n */\nexport const RELATION_ACTIONS: DynamicRelationAction[] = [DISABLE_ACTION, HIDDEN_ACTION, REQUIRED_ACTION];\n","import { inject, Injectable, Injector } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { distinctUntilChanged, startWith, Subscription } from 'rxjs';\nimport { DynamicFormFieldModel } from '../models/classes/dynamic-form-field-model';\nimport { DynamicRelationAction, RELATION_ACTIONS } from '../models/constants/dynamic-relations.const';\nimport { DynamicFormFieldRelation, RelationCondition, RelationOperator } from '../models/types/dynamic-form-field-relation.type';\nimport { RelatedFormControls } from '../models/types/related-form-controls.type';\n\n/** @ignore */\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormRelationsService {\n private _injector = inject(Injector);\n\n /**\n * Get an object with all FormField the provided model has a relation with\n * @param model\n * @param group\n * @returns\n */\n public findRelatedFormField(model: DynamicFormFieldModel, group: FormGroup): RelatedFormControls {\n const conditionReducer = (controls: RelatedFormControls, condition: RelationCondition) => {\n const fieldName = condition.path ?? condition.fieldName!;\n // Get the control using the provided path or fieldName\n const control = condition.path ? (group.root.get(condition.path) as FormControl) : (group.get(condition.fieldName!) as FormControl);\n\n if (!control) {\n console.warn(`No related form control with the name ${fieldName} found`);\n return controls;\n }\n\n controls[fieldName] = control;\n return controls;\n };\n\n const relationsReducer = (controls: RelatedFormControls, relation: DynamicFormFieldRelation) => {\n return relation.conditions.reduce(conditionReducer, controls);\n };\n\n return model.relations!.reduce(relationsReducer, {});\n }\n\n public getRelationSubscriptions(\n relatedFormControls: RelatedFormControls,\n model: DynamicFormFieldModel,\n control: FormControl\n ): Subscription[] {\n const subs: Subscription[] = [];\n\n // Subscribe to value changes of all FormControls, provide the current value inside the startWith\n Object.values(relatedFormControls).forEach((relatedControl) => {\n subs.push(\n relatedControl.valueChanges.pipe(startWith(relatedControl.value), distinctUntilChanged()).subscribe(() => {\n model.relations!.forEach((relation) => {\n // Find the RelationAction object based on the actionType passed inside the DynamicFormConfig\n const action = RELATION_ACTIONS.find(\n (action) => relation.actionType === action.type || relation.actionType === action.reversedType\n );\n\n if (action) {\n const shouldTrigger = this.checkRelationCondition(relation, relatedFormControls, action);\n\n action.change(shouldTrigger, model, control, this._injector);\n }\n });\n })\n );\n });\n\n return subs;\n }\n\n /**\n * Check the conditions inside the relations\n * @param relation\n * @param relatedControl\n * @param action\n * @returns\n */\n private checkRelationCondition(\n relation: DynamicFormFieldRelation,\n relatedControls: RelatedFormControls,\n action: DynamicRelationAction\n ): boolean {\n // Default operator is AND, meaning all conditions should return true before the provided action is triggered.\n // In the case of a reversed type, the return value whould be false.\n const operator = relation.operator ?? RelationOperator.AND;\n\n // Use a reducer to map all conditions to a single boolean value to decide if we want to trigger the provided action type\n const reducer = (isMatch: boolean, condition: RelationCondition, index: number): boolean => {\n // Find the FormControl of the related field\n let relatedControl: FormControl | undefined;\n\n for (const [fieldName, control] of Object.entries(relatedControls)) {\n if (fieldName === (condition.path ?? condition.fieldName)) {\n relatedControl = control;\n break;\n }\n }\n\n if (!relatedControl) return false;\n\n // Using the 'normal' type should return true when the condition matches\n if (relation.actionType === action.type) {\n // Shortcut to false when a previous condition check was resolved as false in case of the AND operator\n if (index > 0 && operator === RelationOperator.AND && !isMatch) return false;\n\n // Shortcut to true when a previous condition check was resolved as true in case of the OR operator\n if (index > 0 && operator === RelationOperator.OR && isMatch) return true;\n\n return condition.value(relatedControl.value);\n }\n\n // Using the reversed type should return false when the condition matches, because we want to the opposite of the configured change Function\n if (relation.actionType === action.reversedType) {\n // Shortcut to true when a previous condition check was resolved as true\n if (index > 0 && operator === RelationOperator.AND && isMatch) return true;\n\n // Shortcut to false when a previous condition check was resolved as false\n if (index > 0 && operator === RelationOperator.OR && !isMatch) return false;\n\n return !condition.value(relatedControl.value);\n }\n\n return false;\n };\n\n return relation.conditions.reduce(reducer, false);\n }\n}\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n input,\n OnDestroy,\n OnInit,\n Type,\n viewChild,\n ViewContainerRef\n} from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { DynamicFormField } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldModel } from '../../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\nimport { DYNAMIC_FORM_FIELD_MAP } from '../../models/constants/dynamic-form-field-map.const';\nimport { DynamicFormRelationsService } from '../../services/dynamic-form-relations.service';\nimport { DynamicFormService } from '../../services/dynamic-form.service';\n\n/** @ignore */\n@Component({\n imports: [NgClass, ReactiveFormsModule],\n selector: 'dynamic-form-field',\n templateUrl: 'dynamic-form-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DynamicFormFieldComponent implements OnInit, OnDestroy {\n private componentViewContainer = viewChild.required('componentViewContainer', { read: ViewContainerRef });\n\n public model = input.required<DynamicFormFieldModel>();\n public group = input.required<FormGroup>();\n\n private readonly dynamicFormService = inject(DynamicFormService);\n private readonly relationService = inject(DynamicFormRelationsService);\n private readonly cdRef = inject(ChangeDetectorRef);\n\n private _control!: FormControl;\n private _subs = new Subscription();\n\n /**\n * Get the instance of a control component using the injected custom method or local method\n */\n private get componentType(): Type<DynamicFormField<any>> | null {\n return this.dynamicFormService.getCustomControlComponentType(this.model()) || this.getControlComponentType();\n }\n\n ngOnInit(): void {\n if (this.group()) {\n this._control = this.group().get(this.model().name) as FormControl;\n\n this.createFormControlComponent();\n this.setSubscriptions();\n }\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Finds the instance of a control component by type\n * @returns\n */\n private getControlComponentType(): Type<DynamicFormField<any>> | null {\n const field = DYNAMIC_FORM_FIELD_MAP[this.model().type];\n\n if (!field) {\n console.warn(\n `Model of type 'dynamic-${this.model().type}' is not implemented yet. Add this type to dynamic-form-field.component.ts to add support`\n );\n return null;\n }\n\n return field;\n }\n\n private createFormControlComponent(): void {\n const component = this.componentType;\n\n if (component != null) {\n let componentRef = this.componentViewContainer().createComponent(component);\n\n componentRef.setInput('group', this.group());\n componentRef.setInput('model', this.model());\n }\n }\n\n /**\n * Setup all necessary subscriptions of the FormControl\n */\n private setSubscriptions(): void {\n const model = this.model() as DynamicFormFieldModel;\n\n // Subscribe to the value change inside the control to change the value inside the model as well\n this._subs.add(this._control.valueChanges.subscribe((value) => this.onValueChange(value)));\n\n // Subscribe to the disabled change inside the model to change the disabled state of the FormControl\n this._subs.add(model.disabledChange.subscribe((disabled) => this.onDisabledChange(disabled)));\n\n // Setup subscriptions for any possible relation\n if (this.model().relations?.length) {\n this.setUpRelations();\n }\n }\n\n /**\n * Set up all relations of the current model\n */\n private setUpRelations(): void {\n // Array of all FormControls the current model has a relation to\n const relatedFormControls = this.relationService.findRelatedFormField(this.model(), this.group());\n\n const subs = this.relationService.getRelationSubscriptions(relatedFormControls, this.model(), this._control);\n\n // Add all relations as subscription to the main Subscription object\n subs.forEach((sub) => this._subs.add(sub));\n }\n\n /**\n * Fired when the value changes of the control and updates the value inside the model\n * @param value\n */\n private onValueChange(value: unknown): void {\n if (this.model() instanceof DynamicFormFieldValueModel && (this.model() as DynamicFormFieldValueModel).value !== value) {\n (this.model() as DynamicFormFieldValueModel).value = value;\n }\n }\n\n /**\n * Enables/disabled the control based on the provided parameter.\n * Is fired when disabled state is changed inside the model and should not be directly used outside this component.\n * @param disabled\n */\n private onDisabledChange(disabled: boolean): void {\n disabled ? this._control.disable() : this._control.enable();\n\n this.cdRef.markForCheck();\n }\n}\n","<div\n [formGroup]=\"group()\"\n [ngClass]=\"['dynamic-form-field-container', 'dynamic-form-field-' + model().type]\">\n <ng-container #componentViewContainer></ng-container>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { DynamicFormConfig } from '../../models/types/dynamic-form-config.type';\nimport { DynamicFormService } from '../../services/dynamic-form.service';\nimport { DynamicFormFieldComponent } from '../dynamic-form-field/dynamic-form-field.component';\n\n@Component({\n imports: [DynamicFormFieldComponent, ReactiveFormsModule],\n selector: 'dynamic-form',\n templateUrl: 'dynamic-form.component.html',\n styleUrls: ['./dynamic-form.component.scss'],\n providers: [DynamicFormService],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DynamicFormComponent {\n public group = input.required<FormGroup>();\n public formConfig = input.required<DynamicFormConfig>();\n public layout = input<string[]>([]);\n\n public layoutRows = computed(() => {\n if (!this.layout()?.length) return null;\n\n return this.layout().map((row) =>\n row\n .trim()\n .split(/\\s+/)\n .map((name) => this.formConfig().find((f) => f.name === name))\n .filter((f) => !!f)\n );\n });\n\n /**\n * Get the current value of the form.\n * @param includeDisabledFields Include the disabled fields of the form, is enabled by default\n */\n public getFormValue<T = unknown>(includeDisabledFields = true): T {\n const formValue = includeDisabledFields ? this.group().getRawValue() : this.group().value;\n\n return formValue;\n }\n\n /**\n * Provides an Observable to listen to changes of a specific field in the form.\n *\n * @param name Name of the field\n * @returns Observable<unknown>\n */\n public onControlChange(name: string): Observable<unknown> {\n const field = this.group().get(name);\n\n if (!field) {\n throw new Error(`Cannot find a field with the name ${name} in the FormGroup`);\n }\n\n return field.valueChanges;\n }\n}\n","@if (layoutRows(); as rows) {\n @for (row of rows; track $index) {\n <div class=\"dynamic-form-row\">\n @for (field of row; track field.id) {\n <dynamic-form-field\n class=\"dynamic-form-field\"\n [style.flex-basis]=\"'var(--field-' + field.name + '-width, auto)'\"\n [style.max-width]=\"'var(--field-' + field.name + '-width, 100%)'\"\n [id]=\"field.id\"\n [hidden]=\"field.hidden\"\n [class]=\"field.type\"\n [group]=\"group()\"\n [model]=\"field\">\n </dynamic-form-field>\n }\n </div>\n }\n} @else {\n @for (field of formConfig(); track $index) {\n <div class=\"dynamic-form-row\">\n <dynamic-form-field\n class=\"dynamic-form-field\"\n [style.flex-basis]=\"'var(--field-' + field.name + '-width, auto)'\"\n [style.max-width]=\"'var(--field-' + field.name + '-width, 100%)'\"\n [id]=\"field.id\"\n [hidden]=\"field.hidden\"\n [class]=\"field.type\"\n [group]=\"group()\"\n [model]=\"field\">\n </dynamic-form-field>\n </div>\n }\n}\n","import { map, Observable } from 'rxjs';\nimport { DynamicFormFieldOption } from '../models/classes/dynamic-form-field-option-model';\n\n/**\n * Transform any list to a list of DynamicFormFieldOption which is used in any Dynamic Form Field with options (e.g. DynamicSelect).\n * Possible to provide the method with type definitions to define the provided list type `<T>` and desired option value type `<K>`:\n *\n * `dynamicFormService.toDynamicOptionList<T, K>(...)`\n *\n * Generic types:\n * - T = The type of the items in the provided list\n * - K = The type of the value inside an DynamicFormFieldOption. Default is 'string'\n * @param arr An array of items of type T\n * @param labelFn Callback to define the label of the options in the template\n * @param valueFn Callback to define the value of the options. Must return a value of type K (default string)\n * @returns\n */\nexport function arrToDynamicFormOptions<T, K = string>(\n arr: T[],\n labelFn: (item: T) => string,\n valueFn: (item: T) => K\n): DynamicFormFieldOption<K>[] {\n return arr.map((item) => {\n return {\n label: labelFn(item),\n value: valueFn(item)\n };\n });\n}\n\n/**\n * Transform any Observable of a list to a list of DynamicFormFieldOption which is used in any Dynamic Form Field with options (e.g. DynamicSelect).\n * Possible to provide the method with type definitions to define the provided list type `<T>` and desired option value type `<K>`:\n *\n * `dynamicFormService.toDynamicOptionList<T, K>(...)`\n *\n * Generic types:\n * - T = The type of the items in the provided list\n * - K = The type of the value inside an DynamicFormFieldOption. Default is 'string'\n * @param obs An Observable of a list of items of type T\n * @param labelFn Callback to define the label of the options in the template\n * @param valueFn Callback to define the value of the options. Must return a value of type K (default string)\n * @returns\n */\nexport function obsToDynamicFormOptions<T, K = string>(\n obs: Observable<T[]>,\n labelFn: (item: T) => string,\n valueFn: (item: T) => K\n): Observable<DynamicFormFieldOption<K>[]> {\n return obs.pipe(map((arr) => arrToDynamicFormOptions(arr, labelFn, valueFn)));\n}\n","/*\n * Public API Surface of ngx-dynamic-form\n */\nexport * from './lib/components/dynamic-form/dynamic-form.component';\n\nexport * from './lib/controls/controls';\nexport * from './lib/models';\n\nexport * from './lib/services/dynamic-form.service';\n\nexport * from './lib/utils/helpers';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DYNAMIC_FORM_FIELD_MAP","i2.DynamicFormValidationsService","i2","i1","i4","i3"],"mappings":"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"}
1
+ {"version":3,"file":"olafvv-ngx-dynamic-form.mjs","sources":["../../../projects/ngx-dynamic-form/src/lib/models/tokens/dynamic-form-field-map.token.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-validations.service.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-form.service.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-value-model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-base.ts","../../../projects/ngx-dynamic-form/src/lib/controls/autocomplete/dynamic-autocomplete.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/autocomplete/dynamic-autocomplete.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.component.html","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-option-model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/autocomplete/dynamic-autocomplete.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/slide-toggle/dynamic-slide-toggle.model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-validators.ts","../../../projects/ngx-dynamic-form/src/lib/models/types/dynamic-form-field-relation.type.ts","../../../projects/ngx-dynamic-form/src/lib/controls/static-text/dynamic-static-text.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/slide-toggle/dynamic-slide-toggle.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/slide-toggle/dynamic-slide-toggle.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/static-text/dynamic-static-text.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/static-text/dynamic-static-text.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.component.html","../../../projects/ngx-dynamic-form/src/lib/models/constants/dynamic-form-field-map.const.ts","../../../projects/ngx-dynamic-form/src/lib/models/constants/dynamic-relations.const.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-form-relations.service.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form-field/dynamic-form-field.component.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form-field/dynamic-form-field.component.html","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form/dynamic-form.component.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form/dynamic-form.component.html","../../../projects/ngx-dynamic-form/src/lib/utils/helpers.ts","../../../projects/ngx-dynamic-form/src/public-api.ts","../../../projects/ngx-dynamic-form/src/olafvv-ngx-dynamic-form.ts"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core';\nimport { DynamicFormField } from '../classes/dynamic-form-field-base';\n\nexport const DYNAMIC_FORM_FIELD_MAP = new InjectionToken<Record<string, Type<DynamicFormField<any>>>>('DYNAMIC_FORM_FIELD_MAP');\n","import { Injectable } from '@angular/core';\nimport { FormControl, ValidatorFn } from '@angular/forms';\nimport { DynamicFormValidator } from '../models/types/dynamic-form-validator.type';\n\n/** @ignore */\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormValidationsService {\n /**\n * Get all Validator Functions from the validator configuration\n * @param validatorConfig\n * @returns\n */\n public getValidatorFns(validatorConfig: DynamicFormValidator[]): ValidatorFn[] {\n return validatorConfig.map((v) => v.validator);\n }\n\n /**\n * Update the validators on a FormControl based on the provided validator configuration.\n * This will replace any existing validators on the control or removes all validators when none provided\n * @param validatorConfig\n * @param control\n */\n public updateValidators(validatorConfig: DynamicFormValidator[], control: FormControl): void {\n if (!validatorConfig || validatorConfig.length === 0) {\n control.clearValidators();\n } else {\n const validatorFns: ValidatorFn[] = this.getValidatorFns(validatorConfig);\n control.setValidators(validatorFns);\n }\n\n control.updateValueAndValidity();\n }\n}\n","import { Inject, Injectable, Optional, Type } from '@angular/core';\nimport { FormBuilder, FormControl, FormControlOptions, FormGroup } from '@angular/forms';\nimport { DynamicFormField } from '../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldModel } from '../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldValueConfig } from '../models/classes/dynamic-form-field-value-model';\nimport { DYNAMIC_FORM_FIELD_MAP } from '../models/tokens/dynamic-form-field-map.token';\nimport { DynamicFormConfig } from '../models/types/dynamic-form-config.type';\nimport { DynamicFormValidationsService } from './dynamic-validations.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormService {\n constructor(\n @Inject(DYNAMIC_FORM_FIELD_MAP) @Optional() private customMap: Record<string, Type<DynamicFormField>>,\n private fb: FormBuilder,\n private validatorsService: DynamicFormValidationsService\n ) {}\n\n /**\n * Check if there is a mapping provided to use custom form controls\n * @param model\n * @returns\n */\n public getCustomControlComponentType(model: DynamicFormFieldModel): Type<DynamicFormField<any>> | null {\n return this.customMap && this.customMap[model.type] ? this.customMap[model.type] : null;\n }\n\n /**\n * Create a FormGroup from the provided form configuration.\n * Returns a FormGroup.\n * @param {DynamicFormConfig} config Configuration object of a form\n * @returns {FormGroup}\n */\n public createFormGroup(config: DynamicFormConfig): FormGroup {\n const group: FormGroup = this.fb.group({});\n\n config.forEach((controlConfig) => {\n const controlOptions: FormControlOptions = {\n updateOn: controlConfig.updateOn,\n validators: this.validatorsService.getValidatorFns(controlConfig.validators)\n };\n\n const controlValueConfig = controlConfig as DynamicFormFieldValueConfig<unknown>;\n const control = new FormControl(\n { value: controlValueConfig.value ?? controlValueConfig.defaultValue, disabled: controlValueConfig.disabled },\n controlOptions\n );\n\n group.addControl(controlConfig.name, control);\n });\n\n return group;\n }\n}\n","import { signal, WritableSignal } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { DynamicFormFieldConfig } from '../types/dynamic-form-field-config.type';\nimport { DynamicFormFieldRelation } from '../types/dynamic-form-field-relation.type';\nimport { DynamicFormValidator } from '../types/dynamic-form-validator.type';\n\n/**\n * Base class for all DynamicFormFields\n */\nexport abstract class DynamicFormFieldModel {\n public id: string;\n public width: number;\n public label: string | null;\n public name: string;\n public hint: string | null;\n public validators: DynamicFormValidator[];\n public updateOn: 'submit' | 'blur' | 'change';\n public relations: DynamicFormFieldRelation[] | null;\n public disabledChange: Observable<boolean>;\n\n abstract readonly type: string;\n\n private readonly disabled$: BehaviorSubject<boolean>;\n private readonly $hidden: WritableSignal<boolean>;\n\n constructor(config: DynamicFormFieldConfig) {\n this.id = config.id ?? config.name;\n this.width = config.width ?? 100;\n this.label = config.label ?? null;\n this.name = config.name;\n this.hint = config.hint ?? null;\n this.validators = config.validators ?? [];\n this.updateOn = config.updateOn ?? 'change';\n this.relations = config.relations ?? null;\n\n // Create a disabled Subject and Observable to change the state of the FormControl inside DynamicFormFieldComponent by subscribing to disabledChange\n this.disabled$ = new BehaviorSubject(config.disabled ?? false);\n this.disabledChange = this.disabled$.asObservable();\n\n this.$hidden = signal(config.hidden ?? false);\n }\n\n get disabled(): boolean {\n return this.disabled$.getValue();\n }\n set disabled(disable: boolean) {\n this.disabled$.next(disable);\n }\n\n get hidden(): boolean {\n return this.$hidden();\n }\n set hidden(hidden: boolean) {\n this.$hidden.set(hidden);\n }\n}\n","import { BehaviorSubject } from 'rxjs';\nimport { DynamicFormFieldConfig } from '../types/dynamic-form-field-config.type';\nimport { DynamicFormFieldModel } from './dynamic-form-field-model';\n\nexport interface DynamicFormFieldValueConfig<T> extends DynamicFormFieldConfig {\n /**\n * The value of the control.\n * This value will change when the control is used.\n * @optional\n */\n value?: T;\n /**\n * The default value of the control when initializing or resetting the control.\n * @optional\n */\n defaultValue?: T;\n /**\n * A function that gets called everytime the value of the control changes.\n * Passes the value of the control as parameter.\n * If you don't want to get an event on every keystroke without delay, use the ReactiveFormsModule `valueChanges` Observable\n * @optional\n */\n valueChanged?: (val: T | null) => any;\n}\n\n/**\n * Base class for a DynamicFormField with a value\n */\nexport abstract class DynamicFormFieldValueModel<T = unknown> extends DynamicFormFieldModel {\n public defaultValue: T | null;\n\n private _value$: BehaviorSubject<T | null>;\n private _valueChanged: ((val: T | null) => any) | undefined;\n\n constructor(config: DynamicFormFieldValueConfig<T>) {\n super(config);\n\n this.defaultValue = config.defaultValue ?? null;\n\n const val: T | null = config.value ?? null;\n this._value$ = new BehaviorSubject(val);\n this._valueChanged = config.valueChanged;\n }\n\n get value(): T | null {\n return this._value$.getValue();\n }\n set value(val: T | null) {\n this._value$.next(val);\n if (this._valueChanged) {\n this._valueChanged(val);\n }\n }\n}\n","import { InputSignal } from '@angular/core';\nimport { AbstractControl, FormGroup } from '@angular/forms';\nimport { DynamicFormFieldModel } from './dynamic-form-field-model';\n\nexport interface DynamicFormField<M extends DynamicFormFieldModel = DynamicFormFieldModel> {\n group: InputSignal<FormGroup>;\n model: InputSignal<M>;\n}\n\n/**\n * Base class for the DynamicFormField component classes\n */\nexport abstract class DynamicFormFieldBase<M extends DynamicFormFieldModel = DynamicFormFieldModel> implements DynamicFormField<M> {\n abstract group: InputSignal<FormGroup>;\n abstract model: InputSignal<M>;\n\n get id(): string {\n return this.model().id ?? this.model().name;\n }\n\n get control(): AbstractControl {\n const ctrl = this.group().get(this.model().name);\n\n if (!ctrl) {\n throw new Error(`Provided FormGroup does not contain a control with the name ${this.model().name}`);\n }\n return ctrl;\n }\n\n get isValid(): boolean {\n return this.control.valid;\n }\n\n get isInvalid(): boolean {\n return this.control.invalid;\n }\n\n public resetControl() {\n this.group().get(this.model().name)?.reset();\n }\n\n public hasError(name: string): boolean {\n return this.control.hasError(name);\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input, OnInit, signal } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { debounceTime, distinctUntilChanged, map, merge, Observable, startWith, Subject, switchMap, tap } from 'rxjs';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldOption } from '../../models/classes/dynamic-form-field-option-model';\nimport { DynamicAutocomplete } from './dynamic-autocomplete.model';\n\n@Component({\n imports: [\n MatFormFieldModule,\n MatInputModule,\n MatAutocompleteModule,\n MatOptionModule,\n MatProgressSpinnerModule,\n ReactiveFormsModule,\n AsyncPipe\n ],\n selector: 'dynamic-autocomplete',\n templateUrl: './dynamic-autocomplete.component.html',\n styleUrls: ['./dynamic-autocomplete.component.scss']\n})\nexport class DynamicAutocompleteComponent extends DynamicFormFieldBase<DynamicAutocomplete> implements OnInit {\n public model = input.required<DynamicAutocomplete>();\n public group = input.required<FormGroup>();\n\n public filteredOptions$!: Observable<DynamicFormFieldOption<unknown>[]>;\n public isLoading = signal(false);\n\n private focus$ = new Subject<void>();\n\n ngOnInit(): void {\n this.filteredOptions$ = merge(this.control.valueChanges, this.focus$.pipe(map(() => this.control.value))).pipe(\n startWith(this.control.value ?? ''),\n debounceTime(this.model().debounceTime),\n distinctUntilChanged(),\n tap(() => {\n if (this.model().searchFn) this.isLoading.set(true);\n }),\n switchMap((value) => this.getOptions(value)),\n tap(() => this.isLoading.set(false))\n );\n }\n\n public onFocus(): void {\n this.focus$.next();\n }\n\n private getOptions(value: unknown): Observable<DynamicFormFieldOption<unknown>[]> {\n const searchString = typeof value === 'string' ? value.toLowerCase() : '';\n\n if (this.model().searchFn) {\n return this.model().searchFn!(searchString);\n }\n\n return this.model().options$.pipe(\n map((options) => {\n if (this.model().filterFn) {\n return options.filter((opt) => this.model().filterFn!(searchString, opt));\n }\n return options.filter((opt) => opt.label.toLowerCase().includes(searchString));\n })\n );\n }\n\n /**\n * Used by mat-autocomplete to display the label of the selected option instead of the value.\n */\n public displayFn = (value: any): string => {\n if (!value) return '';\n\n if (this.model().displayFn) {\n return this.model().displayFn!(value);\n }\n\n return value;\n };\n}\n","<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <input\n type=\"text\"\n matInput\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [matAutocomplete]=\"auto\"\n (focus)=\"onFocus()\" />\n\n <mat-autocomplete\n #auto=\"matAutocomplete\"\n [displayWith]=\"displayFn\">\n @for (option of filteredOptions$ | async; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-autocomplete>\n\n @if (isLoading()) {\n <div\n matSuffix\n class=\"loader-icon\">\n <mat-spinner\n diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicButtonToggles } from './dynamic-button-toggles.model';\n\n@Component({\n imports: [MatButtonToggleModule, ReactiveFormsModule, AsyncPipe, MatFormFieldModule],\n selector: 'dynamic-button-toggles',\n templateUrl: './dynamic-button-toggles.component.html',\n styleUrls: ['./dynamic-button-toggles.component.scss']\n})\nexport class DynamicButtonTogglesComponent extends DynamicFormFieldBase<DynamicButtonToggles> {\n public model = input.required<DynamicButtonToggles>();\n public group = input.required<FormGroup>();\n}\n","<div\n class=\"dynamic-button-toggles-wrapper\"\n [formGroup]=\"group()\">\n <mat-button-toggle-group\n [id]=\"id\"\n [formControlName]=\"model().name\"\n [multiple]=\"model().multiple\"\n [vertical]=\"model().vertical\">\n @for (option of model().options$ | async; track option.value) {\n <mat-button-toggle [value]=\"option.value\">{{ option.label }}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n</div>\n","import { Component, input } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicButton } from './dynamic-button.model';\n\n@Component({\n imports: [MatButtonModule],\n selector: 'dynamic-button',\n templateUrl: './dynamic-button.component.html',\n styleUrl: './dynamic-button.component.scss'\n})\nexport class DynamicButtonComponent extends DynamicFormFieldBase<DynamicButton> {\n public model = input.required<DynamicButton>();\n public group = input.required<FormGroup>();\n\n public onClick() {\n this.model().clicked();\n }\n}\n","<div class=\"dynamic-button-wrapper\">\n <button\n [matButton]=\"model().variant\"\n [id]=\"id\"\n [disabled]=\"model().disabled\"\n (click)=\"onClick()\">\n <span>{{ model().label }}</span>\n </button>\n</div>\n","import { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicCheckbox } from './dynamic-checkbox.model';\n\n@Component({\n selector: 'dynamic-checkbox',\n templateUrl: 'dynamic-checkbox.component.html',\n imports: [ReactiveFormsModule, MatCheckboxModule]\n})\nexport class DynamicCheckboxComponent extends DynamicFormFieldBase<DynamicCheckbox> {\n public model = input.required<DynamicCheckbox>();\n public group = input.required<FormGroup>();\n}\n","<ng-container [formGroup]=\"group()\">\n <mat-checkbox\n [checked]=\"model().checked\"\n [formControlName]=\"model().name\"\n [indeterminate]=\"model().indeterminate\"\n [labelPosition]=\"model().labelPosition\"\n [name]=\"model().name\"\n [id]=\"id\">\n <span class=\"checkbox-label\">{{ model().label }}</span>\n </mat-checkbox>\n</ng-container>\n","import { isObservable, map, Observable, of } from 'rxjs';\nimport { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from './dynamic-form-field-value-model';\n\nexport type DynamicOptionList<T> = DynamicFormFieldOption<T>[] | Observable<DynamicFormFieldOption<T>[]>;\n\nexport type DynamicGroupedOptionList<T> = DynamicFormFieldOptionGroup<T>[] | Observable<DynamicFormFieldOptionGroup<T>[]>;\n\n/**\n * Interface for the objects inside a list of options of Dynamic FormField\n */\nexport interface DynamicFormFieldOption<T> {\n /** The text shown as label */\n label: string;\n /** Extra line of text shown as subtitle */\n subTitle?: string;\n /** The value the option holds */\n value: T;\n}\n\n/**\n * Interface for a group op options inside a Dynamic FormField (optgroup)\n */\nexport interface DynamicFormFieldOptionGroup<T> {\n name: string;\n options: DynamicFormFieldOption<T>[];\n}\n\n/**\n * Base interface for any DynamicFormFieldConfig with options (e.g. DynamicSelectConfig or DynamicAutocompleteConfig).\n */\nexport interface DynamicFormFieldOptionConfig<T> extends DynamicFormFieldValueConfig<T> {\n options?: DynamicOptionList<T>;\n groupedOptions?: DynamicGroupedOptionList<T>;\n}\n\n/**\n * Base class for any DynamicFormField with options (e.g. DynamicSelect or DynamicAutocomplete)\n */\nexport abstract class DynamicFormFieldOptionModel<T> extends DynamicFormFieldValueModel<T> {\n public options$!: Observable<DynamicFormFieldOption<T>[]>;\n public groupedOptions$!: Observable<DynamicFormFieldOptionGroup<T>[]>;\n\n private _options: DynamicFormFieldOption<T>[] = [];\n private _groupedOptions: DynamicFormFieldOptionGroup<T>[] = [];\n\n constructor(config: DynamicFormFieldOptionConfig<T>) {\n super(config);\n\n if (!config.options && !config.groupedOptions) {\n console.error(`No options or groupedOptions provided for ${this.name}`);\n }\n\n if (config.options) {\n this.options$ = this.setOptions(config.options);\n } else if (config.groupedOptions) {\n this.groupedOptions$ = this.setGroupedOptions(config.groupedOptions);\n }\n }\n\n private setOptions(options: DynamicOptionList<T>): Observable<DynamicFormFieldOption<T>[]> {\n if (Array.isArray(options)) {\n this._options = options;\n return of(this._options);\n }\n\n if (isObservable(options)) {\n return options.pipe(\n map((o) => {\n this._options = o;\n return this._options;\n })\n );\n }\n\n return of([]);\n }\n\n private setGroupedOptions(groupedOptions: DynamicGroupedOptionList<T>): Observable<DynamicFormFieldOptionGroup<T>[]> {\n if (Array.isArray(groupedOptions)) {\n this._groupedOptions = groupedOptions;\n return of(this._groupedOptions);\n }\n\n if (isObservable(groupedOptions)) {\n return groupedOptions.pipe(\n map((o) => {\n this._groupedOptions = o;\n return this._groupedOptions;\n })\n );\n }\n\n return of([]);\n }\n}\n","import { Observable } from 'rxjs';\nimport {\n DynamicFormFieldOption,\n DynamicFormFieldOptionConfig,\n DynamicFormFieldOptionModel\n} from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_AUTOCOMPLETE = 'autocomplete';\n\nexport type DynamicAutocompleteConfig<T = string> = DynamicFormFieldOptionConfig<T> & {\n /**\n * Optional search function for asynchronous searching.\n * If provided, the internal search logic will use this instead of filtering the static options.\n */\n searchFn?: (term: string) => Observable<DynamicFormFieldOption<T>[]>;\n /**\n * Optional filter function for custom local filtering of pre-fetched options.\n * Only used if searchFn is not provided.\n */\n filterFn?: (term: string, option: DynamicFormFieldOption<T>) => boolean;\n /**\n * Debounce time in milliseconds for the search function (default: 300ms).\n */\n debounceTime?: number;\n placeholder?: string;\n /**\n * Optional function to format the selected value for display in the input field.\n */\n displayFn?: (value: T) => string;\n};\n\nexport class DynamicAutocomplete<T = string> extends DynamicFormFieldOptionModel<T> {\n public searchFn?: (term: string) => Observable<DynamicFormFieldOption<T>[]>;\n public filterFn?: (term: string, option: DynamicFormFieldOption<T>) => boolean;\n public displayFn?: (value: T) => string;\n public debounceTime: number;\n public placeholder: string;\n\n public readonly type = DYNAMIC_FORM_FIELD_AUTOCOMPLETE;\n\n constructor(config: DynamicAutocompleteConfig<T>) {\n super(config);\n\n this.searchFn = config.searchFn;\n this.filterFn = config.filterFn;\n this.displayFn = config.displayFn;\n this.debounceTime = config.debounceTime ?? 300;\n this.placeholder = config.placeholder ?? config.label ?? '';\n }\n}\n","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_BUTTON_TOGGLES = 'button-toggles';\n\nexport type DynamicButtonTogglesConfig = Omit<DynamicFormFieldOptionConfig<string | number | null>, 'label'> & {\n /** Whether to allow multiple options to be selected. Default is false */\n multiple?: boolean;\n /** Whether the toggle group is vertical. Default is false */\n vertical?: boolean;\n};\n\nexport class DynamicButtonToggles extends DynamicFormFieldOptionModel<string | number | null> {\n public multiple: boolean;\n public vertical: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_BUTTON_TOGGLES;\n\n constructor(config: DynamicButtonTogglesConfig) {\n super(config);\n\n this.multiple = config.multiple ?? false;\n this.vertical = config.vertical ?? false;\n }\n}\n","import { MatButtonAppearance } from '@angular/material/button';\nimport { DynamicFormFieldModel } from '../../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldConfig } from '../../models/types/dynamic-form-field-config.type';\n\nexport const DYNAMIC_FORM_FIELD_BUTTON = 'button';\n\ntype OmittedProperties = 'hint' | 'validators' | 'updateOn';\n\n/**\n * @TODO icon support\n */\nexport type DynamicButtonConfig = Omit<DynamicFormFieldConfig, OmittedProperties> & {\n /**\n * Label shown inside the button\n */\n label: string;\n /**\n * Variant of the button\n */\n variant?: MatButtonAppearance;\n /**\n * Function called when the button is clicked.\n * Provides no parameters.\n * @returns\n */\n clicked: () => any;\n};\n\nexport class DynamicButton extends DynamicFormFieldModel {\n public label: string | null;\n public variant: MatButtonAppearance;\n public clicked: () => any;\n\n public readonly type = DYNAMIC_FORM_FIELD_BUTTON;\n\n constructor(config: DynamicButtonConfig) {\n super(config);\n\n this.label = config.label;\n this.variant = config.variant ?? 'text';\n this.clicked = config.clicked;\n }\n}\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_CHECKBOX = 'checkbox';\n\nexport type DynamicCheckboxConfig = DynamicFormFieldValueConfig<boolean> & {\n labelPosition?: 'before' | 'after';\n indeterminate?: boolean;\n};\n\nexport class DynamicCheckbox extends DynamicFormFieldValueModel<boolean> {\n public labelPosition: 'before' | 'after';\n public indeterminate: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_CHECKBOX;\n\n constructor(config: DynamicCheckboxConfig) {\n super(config);\n\n this.value = config.value ?? false;\n\n this.labelPosition = config.labelPosition ?? 'after';\n this.indeterminate = config.indeterminate === true ? true : false;\n }\n\n get checked(): boolean {\n return this.value ?? false;\n }\n\n set checked(checked: boolean) {\n this.value = checked;\n }\n}\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_DATEPICKER = 'datepicker';\n\nexport type DynamicDatepickerControlValue = Date | object | string | null;\n\nexport type DynamicDatepickerConfig = DynamicFormFieldValueConfig<DynamicDatepickerControlValue> & {\n /** Maximum date selectable in the datepicker */\n max?: DynamicDatepickerControlValue;\n /** Minimum date selectable in the datepicker */\n min?: DynamicDatepickerControlValue;\n /** The initial date visible inside the datepicker when opening the picker */\n startAt?: DynamicDatepickerControlValue;\n /** The view the picker is initializing when opening */\n startView?: 'month' | 'year' | 'multi-year';\n};\n\nexport class DynamicDatepicker extends DynamicFormFieldValueModel<DynamicDatepickerControlValue> {\n public max: DynamicDatepickerControlValue | null;\n public min: DynamicDatepickerControlValue | null;\n public startAt: DynamicDatepickerControlValue | null;\n public startView: 'month' | 'year' | 'multi-year';\n\n public readonly type = DYNAMIC_FORM_FIELD_DATEPICKER;\n\n constructor(config: DynamicDatepickerConfig) {\n super(config);\n\n this.max = config.max ?? null;\n this.min = config.min ?? null;\n this.startAt = config.startAt ?? null;\n this.startView = config.startView ?? 'month';\n }\n}\n","import { signal, WritableSignal } from '@angular/core';\nimport { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_INPUT = 'input';\n\nexport type HtmlInputType = 'text' | 'number' | 'tel' | 'email' | 'password' | 'date' | 'time' | 'color';\nexport type DynamicInputValue = string | number | Date | null;\n\nexport type DynamicInputConfig = DynamicFormFieldValueConfig<DynamicInputValue> & {\n inputType?: HtmlInputType;\n placeholder?: string;\n max?: number;\n min?: number;\n maxLength?: number;\n minLength?: number;\n step?: number;\n pattern?: string | RegExp;\n autocomplete?: 'on' | 'off';\n prefix?: string;\n hideClearIcon?: boolean;\n showLoader?: WritableSignal<boolean>;\n};\n\nexport class DynamicInput extends DynamicFormFieldValueModel<DynamicInputValue> {\n public inputType: HtmlInputType;\n public placeholder: string;\n public max: number | null;\n public min: number | null;\n public maxLength: number | null;\n public minLength: number | null;\n public step: number | null;\n public pattern: string | RegExp;\n public autocomplete: 'on' | 'off';\n public prefix: string | null;\n public hideClearIcon: boolean;\n public showLoader: WritableSignal<boolean>;\n\n public readonly type = DYNAMIC_FORM_FIELD_INPUT;\n\n constructor(config: DynamicInputConfig) {\n super(config);\n\n this.inputType = config.inputType ?? 'text';\n this.placeholder = config.placeholder ?? config.label ?? '';\n this.max = config.max ?? null;\n this.min = config.min ?? null;\n this.maxLength = typeof config.maxLength === 'number' ? config.maxLength : null;\n this.minLength = typeof config.minLength === 'number' ? config.minLength : null;\n this.step = config.step ?? null;\n this.pattern = config.pattern ?? '';\n this.autocomplete = config.autocomplete ?? 'off';\n this.prefix = config.prefix ?? null;\n this.hideClearIcon = config.hideClearIcon ?? false;\n this.showLoader = config.showLoader ?? signal(false);\n }\n}\n","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_RADIO_GROUP = 'radio-group';\n\nexport type DynamicRadioGroupConfig = DynamicFormFieldOptionConfig<string | number | null> & {\n /** Placement of the option label. Default is 'before' */\n labelPosition?: 'before' | 'after';\n /** Whether the options are shown inline (horizontally). Default is false */\n inline?: boolean;\n};\n\nexport class DynamicRadioGroup extends DynamicFormFieldOptionModel<string | number | null> {\n public labelPosition: 'before' | 'after';\n public inline: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_RADIO_GROUP;\n\n constructor(config: DynamicRadioGroupConfig) {\n super(config);\n\n this.labelPosition = config.labelPosition ?? 'after';\n this.inline = config.inline ?? false;\n }\n}\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_READONLY = 'readonly';\nexport type DynamicReadonlyValue = string | number | null;\n\nexport type DynamicReadonlyConfig = DynamicFormFieldValueConfig<DynamicReadonlyValue>;\n\nexport class DynamicReadonly extends DynamicFormFieldValueModel<DynamicReadonlyValue> {\n public readonly type = DYNAMIC_FORM_FIELD_READONLY;\n\n constructor(config: DynamicReadonlyConfig) {\n super(config);\n }\n}\n","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_SELECT = 'select';\n\nexport type DynamicSelectConfig<T = string> = DynamicFormFieldOptionConfig<T> & {\n /**\n * Show the native dropdown instead of the Angular Material styled dropdown\n */\n native?: boolean;\n /**\n * Whether it is possible to select multiple options.\n * Default value is false\n */\n multiple?: boolean;\n};\n\nexport class DynamicSelect<T = string> extends DynamicFormFieldOptionModel<T> {\n public native: boolean;\n public multiple: boolean;\n\n public readonly type = DYNAMIC_FORM_FIELD_SELECT;\n\n constructor(config: DynamicSelectConfig<T>) {\n super(config);\n\n this.native = config.native ?? false;\n this.multiple = config.multiple ?? false;\n }\n}\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_SLIDE_TOGGLE = 'slide-toggle';\n\nexport type DynamicSlideToggleConfig = DynamicFormFieldValueConfig<boolean> & {\n /**\n * Whether the label appears before or after the slide toggle.\n * @default 'after'\n */\n labelPosition?: 'before' | 'after';\n};\n\nexport class DynamicSlideToggle extends DynamicFormFieldValueModel<boolean> {\n public labelPosition: 'before' | 'after';\n\n public readonly type: string = DYNAMIC_FORM_FIELD_SLIDE_TOGGLE;\n\n constructor(config: DynamicSlideToggleConfig) {\n super(config);\n\n this.value = config.value ?? false;\n this.labelPosition = config.labelPosition ?? 'after';\n }\n\n get checked(): boolean {\n return this.value ?? false;\n }\n\n set checked(checked: boolean) {\n this.value = checked;\n }\n}\n","import { Validators } from '@angular/forms';\nimport { DynamicFormValidator } from '../types/dynamic-form-validator.type';\n\nexport class DynamicFormValidators {\n /**\n * Default email validator, the value of the control has to be a valid email address\n * @param msg\n */\n static email(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Geen geldig emailadres';\n return { name: 'email', validator: Validators.email, message };\n }\n\n /**\n * Default min validator, the value has to be greater or equal than the the provided number\n * @param min number\n * @param msg\n */\n static min(min: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Minimum is ${min}`;\n return { name: 'min', validator: Validators.min(min), message };\n }\n\n /**\n * Default max validator, the value has to be less or equal than the the provided number\n * @param max number\n * @param msg\n */\n static max(max: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Maximum is ${max}`;\n return { name: 'max', validator: Validators.max(max), message };\n }\n\n /**\n * Default minLength validator, the value has to contain a minimum amount of characters\n * @param min number\n * @param msg\n */\n static minLength(min: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Minimaal ${min} tekens`;\n return { name: 'minLength', validator: Validators.min(min), message };\n }\n\n /**\n * Default maxLength validator, the value has to contain a maximum amount of characters\n * @param max number\n * @param msg\n */\n static maxLength(max: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Maximaal ${max} tekens`;\n return { name: 'maxLength', validator: Validators.max(max), message };\n }\n\n /**\n * Default pattern validator, the value of the control has to match the provided pattern\n * @param pattern: string | RegExp\n * @param msg\n */\n static pattern(pattern: string | RegExp, msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Geen geldige invoer';\n return { name: 'pattern', validator: Validators.pattern(pattern), message };\n }\n\n /**\n * Default required validator, the control must contain a value\n * @param msg\n */\n static required(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Dit veld is verplicht';\n\n return { name: 'required', validator: Validators.required, message };\n }\n\n /**\n * Default requiredTrue validator, the value of the control has to be true\n * @param msg\n */\n static requiredTrue(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Dit veld is verplicht';\n return { name: 'requiredTrue', validator: Validators.requiredTrue, message };\n }\n}\n","export enum RelationActionType {\n DISABLED = 'DISABLED',\n ENABLED = 'ENABLED',\n HIDDEN = 'HIDDEN',\n VISIBLE = 'VISIBLE',\n REQUIRED = 'REQUIRED',\n OPTIONAL = 'OPTIONAL'\n}\n\nexport enum RelationOperator {\n AND = 'AND',\n OR = 'OR'\n}\n\nexport type RelationCondition = {\n /** Name of a field in the same form this field is depended on */\n fieldName?: string;\n /**\n * Path to the related field.\n * This must be used when working with nested FormGroups and you want to relate a field in a different group.\n */\n path?: string;\n /** Method that returns true when the condition is met. The passed parameter is the value of the depended field */\n value: (val: any) => boolean;\n};\n\nexport type DynamicFormFieldRelation = {\n actionType: RelationActionType;\n conditions: RelationCondition[];\n operator?: RelationOperator;\n};\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models';\n\nexport const DYNAMIC_FORM_FIELD_STATIC_TEXT = 'static-text';\n\nexport type DynamicStaticTextValue = {\n title?: string;\n text?: string;\n};\n\nexport type DynamicStaticTextConfig = DynamicFormFieldValueConfig<DynamicStaticTextValue>;\n\nexport class DynamicStaticText extends DynamicFormFieldValueModel<DynamicStaticTextValue> {\n public readonly type = DYNAMIC_FORM_FIELD_STATIC_TEXT;\n\n constructor(config: DynamicStaticTextConfig) {\n super(config);\n }\n}\n","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_TEXTAREA = 'textarea';\nexport type DynamicTextareaValue = string | null;\n\nexport type DynamicTextareaConfig = DynamicFormFieldValueConfig<DynamicTextareaValue> & {\n /**\n * Placeholder text inside the textarea.\n * Only visible when the field is empty and in focus.\n */\n placeholder?: string;\n /**\n * Minimum amount of characters needed in the textarea\n */\n minLength?: number;\n /**\n * Maximum amount of characters it is possible to fill in the textarea\n */\n maxLength?: number;\n /**\n * Enables or disabled the browser natie autocomplete bubble when the control is in focus.\n * Default value is 'off'\n */\n autocomplete?: 'on' | 'off';\n /**\n * Amount of rows the textarea initializes on\n */\n rows?: number;\n /**\n * Whether the textare automatically resizes to fit its content\n */\n resize?: boolean;\n /**\n * Maximum amount of rows the textarea show resize to\n */\n resizeMaxRows?: number;\n};\n\nexport class DynamicTextarea extends DynamicFormFieldValueModel<DynamicTextareaValue> {\n public placeholder: string;\n public minLength: number | null;\n public maxLength: number | null;\n public autocomplete: 'on' | 'off';\n public rows: number;\n public resize: boolean;\n public resizeMaxRows: number | null;\n\n public readonly type = DYNAMIC_FORM_FIELD_TEXTAREA;\n\n constructor(config: DynamicTextareaConfig) {\n super(config);\n\n this.placeholder = config.placeholder ?? '';\n this.minLength = config.minLength ?? 0;\n this.maxLength = config.minLength ?? null;\n this.autocomplete = config.autocomplete ?? 'off';\n this.rows = config.rows ?? 3;\n this.resize = config.resize ?? true;\n this.resizeMaxRows = config.resizeMaxRows ?? null;\n }\n}\n","import { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicDatepicker } from './dynamic-datepicker.model';\n\n@Component({\n imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatDatepickerModule],\n selector: 'dynamic-datepicker',\n templateUrl: './dynamic-datepicker.component.html',\n styleUrl: './dynamic-datepicker.component.scss'\n})\nexport class DynamicDatepickerComponent extends DynamicFormFieldBase<DynamicDatepicker> {\n public model = input.required<DynamicDatepicker>();\n public group = input.required<FormGroup>();\n}\n","<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"model().id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <input\n matInput\n [min]=\"model().min\"\n [max]=\"model().max\"\n [matDatepicker]=\"picker\" />\n\n @if (model().hint) {\n <mat-hint>{{ model().hint }}</mat-hint>\n }\n\n <mat-datepicker-toggle\n matIconSuffix\n [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker\n #picker\n [startAt]=\"model().startAt\"\n [startView]=\"model().startView\"></mat-datepicker>\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n","import { Component, computed, input, viewChild } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicInput } from './dynamic-input.model';\n\n@Component({\n imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule],\n selector: 'dynamic-input',\n templateUrl: './dynamic-input.component.html',\n styleUrl: './dynamic-input.component.scss'\n})\nexport class DynamicInputComponent extends DynamicFormFieldBase<DynamicInput> {\n public input = viewChild.required<MatInput>(MatInput);\n\n public model = input.required<DynamicInput>();\n public group = input.required<FormGroup>();\n\n public typeIsPassword = computed(() => this.model().inputType === 'password');\n public valueCount = computed(() => (this.input()?.value ? this.input().value.length : 0));\n public maxCountText = computed(() => `${this.valueCount()} / ${this.model().maxLength}`);\n public showClear = computed(() => !!this.valueCount() && !this.control.disabled && !this.model().showLoader);\n\n public togglePassword(): void {\n this.input().type = this.input().type === 'password' ? 'text' : 'password';\n }\n}\n","<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n @if (model().prefix) {\n <span matTextPrefix>{{ model().prefix }}</span>\n }\n\n <input\n matInput\n [type]=\"model().inputType\"\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [attr.min]=\"model().min\"\n [attr.max]=\"model().max\"\n [attr.minLength]=\"model().minLength\"\n [attr.maxLength]=\"model().maxLength\"\n [pattern]=\"model().pattern\"\n [autocomplete]=\"model().autocomplete\" />\n\n @if (typeIsPassword()) {\n <button\n matSuffix\n mat-icon-button\n (click)=\"togglePassword()\">\n @if (input().type === 'password') {\n <mat-icon fontIcon=\"visibility\"></mat-icon>\n } @else {\n <mat-icon fontIcon=\"visibility_off\"></mat-icon>\n }\n </button>\n }\n\n @if (showClear()) {\n <button\n matSuffix\n mat-icon-button\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n }\n\n @if (model().showLoader()) {\n <div\n matSuffix\n class=\"loader-icon\">\n <mat-spinner\n diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @if (model().maxLength) {\n <mat-hint align=\"end\">{{ maxCountText() }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicRadioGroup } from './dynamic-radio-group.model';\n\n@Component({\n imports: [ReactiveFormsModule, MatRadioModule, AsyncPipe],\n selector: 'dynamic-radio-group',\n templateUrl: './dynamic-radio-group.component.html',\n styleUrls: ['./dynamic-radio-group.component.scss']\n})\nexport class DynamicRadioGroupComponent extends DynamicFormFieldBase<DynamicRadioGroup> {\n public model = input.required<DynamicRadioGroup>();\n public group = input.required<FormGroup>();\n}\n","<div\n class=\"dynamic-radio-group-wrapper\"\n [formGroup]=\"group()\">\n @if (model().label) {\n <label>{{ model().label }}</label>\n }\n <mat-radio-group\n [formControlName]=\"model().name\"\n class=\"radio-group\"\n [class.inlint]=\"model().inline\">\n @for (option of model().options$ | async; track option.value) {\n <mat-radio-button\n [value]=\"option.value\"\n [labelPosition]=\"model().labelPosition\">\n {{ option.label }}\n </mat-radio-button>\n }\n </mat-radio-group>\n</div>\n","import { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicReadonly } from './dynamic-readonly.model';\n\n@Component({\n imports: [ReactiveFormsModule],\n selector: 'dynamic-readonly',\n templateUrl: './dynamic-readonly.component.html',\n styleUrls: ['./dynamic-readonly.component.scss']\n})\nexport class DynamicReadonlyComponent extends DynamicFormFieldBase<DynamicReadonly> {\n public model = input.required<DynamicReadonly>();\n public group = input.required<FormGroup>();\n}\n","<div\n class=\"dynamic-form-field-readonly\"\n [formGroup]=\"group()\"\n [id]=\"model().id\">\n <div class=\"label\">{{ model().label }}</div>\n <span>{{ model().value }}</span>\n</div>\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicSelect } from './dynamic-select.model';\n\n@Component({\n imports: [MatFormFieldModule, ReactiveFormsModule, MatSelectModule, MatOptionModule, AsyncPipe, MatInputModule],\n selector: 'dynamic-select',\n templateUrl: './dynamic-select.component.html',\n styleUrls: ['./dynamic-select.component.scss']\n})\nexport class DynamicSelectComponent extends DynamicFormFieldBase<DynamicSelect> {\n public model = input.required<DynamicSelect>();\n public group = input.required<FormGroup>();\n}\n","<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"model().id\"\n color=\"primary\">\n <mat-label>{{ model().label }}</mat-label>\n\n <!-- Template for select without grouped options -->\n @if (model().options$ | async; as options) {\n @if (!model().native) {\n <mat-select\n [formControlName]=\"model().name\"\n [multiple]=\"model().multiple\">\n @for (option of options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-select>\n } @else {\n <select matNativeControl>\n @for (option of options; track option.value) {\n <option [value]=\"option.value\">\n {{ option.label }}\n </option>\n }\n </select>\n }\n }\n\n <!-- Template for select with grouped options -->\n @if (model().groupedOptions$ | async; as groupedOptions) {\n @if (!model().native) {\n <mat-select [formControlName]=\"model().name\">\n @for (group of groupedOptions; track group.name) {\n <mat-optgroup [label]=\"group.name\">\n @for (option of group.options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{ option.label }}\n </mat-option>\n }\n </mat-optgroup>\n }\n </mat-select>\n } @else {\n <select matNativeControl>\n @for (group of groupedOptions; track group.name) {\n =\n <optgroup [label]=\"group.name\">\n @for (option of group.options; track option.value) {\n <option [value]=\"option.value\">\n {{ option.label }}\n </option>\n }\n </optgroup>\n }\n </select>\n }\n }\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n","import { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicSlideToggle } from './dynamic-slide-toggle.model';\n\n@Component({\n selector: 'dynamic-slide-toggle',\n templateUrl: 'dynamic-slide-toggle.component.html',\n styleUrl: 'dynamic-slide-toggle.component.scss',\n imports: [ReactiveFormsModule, MatSlideToggleModule]\n})\nexport class DynamicSlideToggleComponent extends DynamicFormFieldBase<DynamicSlideToggle> {\n public model = input.required<DynamicSlideToggle>();\n public group = input.required<FormGroup>();\n}\n","<ng-container [formGroup]=\"group()\">\n <mat-slide-toggle\n [formControlName]=\"model().name\"\n [labelPosition]=\"model().labelPosition\"\n [id]=\"id\">\n <span class=\"slide-toggle-label\">{{ model().label }}</span>\n </mat-slide-toggle>\n</ng-container>\n","import { Component, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicStaticText } from './dynamic-static-text.model';\n\n@Component({\n selector: 'dynamic-static-text',\n templateUrl: 'dynamic-static-text.component.html',\n styleUrl: './dynamic-static-text.component.scss',\n imports: [ReactiveFormsModule]\n})\nexport class DynamicStaticTextComponent extends DynamicFormFieldBase<DynamicStaticText> {\n public model = input.required<DynamicStaticText>();\n public group = input.required<FormGroup>();\n}\n","<div class=\"dynamic-static-text\">\n @if (model().value?.title) {\n <h3 class=\"dynamic-static-text-title\">{{ model().value?.title }}</h3>\n }\n @if (model().value?.text) {\n <p class=\"dynamic-static-text-body\">{{ model().value?.text }}</p>\n }\n</div>\n","import { Component, input, viewChild } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicTextarea } from './dynamic-textarea.model';\n\n@Component({\n imports: [MatFormFieldModule, MatInputModule, ReactiveFormsModule],\n selector: 'dynamic-textarea',\n templateUrl: './dynamic-textarea.component.html',\n styles: ['mat-form-field {width: 100%;}']\n})\nexport class DynamicTextareaComponent extends DynamicFormFieldBase<DynamicTextarea> {\n public textarea = viewChild.required<MatInput>(MatInput);\n\n public model = input.required<DynamicTextarea>();\n public group = input.required<FormGroup>();\n\n get valueCount(): number {\n return this.textarea()?.value ? this.textarea().value.length : 0;\n }\n\n get maxCountText(): string {\n return `${this.valueCount} / ${this.model().maxLength}`;\n }\n}\n","<mat-form-field\n [formGroup]=\"group()\"\n [id]=\"id\"\n color=\"primary\">\n @if (model().label) {\n <mat-label>{{ model().label }}</mat-label>\n }\n\n <textarea\n matInput\n [cdkTextareaAutosize]=\"model().resize\"\n [cdkAutosizeMinRows]=\"model().rows\"\n [cdkAutosizeMaxRows]=\"model().resizeMaxRows\"\n [id]=\"id\"\n [formControlName]=\"model().name\"\n [placeholder]=\"model().placeholder\"\n [attr.minLength]=\"model().minLength\"\n [attr.maxLength]=\"model().maxLength\"\n [rows]=\"model().rows\"\n [autocomplete]=\"model().autocomplete\">\n </textarea>\n\n @if (model().hint) {\n <mat-hint align=\"start\">{{ model().hint }}</mat-hint>\n }\n\n @if (model().maxLength) {\n <mat-hint align=\"end\">{{ maxCountText }}</mat-hint>\n }\n\n @for (validator of model().validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n @if (hasError(validator.name)) {\n <mat-error>{{ validator.message }}</mat-error>\n }\n </ng-container>\n }\n</mat-form-field>\n","import { Type } from '@angular/core';\nimport { DynamicAutocompleteComponent } from '../../controls/autocomplete/dynamic-autocomplete.component';\nimport { DynamicButtonTogglesComponent } from '../../controls/button-toggles/dynamic-button-toggles.component';\nimport { DynamicButtonComponent } from '../../controls/button/dynamic-button.component';\nimport { DynamicCheckboxComponent } from '../../controls/checkbox/dynamic-checkbox.component';\nimport {\n DYNAMIC_FORM_FIELD_AUTOCOMPLETE,\n DYNAMIC_FORM_FIELD_BUTTON,\n DYNAMIC_FORM_FIELD_BUTTON_TOGGLES,\n DYNAMIC_FORM_FIELD_CHECKBOX,\n DYNAMIC_FORM_FIELD_DATEPICKER,\n DYNAMIC_FORM_FIELD_INPUT,\n DYNAMIC_FORM_FIELD_RADIO_GROUP,\n DYNAMIC_FORM_FIELD_READONLY,\n DYNAMIC_FORM_FIELD_SELECT,\n DYNAMIC_FORM_FIELD_SLIDE_TOGGLE,\n DYNAMIC_FORM_FIELD_STATIC_TEXT,\n DYNAMIC_FORM_FIELD_TEXTAREA\n} from '../../controls/controls';\nimport { DynamicDatepickerComponent } from '../../controls/datepicker/dynamic-datepicker.component';\nimport { DynamicInputComponent } from '../../controls/input/dynamic-input.component';\nimport { DynamicRadioGroupComponent } from '../../controls/radio-group/dynamic-radio-group.component';\nimport { DynamicReadonlyComponent } from '../../controls/readonly/dynamic-readonly.component';\nimport { DynamicSelectComponent } from '../../controls/select/dynamic-select.component';\nimport { DynamicSlideToggleComponent } from '../../controls/slide-toggle/dynamic-slide-toggle.component';\nimport { DynamicStaticTextComponent } from '../../controls/static-text/dynamic-static-text.component';\nimport { DynamicTextareaComponent } from '../../controls/textarea/dynamic-textarea.component';\nimport { DynamicFormField } from '../classes/dynamic-form-field-base';\n\nexport const DYNAMIC_FORM_FIELD_MAP: Record<string, Type<DynamicFormField<any>>> = {\n [DYNAMIC_FORM_FIELD_AUTOCOMPLETE]: DynamicAutocompleteComponent,\n [DYNAMIC_FORM_FIELD_BUTTON]: DynamicButtonComponent,\n [DYNAMIC_FORM_FIELD_BUTTON_TOGGLES]: DynamicButtonTogglesComponent,\n [DYNAMIC_FORM_FIELD_CHECKBOX]: DynamicCheckboxComponent,\n [DYNAMIC_FORM_FIELD_DATEPICKER]: DynamicDatepickerComponent,\n [DYNAMIC_FORM_FIELD_INPUT]: DynamicInputComponent,\n [DYNAMIC_FORM_FIELD_RADIO_GROUP]: DynamicRadioGroupComponent,\n [DYNAMIC_FORM_FIELD_READONLY]: DynamicReadonlyComponent,\n [DYNAMIC_FORM_FIELD_SELECT]: DynamicSelectComponent,\n [DYNAMIC_FORM_FIELD_SLIDE_TOGGLE]: DynamicSlideToggleComponent,\n [DYNAMIC_FORM_FIELD_STATIC_TEXT]: DynamicStaticTextComponent,\n [DYNAMIC_FORM_FIELD_TEXTAREA]: DynamicTextareaComponent\n};\n","import { Injector } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { DynamicFormValidationsService } from '../../services/dynamic-validations.service';\nimport { DynamicFormFieldModel } from '../classes/dynamic-form-field-model';\nimport { DynamicFormValidators } from '../classes/dynamic-form-validators';\nimport { RelationActionType } from '../types/dynamic-form-field-relation.type';\nimport { DynamicFormValidator } from '../types/dynamic-form-validator.type';\n\nexport interface DynamicRelationAction {\n type: RelationActionType;\n reversedType?: string;\n change(hasMatch: boolean, model: DynamicFormFieldModel, control: FormControl, injector: Injector): void;\n}\n\n/**\n * Relation action to disable/enable a form control.\n */\nconst DISABLE_ACTION: DynamicRelationAction = {\n type: RelationActionType.DISABLED,\n reversedType: RelationActionType.ENABLED,\n change(hasMatch, model) {\n model.disabled = hasMatch;\n }\n};\n\n/**\n * Relation action to toggle the visibility of a form control\n */\nconst HIDDEN_ACTION: DynamicRelationAction = {\n type: RelationActionType.HIDDEN,\n reversedType: RelationActionType.VISIBLE,\n change(hasMatch, model) {\n model.hidden = hasMatch;\n }\n};\n\n/**\n * Relation action to add or remove the required validator to a form control\n */\nconst REQUIRED_ACTION: DynamicRelationAction = {\n type: RelationActionType.REQUIRED,\n reversedType: RelationActionType.OPTIONAL,\n change(hasMatch, model, control, injector) {\n const hasRequiredValidation = !!model.validators.find((f) => f.name === 'required');\n let validators: DynamicFormValidator[];\n\n if (hasMatch) {\n // If the model already contains the required validator, return the model validators.\n // Otherwise, add the required validator\n validators = hasRequiredValidation ? model.validators : [...model.validators, DynamicFormValidators.required()];\n } else {\n validators = model.validators.filter((f) => f.name !== 'required');\n }\n\n injector.get(DynamicFormValidationsService).updateValidators(validators, control);\n }\n};\n\n/**\n * Export all Relation actions so the DynamicFormService can easily access all Relation actions.\n * This way if there are any new actions, all you have to do is add them here.\n * TODO: This can be potentially be expanded towords an InjectionToken to provide the possibility for custom relationactions.\n */\nexport const RELATION_ACTIONS: DynamicRelationAction[] = [DISABLE_ACTION, HIDDEN_ACTION, REQUIRED_ACTION];\n","import { inject, Injectable, Injector } from '@angular/core';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { distinctUntilChanged, startWith, Subscription } from 'rxjs';\nimport { DynamicFormFieldModel } from '../models/classes/dynamic-form-field-model';\nimport { DynamicRelationAction, RELATION_ACTIONS } from '../models/constants/dynamic-relations.const';\nimport { DynamicFormFieldRelation, RelationCondition, RelationOperator } from '../models/types/dynamic-form-field-relation.type';\nimport { RelatedFormControls } from '../models/types/related-form-controls.type';\n\n/** @ignore */\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormRelationsService {\n private _injector = inject(Injector);\n\n /**\n * Get an object with all FormField the provided model has a relation with\n * @param model\n * @param group\n * @returns\n */\n public findRelatedFormField(model: DynamicFormFieldModel, group: FormGroup): RelatedFormControls {\n const conditionReducer = (controls: RelatedFormControls, condition: RelationCondition) => {\n const fieldName = condition.path ?? condition.fieldName!;\n // Get the control using the provided path or fieldName\n const control = condition.path ? (group.root.get(condition.path) as FormControl) : (group.get(condition.fieldName!) as FormControl);\n\n if (!control) {\n console.warn(`No related form control with the name ${fieldName} found`);\n return controls;\n }\n\n controls[fieldName] = control;\n return controls;\n };\n\n const relationsReducer = (controls: RelatedFormControls, relation: DynamicFormFieldRelation) => {\n return relation.conditions.reduce(conditionReducer, controls);\n };\n\n return model.relations!.reduce(relationsReducer, {});\n }\n\n public getRelationSubscriptions(\n relatedFormControls: RelatedFormControls,\n model: DynamicFormFieldModel,\n control: FormControl\n ): Subscription[] {\n const subs: Subscription[] = [];\n\n // Subscribe to value changes of all FormControls, provide the current value inside the startWith\n Object.values(relatedFormControls).forEach((relatedControl) => {\n subs.push(\n relatedControl.valueChanges.pipe(startWith(relatedControl.value), distinctUntilChanged()).subscribe(() => {\n model.relations!.forEach((relation) => {\n // Find the RelationAction object based on the actionType passed inside the DynamicFormConfig\n const action = RELATION_ACTIONS.find(\n (action) => relation.actionType === action.type || relation.actionType === action.reversedType\n );\n\n if (action) {\n const shouldTrigger = this.checkRelationCondition(relation, relatedFormControls, action);\n\n action.change(shouldTrigger, model, control, this._injector);\n }\n });\n })\n );\n });\n\n return subs;\n }\n\n /**\n * Check the conditions inside the relations\n * @param relation\n * @param relatedControl\n * @param action\n * @returns\n */\n private checkRelationCondition(\n relation: DynamicFormFieldRelation,\n relatedControls: RelatedFormControls,\n action: DynamicRelationAction\n ): boolean {\n // Default operator is AND, meaning all conditions should return true before the provided action is triggered.\n // In the case of a reversed type, the return value whould be false.\n const operator = relation.operator ?? RelationOperator.AND;\n\n // Use a reducer to map all conditions to a single boolean value to decide if we want to trigger the provided action type\n const reducer = (isMatch: boolean, condition: RelationCondition, index: number): boolean => {\n // Find the FormControl of the related field\n let relatedControl: FormControl | undefined;\n\n for (const [fieldName, control] of Object.entries(relatedControls)) {\n if (fieldName === (condition.path ?? condition.fieldName)) {\n relatedControl = control;\n break;\n }\n }\n\n if (!relatedControl) return false;\n\n // Using the 'normal' type should return true when the condition matches\n if (relation.actionType === action.type) {\n // Shortcut to false when a previous condition check was resolved as false in case of the AND operator\n if (index > 0 && operator === RelationOperator.AND && !isMatch) return false;\n\n // Shortcut to true when a previous condition check was resolved as true in case of the OR operator\n if (index > 0 && operator === RelationOperator.OR && isMatch) return true;\n\n return condition.value(relatedControl.value);\n }\n\n // Using the reversed type should return false when the condition matches, because we want to the opposite of the configured change Function\n if (relation.actionType === action.reversedType) {\n // Shortcut to true when a previous condition check was resolved as true\n if (index > 0 && operator === RelationOperator.AND && isMatch) return true;\n\n // Shortcut to false when a previous condition check was resolved as false\n if (index > 0 && operator === RelationOperator.OR && !isMatch) return false;\n\n return !condition.value(relatedControl.value);\n }\n\n return false;\n };\n\n return relation.conditions.reduce(reducer, false);\n }\n}\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n inject,\n input,\n OnDestroy,\n OnInit,\n Type,\n viewChild,\n ViewContainerRef\n} from '@angular/core';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { DynamicFormField } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldModel } from '../../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\nimport { DYNAMIC_FORM_FIELD_MAP } from '../../models/constants/dynamic-form-field-map.const';\nimport { DynamicFormRelationsService } from '../../services/dynamic-form-relations.service';\nimport { DynamicFormService } from '../../services/dynamic-form.service';\n\n/** @ignore */\n@Component({\n imports: [NgClass, ReactiveFormsModule],\n selector: 'dynamic-form-field',\n templateUrl: 'dynamic-form-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DynamicFormFieldComponent implements OnInit, OnDestroy {\n private componentViewContainer = viewChild.required('componentViewContainer', { read: ViewContainerRef });\n\n public model = input.required<DynamicFormFieldModel>();\n public group = input.required<FormGroup>();\n\n private readonly dynamicFormService = inject(DynamicFormService);\n private readonly relationService = inject(DynamicFormRelationsService);\n private readonly cdRef = inject(ChangeDetectorRef);\n\n private _control!: FormControl;\n private _subs = new Subscription();\n\n /**\n * Get the instance of a control component using the injected custom method or local method\n */\n private get componentType(): Type<DynamicFormField<any>> | null {\n return this.dynamicFormService.getCustomControlComponentType(this.model()) || this.getControlComponentType();\n }\n\n ngOnInit(): void {\n if (this.group()) {\n this._control = this.group().get(this.model().name) as FormControl;\n\n this.createFormControlComponent();\n this.setSubscriptions();\n }\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Finds the instance of a control component by type\n * @returns\n */\n private getControlComponentType(): Type<DynamicFormField<any>> | null {\n const field = DYNAMIC_FORM_FIELD_MAP[this.model().type];\n\n if (!field) {\n console.warn(\n `Model of type 'dynamic-${this.model().type}' is not implemented yet. Add this type to dynamic-form-field.component.ts to add support`\n );\n return null;\n }\n\n return field;\n }\n\n private createFormControlComponent(): void {\n const component = this.componentType;\n\n if (component != null) {\n let componentRef = this.componentViewContainer().createComponent(component);\n\n componentRef.setInput('group', this.group());\n componentRef.setInput('model', this.model());\n }\n }\n\n /**\n * Setup all necessary subscriptions of the FormControl\n */\n private setSubscriptions(): void {\n const model = this.model() as DynamicFormFieldModel;\n\n // Subscribe to the value change inside the control to change the value inside the model as well\n this._subs.add(this._control.valueChanges.subscribe((value) => this.onValueChange(value)));\n\n // Subscribe to the disabled change inside the model to change the disabled state of the FormControl\n this._subs.add(model.disabledChange.subscribe((disabled) => this.onDisabledChange(disabled)));\n\n // Setup subscriptions for any possible relation\n if (this.model().relations?.length) {\n this.setUpRelations();\n }\n }\n\n /**\n * Set up all relations of the current model\n */\n private setUpRelations(): void {\n // Array of all FormControls the current model has a relation to\n const relatedFormControls = this.relationService.findRelatedFormField(this.model(), this.group());\n\n const subs = this.relationService.getRelationSubscriptions(relatedFormControls, this.model(), this._control);\n\n // Add all relations as subscription to the main Subscription object\n subs.forEach((sub) => this._subs.add(sub));\n }\n\n /**\n * Fired when the value changes of the control and updates the value inside the model\n * @param value\n */\n private onValueChange(value: unknown): void {\n if (this.model() instanceof DynamicFormFieldValueModel && (this.model() as DynamicFormFieldValueModel).value !== value) {\n (this.model() as DynamicFormFieldValueModel).value = value;\n }\n }\n\n /**\n * Enables/disabled the control based on the provided parameter.\n * Is fired when disabled state is changed inside the model and should not be directly used outside this component.\n * @param disabled\n */\n private onDisabledChange(disabled: boolean): void {\n disabled ? this._control.disable() : this._control.enable();\n\n this.cdRef.markForCheck();\n }\n}\n","<div\n [formGroup]=\"group()\"\n [ngClass]=\"['dynamic-form-field-container', 'dynamic-form-field-' + model().type]\">\n <ng-container #componentViewContainer></ng-container>\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { DynamicFormConfig } from '../../models/types/dynamic-form-config.type';\nimport { DynamicFormService } from '../../services/dynamic-form.service';\nimport { DynamicFormFieldComponent } from '../dynamic-form-field/dynamic-form-field.component';\n\n@Component({\n imports: [DynamicFormFieldComponent, ReactiveFormsModule],\n selector: 'dynamic-form',\n templateUrl: 'dynamic-form.component.html',\n styleUrls: ['./dynamic-form.component.scss'],\n providers: [DynamicFormService],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DynamicFormComponent {\n public group = input.required<FormGroup>();\n public formConfig = input.required<DynamicFormConfig>();\n public layout = input<string[]>([]);\n\n public layoutRows = computed(() => {\n if (!this.layout()?.length) return null;\n\n return this.layout().map((row) =>\n row\n .trim()\n .split(/\\s+/)\n .map((name) => this.formConfig().find((f) => f.name === name))\n .filter((f) => !!f)\n );\n });\n\n /**\n * Get the current value of the form.\n * @param includeDisabledFields Include the disabled fields of the form, is enabled by default\n */\n public getFormValue<T = unknown>(includeDisabledFields = true): T {\n const formValue = includeDisabledFields ? this.group().getRawValue() : this.group().value;\n\n return formValue;\n }\n\n /**\n * Provides an Observable to listen to changes of a specific field in the form.\n *\n * @param name Name of the field\n * @returns Observable<unknown>\n */\n public onControlChange(name: string): Observable<unknown> {\n const field = this.group().get(name);\n\n if (!field) {\n throw new Error(`Cannot find a field with the name ${name} in the FormGroup`);\n }\n\n return field.valueChanges;\n }\n}\n","@if (layoutRows(); as rows) {\n @for (row of rows; track $index) {\n <div class=\"dynamic-form-row\">\n @for (field of row; track field.id) {\n <dynamic-form-field\n class=\"dynamic-form-field\"\n [style.flex-basis]=\"'var(--field-' + field.name + '-width, auto)'\"\n [style.max-width]=\"'var(--field-' + field.name + '-width, 100%)'\"\n [id]=\"field.id\"\n [hidden]=\"field.hidden\"\n [class]=\"field.type\"\n [group]=\"group()\"\n [model]=\"field\">\n </dynamic-form-field>\n }\n </div>\n }\n} @else {\n @for (field of formConfig(); track $index) {\n <div class=\"dynamic-form-row\">\n <dynamic-form-field\n class=\"dynamic-form-field\"\n [style.flex-basis]=\"'var(--field-' + field.name + '-width, auto)'\"\n [style.max-width]=\"'var(--field-' + field.name + '-width, 100%)'\"\n [id]=\"field.id\"\n [hidden]=\"field.hidden\"\n [class]=\"field.type\"\n [group]=\"group()\"\n [model]=\"field\">\n </dynamic-form-field>\n </div>\n }\n}\n","import { map, Observable } from 'rxjs';\nimport { DynamicFormFieldOption } from '../models/classes/dynamic-form-field-option-model';\n\n/**\n * Transform any list to a list of DynamicFormFieldOption which is used in any Dynamic Form Field with options (e.g. DynamicSelect).\n * Possible to provide the method with type definitions to define the provided list type `<T>` and desired option value type `<K>`:\n *\n * `dynamicFormService.toDynamicOptionList<T, K>(...)`\n *\n * Generic types:\n * - T = The type of the items in the provided list\n * - K = The type of the value inside an DynamicFormFieldOption. Default is 'string'\n * @param arr An array of items of type T\n * @param labelFn Callback to define the label of the options in the template\n * @param valueFn Callback to define the value of the options. Must return a value of type K (default string)\n * @returns\n */\nexport function arrToDynamicFormOptions<T, K = string>(\n arr: T[],\n labelFn: (item: T) => string,\n valueFn: (item: T) => K\n): DynamicFormFieldOption<K>[] {\n return arr.map((item) => {\n return {\n label: labelFn(item),\n value: valueFn(item)\n };\n });\n}\n\n/**\n * Transform any Observable of a list to a list of DynamicFormFieldOption which is used in any Dynamic Form Field with options (e.g. DynamicSelect).\n * Possible to provide the method with type definitions to define the provided list type `<T>` and desired option value type `<K>`:\n *\n * `dynamicFormService.toDynamicOptionList<T, K>(...)`\n *\n * Generic types:\n * - T = The type of the items in the provided list\n * - K = The type of the value inside an DynamicFormFieldOption. Default is 'string'\n * @param obs An Observable of a list of items of type T\n * @param labelFn Callback to define the label of the options in the template\n * @param valueFn Callback to define the value of the options. Must return a value of type K (default string)\n * @returns\n */\nexport function obsToDynamicFormOptions<T, K = string>(\n obs: Observable<T[]>,\n labelFn: (item: T) => string,\n valueFn: (item: T) => K\n): Observable<DynamicFormFieldOption<K>[]> {\n return obs.pipe(map((arr) => arrToDynamicFormOptions(arr, labelFn, valueFn)));\n}\n","/*\n * Public API Surface of ngx-dynamic-form\n */\nexport * from './lib/components/dynamic-form/dynamic-form.component';\n\nexport * from './lib/controls/controls';\nexport * from './lib/models';\n\nexport * from './lib/services/dynamic-form.service';\n\nexport * from './lib/utils/helpers';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DYNAMIC_FORM_FIELD_MAP","i2.DynamicFormValidationsService","i2","i3","i1","i4","i6"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -225,6 +225,38 @@ declare abstract class DynamicFormFieldOptionModel<T> extends DynamicFormFieldVa
225
225
  private setGroupedOptions;
226
226
  }
227
227
 
228
+ declare const DYNAMIC_FORM_FIELD_AUTOCOMPLETE = "autocomplete";
229
+ type DynamicAutocompleteConfig<T = string> = DynamicFormFieldOptionConfig<T> & {
230
+ /**
231
+ * Optional search function for asynchronous searching.
232
+ * If provided, the internal search logic will use this instead of filtering the static options.
233
+ */
234
+ searchFn?: (term: string) => Observable<DynamicFormFieldOption<T>[]>;
235
+ /**
236
+ * Optional filter function for custom local filtering of pre-fetched options.
237
+ * Only used if searchFn is not provided.
238
+ */
239
+ filterFn?: (term: string, option: DynamicFormFieldOption<T>) => boolean;
240
+ /**
241
+ * Debounce time in milliseconds for the search function (default: 300ms).
242
+ */
243
+ debounceTime?: number;
244
+ placeholder?: string;
245
+ /**
246
+ * Optional function to format the selected value for display in the input field.
247
+ */
248
+ displayFn?: (value: T) => string;
249
+ };
250
+ declare class DynamicAutocomplete<T = string> extends DynamicFormFieldOptionModel<T> {
251
+ searchFn?: (term: string) => Observable<DynamicFormFieldOption<T>[]>;
252
+ filterFn?: (term: string, option: DynamicFormFieldOption<T>) => boolean;
253
+ displayFn?: (value: T) => string;
254
+ debounceTime: number;
255
+ placeholder: string;
256
+ readonly type = "autocomplete";
257
+ constructor(config: DynamicAutocompleteConfig<T>);
258
+ }
259
+
228
260
  declare const DYNAMIC_FORM_FIELD_BUTTON_TOGGLES = "button-toggles";
229
261
  type DynamicButtonTogglesConfig = Omit<DynamicFormFieldOptionConfig<string | number | null>, 'label'> & {
230
262
  /** Whether to allow multiple options to be selected. Default is false */
@@ -591,5 +623,5 @@ declare function arrToDynamicFormOptions<T, K = string>(arr: T[], labelFn: (item
591
623
  */
592
624
  declare function obsToDynamicFormOptions<T, K = string>(obs: Observable<T[]>, labelFn: (item: T) => string, valueFn: (item: T) => K): Observable<DynamicFormFieldOption<K>[]>;
593
625
 
594
- export { DYNAMIC_FORM_FIELD_BUTTON, DYNAMIC_FORM_FIELD_BUTTON_TOGGLES, DYNAMIC_FORM_FIELD_CHECKBOX, DYNAMIC_FORM_FIELD_DATEPICKER, DYNAMIC_FORM_FIELD_INPUT, DYNAMIC_FORM_FIELD_MAP, DYNAMIC_FORM_FIELD_RADIO_GROUP, DYNAMIC_FORM_FIELD_READONLY, DYNAMIC_FORM_FIELD_SELECT, DYNAMIC_FORM_FIELD_SLIDE_TOGGLE, DYNAMIC_FORM_FIELD_STATIC_TEXT, DYNAMIC_FORM_FIELD_TEXTAREA, DynamicButton, DynamicButtonToggles, DynamicCheckbox, DynamicDatepicker, DynamicFormComponent, DynamicFormFieldBase, DynamicFormFieldModel, DynamicFormFieldOptionModel, DynamicFormFieldValueModel, DynamicFormService, DynamicFormValidators, DynamicInput, DynamicRadioGroup, DynamicReadonly, DynamicSelect, DynamicSlideToggle, DynamicStaticText, DynamicTextarea, RelationActionType, RelationOperator, arrToDynamicFormOptions, obsToDynamicFormOptions };
595
- export type { DynamicButtonConfig, DynamicButtonTogglesConfig, DynamicCheckboxConfig, DynamicDatepickerConfig, DynamicDatepickerControlValue, DynamicFormConfig, DynamicFormField, DynamicFormFieldConfig, DynamicFormFieldOption, DynamicFormFieldOptionConfig, DynamicFormFieldOptionGroup, DynamicFormFieldRelation, DynamicFormFieldValueConfig, DynamicFormValidator, DynamicGroupedOptionList, DynamicInputConfig, DynamicInputValue, DynamicOptionList, DynamicRadioGroupConfig, DynamicReadonlyConfig, DynamicReadonlyValue, DynamicSelectConfig, DynamicSlideToggleConfig, DynamicStaticTextConfig, DynamicStaticTextValue, DynamicTextareaConfig, DynamicTextareaValue, HtmlInputType, RelationCondition };
626
+ export { DYNAMIC_FORM_FIELD_AUTOCOMPLETE, DYNAMIC_FORM_FIELD_BUTTON, DYNAMIC_FORM_FIELD_BUTTON_TOGGLES, DYNAMIC_FORM_FIELD_CHECKBOX, DYNAMIC_FORM_FIELD_DATEPICKER, DYNAMIC_FORM_FIELD_INPUT, DYNAMIC_FORM_FIELD_MAP, DYNAMIC_FORM_FIELD_RADIO_GROUP, DYNAMIC_FORM_FIELD_READONLY, DYNAMIC_FORM_FIELD_SELECT, DYNAMIC_FORM_FIELD_SLIDE_TOGGLE, DYNAMIC_FORM_FIELD_STATIC_TEXT, DYNAMIC_FORM_FIELD_TEXTAREA, DynamicAutocomplete, DynamicButton, DynamicButtonToggles, DynamicCheckbox, DynamicDatepicker, DynamicFormComponent, DynamicFormFieldBase, DynamicFormFieldModel, DynamicFormFieldOptionModel, DynamicFormFieldValueModel, DynamicFormService, DynamicFormValidators, DynamicInput, DynamicRadioGroup, DynamicReadonly, DynamicSelect, DynamicSlideToggle, DynamicStaticText, DynamicTextarea, RelationActionType, RelationOperator, arrToDynamicFormOptions, obsToDynamicFormOptions };
627
+ export type { DynamicAutocompleteConfig, DynamicButtonConfig, DynamicButtonTogglesConfig, DynamicCheckboxConfig, DynamicDatepickerConfig, DynamicDatepickerControlValue, DynamicFormConfig, DynamicFormField, DynamicFormFieldConfig, DynamicFormFieldOption, DynamicFormFieldOptionConfig, DynamicFormFieldOptionGroup, DynamicFormFieldRelation, DynamicFormFieldValueConfig, DynamicFormValidator, DynamicGroupedOptionList, DynamicInputConfig, DynamicInputValue, DynamicOptionList, DynamicRadioGroupConfig, DynamicReadonlyConfig, DynamicReadonlyValue, DynamicSelectConfig, DynamicSlideToggleConfig, DynamicStaticTextConfig, DynamicStaticTextValue, DynamicTextareaConfig, DynamicTextareaValue, HtmlInputType, RelationCondition };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olafvv/ngx-dynamic-form",
3
- "version": "20.2.0",
3
+ "version": "20.3.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^20.3.16",
6
6
  "@angular/core": "^20.3.16",