@bsachref/ng-form 1.0.2

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.
@@ -0,0 +1,210 @@
1
+ /**
2
+ * PrimeNgFormsComponent is a standalone Angular component that dynamically generates
3
+ * a form based on the provided configuration. It leverages PrimeNG UI components
4
+ * and Angular Reactive Forms for form creation and validation.
5
+ *
6
+ * @selector primeng-forms
7
+ * @standalone true
8
+ * @imports [
9
+ * CommonModule,
10
+ * FormsModule,
11
+ * ReactiveFormsModule,
12
+ * ValidationMessagesComponent,
13
+ * InputTextModule,
14
+ * MultiSelectModule,
15
+ * TextareaModule,
16
+ * CheckboxModule,
17
+ * RadioButtonModule,
18
+ * DatePickerModule,
19
+ * ToggleButtonModule,
20
+ * FileUploadModule,
21
+ * SliderModule,
22
+ * ButtonModule,
23
+ * SelectModule,
24
+ * FileUploadValueAccessor
25
+ * ]
26
+ * @templateUrl ./prime-form.component.html
27
+ * @styleUrl ./prime-form.component.css
28
+ * @changeDetection ChangeDetectionStrategy.OnPush
29
+ *
30
+ * @property {string} formName - The name of the form.
31
+ * @property {FormControlConfig[]} controls - The configuration for the form controls.
32
+ * @property {EventEmitter<Record<string, any>>} formSubmit - Event emitter for form submission.
33
+ * @property {FormGroup} form - The reactive form group.
34
+ * @property {BehaviorSubject<boolean>} formChanges$ - Observable to track form changes.
35
+ *
36
+ * @constructor
37
+ * @param {FormBuilder} fb - FormBuilder service to create form controls.
38
+ * @param {ChangeDetectorRef} cdr - ChangeDetectorRef to manually trigger change detection.
39
+ *
40
+ * @method ngOnInit - Lifecycle hook that initializes the form.
41
+ * @method initializeForm - Initializes the form controls and sets up value change subscriptions.
42
+ * @method getValidators - Returns an array of validators for a given form control configuration.
43
+ * @param {FormControlConfig} control - The configuration for a form control.
44
+ * @returns {ValidatorFn[]} - An array of validator functions.
45
+ * @method updateValidators - Updates the validators for a form control based on its value.
46
+ * @param {AbstractControl} control - The form control to update.
47
+ * @param {any} value - The current value of the form control.
48
+ * @method shouldRequireValidation - Determines if a form control should require validation.
49
+ * @param {any} value - The current value of the form control.
50
+ * @returns {boolean} - True if validation is required, false otherwise.
51
+ * @method onFileSelect - Handles file selection for file upload controls.
52
+ * @param {any} event - The file selection event.
53
+ * @param {string} controlName - The name of the form control.
54
+ * @method onSubmit - Handles form submission, validates the form, and emits the form value.
55
+ */
56
+ import { CommonModule } from '@angular/common';
57
+ import { ChangeDetectionStrategy, Component, input, output, } from '@angular/core';
58
+ import { ReactiveFormsModule, FormsModule, Validators, } from '@angular/forms';
59
+ import { ValidationMessagesComponent } from '../validation-messages/validation-messages.component';
60
+ import { BehaviorSubject } from 'rxjs';
61
+ import { InputTextModule } from 'primeng/inputtext';
62
+ import { MultiSelectModule } from 'primeng/multiselect';
63
+ import { TextareaModule } from 'primeng/textarea';
64
+ import { CheckboxModule } from 'primeng/checkbox';
65
+ import { RadioButtonModule } from 'primeng/radiobutton';
66
+ import { ToggleButtonModule } from 'primeng/togglebutton';
67
+ import { FileUploadModule } from 'primeng/fileupload';
68
+ import { SliderModule } from 'primeng/slider';
69
+ import { ButtonModule } from 'primeng/button';
70
+ import { DatePickerModule } from 'primeng/datepicker';
71
+ import { SelectModule } from 'primeng/select';
72
+ import { FileUploadValueAccessor } from '../file-upload-accessor.directive';
73
+ import * as i0 from "@angular/core";
74
+ import * as i1 from "@angular/forms";
75
+ import * as i2 from "@angular/common";
76
+ import * as i3 from "primeng/inputtext";
77
+ import * as i4 from "primeng/multiselect";
78
+ import * as i5 from "primeng/textarea";
79
+ import * as i6 from "primeng/checkbox";
80
+ import * as i7 from "primeng/radiobutton";
81
+ import * as i8 from "primeng/datepicker";
82
+ import * as i9 from "primeng/togglebutton";
83
+ import * as i10 from "primeng/slider";
84
+ import * as i11 from "primeng/button";
85
+ import * as i12 from "primeng/select";
86
+ export class PrimeNgFormsComponent {
87
+ fb;
88
+ cdr;
89
+ formName = input.required();
90
+ controls = input.required();
91
+ formSubmit = output();
92
+ form;
93
+ formChanges$ = new BehaviorSubject(false);
94
+ constructor(fb, cdr) {
95
+ this.fb = fb;
96
+ this.cdr = cdr;
97
+ }
98
+ ngOnInit() {
99
+ this.initializeForm();
100
+ }
101
+ initializeForm() {
102
+ const formControls = {};
103
+ this.controls().forEach((control) => {
104
+ formControls[control.name] = [
105
+ control.value ?? null,
106
+ this.getValidators(control),
107
+ ];
108
+ });
109
+ this.form = this.fb.group(formControls);
110
+ this.controls().forEach((control) => {
111
+ const formControl = this.form.get(control.name);
112
+ if (formControl) {
113
+ formControl.valueChanges.subscribe((value) => {
114
+ this.updateValidators(formControl, value);
115
+ });
116
+ }
117
+ });
118
+ this.formChanges$.subscribe(() => this.cdr.markForCheck());
119
+ }
120
+ getValidators(control) {
121
+ const validators = [];
122
+ if (control.validators) {
123
+ control.validators.forEach((validator) => {
124
+ if (validator.required)
125
+ validators.push(Validators.required);
126
+ if (validator.minlength)
127
+ validators.push(Validators.minLength(validator.minlength));
128
+ if (validator.maxlength)
129
+ validators.push(Validators.maxLength(validator.maxlength));
130
+ if (validator.pattern)
131
+ validators.push(Validators.pattern(validator.pattern));
132
+ if (validator.email)
133
+ validators.push(Validators.email);
134
+ if (validator.custom)
135
+ validators.push(validator.custom);
136
+ });
137
+ }
138
+ return validators;
139
+ }
140
+ updateValidators(control, value) {
141
+ if (this.shouldRequireValidation(value)) {
142
+ control.addValidators(Validators.required);
143
+ }
144
+ else {
145
+ control.removeValidators(Validators.required);
146
+ }
147
+ control.updateValueAndValidity();
148
+ this.formChanges$.next(true);
149
+ }
150
+ shouldRequireValidation(value) {
151
+ return value !== null && value !== '';
152
+ }
153
+ onFileSelect(event, controlName) {
154
+ const file = event.files[0]; // Getting the first selected file
155
+ if (file) {
156
+ console.log(`Selected file for ${controlName}:`, file);
157
+ console.log(this.form.get(controlName)?.value);
158
+ this.form.get(controlName)?.setValue(file);
159
+ console.log(this.form.get(controlName)?.value);
160
+ this.form.get(controlName)?.updateValueAndValidity(); // Update the form control's validity
161
+ // Emit the onUpload event if defined
162
+ const controlConfig = this.controls().find(control => control.name === controlName);
163
+ if (controlConfig?.events?.onUpload) {
164
+ controlConfig.events.onUpload(event);
165
+ }
166
+ }
167
+ }
168
+ onSubmit() {
169
+ this.form.markAllAsTouched();
170
+ this.form.markAsDirty();
171
+ this.form.updateValueAndValidity();
172
+ if (this.form.valid) {
173
+ this.formSubmit.emit(this.form.value);
174
+ this.form.reset();
175
+ // Clear the file input
176
+ const fileInput = document.querySelector('input[type="file"]');
177
+ if (fileInput) {
178
+ fileInput.value = '';
179
+ }
180
+ }
181
+ else {
182
+ console.error('Form Invalid');
183
+ }
184
+ this.formChanges$.next(true);
185
+ }
186
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrimeNgFormsComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
187
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: PrimeNgFormsComponent, isStandalone: true, selector: "primeng-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" }, ngImport: i0, template: "<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"primeng\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.label) {\n <label\n [attr.for]=\"control.name\"\n [ngClass]=\"control.labelClass\"\n [ngStyle]=\"control.labelStyle\"\n >\n {{ control.label }}\n </label>\n }\n\n @switch (control.type) {\n @case (\"text\") {\n <input\n pInputText\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"number\") {\n <input\n pInputText\n type=\"number\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"password\") {\n <input\n pInputText\n type=\"password\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"email\") {\n <input\n pInputText\n type=\"email\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"select\") {\n <p-select\n [options]=\"control.options\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n />\n }\n @case (\"multi-select\") {\n <p-multiSelect\n [options]=\"control.options\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-multiSelect>\n }\n @case (\"textarea\") {\n <textarea\n pTextarea\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n ></textarea>\n }\n @case (\"checkbox\") {\n <p-checkbox\n [binary]=\"true\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-checkbox>\n }\n @case (\"radio\") {\n @for (option of control.options ?? []; track $index) {\n <div>\n <p-radioButton\n [name]=\"control.name\"\n [formControlName]=\"control.name\"\n [value]=\"option\"\n [inputId]=\"'radio-' + option\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-radioButton>\n <label [for]=\"'radio-' + option\">{{ option }}</label>\n </div>\n }\n }\n @case (\"date\") {\n <p-datepicker\n [formControlName]=\"control.name\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n />\n }\n @case (\"toggle\") {\n <p-toggleButton\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-toggleButton>\n }\n <!-- @case (\"file\") {\n <p-fileUpload \n [customUpload]=\"true\"\n [formControlName]=\"control.name\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onClear)=\"control.events?.onClear?.($event)\"\n (onRemove)=\"control.events?.onRemove?.($event)\"\n (onError)=\"control.events?.onError?.($event)\"\n (onBeforeUpload)=\"control.events?.onBeforeUpload?.($event)\"\n (onProgress)=\"control.events?.onProgress?.($event)\"\n (onUpload)=\"control.events?.onUpload?.($event)\"\n >\n\n <p-fileUpload\n [customUpload]=\"true\"\n (onUpload)=\"onFileSelect($event, control.name)\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n [chooseLabel]=\"control.primeng?.chooseLabel\"\n [uploadLabel]=\"control.primeng?.uploadLabel\"\n [cancelLabel]=\"control.primeng?.cancelLabel\"\n [auto]=\"control.primeng?.auto\"\n [url]=\"control.primeng?.url\"\n [withCredentials]=\"control.primeng?.withCredentials\"\n [multiple]=\"control.primeng?.multiple\"\n [maxFileSize]=\"control.primeng?.maxFileSize\"\n [customUpload]=\"control.primeng?.customUpload\"\n [showUploadButton]=\"control.primeng?.showUploadButton\"\n [showCancelButton]=\"control.primeng?.showCancelButton\"\n [accept]=\"control.primeng?.accept\"\n [mode]=\"control.primeng?.mode\"\n [previewWidth]=\"control.primeng?.previewWidth\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onClear)=\"control.events?.onClear?.($event)\"\n (onRemove)=\"control.events?.onRemove?.($event)\"\n (onError)=\"control.events?.onError?.($event)\"\n (onBeforeUpload)=\"control.events?.onBeforeUpload?.($event)\"\n (onProgress)=\"control.events?.onProgress?.($event)\"\n (onUpload)=\"control.events?.onUpload?.($event)\"\n >\n <ng-template pTemplate=\"content\">\n <p-button label=\"Choose File\" icon=\"pi pi-upload\"></p-button>\n </ng-template>\n </p-fileUpload>\n } -->\n @case (\"slider\") {\n <p-slider\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onSlideEnd)=\"control.events?.onSlideEnd?.($event)\"\n ></p-slider>\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 pButton\n type=\"submit\"\n [disabled]=\"form.invalid\"\n label=\"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: FormsModule }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ValidationMessagesComponent, selector: "validation-messages", inputs: ["control", "controlName", "config"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant", "fluid", "pSize"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i4.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "fluid", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "size", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "ngmodule", type: TextareaModule }, { kind: "directive", type: i5.Textarea, selector: "[pTextarea]", inputs: ["autoResize", "variant", "fluid", "pSize"], outputs: ["onResize"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox, p-checkBox, p-check-box", inputs: ["value", "name", "disabled", "binary", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "inputStyle", "styleClass", "inputClass", "indeterminate", "size", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: RadioButtonModule }, { kind: "component", type: i7.RadioButton, selector: "p-radioButton, p-radiobutton, p-radio-button", inputs: ["value", "formControlName", "name", "disabled", "variant", "size", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "style", "styleClass", "autofocus", "binary"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DatePickerModule }, { kind: "component", type: i8.DatePicker, selector: "p-datePicker, p-datepicker, p-date-picker", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "fluid", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "size", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: ToggleButtonModule }, { kind: "component", type: i9.ToggleButton, selector: "p-toggleButton, p-togglebutton, p-toggle-button", inputs: ["onLabel", "offLabel", "onIcon", "offIcon", "ariaLabel", "ariaLabelledBy", "disabled", "style", "styleClass", "inputId", "tabindex", "size", "iconPos", "autofocus", "allowEmpty"], outputs: ["onChange"] }, { kind: "ngmodule", type: FileUploadModule }, { kind: "ngmodule", type: SliderModule }, { kind: "component", type: i10.Slider, selector: "p-slider", inputs: ["animate", "disabled", "min", "max", "orientation", "step", "range", "style", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i11.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i12.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "size", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "fluid", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
188
+ }
189
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PrimeNgFormsComponent, decorators: [{
190
+ type: Component,
191
+ args: [{ selector: 'primeng-forms', standalone: true, imports: [
192
+ CommonModule,
193
+ FormsModule,
194
+ ReactiveFormsModule,
195
+ ValidationMessagesComponent,
196
+ InputTextModule,
197
+ MultiSelectModule,
198
+ TextareaModule,
199
+ CheckboxModule,
200
+ RadioButtonModule,
201
+ DatePickerModule,
202
+ ToggleButtonModule,
203
+ FileUploadModule,
204
+ SliderModule,
205
+ ButtonModule,
206
+ SelectModule,
207
+ FileUploadValueAccessor
208
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"primeng\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.label) {\n <label\n [attr.for]=\"control.name\"\n [ngClass]=\"control.labelClass\"\n [ngStyle]=\"control.labelStyle\"\n >\n {{ control.label }}\n </label>\n }\n\n @switch (control.type) {\n @case (\"text\") {\n <input\n pInputText\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"number\") {\n <input\n pInputText\n type=\"number\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"password\") {\n <input\n pInputText\n type=\"password\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"email\") {\n <input\n pInputText\n type=\"email\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"select\") {\n <p-select\n [options]=\"control.options\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n />\n }\n @case (\"multi-select\") {\n <p-multiSelect\n [options]=\"control.options\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-multiSelect>\n }\n @case (\"textarea\") {\n <textarea\n pTextarea\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n ></textarea>\n }\n @case (\"checkbox\") {\n <p-checkbox\n [binary]=\"true\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-checkbox>\n }\n @case (\"radio\") {\n @for (option of control.options ?? []; track $index) {\n <div>\n <p-radioButton\n [name]=\"control.name\"\n [formControlName]=\"control.name\"\n [value]=\"option\"\n [inputId]=\"'radio-' + option\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-radioButton>\n <label [for]=\"'radio-' + option\">{{ option }}</label>\n </div>\n }\n }\n @case (\"date\") {\n <p-datepicker\n [formControlName]=\"control.name\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n />\n }\n @case (\"toggle\") {\n <p-toggleButton\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-toggleButton>\n }\n <!-- @case (\"file\") {\n <p-fileUpload \n [customUpload]=\"true\"\n [formControlName]=\"control.name\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onClear)=\"control.events?.onClear?.($event)\"\n (onRemove)=\"control.events?.onRemove?.($event)\"\n (onError)=\"control.events?.onError?.($event)\"\n (onBeforeUpload)=\"control.events?.onBeforeUpload?.($event)\"\n (onProgress)=\"control.events?.onProgress?.($event)\"\n (onUpload)=\"control.events?.onUpload?.($event)\"\n >\n\n <p-fileUpload\n [customUpload]=\"true\"\n (onUpload)=\"onFileSelect($event, control.name)\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n [chooseLabel]=\"control.primeng?.chooseLabel\"\n [uploadLabel]=\"control.primeng?.uploadLabel\"\n [cancelLabel]=\"control.primeng?.cancelLabel\"\n [auto]=\"control.primeng?.auto\"\n [url]=\"control.primeng?.url\"\n [withCredentials]=\"control.primeng?.withCredentials\"\n [multiple]=\"control.primeng?.multiple\"\n [maxFileSize]=\"control.primeng?.maxFileSize\"\n [customUpload]=\"control.primeng?.customUpload\"\n [showUploadButton]=\"control.primeng?.showUploadButton\"\n [showCancelButton]=\"control.primeng?.showCancelButton\"\n [accept]=\"control.primeng?.accept\"\n [mode]=\"control.primeng?.mode\"\n [previewWidth]=\"control.primeng?.previewWidth\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onClear)=\"control.events?.onClear?.($event)\"\n (onRemove)=\"control.events?.onRemove?.($event)\"\n (onError)=\"control.events?.onError?.($event)\"\n (onBeforeUpload)=\"control.events?.onBeforeUpload?.($event)\"\n (onProgress)=\"control.events?.onProgress?.($event)\"\n (onUpload)=\"control.events?.onUpload?.($event)\"\n >\n <ng-template pTemplate=\"content\">\n <p-button label=\"Choose File\" icon=\"pi pi-upload\"></p-button>\n </ng-template>\n </p-fileUpload>\n } -->\n @case (\"slider\") {\n <p-slider\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onSlideEnd)=\"control.events?.onSlideEnd?.($event)\"\n ></p-slider>\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 pButton\n type=\"submit\"\n [disabled]=\"form.invalid\"\n label=\"Submit\"\n ></button>\n</form>\n" }]
209
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }] });
210
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbWUtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9uZ0Zvcm0vc3JjL2FwcC9wcmltZS1mb3JtL3ByaW1lLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbmdGb3JtL3NyYy9hcHAvcHJpbWUtZm9ybS9wcmltZS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7QUFDSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFdBQVcsRUFJWCxVQUFVLEdBRVgsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUVuRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUs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RUFBRSxDQUFDO2dCQUNkLFNBQVMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7d0dBaEhVLHFCQUFxQjs0RkFBckIscUJBQXFCLDRYQ2xIbEMsNnRTQXFOQSx5RER4SEksWUFBWSxpTkFDWixXQUFXLDZ6QkFDWCxtQkFBbUIsZ1ZBQ25CLDJCQUEyQiw2R0FDM0IsZUFBZSwwSUFDZixpQkFBaUIsZzVDQUNqQixjQUFjLDZLQUNkLGNBQWMsa2NBQ2QsaUJBQWlCLGlXQUNqQixnQkFBZ0IsMDFDQUNoQixrQkFBa0IsNlZBQ2xCLGdCQUFnQiw4QkFDaEIsWUFBWSxnU0FDWixZQUFZLHFRQUNaLFlBQVk7OzRGQU9ILHFCQUFxQjtrQkF6QmpDLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsbUJBQW1CO3dCQUNuQiwyQkFBMkI7d0JBQzNCLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixjQUFjO3dCQUNkLGNBQWM7d0JBQ2QsaUJBQWlCO3dCQUNqQixnQkFBZ0I7d0JBQ2hCLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLFlBQVk7d0JBQ1osWUFBWTt3QkFDWix1QkFBdUI7cUJBQ3hCLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQcmltZU5nRm9ybXNDb21wb25lbnQgaXMgYSBzdGFuZGFsb25lIEFuZ3VsYXIgY29tcG9uZW50IHRoYXQgZHluYW1pY2FsbHkgZ2VuZXJhdGVzXG4gKiBhIGZvcm0gYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24uIEl0IGxldmVyYWdlcyBQcmltZU5HIFVJIGNvbXBvbmVudHNcbiAqIGFuZCBBbmd1bGFyIFJlYWN0aXZlIEZvcm1zIGZvciBmb3JtIGNyZWF0aW9uIGFuZCB2YWxpZGF0aW9uLlxuICogXG4gKiBAc2VsZWN0b3IgcHJpbWVuZy1mb3Jtc1xuICogQHN0YW5kYWxvbmUgdHJ1ZVxuICogQGltcG9ydHMgW1xuICogICBDb21tb25Nb2R1bGUsXG4gKiAgIEZvcm1zTW9kdWxlLFxuICogICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICogICBWYWxpZGF0aW9uTWVzc2FnZXNDb21wb25lbnQsXG4gKiAgIElucHV0VGV4dE1vZHVsZSxcbiAqICAgTXVsdGlTZWxlY3RNb2R1bGUsXG4gKiAgIFRleHRhcmVhTW9kdWxlLFxuICogICBDaGVja2JveE1vZHVsZSxcbiAqICAgUmFkaW9CdXR0b25Nb2R1bGUsXG4gKiAgIERhdGVQaWNrZXJNb2R1bGUsXG4gKiAgIFRvZ2dsZUJ1dHRvbk1vZHVsZSxcbiAqICAgRmlsZVVwbG9hZE1vZHVsZSxcbiAqICAgU2xpZGVyTW9kdWxlLFxuICogICBCdXR0b25Nb2R1bGUsXG4gKiAgIFNlbGVjdE1vZHVsZSxcbiAqICAgRmlsZVVwbG9hZFZhbHVlQWNjZXNzb3JcbiAqIF1cbiAqIEB0ZW1wbGF0ZVVybCAuL3ByaW1lLWZvcm0uY29tcG9uZW50Lmh0bWxcbiAqIEBzdHlsZVVybCAuL3ByaW1lLWZvcm0uY29tcG9uZW50LmNzc1xuICogQGNoYW5nZURldGVjdGlvbiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbiAqIFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZvcm0uXG4gKiBAcHJvcGVydHkge0Zvcm1Db250cm9sQ29uZmlnW119IGNvbnRyb2xzIC0gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBmb3JtIGNvbnRyb2xzLlxuICogQHByb3BlcnR5IHtFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgYW55Pj59IGZvcm1TdWJtaXQgLSBFdmVudCBlbWl0dGVyIGZvciBmb3JtIHN1Ym1pc3Npb24uXG4gKiBAcHJvcGVydHkge0Zvcm1Hcm91cH0gZm9ybSAtIFRoZSByZWFjdGl2ZSBmb3JtIGdyb3VwLlxuICogQHByb3BlcnR5IHtCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj59IGZvcm1DaGFuZ2VzJCAtIE9ic2VydmFibGUgdG8gdHJhY2sgZm9ybSBjaGFuZ2VzLlxuICogXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7Rm9ybUJ1aWxkZXJ9IGZiIC0gRm9ybUJ1aWxkZXIgc2VydmljZSB0byBjcmVhdGUgZm9ybSBjb250cm9scy5cbiAqIEBwYXJhbSB7Q2hhbmdlRGV0ZWN0b3JSZWZ9IGNkciAtIENoYW5nZURldGVjdG9yUmVmIHRvIG1hbnVhbGx5IHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbi5cbiAqIFxuICogQG1ldGhvZCBuZ09uSW5pdCAtIExpZmVjeWNsZSBob29rIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGZvcm0uXG4gKiBAbWV0aG9kIGluaXRpYWxpemVGb3JtIC0gSW5pdGlhbGl6ZXMgdGhlIGZvcm0gY29udHJvbHMgYW5kIHNldHMgdXAgdmFsdWUgY2hhbmdlIHN1YnNjcmlwdGlvbnMuXG4gKiBAbWV0aG9kIGdldFZhbGlkYXRvcnMgLSBSZXR1cm5zIGFuIGFycmF5IG9mIHZhbGlkYXRvcnMgZm9yIGEgZ2l2ZW4gZm9ybSBjb250cm9sIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge0Zvcm1Db250cm9sQ29uZmlnfSBjb250cm9sIC0gVGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgZm9ybSBjb250cm9sLlxuICogQHJldHVybnMge1ZhbGlkYXRvckZuW119IC0gQW4gYXJyYXkgb2YgdmFsaWRhdG9yIGZ1bmN0aW9ucy5cbiAqIEBtZXRob2QgdXBkYXRlVmFsaWRhdG9ycyAtIFVwZGF0ZXMgdGhlIHZhbGlkYXRvcnMgZm9yIGEgZm9ybSBjb250cm9sIGJhc2VkIG9uIGl0cyB2YWx1ZS5cbiAqIEBwYXJhbSB7QWJzdHJhY3RDb250cm9sfSBjb250cm9sIC0gVGhlIGZvcm0gY29udHJvbCB0byB1cGRhdGUuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sLlxuICogQG1ldGhvZCBzaG91bGRSZXF1aXJlVmFsaWRhdGlvbiAtIERldGVybWluZXMgaWYgYSBmb3JtIGNvbnRyb2wgc2hvdWxkIHJlcXVpcmUgdmFsaWRhdGlvbi5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmb3JtIGNvbnRyb2wuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIGlmIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAqIEBtZXRob2Qgb25GaWxlU2VsZWN0IC0gSGFuZGxlcyBmaWxlIHNlbGVjdGlvbiBmb3IgZmlsZSB1cGxvYWQgY29udHJvbHMuXG4gKiBAcGFyYW0ge2FueX0gZXZlbnQgLSBUaGUgZmlsZSBzZWxlY3Rpb24gZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udHJvbE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZm9ybSBjb250cm9sLlxuICogQG1ldGhvZCBvblN1Ym1pdCAtIEhhbmRsZXMgZm9ybSBzdWJtaXNzaW9uLCB2YWxpZGF0ZXMgdGhlIGZvcm0sIGFuZCBlbWl0cyB0aGUgZm9ybSB2YWx1ZS5cbiAqL1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIEZvcm1zTW9kdWxlLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1CdWlsZGVyLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9ycyxcbiAgQWJzdHJhY3RDb250cm9sLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZXNDb21wb25lbnQgfSBmcm9tICcuLi92YWxpZGF0aW9uLW1lc3NhZ2VzL3ZhbGlkYXRpb24tbWVzc2FnZXMuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1Db250cm9sQ29uZmlnIH0gZnJvbSAnLi4vZm9ybUNvbnRyb2xDb25maWcnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJbnB1dFRleHRNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0dGV4dCc7XG5pbXBvcnQgeyBNdWx0aVNlbGVjdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xuaW1wb3J0IHsgVGV4dGFyZWFNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RleHRhcmVhJztcbmltcG9ydCB7IENoZWNrYm94TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jaGVja2JveCc7XG5pbXBvcnQgeyBSYWRpb0J1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvcmFkaW9idXR0b24nO1xuaW1wb3J0IHsgVG9nZ2xlQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2dnbGVidXR0b24nO1xuaW1wb3J0IHsgRmlsZVVwbG9hZE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZmlsZXVwbG9hZCc7XG5pbXBvcnQgeyBTbGlkZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL3NsaWRlcic7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBEYXRlUGlja2VyTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kYXRlcGlja2VyJztcbmltcG9ydCB7IFNlbGVjdE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2VsZWN0JztcbmltcG9ydCB7IEZpbGVVcGxvYWRWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi4vZmlsZS11cGxvYWQtYWNjZXNzb3IuZGlyZWN0aXZlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcmltZW5nLWZvcm1zJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFZhbGlkYXRpb25NZXNzYWdlc0NvbXBvbmVudCxcbiAgICBJbnB1dFRleHRNb2R1bGUsXG4gICAgTXVsdGlTZWxlY3RNb2R1bGUsXG4gICAgVGV4dGFyZWFNb2R1bGUsXG4gICAgQ2hlY2tib3hNb2R1bGUsXG4gICAgUmFkaW9CdXR0b25Nb2R1bGUsXG4gICAgRGF0ZVBpY2tlck1vZHVsZSxcbiAgICBUb2dnbGVCdXR0b25Nb2R1bGUsXG4gICAgRmlsZVVwbG9hZE1vZHVsZSxcbiAgICBTbGlkZXJNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIFNlbGVjdE1vZHVsZSxcbiAgICBGaWxlVXBsb2FkVmFsdWVBY2Nlc3NvclxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJpbWUtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9wcmltZS1mb3JtLmNvbXBvbmVudC5jc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUHJpbWVOZ0Zvcm1zQ29tcG9uZW50IHtcbiAgZm9ybU5hbWUgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG4gIGNvbnRyb2xzID0gaW5wdXQucmVxdWlyZWQ8Rm9ybUNvbnRyb2xDb25maWdbXT4oKTtcbiAgZm9ybVN1Ym1pdCA9IG91dHB1dDxSZWNvcmQ8c3RyaW5nLCBhbnk+PigpO1xuXG4gIGZvcm0hOiBGb3JtR3JvdXA7XG4gIHByaXZhdGUgZm9ybUNoYW5nZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRm9ybSgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtQ29udHJvbHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAgIHRoaXMuY29udHJvbHMoKS5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICBmb3JtQ29udHJvbHNbY29udHJvbC5uYW1lXSA9IFtcbiAgICAgICAgY29udHJvbC52YWx1ZSA/PyBudWxsLFxuICAgICAgICB0aGlzLmdldFZhbGlkYXRvcnMoY29udHJvbCksXG4gICAgICBdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChmb3JtQ29udHJvbHMpO1xuXG4gICAgdGhpcy5jb250cm9scygpLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5mb3JtLmdldChjb250cm9sLm5hbWUpO1xuICAgICAgaWYgKGZvcm1Db250cm9sKSB7XG4gICAgICAgIGZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0b3JzKGZvcm1Db250cm9sLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtQ2hhbmdlcyQuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsaWRhdG9ycyhjb250cm9sOiBGb3JtQ29udHJvbENvbmZpZyk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcblxuICAgIGlmIChjb250cm9sLnZhbGlkYXRvcnMpIHtcbiAgICAgIGNvbnRyb2wudmFsaWRhdG9ycy5mb3JFYWNoKCh2YWxpZGF0b3IpID0+IHtcbiAgICAgICAgaWYgKHZhbGlkYXRvci5yZXF1aXJlZCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLm1pbmxlbmd0aClcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodmFsaWRhdG9yLm1pbmxlbmd0aCkpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLm1heGxlbmd0aClcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgodmFsaWRhdG9yLm1heGxlbmd0aCkpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLnBhdHRlcm4pXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybih2YWxpZGF0b3IucGF0dGVybikpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLmVtYWlsKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgIGlmICh2YWxpZGF0b3IuY3VzdG9tKSB2YWxpZGF0b3JzLnB1c2godmFsaWRhdG9yLmN1c3RvbSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmFsaWRhdG9ycyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG91bGRSZXF1aXJlVmFsaWRhdGlvbih2YWx1ZSkpIHtcbiAgICAgIGNvbnRyb2wuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIH1cblxuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIHRoaXMuZm9ybUNoYW5nZXMkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlcXVpcmVWYWxpZGF0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnO1xuICB9XG5cbiAgb25GaWxlU2VsZWN0KGV2ZW50OiBhbnksIGNvbnRyb2xOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWxlID0gZXZlbnQuZmlsZXNbMF07IC8vIEdldHRpbmcgdGhlIGZpcnN0IHNlbGVjdGVkIGZpbGVcbiAgICBpZiAoZmlsZSkge1xuICAgICAgY29uc29sZS5sb2coYFNlbGVjdGVkIGZpbGUgZm9yICR7Y29udHJvbE5hbWV9OmAsIGZpbGUpO1xuICAgICAgY29uc29sZS5sb2codGhpcy5mb3JtLmdldChjb250cm9sTmFtZSk/LnZhbHVlKTtcbiAgICAgIFxuICAgICAgdGhpcy5mb3JtLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKGZpbGUpO1xuICAgICAgY29uc29sZS5sb2codGhpcy5mb3JtLmdldChjb250cm9sTmFtZSk/LnZhbHVlKTtcbiAgICAgIHRoaXMuZm9ybS5nZXQoY29udHJvbE5hbWUpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7IC8vIFVwZGF0ZSB0aGUgZm9ybSBjb250cm9sJ3MgdmFsaWRpdHlcbiAgXG4gICAgICAvLyBFbWl0IHRoZSBvblVwbG9hZCBldmVudCBpZiBkZWZpbmVkXG4gICAgICBjb25zdCBjb250cm9sQ29uZmlnID0gdGhpcy5jb250cm9scygpLmZpbmQoY29udHJvbCA9PiBjb250cm9sLm5hbWUgPT09IGNvbnRyb2xOYW1lKTtcbiAgICAgIGlmIChjb250cm9sQ29uZmlnPy5ldmVudHM/Lm9uVXBsb2FkKSB7XG4gICAgICAgIGNvbnRyb2xDb25maWcuZXZlbnRzLm9uVXBsb2FkKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblN1Ym1pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIHRoaXMuZm9ybS5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMuZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIFxuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMuZm9ybVN1Ym1pdC5lbWl0KHRoaXMuZm9ybS52YWx1ZSk7XG4gICAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICAgIC8vIENsZWFyIHRoZSBmaWxlIGlucHV0XG4gICAgICBjb25zdCBmaWxlSW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiZmlsZVwiXScpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICBpZiAoZmlsZUlucHV0KSB7XG4gICAgICAgIGZpbGVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGb3JtIEludmFsaWQnKTtcbiAgICB9XG4gIFxuICAgIHRoaXMuZm9ybUNoYW5nZXMkLm5leHQodHJ1ZSk7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIFthdHRyLm5hbWVdPVwiZm9ybU5hbWUoKVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCI+XG4gIEBmb3IgKGNvbnRyb2wgb2YgY29udHJvbHMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgQGlmIChjb250cm9sLnVpRnJhbWV3b3JrID09PSBcInByaW1lbmdcIiB8fCAhY29udHJvbC51aUZyYW1ld29yaykge1xuICAgICAgQGlmIChmb3JtLmdldChjb250cm9sLm5hbWUpKSB7XG4gICAgICAgIDxzZWN0aW9uIFtuZ0NsYXNzXT1cImNvbnRyb2wuY2xhc3NcIiBbbmdTdHlsZV09XCJjb250cm9sLnN0eWxlXCI+XG4gICAgICAgICAgQGlmIChjb250cm9sLmxhYmVsKSB7XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgW2F0dHIuZm9yXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbnRyb2wubGFiZWxDbGFzc1wiXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbnRyb2wubGFiZWxTdHlsZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGNvbnRyb2wubGFiZWwgfX1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQHN3aXRjaCAoY29udHJvbC50eXBlKSB7XG4gICAgICAgICAgICBAY2FzZSAoXCJ0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNvbnRyb2wuZXZlbnRzPy5vbkNoYW5nZT8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJjb250cm9sLmV2ZW50cz8ub25Gb2N1cz8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cImNvbnRyb2wuZXZlbnRzPy5vbkJsdXI/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiY29udHJvbC5ldmVudHM/Lm9uS2V5VXA/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJjb250cm9sLmV2ZW50cz8ub25LZXlEb3duPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKHBhc3RlKT1cImNvbnRyb2wuZXZlbnRzPy5vblBhc3RlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY29udHJvbC5ldmVudHM/Lm9uQ2hhbmdlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cImNvbnRyb2wuZXZlbnRzPy5vbkZvY3VzPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiY29udHJvbC5ldmVudHM/Lm9uQmx1cj8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJjb250cm9sLmV2ZW50cz8ub25LZXlVcD8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNvbnRyb2wuZXZlbnRzPy5vbktleURvd24/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwiY29udHJvbC5ldmVudHM/Lm9uUGFzdGU/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlIChcInBhc3N3b3JkXCIpIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJwYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY29udHJvbC5ldmVudHM/Lm9uQ2hhbmdlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cImNvbnRyb2wuZXZlbnRzPy5vbkZvY3VzPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiY29udHJvbC5ldmVudHM/Lm9uQmx1cj8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJjb250cm9sLmV2ZW50cz8ub25LZXlVcD8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNvbnRyb2wuZXZlbnRzPy5vbktleURvd24/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwiY29udHJvbC5ldmVudHM/Lm9uUGFzdGU/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlIChcImVtYWlsXCIpIHtcbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJlbWFpbFwiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY29udHJvbC5ldmVudHM/Lm9uQ2hhbmdlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cImNvbnRyb2wuZXZlbnRzPy5vbkZvY3VzPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiY29udHJvbC5ldmVudHM/Lm9uQmx1cj8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJjb250cm9sLmV2ZW50cz8ub25LZXlVcD8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNvbnRyb2wuZXZlbnRzPy5vbktleURvd24/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwiY29udHJvbC5ldmVudHM/Lm9uUGFzdGU/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlIChcInNlbGVjdFwiKSB7XG4gICAgICAgICAgICAgIDxwLXNlbGVjdFxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbnRyb2wub3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJjb250cm9sLmV2ZW50cz8ub25DaGFuZ2U/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25Gb2N1cyk9XCJjb250cm9sLmV2ZW50cz8ub25Gb2N1cz8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkJsdXIpPVwiY29udHJvbC5ldmVudHM/Lm9uQmx1cj8uKCRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKFwibXVsdGktc2VsZWN0XCIpIHtcbiAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb250cm9sLm9wdGlvbnNcIlxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiY29udHJvbC5ldmVudHM/Lm9uQ2hhbmdlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uRm9jdXMpPVwiY29udHJvbC5ldmVudHM/Lm9uRm9jdXM/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25CbHVyKT1cImNvbnRyb2wuZXZlbnRzPy5vbkJsdXI/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlIChcInRleHRhcmVhXCIpIHtcbiAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgcFRleHRhcmVhXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY29udHJvbC5ldmVudHM/Lm9uQ2hhbmdlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cImNvbnRyb2wuZXZlbnRzPy5vbkZvY3VzPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiY29udHJvbC5ldmVudHM/Lm9uQmx1cj8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJjb250cm9sLmV2ZW50cz8ub25LZXlVcD8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNvbnRyb2wuZXZlbnRzPy5vbktleURvd24/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwiY29udHJvbC5ldmVudHM/Lm9uUGFzdGU/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgICAgIDxwLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgW2JpbmFyeV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cImNvbnRyb2wuZXZlbnRzPy5vbkNoYW5nZT8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cImNvbnRyb2wuZXZlbnRzPy5vbkZvY3VzPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uQmx1cik9XCJjb250cm9sLmV2ZW50cz8ub25CbHVyPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L3AtY2hlY2tib3g+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBjb250cm9sLm9wdGlvbnMgPz8gW107IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8cC1yYWRpb0J1dHRvblxuICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCIncmFkaW8tJyArIG9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJjb250cm9sLmV2ZW50cz8ub25DaGFuZ2U/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uRm9jdXMpPVwiY29udHJvbC5ldmVudHM/Lm9uRm9jdXM/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQmx1cik9XCJjb250cm9sLmV2ZW50cz8ub25CbHVyPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICA+PC9wLXJhZGlvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwiJ3JhZGlvLScgKyBvcHRpb25cIj57eyBvcHRpb24gfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoXCJkYXRlXCIpIHtcbiAgICAgICAgICAgICAgPHAtZGF0ZXBpY2tlclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwiY29udHJvbC5ldmVudHM/Lm9uU2VsZWN0Py4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uRm9jdXMpPVwiY29udHJvbC5ldmVudHM/Lm9uRm9jdXM/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25CbHVyKT1cImNvbnRyb2wuZXZlbnRzPy5vbkJsdXI/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlIChcInRvZ2dsZVwiKSB7XG4gICAgICAgICAgICAgIDxwLXRvZ2dsZUJ1dHRvblxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiY29udHJvbC5ldmVudHM/Lm9uQ2hhbmdlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uRm9jdXMpPVwiY29udHJvbC5ldmVudHM/Lm9uRm9jdXM/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25CbHVyKT1cImNvbnRyb2wuZXZlbnRzPy5vbkJsdXI/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvcC10b2dnbGVCdXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8IS0tIEBjYXNlIChcImZpbGVcIikge1xuICAgICAgICAgICAgICA8cC1maWxlVXBsb2FkIFxuICAgICAgICAgICAgICBbY3VzdG9tVXBsb2FkXT1cInRydWVcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgIChvblNlbGVjdCk9XCJjb250cm9sLmV2ZW50cz8ub25TZWxlY3Q/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwiY29udHJvbC5ldmVudHM/Lm9uQ2xlYXI/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uUmVtb3ZlKT1cImNvbnRyb2wuZXZlbnRzPy5vblJlbW92ZT8uKCRldmVudClcIlxuICAgICAgICAgICAgICAob25FcnJvcik9XCJjb250cm9sLmV2ZW50cz8ub25FcnJvcj8uKCRldmVudClcIlxuICAgICAgICAgICAgICAob25CZWZvcmVVcGxvYWQpPVwiY29udHJvbC5ldmVudHM/Lm9uQmVmb3JlVXBsb2FkPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvblByb2dyZXNzKT1cImNvbnRyb2wuZXZlbnRzPy5vblByb2dyZXNzPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvblVwbG9hZCk9XCJjb250cm9sLmV2ZW50cz8ub25VcGxvYWQ/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgIDxwLWZpbGVVcGxvYWRcbiAgICAgICAgICAgICAgICBbY3VzdG9tVXBsb2FkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIChvblVwbG9hZCk9XCJvbkZpbGVTZWxlY3QoJGV2ZW50LCBjb250cm9sLm5hbWUpXCJcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgW2lkXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgICAgW2Nob29zZUxhYmVsXT1cImNvbnRyb2wucHJpbWVuZz8uY2hvb3NlTGFiZWxcIlxuICAgICAgICAgICAgICAgIFt1cGxvYWRMYWJlbF09XCJjb250cm9sLnByaW1lbmc/LnVwbG9hZExhYmVsXCJcbiAgICAgICAgICAgICAgICBbY2FuY2VsTGFiZWxdPVwiY29udHJvbC5wcmltZW5nPy5jYW5jZWxMYWJlbFwiXG4gICAgICAgICAgICAgICAgW2F1dG9dPVwiY29udHJvbC5wcmltZW5nPy5hdXRvXCJcbiAgICAgICAgICAgICAgICBbdXJsXT1cImNvbnRyb2wucHJpbWVuZz8udXJsXCJcbiAgICAgICAgICAgICAgICBbd2l0aENyZWRlbnRpYWxzXT1cImNvbnRyb2wucHJpbWVuZz8ud2l0aENyZWRlbnRpYWxzXCJcbiAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiY29udHJvbC5wcmltZW5nPy5tdWx0aXBsZVwiXG4gICAgICAgICAgICAgICAgW21heEZpbGVTaXplXT1cImNvbnRyb2wucHJpbWVuZz8ubWF4RmlsZVNpemVcIlxuICAgICAgICAgICAgICAgIFtjdXN0b21VcGxvYWRdPVwiY29udHJvbC5wcmltZW5nPy5jdXN0b21VcGxvYWRcIlxuICAgICAgICAgICAgICAgIFtzaG93VXBsb2FkQnV0dG9uXT1cImNvbnRyb2wucHJpbWVuZz8uc2hvd1VwbG9hZEJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW3Nob3dDYW5jZWxCdXR0b25dPVwiY29udHJvbC5wcmltZW5nPy5zaG93Q2FuY2VsQnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYWNjZXB0XT1cImNvbnRyb2wucHJpbWVuZz8uYWNjZXB0XCJcbiAgICAgICAgICAgICAgICBbbW9kZV09XCJjb250cm9sLnByaW1lbmc/Lm1vZGVcIlxuICAgICAgICAgICAgICAgIFtwcmV2aWV3V2lkdGhdPVwiY29udHJvbC5wcmltZW5nPy5wcmV2aWV3V2lkdGhcIlxuICAgICAgICAgICAgICAgIChvblNlbGVjdCk9XCJjb250cm9sLmV2ZW50cz8ub25TZWxlY3Q/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25DbGVhcik9XCJjb250cm9sLmV2ZW50cz8ub25DbGVhcj8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvblJlbW92ZSk9XCJjb250cm9sLmV2ZW50cz8ub25SZW1vdmU/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25FcnJvcik9XCJjb250cm9sLmV2ZW50cz8ub25FcnJvcj8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkJlZm9yZVVwbG9hZCk9XCJjb250cm9sLmV2ZW50cz8ub25CZWZvcmVVcGxvYWQ/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAob25Qcm9ncmVzcyk9XCJjb250cm9sLmV2ZW50cz8ub25Qcm9ncmVzcz8uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvblVwbG9hZCk9XCJjb250cm9sLmV2ZW50cz8ub25VcGxvYWQ/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICA8cC1idXR0b24gbGFiZWw9XCJDaG9vc2UgRmlsZVwiIGljb249XCJwaSBwaS11cGxvYWRcIj48L3AtYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvcC1maWxlVXBsb2FkPlxuICAgICAgICAgICAgfSAtLT5cbiAgICAgICAgICAgIEBjYXNlIChcInNsaWRlclwiKSB7XG4gICAgICAgICAgICAgIDxwLXNsaWRlclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwiY29udHJvbC5ldmVudHM/Lm9uQ2hhbmdlPy4oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uU2xpZGVFbmQpPVwiY29udHJvbC5ldmVudHM/Lm9uU2xpZGVFbmQ/LigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvcC1zbGlkZXI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgPHZhbGlkYXRpb24tbWVzc2FnZXNcbiAgICAgICAgICAgIFtjb250cm9sXT1cImZvcm0uZ2V0KGNvbnRyb2wubmFtZSlcIlxuICAgICAgICAgICAgW2NvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cImNvbnRyb2xcIlxuICAgICAgICAgID48L3ZhbGlkYXRpb24tbWVzc2FnZXM+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgPGJ1dHRvblxuICAgIHBCdXR0b25cbiAgICB0eXBlPVwic3VibWl0XCJcbiAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCJcbiAgICBsYWJlbD1cIlN1Ym1pdFwiXG4gID48L2J1dHRvbj5cbjwvZm9ybT5cbiJdfQ==
@@ -0,0 +1,29 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class ValidationMessagesComponent {
4
+ control; // The form control to validate
5
+ controlName; // The name of the control (for displaying in messages)
6
+ config; // The configuration for the control
7
+ getValidatorValue(validatorName, key) {
8
+ return this.control?.errors?.[validatorName]?.[key];
9
+ }
10
+ getCustomErrorMessage() {
11
+ if (this.control?.errors?.['custom']) {
12
+ return this.control.errors['custom'].message ?? 'Invalid input';
13
+ }
14
+ return null;
15
+ }
16
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ValidationMessagesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
17
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ValidationMessagesComponent, isStandalone: true, selector: "validation-messages", inputs: { control: "control", controlName: "controlName", config: "config" }, ngImport: i0, template: "@if (control?.invalid && control?.touched) {\n <section class=\"error-messages\" style=\"color: red\">\n @if (control?.errors?.[\"required\"]) {\n <small>{{ controlName }} is required</small>\n }\n @if (control?.errors?.[\"minlength\"]) {\n <small\n >Minimum length:\n {{ getValidatorValue(\"minlength\", \"requiredLength\") }}</small\n >\n }\n @if (control?.errors?.[\"maxlength\"]) {\n <small\n >Maximum length:\n {{ getValidatorValue(\"maxlength\", \"requiredLength\") }}</small\n >\n }\n @if (control?.errors?.[\"pattern\"]) {\n <small>Invalid format</small>\n }\n @if (control?.errors?.[\"email\"]) {\n <small>Invalid email address</small>\n }\n @if (control?.errors?.[\"min\"]) {\n <small\n >Value must be at least {{ getValidatorValue(\"min\", \"min\") }}</small\n >\n }\n @if (control?.errors?.[\"max\"]) {\n <small>Value must not exceed {{ getValidatorValue(\"max\", \"max\") }}</small>\n }\n @if (control?.errors?.[\"custom\"]) {\n <small>{{ getCustomErrorMessage() }}</small>\n }\n </section>\n}\n", styles: [""] });
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ValidationMessagesComponent, decorators: [{
20
+ type: Component,
21
+ args: [{ selector: 'validation-messages', standalone: true, imports: [], template: "@if (control?.invalid && control?.touched) {\n <section class=\"error-messages\" style=\"color: red\">\n @if (control?.errors?.[\"required\"]) {\n <small>{{ controlName }} is required</small>\n }\n @if (control?.errors?.[\"minlength\"]) {\n <small\n >Minimum length:\n {{ getValidatorValue(\"minlength\", \"requiredLength\") }}</small\n >\n }\n @if (control?.errors?.[\"maxlength\"]) {\n <small\n >Maximum length:\n {{ getValidatorValue(\"maxlength\", \"requiredLength\") }}</small\n >\n }\n @if (control?.errors?.[\"pattern\"]) {\n <small>Invalid format</small>\n }\n @if (control?.errors?.[\"email\"]) {\n <small>Invalid email address</small>\n }\n @if (control?.errors?.[\"min\"]) {\n <small\n >Value must be at least {{ getValidatorValue(\"min\", \"min\") }}</small\n >\n }\n @if (control?.errors?.[\"max\"]) {\n <small>Value must not exceed {{ getValidatorValue(\"max\", \"max\") }}</small>\n }\n @if (control?.errors?.[\"custom\"]) {\n <small>{{ getCustomErrorMessage() }}</small>\n }\n </section>\n}\n" }]
22
+ }], propDecorators: { control: [{
23
+ type: Input
24
+ }], controlName: [{
25
+ type: Input
26
+ }], config: [{
27
+ type: Input
28
+ }] } });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1tZXNzYWdlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9uZ0Zvcm0vc3JjL2FwcC92YWxpZGF0aW9uLW1lc3NhZ2VzL3ZhbGlkYXRpb24tbWVzc2FnZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbmdGb3JtL3NyYy9hcHAvdmFsaWRhdGlvbi1tZXNzYWdlcy92YWxpZGF0aW9uLW1lc3NhZ2VzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVdqRCxNQUFNLE9BQU8sMkJBQTJCO0lBQzdCLE9BQU8sQ0FBMEIsQ0FBQywrQkFBK0I7SUFDakUsV0FBVyxDQUFVLENBQUMsdURBQXVEO0lBQzdFLE1BQU0sQ0FBcUIsQ0FBQyxvQ0FBb0M7SUFFekUsaUJBQWlCLENBQUMsYUFBcUMsRUFBRSxHQUFXO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDO1FBQ2xFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7d0dBZFUsMkJBQTJCOzRGQUEzQiwyQkFBMkIsNkpDWHhDLDhuQ0FvQ0E7OzRGRHpCYSwyQkFBMkI7a0JBUHZDLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUCxFQUFFOzhCQUtGLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdGlvbkVycm9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1Db250cm9sQ29uZmlnIH0gZnJvbSAnLi4vZm9ybUNvbnRyb2xDb25maWcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWxpZGF0aW9uLW1lc3NhZ2VzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW10sXG4gIHRlbXBsYXRlVXJsOiAnLi92YWxpZGF0aW9uLW1lc3NhZ2VzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3ZhbGlkYXRpb24tbWVzc2FnZXMuY29tcG9uZW50LmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlc0NvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNvbnRyb2whOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsOyAvLyBUaGUgZm9ybSBjb250cm9sIHRvIHZhbGlkYXRlXG4gIEBJbnB1dCgpIGNvbnRyb2xOYW1lITogc3RyaW5nOyAvLyBUaGUgbmFtZSBvZiB0aGUgY29udHJvbCAoZm9yIGRpc3BsYXlpbmcgaW4gbWVzc2FnZXMpXG4gIEBJbnB1dCgpIGNvbmZpZyE6IEZvcm1Db250cm9sQ29uZmlnOyAvLyBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRyb2xcblxuICBnZXRWYWxpZGF0b3JWYWx1ZSh2YWxpZGF0b3JOYW1lOiBrZXlvZiBWYWxpZGF0aW9uRXJyb3JzLCBrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbD8uZXJyb3JzPy5bdmFsaWRhdG9yTmFtZV0/LltrZXldO1xuICB9XG5cbiAgZ2V0Q3VzdG9tRXJyb3JNZXNzYWdlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmNvbnRyb2w/LmVycm9ycz8uWydjdXN0b20nXSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udHJvbC5lcnJvcnNbJ2N1c3RvbSddLm1lc3NhZ2UgPz8gJ0ludmFsaWQgaW5wdXQnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIiwiQGlmIChjb250cm9sPy5pbnZhbGlkICYmIGNvbnRyb2w/LnRvdWNoZWQpIHtcbiAgPHNlY3Rpb24gY2xhc3M9XCJlcnJvci1tZXNzYWdlc1wiIHN0eWxlPVwiY29sb3I6IHJlZFwiPlxuICAgIEBpZiAoY29udHJvbD8uZXJyb3JzPy5bXCJyZXF1aXJlZFwiXSkge1xuICAgICAgPHNtYWxsPnt7IGNvbnRyb2xOYW1lIH19IGlzIHJlcXVpcmVkPC9zbWFsbD5cbiAgICB9XG4gICAgQGlmIChjb250cm9sPy5lcnJvcnM/LltcIm1pbmxlbmd0aFwiXSkge1xuICAgICAgPHNtYWxsXG4gICAgICAgID5NaW5pbXVtIGxlbmd0aDpcbiAgICAgICAge3sgZ2V0VmFsaWRhdG9yVmFsdWUoXCJtaW5sZW5ndGhcIiwgXCJyZXF1aXJlZExlbmd0aFwiKSB9fTwvc21hbGxcbiAgICAgID5cbiAgICB9XG4gICAgQGlmIChjb250cm9sPy5lcnJvcnM/LltcIm1heGxlbmd0aFwiXSkge1xuICAgICAgPHNtYWxsXG4gICAgICAgID5NYXhpbXVtIGxlbmd0aDpcbiAgICAgICAge3sgZ2V0VmFsaWRhdG9yVmFsdWUoXCJtYXhsZW5ndGhcIiwgXCJyZXF1aXJlZExlbmd0aFwiKSB9fTwvc21hbGxcbiAgICAgID5cbiAgICB9XG4gICAgQGlmIChjb250cm9sPy5lcnJvcnM/LltcInBhdHRlcm5cIl0pIHtcbiAgICAgIDxzbWFsbD5JbnZhbGlkIGZvcm1hdDwvc21hbGw+XG4gICAgfVxuICAgIEBpZiAoY29udHJvbD8uZXJyb3JzPy5bXCJlbWFpbFwiXSkge1xuICAgICAgPHNtYWxsPkludmFsaWQgZW1haWwgYWRkcmVzczwvc21hbGw+XG4gICAgfVxuICAgIEBpZiAoY29udHJvbD8uZXJyb3JzPy5bXCJtaW5cIl0pIHtcbiAgICAgIDxzbWFsbFxuICAgICAgICA+VmFsdWUgbXVzdCBiZSBhdCBsZWFzdCB7eyBnZXRWYWxpZGF0b3JWYWx1ZShcIm1pblwiLCBcIm1pblwiKSB9fTwvc21hbGxcbiAgICAgID5cbiAgICB9XG4gICAgQGlmIChjb250cm9sPy5lcnJvcnM/LltcIm1heFwiXSkge1xuICAgICAgPHNtYWxsPlZhbHVlIG11c3Qgbm90IGV4Y2VlZCB7eyBnZXRWYWxpZGF0b3JWYWx1ZShcIm1heFwiLCBcIm1heFwiKSB9fTwvc21hbGw+XG4gICAgfVxuICAgIEBpZiAoY29udHJvbD8uZXJyb3JzPy5bXCJjdXN0b21cIl0pIHtcbiAgICAgIDxzbWFsbD57eyBnZXRDdXN0b21FcnJvck1lc3NhZ2UoKSB9fTwvc21hbGw+XG4gICAgfVxuICA8L3NlY3Rpb24+XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnNhY2hyZWYtbmctZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25nRm9ybS9zcmMvYnNhY2hyZWYtbmctZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,5 @@
1
+ export * from './app/default-forms/default-forms.component';
2
+ export * from './app/formControlConfig';
3
+ export * from './app/material-form/material-form.component';
4
+ export * from './app/prime-form/prime-form.component';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25nRm9ybS9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLHVDQUF1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hcHAvZGVmYXVsdC1mb3Jtcy9kZWZhdWx0LWZvcm1zLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9mb3JtQ29udHJvbENvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL2FwcC9tYXRlcmlhbC1mb3JtL21hdGVyaWFsLWZvcm0uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vYXBwL3ByaW1lLWZvcm0vcHJpbWUtZm9ybS5jb21wb25lbnQnO1xuIl19