@bsachref/ng-form 1.0.3 → 1.0.4

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.
@@ -64,8 +64,8 @@
64
64
  * emits the form values if the form is valid, and resets the form. Triggers change detection.
65
65
  */
66
66
  import { CommonModule } from '@angular/common';
67
- import { Component, ChangeDetectionStrategy, input, output, } from '@angular/core';
68
- import { ReactiveFormsModule, Validators, } from '@angular/forms';
67
+ import { Component, ChangeDetectionStrategy, } from '@angular/core';
68
+ import { ReactiveFormsModule, } from '@angular/forms';
69
69
  import { MatInputModule } from '@angular/material/input';
70
70
  import { MatSelectModule } from '@angular/material/select';
71
71
  import { MatCheckboxModule } from '@angular/material/checkbox';
@@ -75,9 +75,10 @@ import { ValidationMessagesComponent } from '../validation-messages/validation-m
75
75
  import { MatDatepickerModule } from '@angular/material/datepicker';
76
76
  import { MatFormFieldModule } from '@angular/material/form-field';
77
77
  import { provideNativeDateAdapter } from '@angular/material/core';
78
+ import { BaseFormsComponent } from '../base.component';
78
79
  import * as i0 from "@angular/core";
79
- import * as i1 from "@angular/forms";
80
- import * as i2 from "@angular/common";
80
+ import * as i1 from "@angular/common";
81
+ import * as i2 from "@angular/forms";
81
82
  import * as i3 from "@angular/material/input";
82
83
  import * as i4 from "@angular/material/form-field";
83
84
  import * as i5 from "@angular/material/select";
@@ -86,81 +87,14 @@ import * as i7 from "@angular/material/checkbox";
86
87
  import * as i8 from "@angular/material/radio";
87
88
  import * as i9 from "@angular/material/button";
88
89
  import * as i10 from "@angular/material/datepicker";
