@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.
- package/LICENSE +21 -0
- package/README.md +143 -0
- package/app/default-forms/default-forms.component.d.ts +22 -0
- package/app/file-upload-accessor.directive.d.ts +13 -0
- package/app/formControlConfig.d.ts +203 -0
- package/app/material-form/material-form.component.d.ts +19 -0
- package/app/prime-form/prime-form.component.d.ts +23 -0
- package/app/validation-messages/validation-messages.component.d.ts +12 -0
- package/esm2022/app/default-forms/default-forms.component.mjs +163 -0
- package/esm2022/app/file-upload-accessor.directive.mjs +52 -0
- package/esm2022/app/formControlConfig.mjs +2 -0
- package/esm2022/app/material-form/material-form.component.mjs +176 -0
- package/esm2022/app/prime-form/prime-form.component.mjs +210 -0
- package/esm2022/app/validation-messages/validation-messages.component.mjs +29 -0
- package/esm2022/bsachref-ng-form.mjs +5 -0
- package/esm2022/public-api.mjs +5 -0
- package/fesm2022/bsachref-ng-form.mjs +615 -0
- package/fesm2022/bsachref-ng-form.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +62 -0
- package/public-api.d.ts +4 -0
@@ -0,0 +1,163 @@
|
|
1
|
+
/**
|
2
|
+
* @component DefaultFormsComponent
|
3
|
+
* @description
|
4
|
+
* The `DefaultFormsComponent` is an Angular standalone component that provides a dynamic form generation
|
5
|
+
* based on the provided configuration. It uses reactive forms to handle form controls and their validations.
|
6
|
+
* The component is designed to be highly configurable and supports various types of form validators.
|
7
|
+
*
|
8
|
+
* @selector default-forms
|
9
|
+
* @standalone true
|
10
|
+
* @imports
|
11
|
+
* - ReactiveFormsModule
|
12
|
+
* - CommonModule
|
13
|
+
* - FormsModule
|
14
|
+
* - ValidationMessagesComponent
|
15
|
+
* @templateUrl ./default-forms.component.html
|
16
|
+
* @styleUrl ./default-forms.component.css
|
17
|
+
* @changeDetection ChangeDetectionStrategy.OnPush
|
18
|
+
*
|
19
|
+
* @input
|
20
|
+
* - `formName: string` - The name of the form.
|
21
|
+
* - `controls: FormControlConfig[]` - An array of form control configurations.
|
22
|
+
*
|
23
|
+
* @output
|
24
|
+
* - `formSubmit: EventEmitter<Record<string, any>>` - Emits the form value when the form is submitted.
|
25
|
+
*
|
26
|
+
* @class DefaultFormsComponent
|
27
|
+
* @implements OnInit
|
28
|
+
*
|
29
|
+
* @property {string} formName - The name of the form.
|
30
|
+
* @property {FormControlConfig[]} controls - The configuration for the form controls.
|
31
|
+
* @property {EventEmitter<Record<string, any>>} formSubmit - Event emitter for form submission.
|
32
|
+
* @property {FormGroup} form - The reactive form group instance.
|
33
|
+
* @property {BehaviorSubject<boolean>} formChanges$ - A subject to track form changes.
|
34
|
+
*
|
35
|
+
* @constructor
|
36
|
+
* @param {FormBuilder} fb - Angular's FormBuilder service to create form controls.
|
37
|
+
* @param {ChangeDetectorRef} cdr - Angular's ChangeDetectorRef service to manually trigger change detection.
|
38
|
+
*
|
39
|
+
* @method ngOnInit
|
40
|
+
* @description Lifecycle hook that is called after the component's view has been initialized. It initializes the form.
|
41
|
+
*
|
42
|
+
* @method initializeForm
|
43
|
+
* @description Initializes the form by creating form controls based on the provided configuration and sets up value change subscriptions.
|
44
|
+
*
|
45
|
+
* @method getValidators
|
46
|
+
* @param {FormControlConfig} control - The configuration for a form control.
|
47
|
+
* @returns {ValidatorFn[]} An array of validators for the form control.
|
48
|
+
* @description Generates an array of validators based on the provided control configuration.
|
49
|
+
*
|
50
|
+
* @method updateValidators
|
51
|
+
* @param {AbstractControl} control - The form control to update validators for.
|
52
|
+
* @param {any} value - The current value of the form control.
|
53
|
+
* @description Updates the validators for a form control based on its current value.
|
54
|
+
*
|
55
|
+
* @method shouldRequireValidation
|
56
|
+
* @param {any} value - The value to check for validation requirement.
|
57
|
+
* @returns {boolean} Whether the value requires validation.
|
58
|
+
* @description Determines if a value should require validation.
|
59
|
+
*
|
60
|
+
* @method onSubmit
|
61
|
+
* @description Handles the form submission. Marks the form as touched and dirty, validates the form, emits the form value if valid, and resets the form.
|
62
|
+
*/
|
63
|
+
import { CommonModule } from '@angular/common';
|
64
|
+
import { ChangeDetectionStrategy, Component, input, output, } from '@angular/core';
|
65
|
+
import { ReactiveFormsModule, FormsModule, Validators, } from '@angular/forms';
|
66
|
+
import { ValidationMessagesComponent } from '../validation-messages/validation-messages.component';
|
67
|
+
import { BehaviorSubject } from 'rxjs';
|
68
|
+
import * as i0 from "@angular/core";
|
69
|
+
import * as i1 from "@angular/forms";
|
70
|
+
import * as i2 from "@angular/common";
|
71
|
+
export class DefaultFormsComponent {
|
72
|
+
fb;
|
73
|
+
cdr;
|
74
|
+
formName = input.required();
|
75
|
+
controls = input.required();
|
76
|
+
formSubmit = output();
|
77
|
+
form;
|
78
|
+
formChanges$ = new BehaviorSubject(false);
|
79
|
+
constructor(fb, cdr) {
|
80
|
+
this.fb = fb;
|
81
|
+
this.cdr = cdr;
|
82
|
+
}
|
83
|
+
ngOnInit() {
|
84
|
+
this.initializeForm();
|
85
|
+
}
|
86
|
+
initializeForm() {
|
87
|
+
const formControls = {};
|
88
|
+
this.controls().forEach((control) => {
|
89
|
+
formControls[control.name] = [
|
90
|
+
control.value ?? '',
|
91
|
+
this.getValidators(control),
|
92
|
+
];
|
93
|
+
});
|
94
|
+
this.form = this.fb.group(formControls);
|
95
|
+
this.controls().forEach((control) => {
|
96
|
+
const formControl = this.form.get(control.name);
|
97
|
+
if (formControl) {
|
98
|
+
formControl.valueChanges.subscribe((value) => {
|
99
|
+
this.updateValidators(formControl, value);
|
100
|
+
});
|
101
|
+
}
|
102
|
+
});
|
103
|
+
this.formChanges$.subscribe(() => this.cdr.markForCheck());
|
104
|
+
}
|
105
|
+
getValidators(control) {
|
106
|
+
const validators = [];
|
107
|
+
if (control.validators) {
|
108
|
+
control.validators.forEach((validator) => {
|
109
|
+
if (validator.required)
|
110
|
+
validators.push(Validators.required);
|
111
|
+
if (validator.minlength)
|
112
|
+
validators.push(Validators.minLength(validator.minlength));
|
113
|
+
if (validator.maxlength)
|
114
|
+
validators.push(Validators.maxLength(validator.maxlength));
|
115
|
+
if (validator.pattern)
|
116
|
+
validators.push(Validators.pattern(validator.pattern));
|
117
|
+
if (validator.email)
|
118
|
+
validators.push(Validators.email);
|
119
|
+
if (validator.custom)
|
120
|
+
validators.push(validator.custom);
|
121
|
+
});
|
122
|
+
}
|
123
|
+
return validators;
|
124
|
+
}
|
125
|
+
updateValidators(control, value) {
|
126
|
+
if (this.shouldRequireValidation(value)) {
|
127
|
+
control.addValidators(Validators.required);
|
128
|
+
}
|
129
|
+
else {
|
130
|
+
control.removeValidators(Validators.required);
|
131
|
+
}
|
132
|
+
control.updateValueAndValidity();
|
133
|
+
this.formChanges$.next(true);
|
134
|
+
}
|
135
|
+
shouldRequireValidation(value) {
|
136
|
+
return value !== null && value !== '';
|
137
|
+
}
|
138
|
+
onSubmit() {
|
139
|
+
this.form.markAllAsTouched();
|
140
|
+
this.form.markAsDirty();
|
141
|
+
this.form.updateValueAndValidity();
|
142
|
+
if (this.form.valid) {
|
143
|
+
this.formSubmit.emit(this.form.value);
|
144
|
+
this.form.reset();
|
145
|
+
}
|
146
|
+
else {
|
147
|
+
console.error('Form Invalid');
|
148
|
+
}
|
149
|
+
this.formChanges$.next(true);
|
150
|
+
}
|
151
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultFormsComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
152
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DefaultFormsComponent, isStandalone: true, selector: "default-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 === \"default\" || !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 @if (control.type === \"input\") {\n <input\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n type=\"text\"\n />\n }\n @if (control.type === \"select\") {\n <select [formControlName]=\"control.name\" [id]=\"control.name\">\n @for (option of control.options; track $index) {\n <option [value]=\"option\">{{ option }}</option>\n }\n </select>\n }\n @if (control.type === \"textarea\") {\n <textarea\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n ></textarea>\n }\n @if (control.type === \"checkbox\") {\n <input\n type=\"checkbox\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n />\n }\n @if (control.type === \"radio\") {\n @for (option of control.options ?? []; track $index) {\n <div>\n <input\n type=\"radio\"\n [formControlName]=\"control.name\"\n [id]=\"control.name + '-' + option\"\n [value]=\"option\"\n />\n <label [for]=\"control.name + '-' + option\">{{ option }}</label>\n </div>\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 type=\"submit\" [disabled]=\"form.invalid\">Submit</button>\n</form>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: 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: "component", type: ValidationMessagesComponent, selector: "validation-messages", inputs: ["control", "controlName", "config"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
153
|
+
}
|
154
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultFormsComponent, decorators: [{
|
155
|
+
type: Component,
|
156
|
+
args: [{ selector: 'default-forms', standalone: true, imports: [
|
157
|
+
ReactiveFormsModule,
|
158
|
+
CommonModule,
|
159
|
+
FormsModule,
|
160
|
+
ValidationMessagesComponent,
|
161
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"default\" || !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 @if (control.type === \"input\") {\n <input\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n type=\"text\"\n />\n }\n @if (control.type === \"select\") {\n <select [formControlName]=\"control.name\" [id]=\"control.name\">\n @for (option of control.options; track $index) {\n <option [value]=\"option\">{{ option }}</option>\n }\n </select>\n }\n @if (control.type === \"textarea\") {\n <textarea\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n ></textarea>\n }\n @if (control.type === \"checkbox\") {\n <input\n type=\"checkbox\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n />\n }\n @if (control.type === \"radio\") {\n @for (option of control.options ?? []; track $index) {\n <div>\n <input\n type=\"radio\"\n [formControlName]=\"control.name\"\n [id]=\"control.name + '-' + option\"\n [value]=\"option\"\n />\n <label [for]=\"control.name + '-' + option\">{{ option }}</label>\n </div>\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 type=\"submit\" [disabled]=\"form.invalid\">Submit</button>\n</form>\n" }]
|
162
|
+
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }] });
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1mb3Jtcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9uZ0Zvcm0vc3JjL2FwcC9kZWZhdWx0LWZvcm1zL2RlZmF1bHQtZm9ybXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbmdGb3JtL3NyYy9hcHAvZGVmYXVsdC1mb3Jtcy9kZWZhdWx0LWZvcm1zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRHO0FBQ0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixXQUFXLEVBSVgsVUFBVSxHQUVYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFFbkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWV2QyxNQUFNLE9BQU8scUJBQXFCO0lBU3RCO0lBQ0E7SUFUVixRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVSxDQUFDO0lBQ3BDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUF1QixDQUFDO0lBQ2pELFVBQVUsR0FBRyxNQUFNLEVBQXVCLENBQUM7SUFFM0MsSUFBSSxDQUFhO0lBQ1QsWUFBWSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRTNELFlBQ1UsRUFBZSxFQUNmLEdBQXNCO1FBRHRCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixRQUFHLEdBQUgsR0FBRyxDQUFtQjtJQUM3QixDQUFDO0lBRUosUUFBUTtR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QUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU8sdUJBQXVCLENBQUMsS0FBVTtRQUN4QyxPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUVuQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3BCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQzt3R0F6RlUscUJBQXFCOzRGQUFyQixxQkFBcUIsNFhDakdsQyx5eUVBbUVBLHlERHFCSSxtQkFBbUIsMnVEQUNuQixZQUFZLGlOQUNaLFdBQVcsK0JBQ1gsMkJBQTJCOzs0RkFNbEIscUJBQXFCO2tCQWJqQyxTQUFTOytCQUNFLGVBQWUsY0FDYixJQUFJLFdBQ1A7d0JBQ1AsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsMkJBQTJCO3FCQUM1QixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGNvbXBvbmVudCBEZWZhdWx0Rm9ybXNDb21wb25lbnRcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBEZWZhdWx0Rm9ybXNDb21wb25lbnRgIGlzIGFuIEFuZ3VsYXIgc3RhbmRhbG9uZSBjb21wb25lbnQgdGhhdCBwcm92aWRlcyBhIGR5bmFtaWMgZm9ybSBnZW5lcmF0aW9uXG4gKiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbi4gSXQgdXNlcyByZWFjdGl2ZSBmb3JtcyB0byBoYW5kbGUgZm9ybSBjb250cm9scyBhbmQgdGhlaXIgdmFsaWRhdGlvbnMuXG4gKiBUaGUgY29tcG9uZW50IGlzIGRlc2lnbmVkIHRvIGJlIGhpZ2hseSBjb25maWd1cmFibGUgYW5kIHN1cHBvcnRzIHZhcmlvdXMgdHlwZXMgb2YgZm9ybSB2YWxpZGF0b3JzLlxuICpcbiAqIEBzZWxlY3RvciBkZWZhdWx0LWZvcm1zXG4gKiBAc3RhbmRhbG9uZSB0cnVlXG4gKiBAaW1wb3J0c1xuICogLSBSZWFjdGl2ZUZvcm1zTW9kdWxlXG4gKiAtIENvbW1vbk1vZHVsZVxuICogLSBGb3Jtc01vZHVsZVxuICogLSBWYWxpZGF0aW9uTWVzc2FnZXNDb21wb25lbnRcbiAqIEB0ZW1wbGF0ZVVybCAuL2RlZmF1bHQtZm9ybXMuY29tcG9uZW50Lmh0bWxcbiAqIEBzdHlsZVVybCAuL2RlZmF1bHQtZm9ybXMuY29tcG9uZW50LmNzc1xuICogQGNoYW5nZURldGVjdGlvbiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbiAqXG4gKiBAaW5wdXRcbiAqIC0gYGZvcm1OYW1lOiBzdHJpbmdgIC0gVGhlIG5hbWUgb2YgdGhlIGZvcm0uXG4gKiAtIGBjb250cm9sczogRm9ybUNvbnRyb2xDb25maWdbXWAgLSBBbiBhcnJheSBvZiBmb3JtIGNvbnRyb2wgY29uZmlndXJhdGlvbnMuXG4gKlxuICogQG91dHB1dFxuICogLSBgZm9ybVN1Ym1pdDogRXZlbnRFbWl0dGVyPFJlY29yZDxzdHJpbmcsIGFueT4+YCAtIEVtaXRzIHRoZSBmb3JtIHZhbHVlIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLlxuICpcbiAqIEBjbGFzcyBEZWZhdWx0Rm9ybXNDb21wb25lbnRcbiAqIEBpbXBsZW1lbnRzIE9uSW5pdFxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb3JtTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmb3JtLlxuICogQHByb3BlcnR5IHtGb3JtQ29udHJvbENvbmZpZ1tdfSBjb250cm9scyAtIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZm9ybSBjb250cm9scy5cbiAqIEBwcm9wZXJ0eSB7RXZlbnRFbWl0dGVyPFJlY29yZDxzdHJpbmcsIGFueT4+fSBmb3JtU3VibWl0IC0gRXZlbnQgZW1pdHRlciBmb3IgZm9ybSBzdWJtaXNzaW9uLlxuICogQHByb3BlcnR5IHtGb3JtR3JvdXB9IGZvcm0gLSBUaGUgcmVhY3RpdmUgZm9ybSBncm91cCBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7QmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+fSBmb3JtQ2hhbmdlcyQgLSBBIHN1YmplY3QgdG8gdHJhY2sgZm9ybSBjaGFuZ2VzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtGb3JtQnVpbGRlcn0gZmIgLSBBbmd1bGFyJ3MgRm9ybUJ1aWxkZXIgc2VydmljZSB0byBjcmVhdGUgZm9ybSBjb250cm9scy5cbiAqIEBwYXJhbSB7Q2hhbmdlRGV0ZWN0b3JSZWZ9IGNkciAtIEFuZ3VsYXIncyBDaGFuZ2VEZXRlY3RvclJlZiBzZXJ2aWNlIHRvIG1hbnVhbGx5IHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbi5cbiAqXG4gKiBAbWV0aG9kIG5nT25Jbml0XG4gKiBAZGVzY3JpcHRpb24gTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCdzIHZpZXcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuIEl0IGluaXRpYWxpemVzIHRoZSBmb3JtLlxuICpcbiAqIEBtZXRob2QgaW5pdGlhbGl6ZUZvcm1cbiAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgZm9ybSBieSBjcmVhdGluZyBmb3JtIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uIGFuZCBzZXRzIHVwIHZhbHVlIGNoYW5nZSBzdWJzY3JpcHRpb25zLlxuICpcbiAqIEBtZXRob2QgZ2V0VmFsaWRhdG9yc1xuICogQHBhcmFtIHtGb3JtQ29udHJvbENvbmZpZ30gY29udHJvbCAtIFRoZSBjb25maWd1cmF0aW9uIGZvciBhIGZvcm0gY29udHJvbC5cbiAqIEByZXR1cm5zIHtWYWxpZGF0b3JGbltdfSBBbiBhcnJheSBvZiB2YWxpZGF0b3JzIGZvciB0aGUgZm9ybSBjb250cm9sLlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhbiBhcnJheSBvZiB2YWxpZGF0b3JzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjb250cm9sIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQG1ldGhvZCB1cGRhdGVWYWxpZGF0b3JzXG4gKiBAcGFyYW0ge0Fic3RyYWN0Q29udHJvbH0gY29udHJvbCAtIFRoZSBmb3JtIGNvbnRyb2wgdG8gdXBkYXRlIHZhbGlkYXRvcnMgZm9yLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZvcm0gY29udHJvbC5cbiAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHRoZSB2YWxpZGF0b3JzIGZvciBhIGZvcm0gY29udHJvbCBiYXNlZCBvbiBpdHMgY3VycmVudCB2YWx1ZS5cbiAqXG4gKiBAbWV0aG9kIHNob3VsZFJlcXVpcmVWYWxpZGF0aW9uXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2sgZm9yIHZhbGlkYXRpb24gcmVxdWlyZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgdmFsdWUgcmVxdWlyZXMgdmFsaWRhdGlvbi5cbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGEgdmFsdWUgc2hvdWxkIHJlcXVpcmUgdmFsaWRhdGlvbi5cbiAqXG4gKiBAbWV0aG9kIG9uU3VibWl0XG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB0aGUgZm9ybSBzdWJtaXNzaW9uLiBNYXJrcyB0aGUgZm9ybSBhcyB0b3VjaGVkIGFuZCBkaXJ0eSwgdmFsaWRhdGVzIHRoZSBmb3JtLCBlbWl0cyB0aGUgZm9ybSB2YWx1ZSBpZiB2YWxpZCwgYW5kIHJlc2V0cyB0aGUgZm9ybS5cbiAqL1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgRm9ybXNNb2R1bGUsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybUJ1aWxkZXIsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzLFxuICBBYnN0cmFjdENvbnRyb2wsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFZhbGlkYXRpb25NZXNzYWdlc0NvbXBvbmVudCB9IGZyb20gJy4uL3ZhbGlkYXRpb24tbWVzc2FnZXMvdmFsaWRhdGlvbi1tZXNzYWdlcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2xDb25maWcgfSBmcm9tICcuLi9mb3JtQ29udHJvbENvbmZpZyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGVmYXVsdC1mb3JtcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBWYWxpZGF0aW9uTWVzc2FnZXNDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kZWZhdWx0LWZvcm1zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2RlZmF1bHQtZm9ybXMuY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEZWZhdWx0Rm9ybXNDb21wb25lbnQge1xuICBmb3JtTmFtZSA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgY29udHJvbHMgPSBpbnB1dC5yZXF1aXJlZDxGb3JtQ29udHJvbENvbmZpZ1tdPigpO1xuICBmb3JtU3VibWl0ID0gb3V0cHV0PFJlY29yZDxzdHJpbmcsIGFueT4+KCk7XG5cbiAgZm9ybSE6IEZvcm1Hcm91cDtcbiAgcHJpdmF0ZSBmb3JtQ2hhbmdlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVGb3JtKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1Db250cm9sczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gICAgdGhpcy5jb250cm9scygpLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgIGZvcm1Db250cm9sc1tjb250cm9sLm5hbWVdID0gW1xuICAgICAgICBjb250cm9sLnZhbHVlID8/ICcnLFxuICAgICAgICB0aGlzLmdldFZhbGlkYXRvcnMoY29udHJvbCksXG4gICAgICBdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChmb3JtQ29udHJvbHMpO1xuXG4gICAgdGhpcy5jb250cm9scygpLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5mb3JtLmdldChjb250cm9sLm5hbWUpO1xuICAgICAgaWYgKGZvcm1Db250cm9sKSB7XG4gICAgICAgIGZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0b3JzKGZvcm1Db250cm9sLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtQ2hhbmdlcyQuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsaWRhdG9ycyhjb250cm9sOiBGb3JtQ29udHJvbENvbmZpZyk6IFZhbGlkYXRvckZuW10ge1xuICAgIGNvbnN0IHZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcblxuICAgIGlmIChjb250cm9sLnZhbGlkYXRvcnMpIHtcbiAgICAgIGNvbnRyb2wudmFsaWRhdG9ycy5mb3JFYWNoKCh2YWxpZGF0b3IpID0+IHtcbiAgICAgICAgaWYgKHZhbGlkYXRvci5yZXF1aXJlZCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLm1pbmxlbmd0aClcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodmFsaWRhdG9yLm1pbmxlbmd0aCkpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLm1heGxlbmd0aClcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgodmFsaWRhdG9yLm1heGxlbmd0aCkpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLnBhdHRlcm4pXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucGF0dGVybih2YWxpZGF0b3IucGF0dGVybikpO1xuICAgICAgICBpZiAodmFsaWRhdG9yLmVtYWlsKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgIGlmICh2YWxpZGF0b3IuY3VzdG9tKSB2YWxpZGF0b3JzLnB1c2godmFsaWRhdG9yLmN1c3RvbSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9ycztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVmFsaWRhdG9ycyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG91bGRSZXF1aXJlVmFsaWRhdGlvbih2YWx1ZSkpIHtcbiAgICAgIGNvbnRyb2wuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIH1cblxuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIHRoaXMuZm9ybUNoYW5nZXMkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZFJlcXVpcmVWYWxpZGF0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnO1xuICB9XG5cbiAgb25TdWJtaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICB0aGlzLmZvcm0ubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLmZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuXG4gICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgdGhpcy5mb3JtU3VibWl0LmVtaXQodGhpcy5mb3JtLnZhbHVlKTtcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGb3JtIEludmFsaWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1DaGFuZ2VzJC5uZXh0KHRydWUpO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBbYXR0ci5uYW1lXT1cImZvcm1OYW1lKClcIiAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiPlxuICBAZm9yIChjb250cm9sIG9mIGNvbnRyb2xzKCk7IHRyYWNrICRpbmRleCkge1xuICAgIEBpZiAoY29udHJvbC51aUZyYW1ld29yayA9PT0gXCJkZWZhdWx0XCIgfHwgIWNvbnRyb2wudWlGcmFtZXdvcmspIHtcbiAgICAgIEBpZiAoZm9ybS5nZXQoY29udHJvbC5uYW1lKSkge1xuICAgICAgICA8c2VjdGlvbiBbbmdDbGFzc109XCJjb250cm9sLmNsYXNzXCIgW25nU3R5bGVdPVwiY29udHJvbC5zdHlsZVwiPlxuICAgICAgICAgIEBpZiAoY29udHJvbC5sYWJlbCkge1xuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgIFthdHRyLmZvcl09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb250cm9sLmxhYmVsQ2xhc3NcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb250cm9sLmxhYmVsU3R5bGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBjb250cm9sLmxhYmVsIH19XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIEBpZiAoY29udHJvbC50eXBlID09PSBcImlucHV0XCIpIHtcbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiXG4gICAgICAgICAgICAgIFtpZF09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbnRyb2wudHlwZSA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgICAgICAgPHNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cImNvbnRyb2wubmFtZVwiIFtpZF09XCJjb250cm9sLm5hbWVcIj5cbiAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGNvbnRyb2wub3B0aW9uczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib3B0aW9uXCI+e3sgb3B0aW9uIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbnRyb2wudHlwZSA9PT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICBbaWRdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNvbnRyb2wudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb250cm9sLm5hbWVcIlxuICAgICAgICAgICAgICBbaWRdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoY29udHJvbC50eXBlID09PSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBjb250cm9sLm9wdGlvbnMgPz8gW107IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgICAgICAgIFtpZF09XCJjb250cm9sLm5hbWUgKyAnLScgKyBvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8bGFiZWwgW2Zvcl09XCJjb250cm9sLm5hbWUgKyAnLScgKyBvcHRpb25cIj57eyBvcHRpb24gfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8dmFsaWRhdGlvbi1tZXNzYWdlc1xuICAgICAgICAgICAgW2NvbnRyb2xdPVwiZm9ybS5nZXQoY29udHJvbC5uYW1lKVwiXG4gICAgICAgICAgICBbY29udHJvbE5hbWVdPVwiY29udHJvbC5uYW1lXCJcbiAgICAgICAgICAgIFtjb25maWddPVwiY29udHJvbFwiXG4gICAgICAgICAgPjwvdmFsaWRhdGlvbi1tZXNzYWdlcz5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgfVxuICAgIH1cbiAgfVxuICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCI+U3VibWl0PC9idXR0b24+XG48L2Zvcm0+XG4iXX0=
|
@@ -0,0 +1,52 @@
|
|
1
|
+
import { Directive, forwardRef } from '@angular/core';
|
2
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
3
|
+
import * as i0 from "@angular/core";
|
4
|
+
import * as i1 from "primeng/fileupload";
|
5
|
+
export class FileUploadValueAccessor {
|
6
|
+
host;
|
7
|
+
constructor(host) {
|
8
|
+
this.host = host;
|
9
|
+
}
|
10
|
+
writeValue(value) {
|
11
|
+
if (value) {
|
12
|
+
this.host.files = value;
|
13
|
+
}
|
14
|
+
else {
|
15
|
+
this.host.clear();
|
16
|
+
}
|
17
|
+
}
|
18
|
+
registerOnChange(fn) {
|
19
|
+
this.host.onUpload.subscribe((event) => {
|
20
|
+
fn(event.files);
|
21
|
+
});
|
22
|
+
}
|
23
|
+
registerOnTouched(fn) {
|
24
|
+
// this.host.onBlur.subscribe(fn);
|
25
|
+
}
|
26
|
+
setDisabledState(isDisabled) {
|
27
|
+
this.host.disabled = isDisabled;
|
28
|
+
}
|
29
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FileUploadValueAccessor, deps: [{ token: i1.FileUpload }], target: i0.ɵɵFactoryTarget.Directive });
|
30
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: FileUploadValueAccessor, isStandalone: true, selector: "p-fileUpload[formControlName], p-fileUpload[formControl], p-fileUpload[ngModel]", providers: [
|
31
|
+
{
|
32
|
+
provide: NG_VALUE_ACCESSOR,
|
33
|
+
useExisting: forwardRef(() => FileUploadValueAccessor),
|
34
|
+
multi: true,
|
35
|
+
},
|
36
|
+
], ngImport: i0 });
|
37
|
+
}
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FileUploadValueAccessor, decorators: [{
|
39
|
+
type: Directive,
|
40
|
+
args: [{
|
41
|
+
standalone: true,
|
42
|
+
selector: 'p-fileUpload[formControlName], p-fileUpload[formControl], p-fileUpload[ngModel]',
|
43
|
+
providers: [
|
44
|
+
{
|
45
|
+
provide: NG_VALUE_ACCESSOR,
|
46
|
+
useExisting: forwardRef(() => FileUploadValueAccessor),
|
47
|
+
multi: true,
|
48
|
+
},
|
49
|
+
],
|
50
|
+
}]
|
51
|
+
}], ctorParameters: () => [{ type: i1.FileUpload }] });
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQtYWNjZXNzb3IuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbmdGb3JtL3NyYy9hcHAvZmlsZS11cGxvYWQtYWNjZXNzb3IuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBY3pFLE1BQU0sT0FBTyx1QkFBdUI7SUFDZDtJQUFwQixZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO0lBQUcsQ0FBQztJQUV4QyxVQUFVLENBQUMsS0FBVTtRQUNuQixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQU87UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDMUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLGtDQUFrQztJQUNwQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBbUI7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQ2xDLENBQUM7d0dBdkJVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDhIQVJ2QjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUM7Z0JBQ3RELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRjs7NEZBRVUsdUJBQXVCO2tCQVhuQyxTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsaUZBQWlGO29CQUMzRixTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUM7NEJBQ3RELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBmb3J3YXJkUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAncHJpbWVuZy9maWxldXBsb2FkJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAncC1maWxlVXBsb2FkW2Zvcm1Db250cm9sTmFtZV0sIHAtZmlsZVVwbG9hZFtmb3JtQ29udHJvbF0sIHAtZmlsZVVwbG9hZFtuZ01vZGVsXScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRmlsZVVwbG9hZFZhbHVlQWNjZXNzb3IpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaG9zdDogRmlsZVVwbG9hZCkge31cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuaG9zdC5maWxlcyA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhvc3QuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmhvc3Qub25VcGxvYWQuc3Vic2NyaWJlKChldmVudDogYW55KSA9PiB7XG4gICAgICBmbihldmVudC5maWxlcyk7XG4gICAgfSk7XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgLy8gdGhpcy5ob3N0Lm9uQmx1ci5zdWJzY3JpYmUoZm4pO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5ob3N0LmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxufSJdfQ==
|
@@ -0,0 +1,2 @@
|
|
1
|
+
export {};
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybUNvbnRyb2xDb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9uZ0Zvcm0vc3JjL2FwcC9mb3JtQ29udHJvbENvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmFsaWRhdG9yRm4gfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcblxuXG4vKipcbiAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgZm9ybSBjb250cm9sLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db250cm9sQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmb3JtIGNvbnRyb2wuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBmb3JtIGNvbnRyb2wuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlICdpbnB1dCcsICdzZWxlY3QnLCAndGV4dGFyZWEnLCAnY2hlY2tib3gnLCAncmFkaW8nLCAnZmlsZScsICdjYWxlbmRhcicsIGV0Yy5cbiAgICovXG4gIHR5cGU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgJ3NlbGVjdCcsICdyYWRpbycsICdkcm9wZG93bicgY29udHJvbHMuIEVhY2ggb3B0aW9uIGNhbiBiZSBhbiBvYmplY3Qgd2l0aCBhIGxhYmVsIGFuZCB2YWx1ZSBvciBhIHN0cmluZy5cbiAgICovXG4gIG9wdGlvbnM/OiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBhbnkgfSB8IHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRvcnMgZm9yIHRoZSBmb3JtIGNvbnRyb2wuIEluY2x1ZGVzIHN0YW5kYXJkIHZhbGlkYXRvcnMgbGlrZSByZXF1aXJlZCwgbWlubGVuZ3RoLCBtYXhsZW5ndGgsIHBhdHRlcm4sIGVtYWlsLCBhbmQgY3VzdG9tIHZhbGlkYXRvcnMuXG4gICAqL1xuICB2YWxpZGF0b3JzPzoge1xuICAgIHJlcXVpcmVkPzogYm9vbGVhbjtcbiAgICBtaW5sZW5ndGg/OiBudW1iZXI7XG4gICAgbWF4bGVuZ3RoPzogbnVtYmVyO1xuICAgIHBhdHRlcm4/OiBzdHJpbmc7XG4gICAgZW1haWw/OiBib29sZWFuO1xuICAgIGN1c3RvbT86IFZhbGlkYXRvckZuO1xuICB9W107XG5cbiAgLyoqXG4gICAqIENTUyBjbGFzc2VzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGZvcm0gY29udHJvbC5cbiAgICovXG4gIGNsYXNzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmxpbmUgc3R5bGVzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGZvcm0gY29udHJvbC5cbiAgICovXG4gIHN0eWxlPzogYW55O1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUgZm9ybSBjb250cm9sLlxuICAgKi9cbiAgdmFsdWU/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFVJIGZyYW1ld29yayB0byBiZSB1c2VkIGZvciB0aGUgZm9ybSBjb250cm9sLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdtYXRlcmlhbCcsICdwcmltZW5nJywgJ2RlZmF1bHQnLlxuICAgKi9cbiAgdWlGcmFtZXdvcms/OiAnbWF0ZXJpYWwnIHwgJ3ByaW1lbmcnIHwgJ2RlZmF1bHQnO1xuXG4gIC8qKlxuICAgKiBMYWJlbCBmb3IgdGhlIGZvcm0gY29udHJvbC5cbiAgICovXG4gIGxhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDU1MgY2xhc3NlcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBsYWJlbCBvZiB0aGUgZm9ybSBjb250cm9sLlxuICAgKi9cbiAgbGFiZWxDbGFzcz86IHN0cmluZztcblxuICAvKipcbiAgICogSW5saW5lIHN0eWxlcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBsYWJlbCBvZiB0aGUgZm9ybSBjb250cm9sLlxuICAgKi9cbiAgbGFiZWxTdHlsZT86IGFueTtcblxuICAvKipcbiAgICogTW9kZSBmb3IgZGF0ZSBwaWNrZXIgY29udHJvbHMuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ3NpbmdsZScgYW5kICdyYW5nZScuXG4gICAqL1xuICBkYXRlUGlja2VyTW9kZT86ICdzaW5nbGUnIHwgJ3JhbmdlJztcblxuICAvKipcbiAgICogUHJpbWVORy1zcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciB0aGUgZm9ybSBjb250cm9sLlxuICAgKi9cbiAgcHJpbWVuZz86IHtcbiAgICBpY29uPzogc3RyaW5nO1xuICAgIHNob3dDbGVhcj86IGJvb2xlYW47XG4gICAgbXVsdGlwbGU/OiBib29sZWFuO1xuICAgIG1heEZpbGVTaXplPzogbnVtYmVyO1xuICAgIGFjY2VwdD86IHN0cmluZztcbiAgICBzaG93V2Vlaz86IGJvb2xlYW47XG4gICAgbWluRGF0ZT86IERhdGU7XG4gICAgbWF4RGF0ZT86IERhdGU7XG4gICAgbW9kZT86ICdiYXNpYycgfCAnYWR2YW5jZWQnO1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xuICAgIGRlY2ltYWxTZXBhcmF0b3I/OiBzdHJpbmc7XG4gICAgc3RlcD86IG51bWJlcjtcbiAgICByYW5nZT86IGJvb2xlYW47XG4gICAgc2Nyb2xsSGVpZ2h0Pzogc3RyaW5nO1xuICAgIHNob3dUb2dnbGVBbGw/OiBib29sZWFuO1xuICAgIHNob3dCdXR0b25zPzogYm9vbGVhbjtcbiAgICBwYW5lbENsYXNzPzogc3RyaW5nO1xuICAgIGNob29zZUxhYmVsPzogc3RyaW5nO1xuICAgIGNsZWFyTGFiZWw/OiBzdHJpbmc7XG4gICAgdG9kYXlMYWJlbD86IHN0cmluZztcbiAgICB0aW1lT25seT86IGJvb2xlYW47XG4gICAgaG91ckZvcm1hdD86IHN0cmluZztcbiAgICBtaW51dGVGb3JtYXQ/OiBzdHJpbmc7XG4gICAgc2Vjb25kc0Zvcm1hdD86IHN0cmluZztcbiAgICBzaG93U2Vjb25kcz86IGJvb2xlYW47XG4gICAgc2hvd01pbGxpc2VjPzogYm9vbGVhbjtcbiAgICB0aW1lU2VwYXJhdG9yPzogc3RyaW5nO1xuICAgIHNob3dPbkZvY3VzPzogYm9vbGVhbjtcbiAgICBhcHBlbmRUbz86IHN0cmluZztcbiAgICBpbnB1dFN0eWxlPzogYW55O1xuICAgIGlucHV0U3R5bGVDbGFzcz86IHN0cmluZztcbiAgICB1cGxvYWRMYWJlbD86IHN0cmluZztcbiAgICBjYW5jZWxMYWJlbD86IHN0cmluZztcbiAgICBhdXRvPzogYm9vbGVhbjtcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcbiAgICBjdXN0b21VcGxvYWQ/OiBzdHJpbmc7XG4gICAgc2hvd1VwbG9hZEJ1dHRvbj86IGJvb2xlYW47XG4gICAgc2hvd0NhbmNlbEJ1dHRvbj86IGJvb2xlYW47XG4gICAgc2hvd1VwbG9hZEljb24/OiBib29sZWFuO1xuICAgIHNob3dSZW1vdmVJY29uPzogYm9vbGVhbjtcbiAgICBzaG93UHJldmlldz86IGJvb2xlYW47XG4gICAgcHJldmlld1dpZHRoPzogbnVtYmVyO1xuICAgIGNob29zZU9wdGlvbnM/OiBhbnk7XG4gICAgc2hvd1RpbWU/OiBib29sZWFuO1xuICAgIHNob3dEYXRlPzogYm9vbGVhbjtcbiAgICBzaG93SWNvbj86IGJvb2xlYW47XG4gICAgaWNvblBvcz86ICdsZWZ0JyB8ICdyaWdodCc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXItc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgdGhlIGZvcm0gY29udHJvbC5cbiAgICovXG4gIGFuZ3VsYXI/OiB7XG4gICAgcmVhZG9ubHk/OiBib29sZWFuO1xuICAgIGF1dG9jb21wbGV0ZT86ICdvbicgfCAnb2ZmJztcbiAgICBhdXRvZm9jdXM/OiBib29sZWFuO1xuICAgIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAgIG1hc2s/OiBzdHJpbmc7XG4gICAgdG9vbHRpcD86IHN0cmluZztcbiAgICBpY29uPzogc3RyaW5nO1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICBzdWZmaXg/OiBzdHJpbmc7XG4gICAgaGludD86IHN0cmluZztcbiAgICB0YWJJbmRleD86IG51bWJlcjtcbiAgICBjb2xvcj86IHN0cmluZztcbiAgICB0aGVtZT86ICdkYXJrJyB8ICdsaWdodCcgfCBzdHJpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIGRlcGVuZGVudCBmaWVsZHMuIFNwZWNpZmllcyBmaWVsZHMgdGhhdCBkZXBlbmQgb24gdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgYW5kIHRoZSBjb25kaXRpb24gZm9yIHRoZWlyIGRlcGVuZGVuY3kuXG4gICAqL1xuICBkZXBlbmRlbnRGaWVsZHM/OiB7XG4gICAgZGVwZW5kc09uOiBzdHJpbmc7XG4gICAgY29uZGl0aW9uOiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbjtcbiAgfVtdO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGZvcm0gY29udHJvbCBpcyByZXBlYXRhYmxlLlxuICAgKi9cbiAgcmVwZWF0YWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRvIGNvbmRpdGlvbmFsbHkgcmVuZGVyIHRoZSBmb3JtIGNvbnRyb2wgYmFzZWQgb24gdGhlIHZhbHVlcyBvZiBvdGhlciBjb250cm9scy5cbiAgICovXG4gIGNvbmRpdGlvbmFsUmVuZGVyPzogKHZhbHVlczogYW55KSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHcm91cCB0byB3aGljaCB0aGUgZm9ybSBjb250cm9sIGJlbG9uZ3MuXG4gICAqL1xuICBncm91cD86IHN0cmluZztcblxuICAvKipcbiAgICogRXZlbnQgaGFuZGxlcnMgZm9yIHZhcmlvdXMgZXZlbnRzIHJlbGF0ZWQgdG8gdGhlIGZvcm0gY29udHJvbC5cbiAgICovXG4gIGV2ZW50cz86IHtcbiAgICBvbkNoYW5nZT86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uRm9jdXM/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvbkJsdXI/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvblNlbGVjdD86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uVXBsb2FkPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gICAgb25LZXlVcD86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uS2V5RG93bj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFzdGU/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvbkRvd25sb2FkPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gICAgb25DbGVhcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUmVzZXQ/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvblRvZ2dsZT86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uU2hvdz86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uSGlkZT86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uT3Blbj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uQ2xvc2U/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvblBhbmVsQ2xpY2s/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvblBhbmVsU2hvdz86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFuZWxIaWRlPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gICAgb25QYW5lbE9wZW4/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvblBhbmVsQ2xvc2U/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvblBhbmVsVG9nZ2xlPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gICAgb25QYW5lbFNlbGVjdD86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFuZWxVbnNlbGVjdD86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFuZWxVbnNlbGVjdEFsbD86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFuZWxSZW9yZGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gICAgb25QYW5lbFJlc2l6ZT86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFuZWxEcmFnU3RhcnQ/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvblBhbmVsRHJhZ0VuZD86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFuZWxEcmFnT3Zlcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFuZWxEcmFnTGVhdmU/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvblBhbmVsRHJvcD86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFuZWxTY3JvbGw/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvblBhbmVsRmlsdGVyPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gICAgb25QYW5lbFRvZ2dsZUFsbD86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFuZWxTaG93QWxsPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gICAgb25QYW5lbEhpZGVBbGw/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgICBvblBhbmVsT3BlbkFsbD86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUGFuZWxDbG9zZUFsbD86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uUmVtb3ZlPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gICAgb25FcnJvcj86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uQmVmb3JlVXBsb2FkPzogKGV2ZW50OiBhbnkpID0+IHZvaWQ7XG4gICAgb25Qcm9ncmVzcz86IChldmVudDogYW55KSA9PiB2b2lkO1xuICAgIG9uU2xpZGVFbmQ/OiAoZXZlbnQ6IGFueSkgPT4gdm9pZDtcbiAgfTtcbn1cbiJdfQ==
|
@@ -0,0 +1,176 @@
|
|
1
|
+
/**
|
2
|
+
* @component
|
3
|
+
* @name MaterialFormsComponent
|
4
|
+
* @description
|
5
|
+
* A standalone Angular component that renders a dynamic form using Angular Material components.
|
6
|
+
* The form configuration is provided via inputs, and the form submission is handled via an output event.
|
7
|
+
*
|
8
|
+
* @selector material-forms
|
9
|
+
* @standalone true
|
10
|
+
* @imports
|
11
|
+
* - CommonModule
|
12
|
+
* - ReactiveFormsModule
|
13
|
+
* - MatInputModule
|
14
|
+
* - MatSelectModule
|
15
|
+
* - MatCheckboxModule
|
16
|
+
* - MatRadioModule
|
17
|
+
* - MatButtonModule
|
18
|
+
* - ValidationMessagesComponent
|
19
|
+
* - MatDatepickerModule
|
20
|
+
* - MatFormFieldModule
|
21
|
+
* @providers provideNativeDateAdapter
|
22
|
+
* @templateUrl ./material-form.component.html
|
23
|
+
* @styleUrl ./material-form.component.css
|
24
|
+
* @changeDetection ChangeDetectionStrategy.OnPush
|
25
|
+
*
|
26
|
+
* @inputs
|
27
|
+
* @property {string} formName - The name of the form.
|
28
|
+
* @property {FormControlConfig[]} controls - The configuration for the form controls.
|
29
|
+
*
|
30
|
+
* @outputs
|
31
|
+
* @property {EventEmitter<Record<string, any>>} formSubmit - Event emitted when the form is submitted.
|
32
|
+
*
|
33
|
+
* @class
|
34
|
+
* @name MaterialFormsComponent
|
35
|
+
* @description
|
36
|
+
* This class defines the MaterialFormsComponent which initializes the form based on the provided controls configuration,
|
37
|
+
* handles form submission, and provides validation for the form controls.
|
38
|
+
*
|
39
|
+
* @constructor
|
40
|
+
* @param {FormBuilder} fb - Angular FormBuilder service to create form groups and controls.
|
41
|
+
* @param {ChangeDetectorRef} cdr - Angular ChangeDetectorRef service to manually trigger change detection.
|
42
|
+
*
|
43
|
+
* @method
|
44
|
+
* @name ngOnInit
|
45
|
+
* @description
|
46
|
+
* Lifecycle hook that is called after the component's view has been initialized. It initializes the form.
|
47
|
+
*
|
48
|
+
* @method
|
49
|
+
* @name initializeForm
|
50
|
+
* @description
|
51
|
+
* Initializes the form controls based on the provided configuration. Supports datepicker range controls.
|
52
|
+
*
|
53
|
+
* @method
|
54
|
+
* @name getValidators
|
55
|
+
* @description
|
56
|
+
* Returns an array of Angular validators based on the provided control configuration.
|
57
|
+
* @param {FormControlConfig} control - The configuration for the form control.
|
58
|
+
* @returns {Validators[]} - An array of Angular validators.
|
59
|
+
*
|
60
|
+
* @method
|
61
|
+
* @name onSubmit
|
62
|
+
* @description
|
63
|
+
* Handles the form submission. Marks all controls as touched and dirty, updates the form's validity,
|
64
|
+
* emits the form values if the form is valid, and resets the form. Triggers change detection.
|
65
|
+
*/
|
66
|
+
import { CommonModule } from '@angular/common';
|
67
|
+
import { Component, ChangeDetectionStrategy, input, output, } from '@angular/core';
|
68
|
+
import { ReactiveFormsModule, Validators, } from '@angular/forms';
|
69
|
+
import { MatInputModule } from '@angular/material/input';
|
70
|
+
import { MatSelectModule } from '@angular/material/select';
|
71
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
72
|
+
import { MatRadioModule } from '@angular/material/radio';
|
73
|
+
import { MatButtonModule } from '@angular/material/button';
|
74
|
+
import { ValidationMessagesComponent } from '../validation-messages/validation-messages.component';
|
75
|
+
import { MatDatepickerModule } from '@angular/material/datepicker';
|
76
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
77
|
+
import { provideNativeDateAdapter } from '@angular/material/core';
|
78
|
+
import * as i0 from "@angular/core";
|
79
|
+
import * as i1 from "@angular/forms";
|
80
|
+
import * as i2 from "@angular/common";
|
81
|
+
import * as i3 from "@angular/material/input";
|
82
|
+
import * as i4 from "@angular/material/form-field";
|
83
|
+
import * as i5 from "@angular/material/select";
|
84
|
+
import * as i6 from "@angular/material/core";
|
85
|
+
import * as i7 from "@angular/material/checkbox";
|
86
|
+
import * as i8 from "@angular/material/radio";
|
87
|
+
import * as i9 from "@angular/material/button";
|
88
|
+
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 });
|
160
|
+
}
|
161
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialFormsComponent, decorators: [{
|
162
|
+
type: Component,
|
163
|
+
args: [{ selector: 'material-forms', standalone: true, imports: [
|
164
|
+
CommonModule,
|
165
|
+
ReactiveFormsModule,
|
166
|
+
MatInputModule,
|
167
|
+
MatSelectModule,
|
168
|
+
MatCheckboxModule,
|
169
|
+
MatRadioModule,
|
170
|
+
MatButtonModule,
|
171
|
+
ValidationMessagesComponent,
|
172
|
+
MatDatepickerModule,
|
173
|
+
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
|