89
- export class MaterialFormsComponent {
90
- fb;
91
- cdr;
92
- formName = input.required();
93
- controls = input.required();
94
- formSubmit = output();
95
- form;
96
- constructor(fb, cdr) {
97
- this.fb = fb;
98
- this.cdr = cdr;
99
- }
100
- ngOnInit() {
101
- this.initializeForm();
102
- }
103
- initializeForm() {
104
- const formControls = {};
105
- this.controls().forEach((control) => {
106
- if (control.type === 'datepicker' && control.datePickerMode === 'range') {
107
- formControls[`${control.name}_Start`] = [
108
- control.value?.start ?? '',
109
- this.getValidators(control),
110
- ];
111
- formControls[`${control.name}_End`] = [
112
- control.value?.end ?? '',
113
- this.getValidators(control),
114
- ];
115
- }
116
- else {
117
- formControls[control.name] = [
118
- control.value ?? '',
119
- this.getValidators(control),
120
- ];
121
- }
122
- });
123
- this.form = this.fb.group(formControls);
124
- }
125
- getValidators(control) {
126
- const validators = [];
127
- if (control.validators) {
128
- control.validators.forEach((validator) => {
129
- if (validator.required)
130
- validators.push(Validators.required);
131
- if (validator.minlength)
132
- validators.push(Validators.minLength(validator.minlength));
133
- if (validator.maxlength)
134
- validators.push(Validators.maxLength(validator.maxlength));
135
- if (validator.pattern)
136
- validators.push(Validators.pattern(validator.pattern));
137
- if (validator.email)
138
- validators.push(Validators.email);
139
- if (validator.custom)
140
- validators.push(validator.custom);
141
- });
142
- }
143
- return validators;
144
- }
145
- onSubmit() {
146
- this.form.markAllAsTouched();
147
- this.form.markAsDirty();
148
- this.form.updateValueAndValidity();
149
- if (this.form.valid) {
150
- this.formSubmit.emit(this.form.value);
151
- this.form.reset();
152
- }
153
- else {
154
- console.error('Form Invalid');
155
- }
156
- this.cdr.markForCheck();
157
- }
158
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialFormsComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
159
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: MaterialFormsComponent, isStandalone: true, selector: "material-forms", inputs: { formName: { classPropertyName: "formName", publicName: "formName", isSignal: true, isRequired: true, transformFunction: null }, controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { formSubmit: "formSubmit" }, providers: [provideNativeDateAdapter()], ngImport: i0, template: "<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"material\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.type === \"input\") {\n <mat-form-field appearance=\"outline\">\n @if (control.label) {\n <mat-label>{{ control.label }}</mat-label>\n }\n <input\n matInput\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n type=\"text\"\n />\n </mat-form-field>\n }\n @if (control.type === \"select\") {\n <mat-form-field appearance=\"outline\">\n @if (control.label) {\n <mat-label>{{ control.label }}</mat-label>\n }\n <mat-select [formControlName]=\"control.name\" [id]=\"control.name\">\n @for (option of control.options ?? []; track $index) {\n <mat-option [value]=\"option\">{{ option }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n @if (control.type === \"checkbox\") {\n <mat-checkbox [formControlName]=\"control.name\" [id]=\"control.name\">\n {{ control.label }}\n </mat-checkbox>\n }\n @if (control.type === \"radio\") {\n @for (option of control.options ?? []; track $index) {\n <mat-radio-group [formControlName]=\"control.name\">\n <mat-radio-button\n [id]=\"control.name + '-' + option\"\n [value]=\"option\"\n >\n {{ option }}\n </mat-radio-button>\n </mat-radio-group>\n }\n }\n @if (control.type === \"datepicker\") {\n @if (control.datePickerMode === \"single\") {\n <mat-form-field appearance=\"outline\">\n <mat-label>Choose a date</mat-label>\n <input\n matInput\n [matDatepicker]=\"datepicker\"\n [formControlName]=\"control.name\"\n />\n <mat-datepicker-toggle\n matIconSuffix\n [for]=\"datepicker\"\n ></mat-datepicker-toggle>\n <mat-datepicker #datepicker></mat-datepicker>\n </mat-form-field>\n } @else if (control.datePickerMode === \"range\") {\n <mat-form-field>\n <mat-label>Enter a date range</mat-label>\n <mat-date-range-input\n [rangePicker]=\"picker\"\n [formGroup]=\"form\"\n ]\n >\n <input\n matStartDate\n formControlName=\"{{ control.name }}_Start\"\n placeholder=\"Start date\"\n />\n <input\n matEndDate\n formControlName=\"{{ control.name }}_End\"\n placeholder=\"End date\"\n />\n </mat-date-range-input>\n <mat-datepicker-toggle\n matIconSuffix\n [for]=\"picker\"\n ></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n\n <!-- @if (form.controls.start.hasError('matStartDateInvalid')) {\n <mat-error>Invalid start date</mat-error>\n }\n @if (form.controls.end.hasError('matEndDateInvalid')) {\n <mat-error>Invalid end date</mat-error>\n } -->\n </mat-form-field>\n }\n }\n\n <validation-messages\n [control]=\"form.get(control.name)\"\n [controlName]=\"control.name\"\n [config]=\"control\"\n ></validation-messages>\n </section>\n }\n }\n }\n <button\n mat-raised-button\n color=\"primary\"\n type=\"submit\"\n [disabled]=\"form.invalid\"\n >\n Submit\n </button>\n</form>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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: "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"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.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"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i8.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i8.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: ValidationMessagesComponent, selector: "validation-messages", inputs: ["control", "controlName", "config"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i10.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i10.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i10.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i10.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "ngmodule", type: MatFormFieldModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
90
+ export class MaterialFormsComponent extends BaseFormsComponent {
91
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialFormsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
92
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: MaterialFormsComponent, isStandalone: true, selector: "material-forms", providers: [provideNativeDateAdapter()], usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"material\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.type === \"input\") {\n <mat-form-field appearance=\"outline\">\n @if (control.label) {\n <mat-label>{{ control.label }}</mat-label>\n }\n <input matInput [formControlName]=\"control.name\" [id]=\"control.name\" type=\"text\" />\n </mat-form-field>\n }\n @if (control.type === \"select\") {\n <mat-form-field appearance=\"outline\">\n @if (control.label) {\n <mat-label>{{ control.label }}</mat-label>\n }\n <mat-select [formControlName]=\"control.name\" [id]=\"control.name\">\n @for (option of control.options ?? []; track $index) {\n <mat-option [value]=\"option\">{{ option }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n @if (control.type === \"checkbox\") {\n <mat-checkbox [formControlName]=\"control.name\" [id]=\"control.name\">\n {{ control.label }}\n </mat-checkbox>\n }\n @if (control.type === \"radio\") {\n <mat-radio-group [formControlName]=\"control.name\">\n @for (option of control.options ?? []; track $index) {\n <mat-radio-button [id]=\"control.name + '-' + option\" [value]=\"option\">\n {{ option }}\n </mat-radio-button>\n }\n </mat-radio-group>\n }\n @if (control.type === \"datepicker\") {\n @if (control.datePickerMode === \"single\") {\n <mat-form-field appearance=\"outline\">\n <mat-label>Choose a date</mat-label>\n <input matInput [matDatepicker]=\"datepicker\" [formControlName]=\"control.name\" />\n <mat-datepicker-toggle matIconSuffix [for]=\"datepicker\"></mat-datepicker-toggle>\n <mat-datepicker #datepicker></mat-datepicker>\n </mat-form-field>\n } @else if (control.datePickerMode === \"range\") {\n <mat-form-field>\n <mat-label>Enter a date range</mat-label>\n <mat-date-range-input [rangePicker]=\"picker\" [formGroup]=\"form\" ]>\n <input matStartDate formControlName=\"{{ control.name }}_Start\" placeholder=\"Start date\" />\n <input matEndDate formControlName=\"{{ control.name }}_End\" placeholder=\"End date\" />\n </mat-date-range-input>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n\n <!-- @if (form.controls.start.hasError('matStartDateInvalid')) {\n <mat-error>Invalid start date</mat-error>\n }\n @if (form.controls.end.hasError('matEndDateInvalid')) {\n <mat-error>Invalid end date</mat-error>\n } -->\n </mat-form-field>\n }\n }\n\n <validation-messages [control]=\"form.get(control.name)\" [controlName]=\"control.name\"\n [config]=\"control\"></validation-messages>\n </section>\n }\n }\n }\n <button mat-raised-button color=\"primary\" type=\"submit\" [disabled]=\"form.invalid\">\n Submit\n </button>\n</form>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { 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"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i5.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"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i8.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i8.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: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: ValidationMessagesComponent, selector: "validation-messages", inputs: ["control", "controlName", "config"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i10.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i10.MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i10.MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i10.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "ngmodule", type: MatFormFieldModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
160
93
  }
161
94
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialFormsComponent, decorators: [{
162
95
  type: Component,
163
96
  args: [{ selector: 'material-forms', standalone: true, imports: [
97
+ BaseFormsComponent,
164
98
  CommonModule,
165
99
  ReactiveFormsModule,
166
100
  MatInputModule,
@@ -171,6 +105,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
171
105
  ValidationMessagesComponent,
172
106
  MatDatepickerModule,
173
107
  MatFormFieldModule,
174
- ], providers: [provideNativeDateAdapter()], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"material\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.type === \"input\") {\n <mat-form-field appearance=\"outline\">\n @if (control.label) {\n <mat-label>{{ control.label }}</mat-label>\n }\n <input\n matInput\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n type=\"text\"\n />\n </mat-form-field>\n }\n @if (control.type === \"select\") {\n <mat-form-field appearance=\"outline\">\n @if (control.label) {\n <mat-label>{{ control.label }}</mat-label>\n }\n <mat-select [formControlName]=\"control.name\" [id]=\"control.name\">\n @for (option of control.options ?? []; track $index) {\n <mat-option [value]=\"option\">{{ option }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n @if (control.type === \"checkbox\") {\n <mat-checkbox [formControlName]=\"control.name\" [id]=\"control.name\">\n {{ control.label }}\n </mat-checkbox>\n }\n @if (control.type === \"radio\") {\n @for (option of control.options ?? []; track $index) {\n <mat-radio-group [formControlName]=\"control.name\">\n <mat-radio-button\n [id]=\"control.name + '-' + option\"\n [value]=\"option\"\n >\n {{ option }}\n </mat-radio-button>\n </mat-radio-group>\n }\n }\n @if (control.type === \"datepicker\") {\n @if (control.datePickerMode === \"single\") {\n <mat-form-field appearance=\"outline\">\n <mat-label>Choose a date</mat-label>\n <input\n matInput\n [matDatepicker]=\"datepicker\"\n [formControlName]=\"control.name\"\n />\n <mat-datepicker-toggle\n matIconSuffix\n [for]=\"datepicker\"\n ></mat-datepicker-toggle>\n <mat-datepicker #datepicker></mat-datepicker>\n </mat-form-field>\n } @else if (control.datePickerMode === \"range\") {\n <mat-form-field>\n <mat-label>Enter a date range</mat-label>\n <mat-date-range-input\n [rangePicker]=\"picker\"\n [formGroup]=\"form\"\n ]\n >\n <input\n matStartDate\n formControlName=\"{{ control.name }}_Start\"\n placeholder=\"Start date\"\n />\n <input\n matEndDate\n formControlName=\"{{ control.name }}_End\"\n placeholder=\"End date\"\n />\n </mat-date-range-input>\n <mat-datepicker-toggle\n matIconSuffix\n [for]=\"picker\"\n ></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n\n <!-- @if (form.controls.start.hasError('matStartDateInvalid')) {\n <mat-error>Invalid start date</mat-error>\n }\n @if (form.controls.end.hasError('matEndDateInvalid')) {\n <mat-error>Invalid end date</mat-error>\n } -->\n </mat-form-field>\n }\n }\n\n <validation-messages\n [control]=\"form.get(control.name)\"\n [controlName]=\"control.name\"\n [config]=\"control\"\n ></validation-messages>\n </section>\n }\n }\n }\n <button\n mat-raised-button\n color=\"primary\"\n type=\"submit\"\n [disabled]=\"form.invalid\"\n >\n Submit\n </button>\n</form>\n" }]
175
- }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }] });
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9uZ0Zvcm0vc3JjL2FwcC9tYXRlcmlhbC1mb3JtL21hdGVyaWFsLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbmdGb3JtL3NyYy9hcHAvbWF0ZXJpYWwtZm9ybS9tYXRlcmlhbC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0VHO0FBQ0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsdUJBQXVCLEVBRXZCLEtBQUssRUFDTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLG1CQUFtQixFQUduQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFFbkcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7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bXBvbmVudFxuICogQGRlc2NyaXB0aW9uXG4gKiBBIHN0YW5kYWxvbmUgQW5ndWxhciBjb21wb25lbnQgdGhhdCByZW5kZXJzIGEgZHluYW1pYyBmb3JtIHVzaW5nIEFuZ3VsYXIgTWF0ZXJpYWwgY29tcG9uZW50cy5cbiAqIFRoZSBmb3JtIGNvbmZpZ3VyYXRpb24gaXMgcHJvdmlkZWQgdmlhIGlucHV0cywgYW5kIHRoZSBmb3JtIHN1Ym1pc3Npb24gaXMgaGFuZGxlZCB2aWEgYW4gb3V0cHV0IGV2ZW50LlxuICogXG4gKiBAc2VsZWN0b3IgbWF0ZXJpYWwtZm9ybXNcbiAqIEBzdGFuZGFsb25lIHRydWVcbiAqIEBpbXBvcnRzXG4gKiAtIENvbW1vbk1vZHVsZVxuICogLSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiAtIE1hdElucHV0TW9kdWxlXG4gKiAtIE1hdFNlbGVjdE1vZHVsZVxuICogLSBNYXRDaGVja2JveE1vZHVsZVxuICogLSBNYXRSYWRpb01vZHVsZVxuICogLSBNYXRCdXR0b25Nb2R1bGVcbiAqIC0gVmFsaWRhdGlvbk1lc3NhZ2VzQ29tcG9uZW50XG4gKiAtIE1hdERhdGVwaWNrZXJNb2R1bGVcbiAqIC0gTWF0Rm9ybUZpZWxkTW9kdWxlXG4gKiBAcHJvdmlkZXJzIHByb3ZpZGVOYXRpdmVEYXRlQWRhcHRlclxuICogQHRlbXBsYXRlVXJsIC4vbWF0ZXJpYWwtZm9ybS5jb21wb25lbnQuaHRtbFxuICogQHN0eWxlVXJsIC4vbWF0ZXJpYWwtZm9ybS5jb21wb25lbnQuY3NzXG4gKiBAY2hhbmdlRGV0ZWN0aW9uIENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxuICogXG4gKiBAaW5wdXRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm9ybU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZm9ybS5cbiAqIEBwcm9wZXJ0eSB7Rm9ybUNvbnRyb2xDb25maWdbXX0gY29udHJvbHMgLSBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gY29udHJvbHMuXG4gKiBcbiAqIEBvdXRwdXRzXG4gKiBAcHJvcGVydHkge0V2ZW50RW1pdHRlcjxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gZm9ybVN1Ym1pdCAtIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuXG4gKiBcbiAqIEBjbGFzc1xuICogQG5hbWUgTWF0ZXJpYWxGb3Jtc0NvbXBvbmVudFxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIE1hdGVyaWFsRm9ybXNDb21wb25lbnQgd2hpY2ggaW5pdGlhbGl6ZXMgdGhlIGZvcm0gYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbnRyb2xzIGNvbmZpZ3VyYXRpb24sXG4gKiBoYW5kbGVzIGZvcm0gc3VibWlzc2lvbiwgYW5kIHByb3ZpZGVzIHZhbGlkYXRpb24gZm9yIHRoZSBmb3JtIGNvbnRyb2xzLlxuICogXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Rm9ybUJ1aWxkZXJ9IGZiIC0gQW5ndWxhciBGb3JtQnVpbGRlciBzZXJ2aWNlIHRvIGNyZWF0ZSBmb3JtIGdyb3VwcyBhbmQgY29udHJvbHMuXG4gKiBAcGFyYW0ge0NoYW5nZURldGVjdG9yUmVmfSBjZHIgLSBBbmd1bGFyIENoYW5nZURldGVjdG9yUmVmIHNlcnZpY2UgdG8gbWFudWFsbHkgdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICogXG4gKiBAbWV0aG9kXG4gKiBAbmFtZSBuZ09uSW5pdFxuICogQGRlc2NyaXB0aW9uXG4gKiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciB0aGUgY29tcG9uZW50J3MgdmlldyBoYXMgYmVlbiBpbml0aWFsaXplZC4gSXQgaW5pdGlhbGl6ZXMgdGhlIGZvcm0uXG4gKiBcbiAqIEBtZXRob2RcbiAqIEBuYW1lIGluaXRpYWxpemVGb3JtXG4gKiBAZGVzY3JpcHRpb25cbiAqIEluaXRpYWxpemVzIHRoZSBmb3JtIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLiBTdXBwb3J0cyBkYXRlcGlja2VyIHJhbmdlIGNvbnRyb2xzLlxuICogXG4gKiBAbWV0aG9kXG4gKiBAbmFtZSBnZXRWYWxpZGF0b3JzXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgQW5ndWxhciB2YWxpZGF0b3JzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjb250cm9sIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge0Zvcm1Db250cm9sQ29uZmlnfSBjb250cm9sIC0gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmb3JtIGNvbnRyb2wuXG4gKiBAcmV0dXJucyB7VmFsaWRhdG9yc1tdfSAtIEFuIGFycmF5IG9mIEFuZ3VsYXIgdmFsaWRhdG9ycy5cbiAqIFxuICogQG1ldGhvZFxuICogQG5hbWUgb25TdWJtaXRcbiAqIEBkZXNjcmlwdGlvblxuICogSGFuZGxlcyB0aGUgZm9ybSBzdWJtaXNzaW9uLiBNYXJrcyBhbGwgY29udHJvbHMgYXMgdG91Y2hlZCBhbmQgZGlydHksIHVwZGF0ZXMgdGhlIGZvcm0ncyB2YWxpZGl0eSxcbiAqIGVtaXRzIHRoZSBmb3JtIHZhbHVlcyBpZiB0aGUgZm9ybSBpcyB2YWxpZCwgYW5kIHJlc2V0cyB0aGUgZm9ybS4gVHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvbi5cbiAqL1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBpbnB1dCxcbiAgb3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUJ1aWxkZXIsXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xuaW1wb3J0IHsgTWF0UmFkaW9Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9yYWRpbyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VzQ29tcG9uZW50IH0gZnJvbSAnLi4vdmFsaWRhdGlvbi1tZXNzYWdlcy92YWxpZGF0aW9uLW1lc3NhZ2VzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbENvbmZpZyB9IGZyb20gJy4uL2Zvcm1Db250cm9sQ29uZmlnJztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgcHJvdmlkZU5hdGl2ZURhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0ZXJpYWwtZm9ybXMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgIE1hdFJhZGlvTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICBWYWxpZGF0aW9uTWVzc2FnZXNDb21wb25lbnQsXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gIF0sXG4gIHByb3ZpZGVyczogW3Byb3ZpZGVOYXRpdmVEYXRlQWRhcHRlcigpXSxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbWF0ZXJpYWwtZm9ybS5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdGVyaWFsRm9ybXNDb21wb25lbnQge1xuICBmb3JtTmFtZSA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgY29udHJvbHMgPSBpbnB1dC5yZXF1aXJlZDxGb3JtQ29udHJvbENvbmZpZ1tdPigpO1xuICBmb3JtU3VibWl0ID0gb3V0cHV0PFJlY29yZDxzdHJpbmcsIGFueT4+KCk7XG5cbiAgZm9ybSE6IEZvcm1Hcm91cDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVGb3JtKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1Db250cm9sczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gICAgdGhpcy5jb250cm9scygpLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgIGlmIChjb250cm9sLnR5cGUgPT09ICdkYXRlcGlja2VyJyAmJiBjb250cm9sLmRhdGVQaWNrZXJNb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIGZvcm1Db250cm9sc1tgJHtjb250cm9sLm5hbWV9X1N0YXJ0YF0gPSBbXG4gICAgICAgICAgY29udHJvbC52YWx1ZT8uc3RhcnQgPz8gJycsXG4gICAgICAgICAgdGhpcy5nZXRWYWxpZGF0b3JzKGNvbnRyb2wpLFxuICAgICAgICBdO1xuICAgICAgICBmb3JtQ29udHJvbHNbYCR7Y29udHJvbC5uYW1lfV9FbmRgXSA9IFtcbiAgICAgICAgICBjb250cm9sLnZhbHVlPy5lbmQgPz8gJycsXG4gICAgICAgICAgdGhpcy5nZXRWYWxpZGF0b3JzKGNvbnRyb2wpLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybUNvbnRyb2xzW2NvbnRyb2wubmFtZV0gPSBbXG4gICAgICAgICAgY29udHJvbC52YWx1ZSA/PyAnJyxcbiAgICAgICAgICB0aGlzLmdldFZhbGlkYXRvcnMoY29udHJvbCksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKGZvcm1Db250cm9scyk7XG4gIH1cblxuICBwcml2YXRlIGdldFZhbGlkYXRvcnMoY29udHJvbDogRm9ybUNvbnRyb2xDb25maWcpOiBWYWxpZGF0b3JzW10ge1xuICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvcnNbXSA9IFtdO1xuXG4gICAgaWYgKGNvbnRyb2wudmFsaWRhdG9ycykge1xuICAgICAgY29udHJvbC52YWxpZGF0b3JzLmZvckVhY2goKHZhbGlkYXRvcikgPT4ge1xuICAgICAgICBpZiAodmFsaWRhdG9yLnJlcXVpcmVkKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIGlmICh2YWxpZGF0b3IubWlubGVuZ3RoKVxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh2YWxpZGF0b3IubWlubGVuZ3RoKSk7XG4gICAgICAgIGlmICh2YWxpZGF0b3IubWF4bGVuZ3RoKVxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCh2YWxpZGF0b3IubWF4bGVuZ3RoKSk7XG4gICAgICAgIGlmICh2YWxpZGF0b3IucGF0dGVybilcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5wYXR0ZXJuKHZhbGlkYXRvci5wYXR0ZXJuKSk7XG4gICAgICAgIGlmICh2YWxpZGF0b3IuZW1haWwpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICAgICAgaWYgKHZhbGlkYXRvci5jdXN0b20pIHZhbGlkYXRvcnMucHVzaCh2YWxpZGF0b3IuY3VzdG9tKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG5cbiAgb25TdWJtaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmZvcm0ubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLmZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuXG4gICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5mb3JtU3VibWl0LmVtaXQodGhpcy5mb3JtLnZhbHVlKTtcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGb3JtIEludmFsaWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgW2F0dHIubmFtZV09XCJmb3JtTmFtZSgpXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIj5cbiAgQGZvciAoY29udHJvbCBvZiBjb250cm9scygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICBAaWYgKGNvbnRyb2wudWlGcmFtZXdvcmsgPT09IFwibWF0ZXJpYWxcIiB8fCAhY29udHJvbC51aUZyYW1ld29yaykge1xuICAgICAgQGlmIChmb3JtLmdldChjb250cm9sLm5hbWUpKSB7XG4gICAgICAgIDxzZWN0aW9uIFtuZ0NsYXNzXT1cImNvbnRyb2wuY2xhc3NcIiBbbmdTdHlsZV09XCJjb250cm9sLnN0eWxlXCI+XG4gICAgICAgICAgQGlmIChjb250cm9sLnR5cGUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgIEBpZiAoY29udHJvbC5sYWJlbCkge1xuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3sgY29udHJvbC5sYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29udHJvbC50eXBlID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgQGlmIChjb250cm9sLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBjb250cm9sLmxhYmVsIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIiBbaWRdPVwiY29udHJvbC5uYW1lXCI+XG4gICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGNvbnRyb2wub3B0aW9ucyA/PyBbXTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwib3B0aW9uXCI+e3sgb3B0aW9uIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChjb250cm9sLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiIFtpZF09XCJjb250cm9sLm5hbWVcIj5cbiAgICAgICAgICAgICAge3sgY29udHJvbC5sYWJlbCB9fVxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29udHJvbC50eXBlID09PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBjb250cm9sLm9wdGlvbnMgPz8gW107IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtpZF09XCJjb250cm9sLm5hbWUgKyAnLScgKyBvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgb3B0aW9uIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChjb250cm9sLnR5cGUgPT09IFwiZGF0ZXBpY2tlclwiKSB7XG4gICAgICAgICAgICBAaWYgKGNvbnRyb2wuZGF0ZVBpY2tlck1vZGUgPT09IFwic2luZ2xlXCIpIHtcbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5DaG9vc2UgYSBkYXRlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwiZGF0ZXBpY2tlclwiXG4gICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXG4gICAgICAgICAgICAgICAgICBtYXRJY29uU3VmZml4XG4gICAgICAgICAgICAgICAgICBbZm9yXT1cImRhdGVwaWNrZXJcIlxuICAgICAgICAgICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGVwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbnRyb2wuZGF0ZVBpY2tlck1vZGUgPT09IFwicmFuZ2VcIikge1xuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5FbnRlciBhIGRhdGUgcmFuZ2U8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8bWF0LWRhdGUtcmFuZ2UtaW5wdXRcbiAgICAgICAgICAgICAgICAgIFtyYW5nZVBpY2tlcl09XCJwaWNrZXJcIlxuICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgbWF0U3RhcnREYXRlXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGNvbnRyb2wubmFtZSB9fV9TdGFydFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU3RhcnQgZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIG1hdEVuZERhdGVcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgY29udHJvbC5uYW1lIH19X0VuZFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW5kIGRhdGVcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L21hdC1kYXRlLXJhbmdlLWlucHV0PlxuICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGVcbiAgICAgICAgICAgICAgICAgIG1hdEljb25TdWZmaXhcbiAgICAgICAgICAgICAgICAgIFtmb3JdPVwicGlja2VyXCJcbiAgICAgICAgICAgICAgICA+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgPG1hdC1kYXRlLXJhbmdlLXBpY2tlciAjcGlja2VyPjwvbWF0LWRhdGUtcmFuZ2UtcGlja2VyPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBAaWYgKGZvcm0uY29udHJvbHMuc3RhcnQuaGFzRXJyb3IoJ21hdFN0YXJ0RGF0ZUludmFsaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvcj5JbnZhbGlkIHN0YXJ0IGRhdGU8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmb3JtLmNvbnRyb2xzLmVuZC5oYXNFcnJvcignbWF0RW5kRGF0ZUludmFsaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvcj5JbnZhbGlkIGVuZCBkYXRlPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAtLT5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8dmFsaWRhdGlvbi1tZXNzYWdlc1xuICAgICAgICAgICAgW2NvbnRyb2xdPVwiZm9ybS5nZXQoY29udHJvbC5uYW1lKVwiXG4gICAgICAgICAgICBbY29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiY29udHJvbFwiXG4gICAgICAgICAgPjwvdmFsaWRhdGlvbi1tZXNzYWdlcz5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgfVxuICAgIH1cbiAgfVxuICA8YnV0dG9uXG4gICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWRcIlxuICA+XG4gICAgU3VibWl0XG4gIDwvYnV0dG9uPlxuPC9mb3JtPlxuIl19
108
+ ], providers: [provideNativeDateAdapter()], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"material\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.type === \"input\") {\n <mat-form-field appearance=\"outline\">\n @if (control.label) {\n <mat-label>{{ control.label }}</mat-label>\n }\n <input matInput [formControlName]=\"control.name\" [id]=\"control.name\" type=\"text\" />\n </mat-form-field>\n }\n @if (control.type === \"select\") {\n <mat-form-field appearance=\"outline\">\n @if (control.label) {\n <mat-label>{{ control.label }}</mat-label>\n }\n <mat-select [formControlName]=\"control.name\" [id]=\"control.name\">\n @for (option of control.options ?? []; track $index) {\n <mat-option [value]=\"option\">{{ option }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n @if (control.type === \"checkbox\") {\n <mat-checkbox [formControlName]=\"control.name\" [id]=\"control.name\">\n {{ control.label }}\n </mat-checkbox>\n }\n @if (control.type === \"radio\") {\n <mat-radio-group [formControlName]=\"control.name\">\n @for (option of control.options ?? []; track $index) {\n <mat-radio-button [id]=\"control.name + '-' + option\" [value]=\"option\">\n {{ option }}\n </mat-radio-button>\n }\n </mat-radio-group>\n }\n @if (control.type === \"datepicker\") {\n @if (control.datePickerMode === \"single\") {\n <mat-form-field appearance=\"outline\">\n <mat-label>Choose a date</mat-label>\n <input matInput [matDatepicker]=\"datepicker\" [formControlName]=\"control.name\" />\n <mat-datepicker-toggle matIconSuffix [for]=\"datepicker\"></mat-datepicker-toggle>\n <mat-datepicker #datepicker></mat-datepicker>\n </mat-form-field>\n } @else if (control.datePickerMode === \"range\") {\n <mat-form-field>\n <mat-label>Enter a date range</mat-label>\n <mat-date-range-input [rangePicker]=\"picker\" [formGroup]=\"form\" ]>\n <input matStartDate formControlName=\"{{ control.name }}_Start\" placeholder=\"Start date\" />\n <input matEndDate formControlName=\"{{ control.name }}_End\" placeholder=\"End date\" />\n </mat-date-range-input>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n\n <!-- @if (form.controls.start.hasError('matStartDateInvalid')) {\n <mat-error>Invalid start date</mat-error>\n }\n @if (form.controls.end.hasError('matEndDateInvalid')) {\n <mat-error>Invalid end date</mat-error>\n } -->\n </mat-form-field>\n }\n }\n\n <validation-messages [control]=\"form.get(control.name)\" [controlName]=\"control.name\"\n [config]=\"control\"></validation-messages>\n </section>\n }\n }\n }\n <button mat-raised-button color=\"primary\" type=\"submit\" [disabled]=\"form.invalid\">\n Submit\n </button>\n</form>" }]
109
+ }] });
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9uZ0Zvcm0vc3JjL2FwcC9tYXRlcmlhbC1mb3JtL21hdGVyaWFsLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbmdGb3JtL3NyYy9hcHAvbWF0ZXJpYWwtZm9ybS9tYXRlcmlhbC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0VHO0FBQ0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsdUJBQXVCLEdBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxtQkFBbUIsR0FDcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDbkcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7OztBQXVCdkQsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGtCQUFrQjt3R0FBakQsc0JBQXNCOzRGQUF0QixzQkFBc0IsNkRBSnRCLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxpRENyR3pDLDZ0R0E0RU8sMkNEY0gsWUFBWSxpTkFDWixtQkFBbUIsNDhCQUNuQixjQUFjLHV2QkFDZCxlQUFlLG1yQkFDZixpQkFBaUIsb1lBQ2pCLGNBQWMsb2xCQUNkLGVBQWUsNE5BQ2YsMkJBQTJCLDZHQUMzQixtQkFBbUIsMmxDQUNuQixrQkFBa0I7OzRGQU1ULHNCQUFzQjtrQkFwQmxDLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQO3dCQUNQLGtCQUFrQjt3QkFDbEIsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZiwyQkFBMkI7d0JBQzNCLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3FCQUNuQixhQUNVLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxtQkFFdEIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGNvbXBvbmVudFxuICogQG5hbWUgTWF0ZXJpYWxGb3Jtc0NvbXBvbmVudFxuICogQGRlc2NyaXB0aW9uXG4gKiBBIHN0YW5kYWxvbmUgQW5ndWxhciBjb21wb25lbnQgdGhhdCByZW5kZXJzIGEgZHluYW1pYyBmb3JtIHVzaW5nIEFuZ3VsYXIgTWF0ZXJpYWwgY29tcG9uZW50cy5cbiAqIFRoZSBmb3JtIGNvbmZpZ3VyYXRpb24gaXMgcHJvdmlkZWQgdmlhIGlucHV0cywgYW5kIHRoZSBmb3JtIHN1Ym1pc3Npb24gaXMgaGFuZGxlZCB2aWEgYW4gb3V0cHV0IGV2ZW50LlxuICogXG4gKiBAc2VsZWN0b3IgbWF0ZXJpYWwtZm9ybXNcbiAqIEBzdGFuZGFsb25lIHRydWVcbiAqIEBpbXBvcnRzXG4gKiAtIENvbW1vbk1vZHVsZVxuICogLSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiAtIE1hdElucHV0TW9kdWxlXG4gKiAtIE1hdFNlbGVjdE1vZHVsZVxuICogLSBNYXRDaGVja2JveE1vZHVsZVxuICogLSBNYXRSYWRpb01vZHVsZVxuICogLSBNYXRCdXR0b25Nb2R1bGVcbiAqIC0gVmFsaWRhdGlvbk1lc3NhZ2VzQ29tcG9uZW50XG4gKiAtIE1hdERhdGVwaWNrZXJNb2R1bGVcbiAqIC0gTWF0Rm9ybUZpZWxkTW9kdWxlXG4gKiBAcHJvdmlkZXJzIHByb3ZpZGVOYXRpdmVEYXRlQWRhcHRlclxuICogQHRlbXBsYXRlVXJsIC4vbWF0ZXJpYWwtZm9ybS5jb21wb25lbnQuaHRtbFxuICogQHN0eWxlVXJsIC4vbWF0ZXJpYWwtZm9ybS5jb21wb25lbnQuY3NzXG4gKiBAY2hhbmdlRGV0ZWN0aW9uIENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxuICogXG4gKiBAaW5wdXRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm9ybU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZm9ybS5cbiAqIEBwcm9wZXJ0eSB7Rm9ybUNvbnRyb2xDb25maWdbXX0gY29udHJvbHMgLSBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZvcm0gY29udHJvbHMuXG4gKiBcbiAqIEBvdXRwdXRzXG4gKiBAcHJvcGVydHkge0V2ZW50RW1pdHRlcjxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gZm9ybVN1Ym1pdCAtIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQuXG4gKiBcbiAqIEBjbGFzc1xuICogQG5hbWUgTWF0ZXJpYWxGb3Jtc0NvbXBvbmVudFxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIE1hdGVyaWFsRm9ybXNDb21wb25lbnQgd2hpY2ggaW5pdGlhbGl6ZXMgdGhlIGZvcm0gYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbnRyb2xzIGNvbmZpZ3VyYXRpb24sXG4gKiBoYW5kbGVzIGZvcm0gc3VibWlzc2lvbiwgYW5kIHByb3ZpZGVzIHZhbGlkYXRpb24gZm9yIHRoZSBmb3JtIGNvbnRyb2xzLlxuICogXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Rm9ybUJ1aWxkZXJ9IGZiIC0gQW5ndWxhciBGb3JtQnVpbGRlciBzZXJ2aWNlIHRvIGNyZWF0ZSBmb3JtIGdyb3VwcyBhbmQgY29udHJvbHMuXG4gKiBAcGFyYW0ge0NoYW5nZURldGVjdG9yUmVmfSBjZHIgLSBBbmd1bGFyIENoYW5nZURldGVjdG9yUmVmIHNlcnZpY2UgdG8gbWFudWFsbHkgdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICogXG4gKiBAbWV0aG9kXG4gKiBAbmFtZSBuZ09uSW5pdFxuICogQGRlc2NyaXB0aW9uXG4gKiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciB0aGUgY29tcG9uZW50J3MgdmlldyBoYXMgYmVlbiBpbml0aWFsaXplZC4gSXQgaW5pdGlhbGl6ZXMgdGhlIGZvcm0uXG4gKiBcbiAqIEBtZXRob2RcbiAqIEBuYW1lIGluaXRpYWxpemVGb3JtXG4gKiBAZGVzY3JpcHRpb25cbiAqIEluaXRpYWxpemVzIHRoZSBmb3JtIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLiBTdXBwb3J0cyBkYXRlcGlja2VyIHJhbmdlIGNvbnRyb2xzLlxuICogXG4gKiBAbWV0aG9kXG4gKiBAbmFtZSBnZXRWYWxpZGF0b3JzXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgQW5ndWxhciB2YWxpZGF0b3JzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjb250cm9sIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge0Zvcm1Db250cm9sQ29uZmlnfSBjb250cm9sIC0gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmb3JtIGNvbnRyb2wuXG4gKiBAcmV0dXJucyB7VmFsaWRhdG9yc1tdfSAtIEFuIGFycmF5IG9mIEFuZ3VsYXIgdmFsaWRhdG9ycy5cbiAqIFxuICogQG1ldGhvZFxuICogQG5hbWUgb25TdWJtaXRcbiAqIEBkZXNjcmlwdGlvblxuICogSGFuZGxlcyB0aGUgZm9ybSBzdWJtaXNzaW9uLiBNYXJrcyBhbGwgY29udHJvbHMgYXMgdG91Y2hlZCBhbmQgZGlydHksIHVwZGF0ZXMgdGhlIGZvcm0ncyB2YWxpZGl0eSxcbiAqIGVtaXRzIHRoZSBmb3JtIHZhbHVlcyBpZiB0aGUgZm9ybSBpcyB2YWxpZCwgYW5kIHJlc2V0cyB0aGUgZm9ybS4gVHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvbi5cbiAqL1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXRSYWRpb01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3JhZGlvJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZXNDb21wb25lbnQgfSBmcm9tICcuLi92YWxpZGF0aW9uLW1lc3NhZ2VzL3ZhbGlkYXRpb24tbWVzc2FnZXMuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgcHJvdmlkZU5hdGl2ZURhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBCYXNlRm9ybXNDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlLmNvbXBvbmVudCc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0ZXJpYWwtZm9ybXMnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQmFzZUZvcm1zQ29tcG9uZW50LFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIE1hdElucHV0TW9kdWxlLFxuICAgIE1hdFNlbGVjdE1vZHVsZSxcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcbiAgICBNYXRSYWRpb01vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgVmFsaWRhdGlvbk1lc3NhZ2VzQ29tcG9uZW50LFxuICAgIE1hdERhdGVwaWNrZXJNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICBdLFxuICBwcm92aWRlcnM6IFtwcm92aWRlTmF0aXZlRGF0ZUFkYXB0ZXIoKV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXRlcmlhbC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdGVyaWFsRm9ybXNDb21wb25lbnQgZXh0ZW5kcyBCYXNlRm9ybXNDb21wb25lbnQge30iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBbYXR0ci5uYW1lXT1cImZvcm1OYW1lKClcIiAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiPlxuICBAZm9yIChjb250cm9sIG9mIGNvbnRyb2xzKCk7IHRyYWNrICRpbmRleCkge1xuICBAaWYgKGNvbnRyb2wudWlGcmFtZXdvcmsgPT09IFwibWF0ZXJpYWxcIiB8fCAhY29udHJvbC51aUZyYW1ld29yaykge1xuICBAaWYgKGZvcm0uZ2V0KGNvbnRyb2wubmFtZSkpIHtcbiAgPHNlY3Rpb24gW25nQ2xhc3NdPVwiY29udHJvbC5jbGFzc1wiIFtuZ1N0eWxlXT1cImNvbnRyb2wuc3R5bGVcIj5cbiAgICBAaWYgKGNvbnRyb2wudHlwZSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICBAaWYgKGNvbnRyb2wubGFiZWwpIHtcbiAgICAgIDxtYXQtbGFiZWw+e3sgY29udHJvbC5sYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgICAgfVxuICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCIgW2lkXT1cImNvbnRyb2wubmFtZVwiIHR5cGU9XCJ0ZXh0XCIgLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIH1cbiAgICBAaWYgKGNvbnRyb2wudHlwZSA9PT0gXCJzZWxlY3RcIikge1xuICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgQGlmIChjb250cm9sLmxhYmVsKSB7XG4gICAgICA8bWF0LWxhYmVsPnt7IGNvbnRyb2wubGFiZWwgfX08L21hdC1sYWJlbD5cbiAgICAgIH1cbiAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCIgW2lkXT1cImNvbnRyb2wubmFtZVwiPlxuICAgICAgICBAZm9yIChvcHRpb24gb2YgY29udHJvbC5vcHRpb25zID8/IFtdOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIm9wdGlvblwiPnt7IG9wdGlvbiB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgfVxuICAgICAgPC9tYXQtc2VsZWN0PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgfVxuICAgIEBpZiAoY29udHJvbC50eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICA8bWF0LWNoZWNrYm94IFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCIgW2lkXT1cImNvbnRyb2wubmFtZVwiPlxuICAgICAge3sgY29udHJvbC5sYWJlbCB9fVxuICAgIDwvbWF0LWNoZWNrYm94PlxuICAgIH1cbiAgICBAaWYgKGNvbnRyb2wudHlwZSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgPG1hdC1yYWRpby1ncm91cCBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiPlxuICAgICAgQGZvciAob3B0aW9uIG9mIGNvbnRyb2wub3B0aW9ucyA/PyBbXTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICA8bWF0LXJhZGlvLWJ1dHRvbiBbaWRdPVwiY29udHJvbC5uYW1lICsgJy0nICsgb3B0aW9uXCIgW3ZhbHVlXT1cIm9wdGlvblwiPlxuICAgICAgICB7eyBvcHRpb24gfX1cbiAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICB9XG4gICAgQGlmIChjb250cm9sLnR5cGUgPT09IFwiZGF0ZXBpY2tlclwiKSB7XG4gICAgQGlmIChjb250cm9sLmRhdGVQaWNrZXJNb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICA8bWF0LWxhYmVsPkNob29zZSBhIGRhdGU8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJkYXRlcGlja2VyXCIgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIiAvPlxuICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRJY29uU3VmZml4IFtmb3JdPVwiZGF0ZXBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgPG1hdC1kYXRlcGlja2VyICNkYXRlcGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICB9IEBlbHNlIGlmIChjb250cm9sLmRhdGVQaWNrZXJNb2RlID09PSBcInJhbmdlXCIpIHtcbiAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWxhYmVsPkVudGVyIGEgZGF0ZSByYW5nZTwvbWF0LWxhYmVsPlxuICAgICAgPG1hdC1kYXRlLXJhbmdlLWlucHV0IFtyYW5nZVBpY2tlcl09XCJwaWNrZXJcIiBbZm9ybUdyb3VwXT1cImZvcm1cIiBdPlxuICAgICAgICA8aW5wdXQgbWF0U3RhcnREYXRlIGZvcm1Db250cm9sTmFtZT1cInt7IGNvbnRyb2wubmFtZSB9fV9TdGFydFwiIHBsYWNlaG9sZGVyPVwiU3RhcnQgZGF0ZVwiIC8+XG4gICAgICAgIDxpbnB1dCBtYXRFbmREYXRlIGZvcm1Db250cm9sTmFtZT1cInt7IGNvbnRyb2wubmFtZSB9fV9FbmRcIiBwbGFjZWhvbGRlcj1cIkVuZCBkYXRlXCIgLz5cbiAgICAgIDwvbWF0LWRhdGUtcmFuZ2UtaW5wdXQ+XG4gICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdEljb25TdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgIDxtYXQtZGF0ZS1yYW5nZS1waWNrZXIgI3BpY2tlcj48L21hdC1kYXRlLXJhbmdlLXBpY2tlcj5cblxuICAgICAgPCEtLSBAaWYgKGZvcm0uY29udHJvbHMuc3RhcnQuaGFzRXJyb3IoJ21hdFN0YXJ0RGF0ZUludmFsaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvcj5JbnZhbGlkIHN0YXJ0IGRhdGU8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmb3JtLmNvbnRyb2xzLmVuZC5oYXNFcnJvcignbWF0RW5kRGF0ZUludmFsaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvcj5JbnZhbGlkIGVuZCBkYXRlPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAtLT5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIH1cbiAgICB9XG5cbiAgICA8dmFsaWRhdGlvbi1tZXNzYWdlcyBbY29udHJvbF09XCJmb3JtLmdldChjb250cm9sLm5hbWUpXCIgW2NvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICBbY29uZmlnXT1cImNvbnRyb2xcIj48L3ZhbGlkYXRpb24tbWVzc2FnZXM+XG4gIDwvc2VjdGlvbj5cbiAgfVxuICB9XG4gIH1cbiAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiPlxuICAgIFN1Ym1pdFxuICA8L2J1dHRvbj5cbjwvZm9ybT4iXX0=