@olafvv/ngx-dynamic-form 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/controls/input/dynamic-input.component.mjs +3 -3
- package/esm2022/lib/models/constants/dynamic-relations.const.mjs +18 -2
- package/esm2022/lib/services/dynamic-form-relations.service.mjs +2 -2
- package/fesm2022/olafvv-ngx-dynamic-form.mjs +20 -4
- package/fesm2022/olafvv-ngx-dynamic-form.mjs.map +1 -1
- package/lib/models/constants/dynamic-relations.const.d.ts +5 -0
- package/package.json +5 -5
|
@@ -36,11 +36,11 @@ export class DynamicInputComponent extends DynamicFormFieldBase {
|
|
|
36
36
|
this.change.emit(event);
|
|
37
37
|
}
|
|
38
38
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
39
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DynamicInputComponent, isStandalone: true, selector: "dynamic-input", inputs: { model: "model", group: "group" }, outputs: { change: "change" }, viewQueries: [{ propertyName: "input", first: true, predicate: MatInput, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <span matTextPrefix\n *ngIf=\"model.prefix\">{{model.prefix}}</span>\n\n <input matInput\n [type]=\"model.inputType\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.min]=\"model.min\"\n [attr.max]=\"model.max\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [pattern]=\"model.pattern\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\" />\n\n <button matSuffix\n mat-icon-button\n *ngIf=\"showClear\"\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n\n <div matSuffix\n *ngIf=\"model.showLoader()\"\n class=\"loaderIcon\">\n <mat-spinner diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>", styles: ["mat-form-field{width:100%}mat-form-field .loaderIcon{padding:8px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
39
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DynamicInputComponent, isStandalone: true, selector: "dynamic-input", inputs: { model: "model", group: "group" }, outputs: { change: "change" }, viewQueries: [{ propertyName: "input", first: true, predicate: MatInput, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <span matTextPrefix\n *ngIf=\"model.prefix\">{{model.prefix}}</span>\n\n <input matInput\n [type]=\"model.inputType\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.min]=\"model.min\"\n [attr.max]=\"model.max\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [pattern]=\"model.pattern\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\" />\n\n <button matSuffix\n mat-icon-button\n *ngIf=\"showClear\"\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n\n <div matSuffix\n *ngIf=\"model.showLoader()\"\n class=\"loaderIcon\">\n <mat-spinner diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>", styles: ["mat-form-field{width:100%}mat-form-field .loaderIcon{padding:8px}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0}input[type=number]{-moz-appearance:textfield;appearance:textfield}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
40
40
|
}
|
|
41
41
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicInputComponent, decorators: [{
|
|
42
42
|
type: Component,
|
|
43
|
-
args: [{ standalone: true, imports: [NgIf, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule], selector: 'dynamic-input', template: "<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <span matTextPrefix\n *ngIf=\"model.prefix\">{{model.prefix}}</span>\n\n <input matInput\n [type]=\"model.inputType\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.min]=\"model.min\"\n [attr.max]=\"model.max\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [pattern]=\"model.pattern\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\" />\n\n <button matSuffix\n mat-icon-button\n *ngIf=\"showClear\"\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n\n <div matSuffix\n *ngIf=\"model.showLoader()\"\n class=\"loaderIcon\">\n <mat-spinner diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>", styles: ["mat-form-field{width:100%}mat-form-field .loaderIcon{padding:8px}\n"] }]
|
|
43
|
+
args: [{ standalone: true, imports: [NgIf, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule], selector: 'dynamic-input', template: "<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <span matTextPrefix\n *ngIf=\"model.prefix\">{{model.prefix}}</span>\n\n <input matInput\n [type]=\"model.inputType\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.min]=\"model.min\"\n [attr.max]=\"model.max\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [pattern]=\"model.pattern\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\" />\n\n <button matSuffix\n mat-icon-button\n *ngIf=\"showClear\"\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n\n <div matSuffix\n *ngIf=\"model.showLoader()\"\n class=\"loaderIcon\">\n <mat-spinner diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>", styles: ["mat-form-field{width:100%}mat-form-field .loaderIcon{padding:8px}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0}input[type=number]{-moz-appearance:textfield;appearance:textfield}\n"] }]
|
|
44
44
|
}], propDecorators: { input: [{
|
|
45
45
|
type: ViewChild,
|
|
46
46
|
args: [MatInput, { static: true }]
|
|
@@ -51,4 +51,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
51
51
|
}], change: [{
|
|
52
52
|
type: Output
|
|
53
53
|
}] } });
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHluYW1pYy1mb3JtL3NyYy9saWIvY29udHJvbHMvaW5wdXQvZHluYW1pYy1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHluYW1pYy1mb3JtL3NyYy9saWIvY29udHJvbHMvaW5wdXQvZHluYW1pYy1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLG1CQUFtQixFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7Ozs7Ozs7QUFXcEYsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG9CQUFvQjtJQVAvRDs7UUFhWSxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7S0FzQjlEO0lBcEJDLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDbEYsQ0FBQztJQUVNLFFBQVEsQ0FBQyxLQUFvQztRQUNsRCx3Q0FBd0M7UUFDeEMsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDM0IsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUE4QixDQUFDLENBQUM7SUFDbkQsQ0FBQzsrR0EzQlUscUJBQXFCO21HQUFyQixxQkFBcUIsMkxBQ3JCLFFBQVEscUZDcEJyQiw2ekNBNkNpQixrVEQvQkwsSUFBSSw0RkFBRSxtQkFBbUIsNC9CQUFFLGtCQUFrQixpdUJBQUUsY0FBYywwV0FBRSxlQUFlLDJJQUFFLGFBQWEsbUxBQUUsd0JBQXdCOzs0RkFLdEgscUJBQXFCO2tCQVBqQyxTQUFTO2lDQUNJLElBQUksV0FDUCxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSx3QkFBd0IsQ0FBQyxZQUN4SCxlQUFlOzhCQUtjLEtBQUs7c0JBQTNDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFNUIsS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlYWN0aXZlRm9ybXNNb2R1bGUsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dCwgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IER5bmFtaWNGb3JtRmllbGRCYXNlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NsYXNzZXMvZHluYW1pYy1mb3JtLWZpZWxkLWJhc2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1GaWVsZEV2ZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ludGVyZmFjZXMvZHluYW1pYy1mb3JtLWZpZWxkLWV2ZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBEeW5hbWljSW5wdXQgfSBmcm9tICcuL2R5bmFtaWMtaW5wdXQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nSWYsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlXSxcbiAgc2VsZWN0b3I6ICdkeW5hbWljLWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZHluYW1pYy1pbnB1dC5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0lucHV0Q29tcG9uZW50IGV4dGVuZHMgRHluYW1pY0Zvcm1GaWVsZEJhc2Uge1xuICBAVmlld0NoaWxkKE1hdElucHV0LCB7IHN0YXRpYzogdHJ1ZSB9KSBpbnB1dCE6IE1hdElucHV0O1xuXG4gIEBJbnB1dCgpIG1vZGVsITogRHluYW1pY0lucHV0O1xuICBASW5wdXQoKSBncm91cCE6IFVudHlwZWRGb3JtR3JvdXA7XG5cbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RHluYW1pY0Zvcm1GaWVsZEV2ZW50PigpO1xuXG4gIGdldCB2YWx1ZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXQ/LnZhbHVlID8gdGhpcy5pbnB1dC52YWx1ZS5sZW5ndGggOiAwO1xuICB9XG5cbiAgZ2V0IG1heENvdW50VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnZhbHVlQ291bnR9IC8gJHt0aGlzLm1vZGVsLm1heExlbmd0aH1gO1xuICB9XG5cbiAgZ2V0IHNob3dDbGVhcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmNvbnRyb2wudmFsdWUgJiYgIXRoaXMuY29udHJvbC5kaXNhYmxlZCAmJiAhdGhpcy5tb2RlbC5zaG93TG9hZGVyO1xuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlKGV2ZW50OiBFdmVudCB8IER5bmFtaWNGb3JtRmllbGRFdmVudCk6IHZvaWQge1xuICAgIC8vIElnbm9yZSB0aGUgbmF0aXZlIEhUTUwgNSBjaGFuZ2UgZXZlbnRcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2UuZW1pdChldmVudCBhcyBEeW5hbWljRm9ybUZpZWxkRXZlbnQpO1xuICB9XG59XG4iLCI8bWF0LWZvcm0tZmllbGQgW2Zvcm1Hcm91cF09XCJncm91cFwiXG4gIFtpZF09XCJpZFwiXG4gIGNvbG9yPVwicHJpbWFyeVwiPlxuICA8bWF0LWxhYmVsICpuZ0lmPVwibW9kZWwubGFiZWxcIj57e21vZGVsLmxhYmVsfX08L21hdC1sYWJlbD5cblxuICA8c3BhbiBtYXRUZXh0UHJlZml4XG4gICAgKm5nSWY9XCJtb2RlbC5wcmVmaXhcIj57e21vZGVsLnByZWZpeH19PC9zcGFuPlxuXG4gIDxpbnB1dCBtYXRJbnB1dFxuICAgIFt0eXBlXT1cIm1vZGVsLmlucHV0VHlwZVwiXG4gICAgW2Zvcm1Db250cm9sTmFtZV09XCJtb2RlbC5uYW1lXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwibW9kZWwucGxhY2Vob2xkZXJcIlxuICAgIFthdHRyLm1pbl09XCJtb2RlbC5taW5cIlxuICAgIFthdHRyLm1heF09XCJtb2RlbC5tYXhcIlxuICAgIFthdHRyLm1pbkxlbmd0aF09XCJtb2RlbC5taW5MZW5ndGhcIlxuICAgIFthdHRyLm1heExlbmd0aF09XCJtb2RlbC5tYXhMZW5ndGhcIlxuICAgIFtwYXR0ZXJuXT1cIm1vZGVsLnBhdHRlcm5cIlxuICAgIFthdXRvY29tcGxldGVdPVwibW9kZWwuYXV0b2NvbXBsZXRlXCJcbiAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIiAvPlxuXG4gIDxidXR0b24gbWF0U3VmZml4XG4gICAgbWF0LWljb24tYnV0dG9uXG4gICAgKm5nSWY9XCJzaG93Q2xlYXJcIlxuICAgIChjbGljayk9XCJyZXNldENvbnRyb2woKVwiPlxuICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsZWFyXCI+PC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG5cbiAgPGRpdiBtYXRTdWZmaXhcbiAgICAqbmdJZj1cIm1vZGVsLnNob3dMb2FkZXIoKVwiXG4gICAgY2xhc3M9XCJsb2FkZXJJY29uXCI+XG4gICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMTZcIlxuICAgICAgY29sb3I9XCJwcmltYXJ5XCI+PC9tYXQtc3Bpbm5lcj5cbiAgPC9kaXY+XG5cbiAgPG1hdC1oaW50ICpuZ0lmPVwibW9kZWwuaGludFwiXG4gICAgYWxpZ249XCJzdGFydFwiPnt7bW9kZWwuaGludH19PC9tYXQtaGludD5cblxuICA8bWF0LWhpbnQgKm5nSWY9XCJtb2RlbC5tYXhMZW5ndGhcIlxuICAgIGFsaWduPVwiZW5kXCI+e3ttYXhDb3VudFRleHR9fTwvbWF0LWhpbnQ+XG5cbiAgQGZvcih2YWxpZGF0b3Igb2YgbW9kZWwudmFsaWRhdG9yczsgdHJhY2sgdmFsaWRhdG9yLm5hbWUpIHtcbiAgPG5nLWNvbnRhaW5lciBuZ1Byb2plY3RBcz1cIm1hdC1lcnJvclwiPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJoYXNFcnJvcih2YWxpZGF0b3IubmFtZSlcIj57e3ZhbGlkYXRvci5tZXNzYWdlfX08L21hdC1lcnJvcj5cbiAgPC9uZy1jb250YWluZXI+XG4gIH1cbjwvbWF0LWZvcm0tZmllbGQ+Il19
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { DynamicFormValidationsService } from '../../services/dynamic-validations.service';
|
|
2
2
|
import { DynamicFormValidators } from '../classes/dynamic-form-validators';
|
|
3
3
|
import { RelationActionType } from '../interfaces/dynamic-form-field-relation.interface';
|
|
4
|
+
/**
|
|
5
|
+
* Relation action to disable/enable a form control.
|
|
6
|
+
*/
|
|
4
7
|
const DISABLE_ACTION = {
|
|
5
8
|
type: RelationActionType.DISABLED,
|
|
6
9
|
reversedType: RelationActionType.ENABLED,
|
|
@@ -8,6 +11,9 @@ const DISABLE_ACTION = {
|
|
|
8
11
|
model.disabled = hasMatch;
|
|
9
12
|
}
|
|
10
13
|
};
|
|
14
|
+
/**
|
|
15
|
+
* Relation action to toggle the visibility of a form control
|
|
16
|
+
*/
|
|
11
17
|
const HIDDEN_ACTION = {
|
|
12
18
|
type: RelationActionType.HIDDEN,
|
|
13
19
|
reversedType: RelationActionType.VISIBLE,
|
|
@@ -15,6 +21,9 @@ const HIDDEN_ACTION = {
|
|
|
15
21
|
model.hidden = hasMatch;
|
|
16
22
|
}
|
|
17
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* Relation action to add or remove the required validator to a form control
|
|
26
|
+
*/
|
|
18
27
|
const REQUIRED_ACTION = {
|
|
19
28
|
type: RelationActionType.REQUIRED,
|
|
20
29
|
reversedType: RelationActionType.OPTIONAL,
|
|
@@ -22,13 +31,20 @@ const REQUIRED_ACTION = {
|
|
|
22
31
|
const hasRequiredValidation = !!model.validators.find((f) => f.name === 'required');
|
|
23
32
|
let validators;
|
|
24
33
|
if (hasMatch) {
|
|
34
|
+
// If the model already contains the required validator, return the model validators.
|
|
35
|
+
// Otherwise, add the required validator
|
|
25
36
|
validators = hasRequiredValidation ? model.validators : [...model.validators, DynamicFormValidators.required()];
|
|
26
37
|
}
|
|
27
38
|
else {
|
|
28
|
-
validators = model.validators.filter((f) => f.name
|
|
39
|
+
validators = model.validators.filter((f) => f.name !== 'required');
|
|
29
40
|
}
|
|
30
41
|
injector.get(DynamicFormValidationsService).updateValidators(validators, control);
|
|
31
42
|
}
|
|
32
43
|
};
|
|
44
|
+
/**
|
|
45
|
+
* Export all Relation actions so the DynamicFormService can easily access all Relation actions.
|
|
46
|
+
* This way if there are any new actions, all you have to do is add them here.
|
|
47
|
+
* TODO: This can be potentially be expanded towords an InjectionToken to provide the possibility for custom relationactions.
|
|
48
|
+
*/
|
|
33
49
|
export const RELATION_ACTIONS = [DISABLE_ACTION, HIDDEN_ACTION, REQUIRED_ACTION];
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1yZWxhdGlvbnMuY29uc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHluYW1pYy1mb3JtL3NyYy9saWIvbW9kZWxzL2NvbnN0YW50cy9keW5hbWljLXJlbGF0aW9ucy5jb25zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUUzRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQVN6Rjs7R0FFRztBQUNILE1BQU0sY0FBYyxHQUEwQjtJQUM1QyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsUUFBUTtJQUNqQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsT0FBTztJQUN4QyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUs7UUFDcEIsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDNUIsQ0FBQztDQUNGLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sYUFBYSxHQUEwQjtJQUMzQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsTUFBTTtJQUMvQixZQUFZLEVBQUUsa0JBQWtCLENBQUMsT0FBTztJQUN4QyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUs7UUFDcEIsS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7SUFDMUIsQ0FBQztDQUNGLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sZUFBZSxHQUEwQjtJQUM3QyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsUUFBUTtJQUNqQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsUUFBUTtJQUN6QyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUTtRQUN2QyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQztRQUNwRixJQUFJLFVBQWtDLENBQUM7UUFFdkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLHFGQUFxRjtZQUNyRix3Q0FBd0M7WUFDeEMsVUFBVSxHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xILENBQUM7YUFBTSxDQUFDO1lBQ04sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRCxRQUFRLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BGLENBQUM7Q0FDRixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUE0QixDQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1WYWxpZGF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9keW5hbWljLXZhbGlkYXRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1GaWVsZE1vZGVsIH0gZnJvbSAnLi4vY2xhc3Nlcy9keW5hbWljLWZvcm0tZmllbGQtbW9kZWwnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1WYWxpZGF0b3JzIH0gZnJvbSAnLi4vY2xhc3Nlcy9keW5hbWljLWZvcm0tdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyBSZWxhdGlvbkFjdGlvblR5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1maWVsZC1yZWxhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1WYWxpZGF0b3IgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS12YWxpZGF0b3IuaW50ZXJmYWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljUmVsYXRpb25BY3Rpb24ge1xuICB0eXBlOiBSZWxhdGlvbkFjdGlvblR5cGU7XG4gIHJldmVyc2VkVHlwZT86IHN0cmluZztcbiAgY2hhbmdlKGhhc01hdGNoOiBib29sZWFuLCBtb2RlbDogRHluYW1pY0Zvcm1GaWVsZE1vZGVsLCBjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wsIGluamVjdG9yOiBJbmplY3Rvcik6IHZvaWQ7XG59XG5cbi8qKlxuICogUmVsYXRpb24gYWN0aW9uIHRvIGRpc2FibGUvZW5hYmxlIGEgZm9ybSBjb250cm9sLlxuICovXG5jb25zdCBESVNBQkxFX0FDVElPTjogRHluYW1pY1JlbGF0aW9uQWN0aW9uID0ge1xuICB0eXBlOiBSZWxhdGlvbkFjdGlvblR5cGUuRElTQUJMRUQsXG4gIHJldmVyc2VkVHlwZTogUmVsYXRpb25BY3Rpb25UeXBlLkVOQUJMRUQsXG4gIGNoYW5nZShoYXNNYXRjaCwgbW9kZWwpIHtcbiAgICBtb2RlbC5kaXNhYmxlZCA9IGhhc01hdGNoO1xuICB9XG59O1xuXG4vKipcbiAqIFJlbGF0aW9uIGFjdGlvbiB0byB0b2dnbGUgdGhlIHZpc2liaWxpdHkgb2YgYSBmb3JtIGNvbnRyb2xcbiAqL1xuY29uc3QgSElEREVOX0FDVElPTjogRHluYW1pY1JlbGF0aW9uQWN0aW9uID0ge1xuICB0eXBlOiBSZWxhdGlvbkFjdGlvblR5cGUuSElEREVOLFxuICByZXZlcnNlZFR5cGU6IFJlbGF0aW9uQWN0aW9uVHlwZS5WSVNJQkxFLFxuICBjaGFuZ2UoaGFzTWF0Y2gsIG1vZGVsKSB7XG4gICAgbW9kZWwuaGlkZGVuID0gaGFzTWF0Y2g7XG4gIH1cbn07XG5cbi8qKlxuICogUmVsYXRpb24gYWN0aW9uIHRvIGFkZCBvciByZW1vdmUgdGhlIHJlcXVpcmVkIHZhbGlkYXRvciB0byBhIGZvcm0gY29udHJvbFxuICovXG5jb25zdCBSRVFVSVJFRF9BQ1RJT046IER5bmFtaWNSZWxhdGlvbkFjdGlvbiA9IHtcbiAgdHlwZTogUmVsYXRpb25BY3Rpb25UeXBlLlJFUVVJUkVELFxuICByZXZlcnNlZFR5cGU6IFJlbGF0aW9uQWN0aW9uVHlwZS5PUFRJT05BTCxcbiAgY2hhbmdlKGhhc01hdGNoLCBtb2RlbCwgY29udHJvbCwgaW5qZWN0b3IpIHtcbiAgICBjb25zdCBoYXNSZXF1aXJlZFZhbGlkYXRpb24gPSAhIW1vZGVsLnZhbGlkYXRvcnMuZmluZCgoZikgPT4gZi5uYW1lID09PSAncmVxdWlyZWQnKTtcbiAgICBsZXQgdmFsaWRhdG9yczogRHluYW1pY0Zvcm1WYWxpZGF0b3JbXTtcblxuICAgIGlmIChoYXNNYXRjaCkge1xuICAgICAgLy8gSWYgdGhlIG1vZGVsIGFscmVhZHkgY29udGFpbnMgdGhlIHJlcXVpcmVkIHZhbGlkYXRvciwgcmV0dXJuIHRoZSBtb2RlbCB2YWxpZGF0b3JzLlxuICAgICAgLy8gT3RoZXJ3aXNlLCBhZGQgdGhlIHJlcXVpcmVkIHZhbGlkYXRvclxuICAgICAgdmFsaWRhdG9ycyA9IGhhc1JlcXVpcmVkVmFsaWRhdGlvbiA/IG1vZGVsLnZhbGlkYXRvcnMgOiBbLi4ubW9kZWwudmFsaWRhdG9ycywgRHluYW1pY0Zvcm1WYWxpZGF0b3JzLnJlcXVpcmVkKCldO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxpZGF0b3JzID0gbW9kZWwudmFsaWRhdG9ycy5maWx0ZXIoKGYpID0+IGYubmFtZSAhPT0gJ3JlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaW5qZWN0b3IuZ2V0KER5bmFtaWNGb3JtVmFsaWRhdGlvbnNTZXJ2aWNlKS51cGRhdGVWYWxpZGF0b3JzKHZhbGlkYXRvcnMsIGNvbnRyb2wpO1xuICB9XG59O1xuXG4vKipcbiAqIEV4cG9ydCBhbGwgUmVsYXRpb24gYWN0aW9ucyBzbyB0aGUgRHluYW1pY0Zvcm1TZXJ2aWNlIGNhbiBlYXNpbHkgYWNjZXNzIGFsbCBSZWxhdGlvbiBhY3Rpb25zLlxuICogVGhpcyB3YXkgaWYgdGhlcmUgYXJlIGFueSBuZXcgYWN0aW9ucywgYWxsIHlvdSBoYXZlIHRvIGRvIGlzIGFkZCB0aGVtIGhlcmUuXG4gKiBUT0RPOiBUaGlzIGNhbiBiZSBwb3RlbnRpYWxseSBiZSBleHBhbmRlZCB0b3dvcmRzIGFuIEluamVjdGlvblRva2VuIHRvIHByb3ZpZGUgdGhlIHBvc3NpYmlsaXR5IGZvciBjdXN0b20gcmVsYXRpb25hY3Rpb25zLlxuICovXG5leHBvcnQgY29uc3QgUkVMQVRJT05fQUNUSU9OUzogRHluYW1pY1JlbGF0aW9uQWN0aW9uW10gPSBbRElTQUJMRV9BQ1RJT04sIEhJRERFTl9BQ1RJT04sIFJFUVVJUkVEX0FDVElPTl07XG4iXX0=
|
|
@@ -21,7 +21,7 @@ export class DynamicFormRelationsService {
|
|
|
21
21
|
? group.root.get(condition.path)
|
|
22
22
|
: group.get(condition.fieldName);
|
|
23
23
|
if (!control) {
|
|
24
|
-
console.warn(`No related form control with the name ${
|
|
24
|
+
console.warn(`No related form control with the name ${fieldName} found`);
|
|
25
25
|
return controls;
|
|
26
26
|
}
|
|
27
27
|
controls[fieldName] = control;
|
|
@@ -105,4 +105,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
105
105
|
providedIn: 'root'
|
|
106
106
|
}]
|
|
107
107
|
}] });
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLXJlbGF0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWR5bmFtaWMtZm9ybS9zcmMvbGliL3NlcnZpY2VzL2R5bmFtaWMtZm9ybS1yZWxhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFckUsT0FBTyxFQUF5QixnQkFBZ0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3RHLE9BQU8sRUFBK0MsZ0JBQWdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7QUFNM0ksTUFBTSxPQUFPLDJCQUEyQjtJQUh4QztRQUlVLGNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0F1SHRDO0lBckhDOzs7OztPQUtHO0lBQ0ksb0JBQW9CLENBQUMsS0FBNEIsRUFBRSxLQUFnQjtRQUN4RSxNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBNkIsRUFBRSxTQUE0QixFQUFFLEVBQUU7WUFDdkYsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsU0FBVSxDQUFDO1lBQ3pELHVEQUF1RDtZQUN2RCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSTtnQkFDNUIsQ0FBQyxDQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQXdCO2dCQUN4RCxDQUFDLENBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBVSxDQUF3QixDQUFDO1lBRTVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxTQUFTLENB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QUFHLENBQUMsSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTztvQkFBRSxPQUFPLEtBQUssQ0FBQztnQkFFN0UsbUdBQW1HO2dCQUNuRyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksUUFBUSxLQUFLLGdCQUFnQixDQUFDLEVBQUUsSUFBSSxPQUFPO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUUxRSxPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFFRCw0SUFBNEk7WUFDNUksSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDaEQsd0VBQXdFO2dCQUN4RSxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksUUFBUSxLQUFLLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxPQUFPO29CQUFFLE9BQU8sSUFBSSxDQUFDO2dCQUUzRSwwRUFBMEU7Z0JBQzFFLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTztvQkFBRSxPQUFPLEtBQUssQ0FBQztnQkFFNUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQztRQUVGLE9BQU8sUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7K0dBdkhVLDJCQUEyQjttSEFBM0IsMkJBQTJCLGNBRjFCLE1BQU07OzRGQUVQLDJCQUEyQjtrQkFIdkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3RhcnRXaXRoLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IER5bmFtaWNGb3JtRmllbGRNb2RlbCB9IGZyb20gJy4uL21vZGVscy9jbGFzc2VzL2R5bmFtaWMtZm9ybS1maWVsZC1tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljUmVsYXRpb25BY3Rpb24sIFJFTEFUSU9OX0FDVElPTlMgfSBmcm9tICcuLi9tb2RlbHMvY29uc3RhbnRzL2R5bmFtaWMtcmVsYXRpb25zLmNvbnN0JztcbmltcG9ydCB7IER5bmFtaWNGb3JtRmllbGRSZWxhdGlvbiwgUmVsYXRpb25Db25kaXRpb24sIFJlbGF0aW9uT3BlcmF0b3IgfSBmcm9tICcuLi9tb2RlbHMvaW50ZXJmYWNlcy9keW5hbWljLWZvcm0tZmllbGQtcmVsYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlbGF0ZWRGb3JtQ29udHJvbHMgfSBmcm9tICcuLi9tb2RlbHMvdHlwZXMvcmVsYXRlZC1mb3JtLWNvbnRyb2xzLnR5cGUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybVJlbGF0aW9uc1NlcnZpY2Uge1xuICBwcml2YXRlIF9pbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cbiAgLyoqXG4gICAqIEdldCBhbiBvYmplY3Qgd2l0aCBhbGwgRm9ybUZpZWxkIHRoZSBwcm92aWRlZCBtb2RlbCBoYXMgYSByZWxhdGlvbiB3aXRoXG4gICAqIEBwYXJhbSBtb2RlbFxuICAgKiBAcGFyYW0gZ3JvdXBcbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyBmaW5kUmVsYXRlZEZvcm1GaWVsZChtb2RlbDogRHluYW1pY0Zvcm1GaWVsZE1vZGVsLCBncm91cDogRm9ybUdyb3VwKTogUmVsYXRlZEZvcm1Db250cm9scyB7XG4gICAgY29uc3QgY29uZGl0aW9uUmVkdWNlciA9IChjb250cm9sczogUmVsYXRlZEZvcm1Db250cm9scywgY29uZGl0aW9uOiBSZWxhdGlvbkNvbmRpdGlvbikgPT4ge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gY29uZGl0aW9uLnBhdGggPz8gY29uZGl0aW9uLmZpZWxkTmFtZSE7XG4gICAgICAvLyBHZXQgdGhlIGNvbnRyb2wgdXNpbmcgdGhlIHByb3ZpZGVkIHBhdGggb3IgZmllbGROYW1lXG4gICAgICBjb25zdCBjb250cm9sID0gY29uZGl0aW9uLnBhdGhcbiAgICAgICAgPyAoZ3JvdXAucm9vdC5nZXQoY29uZGl0aW9uLnBhdGgpIGFzIFVudHlwZWRGb3JtQ29udHJvbClcbiAgICAgICAgOiAoZ3JvdXAuZ2V0KGNvbmRpdGlvbi5maWVsZE5hbWUhKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2wpO1xuXG4gICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBObyByZWxhdGVkIGZvcm0gY29udHJvbCB3aXRoIHRoZSBuYW1lICR7Y29uZGl0aW9uLmZpZWxkTmFtZX0gZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xzO1xuICAgICAgfVxuXG4gICAgICBjb250cm9sc1tmaWVsZE5hbWVdID0gY29udHJvbDtcbiAgICAgIHJldHVybiBjb250cm9scztcbiAgICB9O1xuXG4gICAgY29uc3QgcmVsYXRpb25zUmVkdWNlciA9IChjb250cm9sczogUmVsYXRlZEZvcm1Db250cm9scywgcmVsYXRpb246IER5bmFtaWNGb3JtRmllbGRSZWxhdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIHJlbGF0aW9uLmNvbmRpdGlvbnMucmVkdWNlKGNvbmRpdGlvblJlZHVjZXIsIGNvbnRyb2xzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG1vZGVsLnJlbGF0aW9ucyEucmVkdWNlKHJlbGF0aW9uc1JlZHVjZXIsIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZWxhdGlvblN1YnNjcmlwdGlvbnMoXG4gICAgcmVsYXRlZEZvcm1Db250cm9sczogUmVsYXRlZEZvcm1Db250cm9scyxcbiAgICBtb2RlbDogRHluYW1pY0Zvcm1GaWVsZE1vZGVsLFxuICAgIGNvbnRyb2w6IEZvcm1Db250cm9sXG4gICk6IFN1YnNjcmlwdGlvbltdIHtcbiAgICBjb25zdCBzdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIHZhbHVlIGNoYW5nZXMgb2YgYWxsIEZvcm1Db250cm9scywgcHJvdmlkZSB0aGUgY3VycmVudCB2YWx1ZSBpbnNpZGUgdGhlIHN0YXJ0V2l0aFxuICAgIE9iamVjdC52YWx1ZXMocmVsYXRlZEZvcm1Db250cm9scykuZm9yRWFjaCgocmVsYXRlZENvbnRyb2wpID0+IHtcbiAgICAgIHN1YnMucHVzaChcbiAgICAgICAgcmVsYXRlZENvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHJlbGF0ZWRDb250cm9sLnZhbHVlKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBtb2RlbC5yZWxhdGlvbnMhLmZvckVhY2goKHJlbGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBSZWxhdGlvbkFjdGlvbiBvYmplY3QgYmFzZWQgb24gdGhlIGFjdGlvblR5cGUgcGFzc2VkIGluc2lkZSB0aGUgRHluYW1pY0Zvcm1Db25maWdcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IFJFTEFUSU9OX0FDVElPTlMuZmluZChcbiAgICAgICAgICAgICAgKGFjdGlvbikgPT4gcmVsYXRpb24uYWN0aW9uVHlwZSA9PT0gYWN0aW9uLnR5cGUgfHwgcmVsYXRpb24uYWN0aW9uVHlwZSA9PT0gYWN0aW9uLnJldmVyc2VkVHlwZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICAgICAgICBjb25zdCBzaG91bGRUcmlnZ2VyID0gdGhpcy5jaGVja1JlbGF0aW9uQ29uZGl0aW9uKHJlbGF0aW9uLCByZWxhdGVkRm9ybUNvbnRyb2xzLCBhY3Rpb24pO1xuXG4gICAgICAgICAgICAgIGFjdGlvbi5jaGFuZ2Uoc2hvdWxkVHJpZ2dlciwgbW9kZWwsIGNvbnRyb2wsIHRoaXMuX2luamVjdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3VicztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgY29uZGl0aW9ucyBpbnNpZGUgdGhlIHJlbGF0aW9uc1xuICAgKiBAcGFyYW0gcmVsYXRpb25cbiAgICogQHBhcmFtIHJlbGF0ZWRDb250cm9sXG4gICAqIEBwYXJhbSBhY3Rpb25cbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgY2hlY2tSZWxhdGlvbkNvbmRpdGlvbihcbiAgICByZWxhdGlvbjogRHluYW1pY0Zvcm1GaWVsZFJlbGF0aW9uLFxuICAgIHJlbGF0ZWRDb250cm9sczogUmVsYXRlZEZvcm1Db250cm9scyxcbiAgICBhY3Rpb246IER5bmFtaWNSZWxhdGlvbkFjdGlvblxuICApOiBib29sZWFuIHtcbiAgICAvLyBEZWZhdWx0IG9wZXJhdG9yIGlzIEFORCwgbWVhbmluZyBhbGwgY29uZGl0aW9ucyBzaG91bGQgcmV0dXJuIHRydWUgYmVmb3JlIHRoZSBwcm92aWRlZCBhY3Rpb24gaXMgdHJpZ2dlcmVkLlxuICAgIC8vIEluIHRoZSBjYXNlIG9mIGEgcmV2ZXJzZWQgdHlwZSwgdGhlIHJldHVybiB2YWx1ZSB3aG91bGQgYmUgZmFsc2UuXG4gICAgY29uc3Qgb3BlcmF0b3IgPSByZWxhdGlvbi5vcGVyYXRvciA/PyBSZWxhdGlvbk9wZXJhdG9yLkFORDtcblxuICAgIC8vIFVzZSBhIHJlZHVjZXIgdG8gbWFwIGFsbCBjb25kaXRpb25zIHRvIGEgc2luZ2xlIGJvb2xlYW4gdmFsdWUgdG8gZGVjaWRlIGlmIHdlIHdhbnQgdG8gdHJpZ2dlciB0aGUgcHJvdmlkZWQgYWN0aW9uIHR5cGVcbiAgICBjb25zdCByZWR1Y2VyID0gKGlzTWF0Y2g6IGJvb2xlYW4sIGNvbmRpdGlvbjogUmVsYXRpb25Db25kaXRpb24sIGluZGV4OiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgIC8vIEZpbmQgdGhlIEZvcm1Db250cm9sIG9mIHRoZSByZWxhdGVkIGZpZWxkXG4gICAgICBsZXQgcmVsYXRlZENvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCB8IHVuZGVmaW5lZDtcblxuICAgICAgZm9yIChjb25zdCBbZmllbGROYW1lLCBjb250cm9sXSBvZiBPYmplY3QuZW50cmllcyhyZWxhdGVkQ29udHJvbHMpKSB7XG4gICAgICAgIGlmIChmaWVsZE5hbWUgPT09IChjb25kaXRpb24ucGF0aCA/PyBjb25kaXRpb24uZmllbGROYW1lKSkge1xuICAgICAgICAgIHJlbGF0ZWRDb250cm9sID0gY29udHJvbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0ZWRDb250cm9sKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIFVzaW5nIHRoZSAnbm9ybWFsJyB0eXBlIHNob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBjb25kaXRpb24gbWF0Y2hlc1xuICAgICAgaWYgKHJlbGF0aW9uLmFjdGlvblR5cGUgPT09IGFjdGlvbi50eXBlKSB7XG4gICAgICAgIC8vIFNob3J0Y3V0IHRvIGZhbHNlIHdoZW4gYSBwcmV2aW91cyBjb25kaXRpb24gY2hlY2sgd2FzIHJlc29sdmVkIGFzIGZhbHNlIGluIGNhc2Ugb2YgdGhlIEFORCBvcGVyYXRvclxuICAgICAgICBpZiAoaW5kZXggPiAwICYmIG9wZXJhdG9yID09PSBSZWxhdGlvbk9wZXJhdG9yLkFORCAmJiAhaXNNYXRjaCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIFNob3J0Y3V0IHRvIHRydWUgd2hlbiBhIHByZXZpb3VzIGNvbmRpdGlvbiBjaGVjayB3YXMgcmVzb2x2ZWQgYXMgdHJ1ZSBpbiBjYXNlIG9mIHRoZSBPUiBvcGVyYXRvclxuICAgICAgICBpZiAoaW5kZXggPiAwICYmIG9wZXJhdG9yID09PSBSZWxhdGlvbk9wZXJhdG9yLk9SICYmIGlzTWF0Y2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiBjb25kaXRpb24udmFsdWUocmVsYXRlZENvbnRyb2wudmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2luZyB0aGUgcmV2ZXJzZWQgdHlwZSBzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gdGhlIGNvbmRpdGlvbiBtYXRjaGVzLCBiZWNhdXNlIHdlIHdhbnQgdG8gdGhlIG9wcG9zaXRlIG9mIHRoZSBjb25maWd1cmVkIGNoYW5nZSBGdW5jdGlvblxuICAgICAgaWYgKHJlbGF0aW9uLmFjdGlvblR5cGUgPT09IGFjdGlvbi5yZXZlcnNlZFR5cGUpIHtcbiAgICAgICAgLy8gU2hvcnRjdXQgdG8gdHJ1ZSB3aGVuIGEgcHJldmlvdXMgY29uZGl0aW9uIGNoZWNrIHdhcyByZXNvbHZlZCBhcyB0cnVlXG4gICAgICAgIGlmIChpbmRleCA+IDAgJiYgb3BlcmF0b3IgPT09IFJlbGF0aW9uT3BlcmF0b3IuQU5EICYmIGlzTWF0Y2gpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIFNob3J0Y3V0IHRvIGZhbHNlIHdoZW4gYSBwcmV2aW91cyBjb25kaXRpb24gY2hlY2sgd2FzIHJlc29sdmVkIGFzIGZhbHNlXG4gICAgICAgIGlmIChpbmRleCA+IDAgJiYgb3BlcmF0b3IgPT09IFJlbGF0aW9uT3BlcmF0b3IuT1IgJiYgIWlzTWF0Y2gpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gIWNvbmRpdGlvbi52YWx1ZShyZWxhdGVkQ29udHJvbC52YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlbGF0aW9uLmNvbmRpdGlvbnMucmVkdWNlKHJlZHVjZXIsIGZhbHNlKTtcbiAgfVxufVxuIl19
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLXJlbGF0aW9ucy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWR5bmFtaWMtZm9ybS9zcmMvbGliL3NlcnZpY2VzL2R5bmFtaWMtZm9ybS1yZWxhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFckUsT0FBTyxFQUF5QixnQkFBZ0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3RHLE9BQU8sRUFBK0MsZ0JBQWdCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQzs7QUFNM0ksTUFBTSxPQUFPLDJCQUEyQjtJQUh4QztRQUlVLGNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0F1SHRDO0lBckhDOzs7OztPQUtHO0lBQ0ksb0JBQW9CLENBQUMsS0FBNEIsRUFBRSxLQUFnQjtRQUN4RSxNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBNkIsRUFBRSxTQUE0QixFQUFFLEVBQUU7WUFDdkYsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsU0FBVSxDQUFDO1lBQ3pELHVEQUF1RDtZQUN2RCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSTtnQkFDNUIsQ0FBQyxDQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQXdCO2dCQUN4RCxDQUFDLENBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBVSxDQUF3QixDQUFDO1lBRTVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxTQUFTLFFB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QUFJLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUU3RSxtR0FBbUc7Z0JBQ25HLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsRUFBRSxJQUFJLE9BQU87b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBRTFFLE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUVELDRJQUE0STtZQUM1SSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNoRCx3RUFBd0U7Z0JBQ3hFLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxRQUFRLEtBQUssZ0JBQWdCLENBQUMsR0FBRyxJQUFJLE9BQU87b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBRTNFLDBFQUEwRTtnQkFDMUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUFFLE9BQU8sS0FBSyxDQUFDO2dCQUU1RSxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUVELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDO1FBRUYsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQzsrR0F2SFUsMkJBQTJCO21IQUEzQiwyQkFBMkIsY0FGMUIsTUFBTTs7NEZBRVAsMkJBQTJCO2tCQUh2QyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzdGFydFdpdGgsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1GaWVsZE1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzZXMvZHluYW1pYy1mb3JtLWZpZWxkLW1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNSZWxhdGlvbkFjdGlvbiwgUkVMQVRJT05fQUNUSU9OUyB9IGZyb20gJy4uL21vZGVscy9jb25zdGFudHMvZHluYW1pYy1yZWxhdGlvbnMuY29uc3QnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1GaWVsZFJlbGF0aW9uLCBSZWxhdGlvbkNvbmRpdGlvbiwgUmVsYXRpb25PcGVyYXRvciB9IGZyb20gJy4uL21vZGVscy9pbnRlcmZhY2VzL2R5bmFtaWMtZm9ybS1maWVsZC1yZWxhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVsYXRlZEZvcm1Db250cm9scyB9IGZyb20gJy4uL21vZGVscy90eXBlcy9yZWxhdGVkLWZvcm0tY29udHJvbHMudHlwZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtUmVsYXRpb25zU2VydmljZSB7XG4gIHByaXZhdGUgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICAvKipcbiAgICogR2V0IGFuIG9iamVjdCB3aXRoIGFsbCBGb3JtRmllbGQgdGhlIHByb3ZpZGVkIG1vZGVsIGhhcyBhIHJlbGF0aW9uIHdpdGhcbiAgICogQHBhcmFtIG1vZGVsXG4gICAqIEBwYXJhbSBncm91cFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGZpbmRSZWxhdGVkRm9ybUZpZWxkKG1vZGVsOiBEeW5hbWljRm9ybUZpZWxkTW9kZWwsIGdyb3VwOiBGb3JtR3JvdXApOiBSZWxhdGVkRm9ybUNvbnRyb2xzIHtcbiAgICBjb25zdCBjb25kaXRpb25SZWR1Y2VyID0gKGNvbnRyb2xzOiBSZWxhdGVkRm9ybUNvbnRyb2xzLCBjb25kaXRpb246IFJlbGF0aW9uQ29uZGl0aW9uKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBjb25kaXRpb24ucGF0aCA/PyBjb25kaXRpb24uZmllbGROYW1lITtcbiAgICAgIC8vIEdldCB0aGUgY29udHJvbCB1c2luZyB0aGUgcHJvdmlkZWQgcGF0aCBvciBmaWVsZE5hbWVcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBjb25kaXRpb24ucGF0aFxuICAgICAgICA/IChncm91cC5yb290LmdldChjb25kaXRpb24ucGF0aCkgYXMgVW50eXBlZEZvcm1Db250cm9sKVxuICAgICAgICA6IChncm91cC5nZXQoY29uZGl0aW9uLmZpZWxkTmFtZSEpIGFzIFVudHlwZWRGb3JtQ29udHJvbCk7XG5cbiAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYE5vIHJlbGF0ZWQgZm9ybSBjb250cm9sIHdpdGggdGhlIG5hbWUgJHtmaWVsZE5hbWV9IGZvdW5kYCk7XG4gICAgICAgIHJldHVybiBjb250cm9scztcbiAgICAgIH1cblxuICAgICAgY29udHJvbHNbZmllbGROYW1lXSA9IGNvbnRyb2w7XG4gICAgICByZXR1cm4gY29udHJvbHM7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlbGF0aW9uc1JlZHVjZXIgPSAoY29udHJvbHM6IFJlbGF0ZWRGb3JtQ29udHJvbHMsIHJlbGF0aW9uOiBEeW5hbWljRm9ybUZpZWxkUmVsYXRpb24pID0+IHtcbiAgICAgIHJldHVybiByZWxhdGlvbi5jb25kaXRpb25zLnJlZHVjZShjb25kaXRpb25SZWR1Y2VyLCBjb250cm9scyk7XG4gICAgfTtcblxuICAgIHJldHVybiBtb2RlbC5yZWxhdGlvbnMhLnJlZHVjZShyZWxhdGlvbnNSZWR1Y2VyLCB7fSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVsYXRpb25TdWJzY3JpcHRpb25zKFxuICAgIHJlbGF0ZWRGb3JtQ29udHJvbHM6IFJlbGF0ZWRGb3JtQ29udHJvbHMsXG4gICAgbW9kZWw6IER5bmFtaWNGb3JtRmllbGRNb2RlbCxcbiAgICBjb250cm9sOiBGb3JtQ29udHJvbFxuICApOiBTdWJzY3JpcHRpb25bXSB7XG4gICAgY29uc3Qgc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAgIC8vIFN1YnNjcmliZSB0byB2YWx1ZSBjaGFuZ2VzIG9mIGFsbCBGb3JtQ29udHJvbHMsIHByb3ZpZGUgdGhlIGN1cnJlbnQgdmFsdWUgaW5zaWRlIHRoZSBzdGFydFdpdGhcbiAgICBPYmplY3QudmFsdWVzKHJlbGF0ZWRGb3JtQ29udHJvbHMpLmZvckVhY2goKHJlbGF0ZWRDb250cm9sKSA9PiB7XG4gICAgICBzdWJzLnB1c2goXG4gICAgICAgIHJlbGF0ZWRDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aChyZWxhdGVkQ29udHJvbC52YWx1ZSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgbW9kZWwucmVsYXRpb25zIS5mb3JFYWNoKChyZWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgLy8gRmluZCB0aGUgUmVsYXRpb25BY3Rpb24gb2JqZWN0IGJhc2VkIG9uIHRoZSBhY3Rpb25UeXBlIHBhc3NlZCBpbnNpZGUgdGhlIER5bmFtaWNGb3JtQ29uZmlnXG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSBSRUxBVElPTl9BQ1RJT05TLmZpbmQoXG4gICAgICAgICAgICAgIChhY3Rpb24pID0+IHJlbGF0aW9uLmFjdGlvblR5cGUgPT09IGFjdGlvbi50eXBlIHx8IHJlbGF0aW9uLmFjdGlvblR5cGUgPT09IGFjdGlvbi5yZXZlcnNlZFR5cGVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkVHJpZ2dlciA9IHRoaXMuY2hlY2tSZWxhdGlvbkNvbmRpdGlvbihyZWxhdGlvbiwgcmVsYXRlZEZvcm1Db250cm9scywgYWN0aW9uKTtcblxuICAgICAgICAgICAgICBhY3Rpb24uY2hhbmdlKHNob3VsZFRyaWdnZXIsIG1vZGVsLCBjb250cm9sLCB0aGlzLl9pbmplY3Rvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHN1YnM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIGNvbmRpdGlvbnMgaW5zaWRlIHRoZSByZWxhdGlvbnNcbiAgICogQHBhcmFtIHJlbGF0aW9uXG4gICAqIEBwYXJhbSByZWxhdGVkQ29udHJvbFxuICAgKiBAcGFyYW0gYWN0aW9uXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcml2YXRlIGNoZWNrUmVsYXRpb25Db25kaXRpb24oXG4gICAgcmVsYXRpb246IER5bmFtaWNGb3JtRmllbGRSZWxhdGlvbixcbiAgICByZWxhdGVkQ29udHJvbHM6IFJlbGF0ZWRGb3JtQ29udHJvbHMsXG4gICAgYWN0aW9uOiBEeW5hbWljUmVsYXRpb25BY3Rpb25cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gRGVmYXVsdCBvcGVyYXRvciBpcyBBTkQsIG1lYW5pbmcgYWxsIGNvbmRpdGlvbnMgc2hvdWxkIHJldHVybiB0cnVlIGJlZm9yZSB0aGUgcHJvdmlkZWQgYWN0aW9uIGlzIHRyaWdnZXJlZC5cbiAgICAvLyBJbiB0aGUgY2FzZSBvZiBhIHJldmVyc2VkIHR5cGUsIHRoZSByZXR1cm4gdmFsdWUgd2hvdWxkIGJlIGZhbHNlLlxuICAgIGNvbnN0IG9wZXJhdG9yID0gcmVsYXRpb24ub3BlcmF0b3IgPz8gUmVsYXRpb25PcGVyYXRvci5BTkQ7XG5cbiAgICAvLyBVc2UgYSByZWR1Y2VyIHRvIG1hcCBhbGwgY29uZGl0aW9ucyB0byBhIHNpbmdsZSBib29sZWFuIHZhbHVlIHRvIGRlY2lkZSBpZiB3ZSB3YW50IHRvIHRyaWdnZXIgdGhlIHByb3ZpZGVkIGFjdGlvbiB0eXBlXG4gICAgY29uc3QgcmVkdWNlciA9IChpc01hdGNoOiBib29sZWFuLCBjb25kaXRpb246IFJlbGF0aW9uQ29uZGl0aW9uLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICAvLyBGaW5kIHRoZSBGb3JtQ29udHJvbCBvZiB0aGUgcmVsYXRlZCBmaWVsZFxuICAgICAgbGV0IHJlbGF0ZWRDb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgY29udHJvbF0gb2YgT2JqZWN0LmVudHJpZXMocmVsYXRlZENvbnRyb2xzKSkge1xuICAgICAgICBpZiAoZmllbGROYW1lID09PSAoY29uZGl0aW9uLnBhdGggPz8gY29uZGl0aW9uLmZpZWxkTmFtZSkpIHtcbiAgICAgICAgICByZWxhdGVkQ29udHJvbCA9IGNvbnRyb2w7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFyZWxhdGVkQ29udHJvbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBVc2luZyB0aGUgJ25vcm1hbCcgdHlwZSBzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGUgY29uZGl0aW9uIG1hdGNoZXNcbiAgICAgIGlmIChyZWxhdGlvbi5hY3Rpb25UeXBlID09PSBhY3Rpb24udHlwZSkge1xuICAgICAgICAvLyBTaG9ydGN1dCB0byBmYWxzZSB3aGVuIGEgcHJldmlvdXMgY29uZGl0aW9uIGNoZWNrIHdhcyByZXNvbHZlZCBhcyBmYWxzZSBpbiBjYXNlIG9mIHRoZSBBTkQgb3BlcmF0b3JcbiAgICAgICAgaWYgKGluZGV4ID4gMCAmJiBvcGVyYXRvciA9PT0gUmVsYXRpb25PcGVyYXRvci5BTkQgJiYgIWlzTWF0Y2gpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBTaG9ydGN1dCB0byB0cnVlIHdoZW4gYSBwcmV2aW91cyBjb25kaXRpb24gY2hlY2sgd2FzIHJlc29sdmVkIGFzIHRydWUgaW4gY2FzZSBvZiB0aGUgT1Igb3BlcmF0b3JcbiAgICAgICAgaWYgKGluZGV4ID4gMCAmJiBvcGVyYXRvciA9PT0gUmVsYXRpb25PcGVyYXRvci5PUiAmJiBpc01hdGNoKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gY29uZGl0aW9uLnZhbHVlKHJlbGF0ZWRDb250cm9sLnZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNpbmcgdGhlIHJldmVyc2VkIHR5cGUgc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBjb25kaXRpb24gbWF0Y2hlcywgYmVjYXVzZSB3ZSB3YW50IHRvIHRoZSBvcHBvc2l0ZSBvZiB0aGUgY29uZmlndXJlZCBjaGFuZ2UgRnVuY3Rpb25cbiAgICAgIGlmIChyZWxhdGlvbi5hY3Rpb25UeXBlID09PSBhY3Rpb24ucmV2ZXJzZWRUeXBlKSB7XG4gICAgICAgIC8vIFNob3J0Y3V0IHRvIHRydWUgd2hlbiBhIHByZXZpb3VzIGNvbmRpdGlvbiBjaGVjayB3YXMgcmVzb2x2ZWQgYXMgdHJ1ZVxuICAgICAgICBpZiAoaW5kZXggPiAwICYmIG9wZXJhdG9yID09PSBSZWxhdGlvbk9wZXJhdG9yLkFORCAmJiBpc01hdGNoKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBTaG9ydGN1dCB0byBmYWxzZSB3aGVuIGEgcHJldmlvdXMgY29uZGl0aW9uIGNoZWNrIHdhcyByZXNvbHZlZCBhcyBmYWxzZVxuICAgICAgICBpZiAoaW5kZXggPiAwICYmIG9wZXJhdG9yID09PSBSZWxhdGlvbk9wZXJhdG9yLk9SICYmICFpc01hdGNoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuICFjb25kaXRpb24udmFsdWUocmVsYXRlZENvbnRyb2wudmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIHJldHVybiByZWxhdGlvbi5jb25kaXRpb25zLnJlZHVjZShyZWR1Y2VyLCBmYWxzZSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -417,11 +417,11 @@ class DynamicInputComponent extends DynamicFormFieldBase {
|
|
|
417
417
|
this.change.emit(event);
|
|
418
418
|
}
|
|
419
419
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicInputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
420
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DynamicInputComponent, isStandalone: true, selector: "dynamic-input", inputs: { model: "model", group: "group" }, outputs: { change: "change" }, viewQueries: [{ propertyName: "input", first: true, predicate: MatInput, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <span matTextPrefix\n *ngIf=\"model.prefix\">{{model.prefix}}</span>\n\n <input matInput\n [type]=\"model.inputType\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.min]=\"model.min\"\n [attr.max]=\"model.max\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [pattern]=\"model.pattern\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\" />\n\n <button matSuffix\n mat-icon-button\n *ngIf=\"showClear\"\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n\n <div matSuffix\n *ngIf=\"model.showLoader()\"\n class=\"loaderIcon\">\n <mat-spinner diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>", styles: ["mat-form-field{width:100%}mat-form-field .loaderIcon{padding:8px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
420
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DynamicInputComponent, isStandalone: true, selector: "dynamic-input", inputs: { model: "model", group: "group" }, outputs: { change: "change" }, viewQueries: [{ propertyName: "input", first: true, predicate: MatInput, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <span matTextPrefix\n *ngIf=\"model.prefix\">{{model.prefix}}</span>\n\n <input matInput\n [type]=\"model.inputType\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.min]=\"model.min\"\n [attr.max]=\"model.max\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [pattern]=\"model.pattern\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\" />\n\n <button matSuffix\n mat-icon-button\n *ngIf=\"showClear\"\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n\n <div matSuffix\n *ngIf=\"model.showLoader()\"\n class=\"loaderIcon\">\n <mat-spinner diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>", styles: ["mat-form-field{width:100%}mat-form-field .loaderIcon{padding:8px}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0}input[type=number]{-moz-appearance:textfield;appearance:textfield}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2$1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
421
421
|
}
|
|
422
422
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicInputComponent, decorators: [{
|
|
423
423
|
type: Component,
|
|
424
|
-
args: [{ standalone: true, imports: [NgIf, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule], selector: 'dynamic-input', template: "<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <span matTextPrefix\n *ngIf=\"model.prefix\">{{model.prefix}}</span>\n\n <input matInput\n [type]=\"model.inputType\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.min]=\"model.min\"\n [attr.max]=\"model.max\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [pattern]=\"model.pattern\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\" />\n\n <button matSuffix\n mat-icon-button\n *ngIf=\"showClear\"\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n\n <div matSuffix\n *ngIf=\"model.showLoader()\"\n class=\"loaderIcon\">\n <mat-spinner diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>", styles: ["mat-form-field{width:100%}mat-form-field .loaderIcon{padding:8px}\n"] }]
|
|
424
|
+
args: [{ standalone: true, imports: [NgIf, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule], selector: 'dynamic-input', template: "<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <span matTextPrefix\n *ngIf=\"model.prefix\">{{model.prefix}}</span>\n\n <input matInput\n [type]=\"model.inputType\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.min]=\"model.min\"\n [attr.max]=\"model.max\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [pattern]=\"model.pattern\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\" />\n\n <button matSuffix\n mat-icon-button\n *ngIf=\"showClear\"\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n\n <div matSuffix\n *ngIf=\"model.showLoader()\"\n class=\"loaderIcon\">\n <mat-spinner diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>", styles: ["mat-form-field{width:100%}mat-form-field .loaderIcon{padding:8px}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0}input[type=number]{-moz-appearance:textfield;appearance:textfield}\n"] }]
|
|
425
425
|
}], propDecorators: { input: [{
|
|
426
426
|
type: ViewChild,
|
|
427
427
|
args: [MatInput, { static: true }]
|
|
@@ -669,6 +669,9 @@ var RelationOperator;
|
|
|
669
669
|
RelationOperator["OR"] = "OR";
|
|
670
670
|
})(RelationOperator || (RelationOperator = {}));
|
|
671
671
|
|
|
672
|
+
/**
|
|
673
|
+
* Relation action to disable/enable a form control.
|
|
674
|
+
*/
|
|
672
675
|
const DISABLE_ACTION = {
|
|
673
676
|
type: RelationActionType.DISABLED,
|
|
674
677
|
reversedType: RelationActionType.ENABLED,
|
|
@@ -676,6 +679,9 @@ const DISABLE_ACTION = {
|
|
|
676
679
|
model.disabled = hasMatch;
|
|
677
680
|
}
|
|
678
681
|
};
|
|
682
|
+
/**
|
|
683
|
+
* Relation action to toggle the visibility of a form control
|
|
684
|
+
*/
|
|
679
685
|
const HIDDEN_ACTION = {
|
|
680
686
|
type: RelationActionType.HIDDEN,
|
|
681
687
|
reversedType: RelationActionType.VISIBLE,
|
|
@@ -683,6 +689,9 @@ const HIDDEN_ACTION = {
|
|
|
683
689
|
model.hidden = hasMatch;
|
|
684
690
|
}
|
|
685
691
|
};
|
|
692
|
+
/**
|
|
693
|
+
* Relation action to add or remove the required validator to a form control
|
|
694
|
+
*/
|
|
686
695
|
const REQUIRED_ACTION = {
|
|
687
696
|
type: RelationActionType.REQUIRED,
|
|
688
697
|
reversedType: RelationActionType.OPTIONAL,
|
|
@@ -690,14 +699,21 @@ const REQUIRED_ACTION = {
|
|
|
690
699
|
const hasRequiredValidation = !!model.validators.find((f) => f.name === 'required');
|
|
691
700
|
let validators;
|
|
692
701
|
if (hasMatch) {
|
|
702
|
+
// If the model already contains the required validator, return the model validators.
|
|
703
|
+
// Otherwise, add the required validator
|
|
693
704
|
validators = hasRequiredValidation ? model.validators : [...model.validators, DynamicFormValidators.required()];
|
|
694
705
|
}
|
|
695
706
|
else {
|
|
696
|
-
validators = model.validators.filter((f) => f.name
|
|
707
|
+
validators = model.validators.filter((f) => f.name !== 'required');
|
|
697
708
|
}
|
|
698
709
|
injector.get(DynamicFormValidationsService).updateValidators(validators, control);
|
|
699
710
|
}
|
|
700
711
|
};
|
|
712
|
+
/**
|
|
713
|
+
* Export all Relation actions so the DynamicFormService can easily access all Relation actions.
|
|
714
|
+
* This way if there are any new actions, all you have to do is add them here.
|
|
715
|
+
* TODO: This can be potentially be expanded towords an InjectionToken to provide the possibility for custom relationactions.
|
|
716
|
+
*/
|
|
701
717
|
const RELATION_ACTIONS = [DISABLE_ACTION, HIDDEN_ACTION, REQUIRED_ACTION];
|
|
702
718
|
|
|
703
719
|
class DynamicFormRelationsService {
|
|
@@ -718,7 +734,7 @@ class DynamicFormRelationsService {
|
|
|
718
734
|
? group.root.get(condition.path)
|
|
719
735
|
: group.get(condition.fieldName);
|
|
720
736
|
if (!control) {
|
|
721
|
-
console.warn(`No related form control with the name ${
|
|
737
|
+
console.warn(`No related form control with the name ${fieldName} found`);
|
|
722
738
|
return controls;
|
|
723
739
|
}
|
|
724
740
|
controls[fieldName] = control;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"olafvv-ngx-dynamic-form.mjs","sources":["../../../projects/ngx-dynamic-form/src/lib/models/tokens/dynamic-form-field-map-fn.token.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-validations.service.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-form.service.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-base.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.component.html","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-value-model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-option-model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-validators.ts","../../../projects/ngx-dynamic-form/src/lib/models/interfaces/dynamic-form-field-relation.interface.ts","../../../projects/ngx-dynamic-form/src/lib/models/constants/dynamic-relations.const.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-form-relations.service.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form-field/dynamic-form-field.component.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form-field/dynamic-form-field.component.html","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form/dynamic-form.component.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form/dynamic-form.component.html","../../../projects/ngx-dynamic-form/src/public-api.ts","../../../projects/ngx-dynamic-form/src/olafvv-ngx-dynamic-form.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const DYNAMIC_FORM_FIELD_MAP_FN = new InjectionToken('DYNAMIC_FORM_FIELD_MAP_FN');\n","import { Injectable } from '@angular/core';\nimport { FormControl, ValidatorFn } from '@angular/forms';\nimport { DynamicFormValidator } from '../models/interfaces/dynamic-form-validator.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormValidationsService {\n /**\n * Get all Validator Functions from the validator configuration\n * @param validatorConfig\n * @returns\n */\n public getValidatorFns(validatorConfig: DynamicFormValidator[]): ValidatorFn[] {\n return validatorConfig.map((v) => v.validator);\n }\n\n /**\n * Update the validators on a FormControl based on the provided validator configuration.\n * This will replace any existing validators on the control or removes all validators when none provided\n * @param validatorConfig\n * @param control\n */\n public updateValidators(validatorConfig: DynamicFormValidator[], control: FormControl): void {\n if (!validatorConfig || validatorConfig.length === 0) {\n control.clearValidators();\n } else {\n const validatorFns: ValidatorFn[] = this.getValidatorFns(validatorConfig);\n control.setValidators(validatorFns);\n }\n\n control.updateValueAndValidity();\n }\n}\n","import { Inject, Injectable, Optional, Type } from '@angular/core';\nimport { FormBuilder, FormControlOptions, UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { map, Observable } from 'rxjs';\nimport { DynamicFormField } from '../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldModel } from '../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldOption } from '../models/classes/dynamic-form-field-option-model';\nimport { DynamicFormFieldValueConfig } from '../models/classes/dynamic-form-field-value-model';\nimport { DYNAMIC_FORM_FIELD_MAP_FN } from '../models/tokens/dynamic-form-field-map-fn.token';\nimport { DynamicFormConfig } from '../models/types/dynamic-form-config.type';\nimport { DynamicFormValidationsService } from './dynamic-validations.service';\n\nexport type DynamicFormFieldTypeMapFn = (field: DynamicFormFieldModel) => Type<DynamicFormField> | null;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormService {\n constructor(\n @Inject(DYNAMIC_FORM_FIELD_MAP_FN) @Optional() private DYNAMIC_FORM_FIELD_MAP_FN: DynamicFormFieldTypeMapFn,\n private fb: FormBuilder,\n private validatorsService: DynamicFormValidationsService\n ) {}\n\n /**\n * Check if there is a function provided to use custom form controls\n * @param model\n * @returns\n */\n public getCustomControlComponentType(model: DynamicFormFieldModel): Type<DynamicFormField> | null {\n return typeof this.DYNAMIC_FORM_FIELD_MAP_FN === 'function' ? this.DYNAMIC_FORM_FIELD_MAP_FN(model) : null;\n }\n\n /**\n * Create a FormGroup from the provided form configuration.\n * Returns a FormGroup.\n * @param {DynamicFormConfig} config Configuration object of a form\n * @returns {UntypedFormGroup}\n */\n public createFormGroup(config: DynamicFormConfig): UntypedFormGroup {\n const group: UntypedFormGroup = this.fb.group({});\n\n config.forEach((row) => {\n row.forEach((controlConfig) => {\n const controlOptions: FormControlOptions = {\n updateOn: controlConfig.updateOn,\n validators: this.validatorsService.getValidatorFns(controlConfig.validators)\n };\n\n const controlValueConfig = controlConfig as DynamicFormFieldValueConfig<unknown>;\n const control = new UntypedFormControl(\n { value: controlValueConfig.value ?? controlValueConfig.defaultValue, disabled: controlValueConfig.disabled },\n controlOptions\n );\n\n group.addControl(controlConfig.name, control);\n });\n });\n\n return group;\n }\n\n /**\n * Transform any list (Observable) to a list of DynamicFormFieldOption which is used in any Dynamic Form Field with options (e.g. DynamicSelect).\n * Possible to provide the method with Type definitions to define the provided list type and desired option value type:\n *\n * `dynamicFormService.toDynamicOptionList<T, K>(...)`\n *\n * Generic types:\n * - T = The type of the items in the provided list\n * - K = The type of the value inside an DynamicFormFieldOption. Default is 'string'\n * @param listObs An Observable of a list of items of type T\n * @param labelCb Callback to define the label of the options in the template\n * @param valueCb Callback to define the value of the options. Must return a value of type K (default string)\n * @returns\n */\n public toDynamicOptionListObs<T, K = string>(\n listObs: Observable<T[]>,\n labelCb: (item: T) => string,\n valueCb: (item: T) => K\n ): Observable<DynamicFormFieldOption<K>[]> {\n return listObs.pipe(\n map((list) => {\n return list.map((item) => {\n return {\n label: labelCb(item),\n value: valueCb(item)\n };\n });\n })\n );\n }\n}\n","import { EventEmitter } from '@angular/core';\nimport { AbstractControl, UntypedFormGroup } from '@angular/forms';\nimport { DynamicFormFieldModel } from './dynamic-form-field-model';\n\nexport interface DynamicFormField {\n group: UntypedFormGroup;\n model: DynamicFormFieldModel;\n change: EventEmitter<any>;\n}\n\n/**\n * Base class for the DynamicFormField component classes\n */\nexport abstract class DynamicFormFieldBase implements DynamicFormField {\n group!: UntypedFormGroup;\n model!: DynamicFormFieldModel;\n\n change!: EventEmitter<any>;\n\n get id(): string {\n return this.model.id ?? this.model.name;\n }\n\n get control(): AbstractControl {\n const ctrl = this.group.get(this.model.name);\n\n if (!ctrl) {\n throw new Error(`Provided FormGroup does not contain a control with the name ${this.model.name}`);\n }\n return ctrl;\n }\n\n get isValid(): boolean {\n return this.control.valid;\n }\n\n get isInvalid(): boolean {\n return this.control.invalid;\n }\n\n public onChange(event: unknown) {\n this.change.emit(event);\n }\n\n public resetControl() {\n this.group.get(this.model.name)?.reset();\n }\n\n public hasError(name: string): boolean {\n return this.control.hasError(name);\n }\n}\n","import { AsyncPipe, NgClass, NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatButtonToggleChange, MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicButtonToggles } from './dynamic-button-toggles.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, NgClass, MatButtonToggleModule, ReactiveFormsModule, AsyncPipe, MatFormFieldModule],\n selector: 'dynamic-button-toggles',\n templateUrl: './dynamic-button-toggles.component.html',\n styleUrls: ['./dynamic-button-toggles.component.scss']\n})\nexport class DynamicButtonTogglesComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicButtonToggles;\n @Input() group!: UntypedFormGroup;\n\n @Output() change: EventEmitter<MatButtonToggleChange> = new EventEmitter();\n}\n","<div class=\"dynamic-button-toggles-wrapper\"\n [formGroup]=\"group\">\n <mat-button-toggle-group [id]=\"id\"\n [formControlName]=\"model.name\"\n [multiple]=\"model.multiple\"\n [vertical]=\"model.vertical\"\n (change)=\"onChange($event)\">\n\n @for(option of model.options$ | async; track option.value) {\n <mat-button-toggle [value]=\"option.value\">{{option.label}}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n</div>","import { signal, WritableSignal } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { DynamicFormFieldConfig } from '../interfaces/dynamic-form-field-config.interface';\nimport { DynamicFormFieldRelation } from '../interfaces/dynamic-form-field-relation.interface';\nimport { DynamicFormValidator } from '../interfaces/dynamic-form-validator.interface';\n\n/**\n * Base class for all DynamicFormFields\n */\nexport abstract class DynamicFormFieldModel {\n public id: string;\n public width: number;\n public label: string | null;\n public name: string;\n public hint: string | null;\n public validators: DynamicFormValidator[];\n public updateOn: 'submit' | 'blur' | 'change';\n public relations: DynamicFormFieldRelation[] | null;\n public disabledChange: Observable<boolean>;\n\n abstract readonly type: string;\n\n private readonly disabled$: BehaviorSubject<boolean>;\n private readonly $hidden: WritableSignal<boolean>;\n\n constructor(config: DynamicFormFieldConfig) {\n this.id = config.id ?? config.name;\n this.width = config.width ?? 100;\n this.label = config.label ?? null;\n this.name = config.name;\n this.hint = config.hint ?? null;\n this.validators = config.validators ?? [];\n this.updateOn = config.updateOn ?? 'change';\n this.relations = config.relations ?? null;\n\n // Create a disabled Subject and Observable to change the state of the FormControl inside DynamicFormFieldComponent by subscribing to disabledChange\n this.disabled$ = new BehaviorSubject(config.disabled ?? false);\n this.disabledChange = this.disabled$.asObservable();\n\n this.$hidden = signal(config.hidden ?? false);\n }\n\n get disabled(): boolean {\n return this.disabled$.getValue();\n }\n set disabled(disable: boolean) {\n this.disabled$.next(disable);\n }\n\n get hidden(): boolean {\n return this.$hidden();\n }\n set hidden(hidden: boolean) {\n this.$hidden.set(hidden);\n }\n}\n","import { BehaviorSubject } from 'rxjs';\nimport { DynamicFormFieldConfig } from '../interfaces/dynamic-form-field-config.interface';\nimport { DynamicFormFieldModel } from './dynamic-form-field-model';\n\nexport interface DynamicFormFieldValueConfig<T> extends DynamicFormFieldConfig {\n /**\n * The value of the control.\n * This value will change when the control is used.\n * @optional\n */\n value?: T;\n /**\n * The default value of the control when initializing or resetting the control.\n * @optional\n */\n defaultValue?: T;\n /**\n * A function that gets called everytime the value of the control changes.\n * Passes the value of the control as parameter.\n * If you don't want to get an event on every keystroke without delay, use the ReactiveFormsModule `valueChanges` Observable\n * @optional\n */\n valueChanged?: (val: T | null) => any;\n}\n\n/**\n * Base class for a DynamicFormField with a value\n */\nexport abstract class DynamicFormFieldValueModel<T = unknown> extends DynamicFormFieldModel {\n public defaultValue: T | null;\n\n private _value$: BehaviorSubject<T | null>;\n private _valueChanged: ((val: T | null) => any) | undefined;\n\n constructor(config: DynamicFormFieldValueConfig<T>) {\n super(config);\n\n this.defaultValue = config.defaultValue ?? null;\n\n const val: T | null = config.value ?? null;\n this._value$ = new BehaviorSubject(val);\n this._valueChanged = config.valueChanged;\n }\n\n get value(): T | null {\n return this._value$.getValue();\n }\n set value(val: T | null) {\n this._value$.next(val);\n if (this._valueChanged) {\n this._valueChanged(val);\n }\n }\n}\n","import { isObservable, map, Observable, of } from 'rxjs';\nimport { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from './dynamic-form-field-value-model';\n\nexport type DynamicOptionList<T> = DynamicFormFieldOption<T>[] | Observable<DynamicFormFieldOption<T>[]>;\n\nexport type DynamicGroupedOptionList<T> = DynamicFormFieldOptionGroup<T>[] | Observable<DynamicFormFieldOptionGroup<T>[]>;\n\n/**\n * Interface for the objects inside a list of options of Dynamic FormField\n */\nexport interface DynamicFormFieldOption<T> {\n /** The text shown as label */\n label: string;\n /** Extra line of text shown as subtitle */\n subTitle?: string;\n /** The value the option holds */\n value: T;\n}\n\n/**\n * Interface for a group op options inside a Dynamic FormField (optgroup)\n */\nexport interface DynamicFormFieldOptionGroup<T> {\n name: string;\n options: DynamicFormFieldOption<T>[];\n}\n\n/**\n * Base interface for any DynamicFormFieldConfig with options (e.g. DynamicSelectConfig or DynamicAutocompleteConfig).\n */\nexport interface DynamicFormFieldOptionConfig<T> extends DynamicFormFieldValueConfig<T> {\n options?: DynamicOptionList<T>;\n groupedOptions?: DynamicGroupedOptionList<T>;\n}\n\n/**\n * Base class for any DynamicFormField with options (e.g. DynamicSelect or DynamicAutocomplete)\n */\nexport abstract class DynamicFormFieldOptionModel<T> extends DynamicFormFieldValueModel<T> {\n public options$!: Observable<DynamicFormFieldOption<T>[]>;\n public groupedOptions$!: Observable<DynamicFormFieldOptionGroup<T>[]>;\n\n private _options: DynamicFormFieldOption<T>[] = [];\n private _groupedOptions: DynamicFormFieldOptionGroup<T>[] = [];\n\n constructor(config: DynamicFormFieldOptionConfig<T>) {\n super(config);\n\n if (!config.options && !config.groupedOptions) {\n console.error(`No options or groupedOptions provided for ${this.name}`);\n }\n\n if (config.options) {\n this.options$ = this.setOptions(config.options);\n } else if (config.groupedOptions) {\n this.groupedOptions$ = this.setGroupedOptions(config.groupedOptions);\n }\n }\n\n private setOptions(options: DynamicOptionList<T>): Observable<DynamicFormFieldOption<T>[]> {\n if (Array.isArray(options)) {\n this._options = options;\n return of(this._options);\n }\n\n if (isObservable(options)) {\n return options.pipe(\n map((o) => {\n this._options = o;\n return this._options;\n })\n );\n }\n\n return of([]);\n }\n\n private setGroupedOptions(groupedOptions: DynamicGroupedOptionList<T>): Observable<DynamicFormFieldOptionGroup<T>[]> {\n if (Array.isArray(groupedOptions)) {\n this._groupedOptions = groupedOptions;\n return of(this._groupedOptions);\n }\n\n if (isObservable(groupedOptions)) {\n return groupedOptions.pipe(\n map((o) => {\n this._groupedOptions = o;\n return this._groupedOptions;\n })\n );\n }\n\n return of([]);\n }\n}\n","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_BUTTON_TOGGLES = 'button-toggles';\n\nexport interface DynamicButtonTogglesConfig extends Omit<DynamicFormFieldOptionConfig<string | number | null>, 'label'> {\n /** Whether to allow multiple options to be selected. Default is false */\n multiple?: boolean;\n /** Whether the toggle group is vertical. Default is false */\n vertical?: boolean;\n}\n\nexport class DynamicButtonToggles extends DynamicFormFieldOptionModel<string | number | null> {\n public multiple: boolean;\n public vertical: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_BUTTON_TOGGLES;\n\n constructor(config: DynamicButtonTogglesConfig) {\n super(config);\n\n this.multiple = config.multiple ?? false;\n this.vertical = config.vertical ?? false;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicButton } from './dynamic-button.model';\n\n@Component({\n standalone: true,\n imports: [MatButtonModule],\n selector: 'dynamic-button',\n templateUrl: './dynamic-button.component.html',\n styleUrl: './dynamic-button.component.scss'\n})\nexport class DynamicButtonComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicButton;\n @Input() group!: UntypedFormGroup;\n\n public onClick() {\n this.model.onClick();\n }\n}\n","<div class=\"dynamic-button-wrapper\">\n <button mat-button\n [id]=\"id\"\n [disabled]=\"model.disabled\"\n (click)=\"onClick()\">\n <span>{{model.label}}</span>\n </button>\n</div>","import { DynamicFormFieldModel } from '../../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldConfig } from '../../models/interfaces/dynamic-form-field-config.interface';\n\nexport const DYNAMIC_FORM_FIELD_BUTTON = 'button';\n\ntype OmittedProperties = 'hint' | 'validators' | 'updateOn';\n\nexport interface DynamicButtonConfig extends Omit<DynamicFormFieldConfig, OmittedProperties> {\n /**\n * Label shown inside the button\n */\n label: string;\n /**\n * Function called when the button is clicked.\n * Provides no parameters.\n * @returns\n */\n onClick: () => any;\n}\n\nexport class DynamicButton extends DynamicFormFieldModel {\n public label: string | null;\n public onClick: () => any;\n\n public readonly type = DYNAMIC_FORM_FIELD_BUTTON;\n\n constructor(config: DynamicButtonConfig) {\n super(config);\n\n this.label = config.label ?? null;\n this.onClick = config.onClick;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicCheckbox } from './dynamic-checkbox.model';\n\n@Component({\n selector: 'dynamic-checkbox',\n templateUrl: 'dynamic-checkbox.component.html',\n standalone: true,\n imports: [ReactiveFormsModule, MatCheckboxModule]\n})\nexport class DynamicCheckboxComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicCheckbox;\n @Input() group!: UntypedFormGroup;\n\n @Output() change: EventEmitter<MatCheckboxChange> = new EventEmitter();\n}\n","<ng-container [formGroup]=\"group\">\n <mat-checkbox [checked]=\"model.checked\"\n [formControlName]=\"model.name\"\n [indeterminate]=\"model.indeterminate\"\n [labelPosition]=\"model.labelPosition\"\n [name]=\"model.name\"\n [id]=\"id\"\n (change)=\"onChange($event)\">\n\n <span class=\"checkbox-label\">{{model.label}}</span>\n </mat-checkbox>\n</ng-container>","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_CHECKBOX = 'checkbox';\n\nexport interface DynamicCheckboxConfig extends DynamicFormFieldValueConfig<boolean> {\n labelPosition?: 'before' | 'after';\n indeterminate?: boolean;\n}\n\nexport class DynamicCheckbox extends DynamicFormFieldValueModel<boolean> {\n public labelPosition: 'before' | 'after';\n public indeterminate: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_CHECKBOX;\n\n constructor(config: DynamicCheckboxConfig) {\n super(config);\n\n this.value = config.value ?? false;\n\n this.labelPosition = config.labelPosition ?? 'after';\n this.indeterminate = config.indeterminate === true ? true : false;\n }\n\n get checked(): boolean {\n return this.value ?? false;\n }\n\n set checked(checked: boolean) {\n this.value = checked;\n }\n\n public toggle() {\n this.checked = !this.checked;\n }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldEvent } from '../../models/interfaces/dynamic-form-field-event.interface';\nimport { DynamicDatepicker } from './dynamic-datepicker.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatDatepickerModule],\n selector: 'dynamic-datepicker',\n templateUrl: './dynamic-datepicker.component.html',\n styleUrl: './dynamic-datepicker.component.scss'\n})\nexport class DynamicDatepickerComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicDatepicker;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<DynamicFormFieldEvent>();\n}\n","<mat-form-field [formGroup]=\"group\"\n [id]=\"model.id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <input matInput\n [min]=\"model.min\"\n [max]=\"model.max\"\n [matDatepicker]=\"picker\">\n\n <mat-hint *ngIf=\"model.hint\">{{model.hint}}</mat-hint>\n\n <mat-datepicker-toggle matIconSuffix\n [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker\n [startAt]=\"model.startAt\"\n [startView]=\"model.startView\"></mat-datepicker>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n\n</mat-form-field>","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_DATEPICKER = 'datepicker';\n\nexport type DynamicDatepickerControlValue = Date | object | string | null;\n\nexport interface DynamicDatepickerConfig extends DynamicFormFieldValueConfig<DynamicDatepickerControlValue> {\n /** Maximum date selectable in the datepicker */\n max?: DynamicDatepickerControlValue;\n /** Minimum date selectable in the datepicker */\n min?: DynamicDatepickerControlValue;\n /** The initial date visible inside the datepicker when opening the picker */\n startAt?: DynamicDatepickerControlValue;\n /** The view the picker is initializing when opening */\n startView?: 'month' | 'year' | 'multi-year';\n}\n\nexport class DynamicDatepicker extends DynamicFormFieldValueModel<DynamicDatepickerControlValue> {\n public max: DynamicDatepickerControlValue | null;\n public min: DynamicDatepickerControlValue | null;\n public startAt: DynamicDatepickerControlValue | null;\n public startView: 'month' | 'year' | 'multi-year';\n\n public readonly type = DYNAMIC_FORM_FIELD_DATEPICKER;\n\n constructor(config: DynamicDatepickerConfig) {\n super(config);\n\n this.max = config.max ?? null;\n this.min = config.min ?? null;\n this.startAt = config.startAt ?? null;\n this.startView = config.startView ?? 'month';\n }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldEvent } from '../../models/interfaces/dynamic-form-field-event.interface';\nimport { DynamicInput } from './dynamic-input.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule],\n selector: 'dynamic-input',\n templateUrl: './dynamic-input.component.html',\n styleUrl: './dynamic-input.component.scss'\n})\nexport class DynamicInputComponent extends DynamicFormFieldBase {\n @ViewChild(MatInput, { static: true }) input!: MatInput;\n\n @Input() model!: DynamicInput;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<DynamicFormFieldEvent>();\n\n get valueCount(): number {\n return this.input?.value ? this.input.value.length : 0;\n }\n\n get maxCountText(): string {\n return `${this.valueCount} / ${this.model.maxLength}`;\n }\n\n get showClear(): boolean {\n return !!this.control.value && !this.control.disabled && !this.model.showLoader;\n }\n\n public onChange(event: Event | DynamicFormFieldEvent): void {\n // Ignore the native HTML 5 change event\n if (event instanceof Event) {\n event.stopPropagation();\n }\n\n this.change.emit(event as DynamicFormFieldEvent);\n }\n}\n","<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <span matTextPrefix\n *ngIf=\"model.prefix\">{{model.prefix}}</span>\n\n <input matInput\n [type]=\"model.inputType\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.min]=\"model.min\"\n [attr.max]=\"model.max\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [pattern]=\"model.pattern\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\" />\n\n <button matSuffix\n mat-icon-button\n *ngIf=\"showClear\"\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n\n <div matSuffix\n *ngIf=\"model.showLoader()\"\n class=\"loaderIcon\">\n <mat-spinner diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>","import { signal, WritableSignal } from '@angular/core';\nimport { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_INPUT = 'input';\n\nexport type HtmlInputType = 'text' | 'number' | 'tel' | 'email' | 'password' | 'date' | 'time' | 'color';\nexport type DynamicInputValue = string | number | Date | null;\n\nexport interface DynamicInputConfig extends DynamicFormFieldValueConfig<DynamicInputValue> {\n inputType?: HtmlInputType;\n placeholder?: string;\n max?: number;\n min?: number;\n maxLength?: number;\n minLength?: number;\n step?: number;\n pattern?: string | RegExp;\n autocomplete?: 'on' | 'off';\n prefix?: string;\n hideClearIcon?: boolean;\n showLoader?: WritableSignal<boolean>;\n}\n\nexport class DynamicInput extends DynamicFormFieldValueModel<DynamicInputValue> {\n public inputType: HtmlInputType;\n public placeholder: string;\n public max: number | null;\n public min: number | null;\n public maxLength: number | null;\n public minLength: number | null;\n public step: number | null;\n public pattern: string | RegExp;\n public autocomplete: 'on' | 'off';\n public prefix: string | null;\n public hideClearIcon: boolean;\n public showLoader: WritableSignal<boolean>;\n\n public readonly type = DYNAMIC_FORM_FIELD_INPUT;\n\n constructor(config: DynamicInputConfig) {\n super(config);\n\n this.inputType = config.inputType ?? 'text';\n this.placeholder = config.placeholder ?? config.label ?? '';\n this.max = config.max ?? null;\n this.min = config.min ?? null;\n this.maxLength = typeof config.maxLength === 'number' ? config.maxLength : null;\n this.minLength = typeof config.minLength === 'number' ? config.minLength : null;\n this.step = config.step ?? null;\n this.pattern = config.pattern ?? '';\n this.autocomplete = config.autocomplete ?? 'off';\n this.prefix = config.prefix ?? null;\n this.hideClearIcon = config.hideClearIcon ?? false;\n this.showLoader = config.showLoader ?? signal(false);\n }\n}\n","import { AsyncPipe, NgClass, NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatRadioChange, MatRadioModule } from '@angular/material/radio';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicRadioGroup } from './dynamic-radio-group.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, NgClass, ReactiveFormsModule, MatRadioModule, AsyncPipe],\n selector: 'dynamic-radio-group',\n templateUrl: './dynamic-radio-group.component.html',\n styleUrls: ['./dynamic-radio-group.component.scss']\n})\nexport class DymamicRadioGroupComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicRadioGroup;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<MatRadioChange>();\n}\n","<div class=\"dynamic-radio-group-wrapper\"\n [formGroup]=\"group\">\n <label *ngIf=\"model.label\">{{model.label}}</label>\n <mat-radio-group [formControlName]=\"model.name\"\n class=\"radio-group\"\n [ngClass]=\"{'inline': model.inline}\"\n (change)=\"onChange($event)\">\n @for(option of model.options$ | async; track option.value) {\n <mat-radio-button [value]=\"option.value\"\n [labelPosition]=\"model.labelPosition\">\n {{option.label}}\n </mat-radio-button>\n }\n </mat-radio-group>\n</div>","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_RADIO_GROUP = 'radio-group';\n\nexport interface DynamicRadioGroupConfig extends DynamicFormFieldOptionConfig<string | number | null> {\n /** Placement of the option label. Default is 'before' */\n labelPosition?: 'before' | 'after';\n /** Whether the options are shown inline (horizontally). Default is false */\n inline?: boolean;\n}\n\nexport class DynamicRadioGroup extends DynamicFormFieldOptionModel<string | number | null> {\n public labelPosition: 'before' | 'after';\n public inline: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_RADIO_GROUP;\n\n constructor(config: DynamicRadioGroupConfig) {\n super(config);\n\n this.labelPosition = config.labelPosition ?? 'after';\n this.inline = config.inline ?? false;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicReadonly } from './dynamic-readonly.model';\n\n@Component({\n standalone: true,\n imports: [ReactiveFormsModule],\n selector: 'dynamic-readonly',\n templateUrl: './dynamic-readonly.component.html',\n styleUrls: ['./dynamic-readonly.component.scss']\n})\nexport class DynamicReadonlyComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicReadonly;\n @Input() group!: UntypedFormGroup;\n}\n","<div class=\"dynamic-form-field-readonly\"\n [formGroup]=\"group\"\n [id]=\"id\">\n <div class=\"label\">{{model.label}}</div>\n <span>{{model.value}}</span>\n</div>","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_READONLY = 'readonly';\nexport type DynamicReadonlyValue = string | number | null;\n\nexport interface DynamicReadonlyConfig\n extends Omit<DynamicFormFieldValueConfig<DynamicReadonlyValue>, 'validators' | 'relations' | 'updateOn'> {}\n\nexport class DynamicReadonly extends DynamicFormFieldValueModel<DynamicReadonlyValue> {\n public readonly type = DYNAMIC_FORM_FIELD_READONLY;\n\n constructor(config: DynamicReadonlyConfig) {\n super(config);\n }\n}\n","import { AsyncPipe, NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicSelect } from './dynamic-select.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, MatFormFieldModule, ReactiveFormsModule, MatSelectModule, MatOptionModule, AsyncPipe, MatInputModule],\n selector: 'dynamic-select',\n templateUrl: './dynamic-select.component.html',\n styleUrls: ['./dynamic-select.component.scss']\n})\nexport class DynamicSelectComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicSelect<string>;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<MatSelectChange>();\n}\n","<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label>{{model.label}}</mat-label>\n\n <!-- Template for select without grouped options -->\n <ng-container *ngIf=\"model.options$ | async as options\">\n <ng-container *ngIf=\"!model.native else nativeSelect\">\n <mat-select [formControlName]=\"model.name\"\n [multiple]=\"model.multiple\"\n (selectionChange)=\"onChange($event)\">\n @for(option of options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n }\n </mat-select>\n </ng-container>\n\n <ng-template #nativeSelect>\n <select matNativeControl\n (selectionchange)=\"onChange($event)\">\n @for(option of options; track option.value) {\n <option [value]=\"option.value\">\n {{option.label}}\n </option>\n }\n </select>\n </ng-template>\n </ng-container>\n\n <!-- Template for select with grouped options -->\n <ng-container *ngIf=\"model.groupedOptions$ | async as groupedOptions\">\n <ng-container *ngIf=\"!model.native else nativeSelectGrouped\">\n <mat-select [formControlName]=\"model.name\"\n (selectionChange)=\"onChange($event)\">\n @for(group of groupedOptions; track group.name) {\n <mat-optgroup [label]=\"group.name\">\n @for(option of group.options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n }\n </mat-optgroup>\n }\n\n </mat-select>\n </ng-container>\n\n <ng-template #nativeSelectGrouped>\n <select matNativeControl\n (selectionchange)=\"onChange($event)\">\n @for(group of groupedOptions; track group.name) {=\n <optgroup [label]=\"group.name\">\n @for(option of group.options; track option.value) {\n <option [value]=\"option.value\">\n {{option.label}}\n </option>\n }\n </optgroup>\n }\n </select>\n </ng-template>\n </ng-container>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_SELECT = 'select';\n\nexport interface DynamicSelectConfig<T> extends DynamicFormFieldOptionConfig<T> {\n /**\n * Show the native dropdown instead of the Angular Material styled dropdown\n */\n native?: boolean;\n /**\n * Whether it is possible to select multiple options.\n * Default value is false\n */\n multiple?: boolean;\n}\n\nexport class DynamicSelect<T> extends DynamicFormFieldOptionModel<T> {\n public native: boolean;\n public multiple: boolean;\n\n public readonly type = DYNAMIC_FORM_FIELD_SELECT;\n\n constructor(config: DynamicSelectConfig<T>) {\n super(config);\n\n this.native = config.native ?? false;\n this.multiple = config.multiple ?? false;\n }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldEvent } from '../../models/interfaces/dynamic-form-field-event.interface';\nimport { DynamicTextarea } from './dynamic-textarea.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, MatFormFieldModule, MatInputModule, ReactiveFormsModule],\n selector: 'dynamic-textarea',\n templateUrl: './dynamic-textarea.component.html',\n styles: ['mat-form-field {width: 100%;}']\n})\nexport class DynamicTextareaComponent extends DynamicFormFieldBase {\n @ViewChild(MatInput, { static: true }) textarea!: MatInput;\n\n @Input() model!: DynamicTextarea;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<DynamicFormFieldEvent>();\n\n get valueCount(): number {\n return this.textarea?.value ? this.textarea.value.length : 0;\n }\n\n get maxCountText(): string {\n return `${this.valueCount} / ${this.model.maxLength}`;\n }\n\n public onChange(event: Event | DynamicFormFieldEvent): void {\n // Ignore the native HTML 5 change event\n if (event instanceof Event) {\n event.stopPropagation();\n }\n\n this.change.emit(event as DynamicFormFieldEvent);\n }\n}\n","<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <textarea matInput\n [cdkTextareaAutosize]=\"model.resize\"\n [cdkAutosizeMinRows]=\"model.rows\"\n [cdkAutosizeMaxRows]=\"model.resizeMaxRows\"\n [id]=\"id\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [rows]=\"model.rows\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\">\n </textarea>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_TEXTAREA = 'textarea';\nexport type DynamicTextareaValue = string | null;\n\nexport interface DynamicTextareaConfig extends DynamicFormFieldValueConfig<DynamicTextareaValue> {\n /**\n * Placeholder text inside the textarea.\n * Only visible when the field is empty and in focus.\n */\n placeholder?: string;\n /**\n * Minimum amount of characters needed in the textarea\n */\n minLength?: number;\n /**\n * Maximum amount of characters it is possible to fill in the textarea\n */\n maxLength?: number;\n /**\n * Enables or disabled the browser natie autocomplete bubble when the control is in focus.\n * Default value is 'off'\n */\n autocomplete?: 'on' | 'off';\n /**\n * Amount of rows the textarea initializes on\n */\n rows?: number;\n /**\n * Whether the textare automatically resizes to fit its content\n */\n resize?: boolean;\n /**\n * Maximum amount of rows the textarea show resize to\n */\n resizeMaxRows?: number;\n}\n\nexport class DynamicTextarea extends DynamicFormFieldValueModel<DynamicTextareaValue> {\n public placeholder: string;\n public minLength: number | null;\n public maxLength: number | null;\n public autocomplete: 'on' | 'off';\n public rows: number;\n public resize: boolean;\n public resizeMaxRows: number | null;\n\n public readonly type = DYNAMIC_FORM_FIELD_TEXTAREA;\n\n constructor(config: DynamicTextareaConfig) {\n super(config);\n\n this.placeholder = config.placeholder ?? '';\n this.minLength = config.minLength ?? 0;\n this.maxLength = config.minLength ?? null;\n this.autocomplete = config.autocomplete ?? 'off';\n this.rows = config.rows ?? 3;\n this.resize = config.resize ?? true;\n this.resizeMaxRows = config.resizeMaxRows ?? null;\n }\n}\n","import { Validators } from '@angular/forms';\nimport { DynamicFormValidator } from '../interfaces/dynamic-form-validator.interface';\n\nexport class DynamicFormValidators {\n /**\n * Default email validator, the value of the control has to be a valid email address\n * @param msg\n */\n static email(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Geen geldig emailadres';\n return { name: 'email', validator: Validators.email, message };\n }\n\n /**\n * Default min validator, the value has to be greater or equal than the the provided number\n * @param min number\n * @param msg\n */\n static min(min: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Minimum is ${min}`;\n return { name: 'min', validator: Validators.min(min), message };\n }\n\n /**\n * Default max validator, the value has to be less or equal than the the provided number\n * @param max number\n * @param msg\n */\n static max(max: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Maximum is ${max}`;\n return { name: 'max', validator: Validators.max(max), message };\n }\n\n /**\n * Default minLength validator, the value has to contain a minimum amount of characters\n * @param min number\n * @param msg\n */\n static minLength(min: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Minimaal ${min} tekens`;\n return { name: 'minLength', validator: Validators.min(min), message };\n }\n\n /**\n * Default maxLength validator, the value has to contain a maximum amount of characters\n * @param max number\n * @param msg\n */\n static maxLength(max: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Maximaal ${max} tekens`;\n return { name: 'maxLength', validator: Validators.max(max), message };\n }\n\n /**\n * Default pattern validator, the value of the control has to match the provided pattern\n * @param pattern: string | RegExp\n * @param msg\n */\n static pattern(pattern: string | RegExp, msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Geen geldige invoer';\n return { name: 'pattern', validator: Validators.pattern(pattern), message };\n }\n\n /**\n * Default required validator, the control must contain a value\n * @param msg\n */\n static required(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Dit veld is verplicht';\n\n return { name: 'required', validator: Validators.required, message };\n }\n\n /**\n * Default requiredTrue validator, the value of the control has to be true\n * @param msg\n */\n static requiredTrue(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Dit veld is verplicht';\n return { name: 'requiredTrue', validator: Validators.requiredTrue, message };\n }\n}\n","export enum RelationActionType {\n DISABLED = 'DISABLED',\n ENABLED = 'ENABLED',\n HIDDEN = 'HIDDEN',\n VISIBLE = 'VISIBLE',\n REQUIRED = 'REQUIRED',\n OPTIONAL = 'OPTIONAL'\n}\n\nexport enum RelationOperator {\n AND = 'AND',\n OR = 'OR'\n}\n\nexport interface RelationCondition {\n /** Name of a field in the same form this field is depended on */\n fieldName?: string;\n /**\n * Path to the related field.\n * This must be used when working with nested FormGroups and you want to relate a field in a different group.\n */\n path?: string;\n /** Method that returns true when the condition is met. The passed parameter is the value of the depended field */\n value: (val: any) => boolean;\n}\n\nexport interface DynamicFormFieldRelation {\n actionType: RelationActionType;\n conditions: RelationCondition[];\n operator?: RelationOperator;\n}\n","import { Injector } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { DynamicFormValidationsService } from '../../services/dynamic-validations.service';\nimport { DynamicFormFieldModel } from '../classes/dynamic-form-field-model';\nimport { DynamicFormValidators } from '../classes/dynamic-form-validators';\nimport { RelationActionType } from '../interfaces/dynamic-form-field-relation.interface';\nimport { DynamicFormValidator } from '../interfaces/dynamic-form-validator.interface';\n\nexport interface DynamicRelationAction {\n type: RelationActionType;\n reversedType?: string;\n change(hasMatch: boolean, model: DynamicFormFieldModel, control: UntypedFormControl, injector: Injector): void;\n}\n\nconst DISABLE_ACTION: DynamicRelationAction = {\n type: RelationActionType.DISABLED,\n reversedType: RelationActionType.ENABLED,\n change(hasMatch, model) {\n model.disabled = hasMatch;\n }\n};\n\nconst HIDDEN_ACTION: DynamicRelationAction = {\n type: RelationActionType.HIDDEN,\n reversedType: RelationActionType.VISIBLE,\n change(hasMatch, model) {\n model.hidden = hasMatch;\n }\n};\n\nconst REQUIRED_ACTION: DynamicRelationAction = {\n type: RelationActionType.REQUIRED,\n reversedType: RelationActionType.OPTIONAL,\n change(hasMatch, model, control, injector) {\n const hasRequiredValidation = !!model.validators.find((f) => f.name === 'required');\n let validators: DynamicFormValidator[];\n\n if (hasMatch) {\n validators = hasRequiredValidation ? model.validators : [...model.validators, DynamicFormValidators.required()];\n } else {\n validators = model.validators.filter((f) => f.name === 'required');\n }\n\n injector.get(DynamicFormValidationsService).updateValidators(validators, control);\n }\n};\n\nexport const RELATION_ACTIONS: DynamicRelationAction[] = [DISABLE_ACTION, HIDDEN_ACTION, REQUIRED_ACTION];\n","import { inject, Injectable, Injector } from '@angular/core';\nimport { FormControl, FormGroup, UntypedFormControl } from '@angular/forms';\nimport { distinctUntilChanged, startWith, Subscription } from 'rxjs';\nimport { DynamicFormFieldModel } from '../models/classes/dynamic-form-field-model';\nimport { DynamicRelationAction, RELATION_ACTIONS } from '../models/constants/dynamic-relations.const';\nimport { DynamicFormFieldRelation, RelationCondition, RelationOperator } from '../models/interfaces/dynamic-form-field-relation.interface';\nimport { RelatedFormControls } from '../models/types/related-form-controls.type';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormRelationsService {\n private _injector = inject(Injector);\n\n /**\n * Get an object with all FormField the provided model has a relation with\n * @param model\n * @param group\n * @returns\n */\n public findRelatedFormField(model: DynamicFormFieldModel, group: FormGroup): RelatedFormControls {\n const conditionReducer = (controls: RelatedFormControls, condition: RelationCondition) => {\n const fieldName = condition.path ?? condition.fieldName!;\n // Get the control using the provided path or fieldName\n const control = condition.path\n ? (group.root.get(condition.path) as UntypedFormControl)\n : (group.get(condition.fieldName!) as UntypedFormControl);\n\n if (!control) {\n console.warn(`No related form control with the name ${condition.fieldName} found`);\n return controls;\n }\n\n controls[fieldName] = control;\n return controls;\n };\n\n const relationsReducer = (controls: RelatedFormControls, relation: DynamicFormFieldRelation) => {\n return relation.conditions.reduce(conditionReducer, controls);\n };\n\n return model.relations!.reduce(relationsReducer, {});\n }\n\n public getRelationSubscriptions(\n relatedFormControls: RelatedFormControls,\n model: DynamicFormFieldModel,\n control: FormControl\n ): Subscription[] {\n const subs: Subscription[] = [];\n\n // Subscribe to value changes of all FormControls, provide the current value inside the startWith\n Object.values(relatedFormControls).forEach((relatedControl) => {\n subs.push(\n relatedControl.valueChanges.pipe(startWith(relatedControl.value), distinctUntilChanged()).subscribe(() => {\n model.relations!.forEach((relation) => {\n // Find the RelationAction object based on the actionType passed inside the DynamicFormConfig\n const action = RELATION_ACTIONS.find(\n (action) => relation.actionType === action.type || relation.actionType === action.reversedType\n );\n\n if (action) {\n const shouldTrigger = this.checkRelationCondition(relation, relatedFormControls, action);\n\n action.change(shouldTrigger, model, control, this._injector);\n }\n });\n })\n );\n });\n\n return subs;\n }\n\n /**\n * Check the conditions inside the relations\n * @param relation\n * @param relatedControl\n * @param action\n * @returns\n */\n private checkRelationCondition(\n relation: DynamicFormFieldRelation,\n relatedControls: RelatedFormControls,\n action: DynamicRelationAction\n ): boolean {\n // Default operator is AND, meaning all conditions should return true before the provided action is triggered.\n // In the case of a reversed type, the return value whould be false.\n const operator = relation.operator ?? RelationOperator.AND;\n\n // Use a reducer to map all conditions to a single boolean value to decide if we want to trigger the provided action type\n const reducer = (isMatch: boolean, condition: RelationCondition, index: number): boolean => {\n // Find the FormControl of the related field\n let relatedControl: UntypedFormControl | undefined;\n\n for (const [fieldName, control] of Object.entries(relatedControls)) {\n if (fieldName === (condition.path ?? condition.fieldName)) {\n relatedControl = control;\n break;\n }\n }\n\n if (!relatedControl) return false;\n\n // Using the 'normal' type should return true when the condition matches\n if (relation.actionType === action.type) {\n // Shortcut to false when a previous condition check was resolved as false in case of the AND operator\n if (index > 0 && operator === RelationOperator.AND && !isMatch) return false;\n\n // Shortcut to true when a previous condition check was resolved as true in case of the OR operator\n if (index > 0 && operator === RelationOperator.OR && isMatch) return true;\n\n return condition.value(relatedControl.value);\n }\n\n // Using the reversed type should return false when the condition matches, because we want to the opposite of the configured change Function\n if (relation.actionType === action.reversedType) {\n // Shortcut to true when a previous condition check was resolved as true\n if (index > 0 && operator === RelationOperator.AND && isMatch) return true;\n\n // Shortcut to false when a previous condition check was resolved as false\n if (index > 0 && operator === RelationOperator.OR && !isMatch) return false;\n\n return !condition.value(relatedControl.value);\n }\n\n return false;\n };\n\n return relation.conditions.reduce(reducer, false);\n }\n}\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n Type,\n ViewChild,\n ViewContainerRef\n} from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { DynamicButtonTogglesComponent } from '../../controls/button-toggles/dynamic-button-toggles.component';\nimport { DYNAMIC_FORM_FIELD_BUTTON_TOGGLES } from '../../controls/button-toggles/dynamic-button-toggles.model';\nimport { DynamicButtonComponent } from '../../controls/button/dynamic-button.component';\nimport { DYNAMIC_FORM_FIELD_BUTTON } from '../../controls/button/dynamic-button.model';\nimport { DynamicCheckboxComponent } from '../../controls/checkbox/dynamic-checkbox.component';\nimport { DYNAMIC_FORM_FIELD_CHECKBOX } from '../../controls/checkbox/dynamic-checkbox.model';\nimport { DynamicDatepickerComponent } from '../../controls/datepicker/dynamic-datepicker.component';\nimport { DYNAMIC_FORM_FIELD_DATEPICKER } from '../../controls/datepicker/dynamic-datepicker.model';\nimport { DynamicInputComponent } from '../../controls/input/dynamic-input.component';\nimport { DYNAMIC_FORM_FIELD_INPUT } from '../../controls/input/dynamic-input.model';\nimport { DymamicRadioGroupComponent } from '../../controls/radio-group/dynamic-radio-group.component';\nimport { DYNAMIC_FORM_FIELD_RADIO_GROUP } from '../../controls/radio-group/dynamic-radio-group.model';\nimport { DynamicReadonlyComponent } from '../../controls/readonly/dynamic-readonly.component';\nimport { DYNAMIC_FORM_FIELD_READONLY } from '../../controls/readonly/dynamic-readonly.model';\nimport { DynamicSelectComponent } from '../../controls/select/dynamic-select.component';\nimport { DYNAMIC_FORM_FIELD_SELECT } from '../../controls/select/dynamic-select.model';\nimport { DynamicTextareaComponent } from '../../controls/textarea/dynamic-textarea.component';\nimport { DYNAMIC_FORM_FIELD_TEXTAREA } from '../../controls/textarea/dynamic-textarea.model';\nimport { DynamicFormField } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldModel } from '../../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\nimport { DynamicFormFieldEvent, DynamicFormFieldEventType } from '../../models/interfaces/dynamic-form-field-event.interface';\nimport { DynamicFormRelationsService } from '../../services/dynamic-form-relations.service';\nimport { DynamicFormService } from '../../services/dynamic-form.service';\n\n@Component({\n standalone: true,\n imports: [NgClass, ReactiveFormsModule],\n selector: 'dynamic-form-field',\n templateUrl: 'dynamic-form-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DynamicFormFieldComponent implements OnInit, OnDestroy {\n @ViewChild('componentViewContainer', { read: ViewContainerRef, static: true }) componentViewContainer!: ViewContainerRef;\n\n @Input() model!: DynamicFormFieldModel;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<DynamicFormFieldEvent>();\n\n private readonly dynamicFormService = inject(DynamicFormService);\n private readonly relationService = inject(DynamicFormRelationsService);\n private readonly cdRef = inject(ChangeDetectorRef);\n\n private _control!: UntypedFormControl;\n private _subs = new Subscription();\n\n /** Get the instance of a control component using the injected custom method or local method */\n private get componentType(): Type<DynamicFormField> | null {\n return this.dynamicFormService.getCustomControlComponentType(this.model) || this.getControlComponentType();\n }\n\n ngOnInit(): void {\n if (this.group) {\n this._control = this.group.get(this.model.name) as UntypedFormControl;\n\n this.createFormControlComponent();\n this.setSubscriptions();\n }\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Finds the instance of a control component by type\n * @returns\n */\n private getControlComponentType(): Type<DynamicFormField> | null {\n switch (this.model.type) {\n case DYNAMIC_FORM_FIELD_BUTTON:\n return DynamicButtonComponent;\n case DYNAMIC_FORM_FIELD_BUTTON_TOGGLES:\n return DynamicButtonTogglesComponent;\n case DYNAMIC_FORM_FIELD_CHECKBOX:\n return DynamicCheckboxComponent;\n case DYNAMIC_FORM_FIELD_DATEPICKER:\n return DynamicDatepickerComponent;\n case DYNAMIC_FORM_FIELD_INPUT:\n return DynamicInputComponent;\n case DYNAMIC_FORM_FIELD_RADIO_GROUP:\n return DymamicRadioGroupComponent;\n case DYNAMIC_FORM_FIELD_READONLY:\n return DynamicReadonlyComponent;\n case DYNAMIC_FORM_FIELD_SELECT:\n return DynamicSelectComponent;\n case DYNAMIC_FORM_FIELD_TEXTAREA:\n return DynamicTextareaComponent;\n default:\n console.warn(\n `Model of type 'dynamic-${this.model.type}' is not implemented yet. Add this type to dynamic-form-field.component.ts to add support`\n );\n return null;\n }\n }\n\n private createFormControlComponent(): void {\n const component = this.componentType;\n\n if (component != null) {\n let componentRef = this.componentViewContainer.createComponent(component);\n\n const componentInstance = componentRef.instance;\n\n this._subs.add(componentInstance.change?.subscribe((event) => this.onChange(event)));\n\n componentInstance.group = this.group;\n componentInstance.model = this.model;\n }\n }\n\n /**\n * Setup all necessary subscriptions of the FormControl\n */\n private setSubscriptions(): void {\n const model = this.model as DynamicFormFieldModel;\n\n // Subscribe to the value change inside the control to change the value inside the model as well\n this._subs.add(this._control.valueChanges.subscribe((value) => this.onValueChange(value)));\n\n // Subscribe to the disabled change inside the model to change the disabled state of the FormControl\n this._subs.add(model.disabledChange.subscribe((disabled) => this.onDisabledChange(disabled)));\n\n // Setup subscriptions for any possible relation\n if (this.model.relations?.length) {\n this.setUpRelations();\n }\n }\n\n /**\n * Set up all relations of the current model\n */\n private setUpRelations(): void {\n // Array of all FormControls the current model has a relation to\n const relatedFormControls = this.relationService.findRelatedFormField(this.model, this.group);\n\n const subs = this.relationService.getRelationSubscriptions(relatedFormControls, this.model, this._control);\n\n // Add all relations as subscription to the main Subscription object\n subs.forEach((sub) => this._subs.add(sub));\n }\n\n /**\n * Fired when the value changes of the control and updates the value inside the model\n * @param value\n */\n private onValueChange(value: unknown): void {\n if (this.model instanceof DynamicFormFieldValueModel && this.model.value !== value) {\n this.model.value = value;\n }\n }\n\n /**\n * Enables/disabled the control based on the provided parameter.\n * Is fired when disabled state is changed inside the model and should not be directly used outside this component.\n * @param disabled\n */\n private onDisabledChange(disabled: boolean): void {\n disabled ? this._control.disable() : this._control.enable();\n\n this.cdRef.markForCheck();\n }\n\n private onChange(ev: unknown): void {\n this.change.emit(this.createDynamicFormEvent(ev, 'change'));\n }\n\n private createDynamicFormEvent(event: unknown, type: DynamicFormFieldEventType): DynamicFormFieldEvent {\n return { event, type, control: this._control, form: this.group, model: this.model };\n }\n}\n","<div [formGroup]=\"group\"\n [ngClass]=\"['dynamic-form-field-container', 'dynamic-form-field-' + model.type]\">\n <ng-container #componentViewContainer></ng-container>\n</div>","import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { DynamicFormFieldModel } from '../../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldEvent } from '../../models/interfaces/dynamic-form-field-event.interface';\nimport { DynamicFormConfig } from '../../models/types/dynamic-form-config.type';\nimport { DynamicFormService } from '../../services/dynamic-form.service';\nimport { DynamicFormFieldComponent } from '../dynamic-form-field/dynamic-form-field.component';\n\n@Component({\n standalone: true,\n imports: [NgClass, DynamicFormFieldComponent, ReactiveFormsModule],\n selector: 'dynamic-form',\n templateUrl: 'dynamic-form.component.html',\n styleUrls: ['./dynamic-form.component.scss'],\n providers: [DynamicFormService],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DynamicFormComponent {\n @Input({ required: true }) group!: UntypedFormGroup;\n @Input({ required: true }) formConfig!: DynamicFormConfig;\n\n @Output() change: EventEmitter<DynamicFormFieldEvent> = new EventEmitter();\n\n /**\n * Get the formConfig as flat array.\n */\n public get flatFormConfig(): DynamicFormFieldModel[] {\n return this.formConfig.reduce((acc, curr) => acc.concat(curr), []);\n }\n\n /**\n * Get the current value of the form.\n * @param includeDisabledFields Include the disabled fields of the form, is enabled by default\n */\n public getFormValue<T = unknown>(includeDisabledFields = true): T {\n const formValue = includeDisabledFields ? this.group.getRawValue() : this.group.value;\n\n return formValue;\n }\n\n /**\n * Provides an Observable to listen to changes of a specific field in the form.\n *\n * @param name Name of the field\n * @returns Observable<unknown>\n */\n public onControlChange(name: string): Observable<unknown> {\n const field = this.group.get(name);\n\n if (!field) {\n throw new Error(`Cannot find a field with the name ${name} in the FormGroup`);\n }\n\n return field.valueChanges;\n }\n\n public onChange(event: DynamicFormFieldEvent) {\n this.change.emit(event);\n }\n}\n","@for(row of formConfig; track $index) {\n<div class=\"dynamic-form-row\">\n @for(field of row; track field.id) {\n <dynamic-form-field class=\"dynamic-form-field\"\n [id]=\"field.id\"\n [hidden]=\"field.hidden\"\n [ngClass]=\"[field.type, 'form-field-width-' + field.width]\"\n [group]=\"group\"\n [model]=\"field\"\n (change)=\"onChange($event)\">\n </dynamic-form-field>\n }\n</div>\n}","/*\n * Public API Surface of ngx-dynamic-form\n */\nexport * from './lib/components/dynamic-form/dynamic-form.component';\n\nexport * from './lib/controls/controls';\nexport * from './lib/models';\n\nexport * from './lib/services/dynamic-form.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.DynamicFormValidationsService","i2","i1","i4","i3","i5"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAEa,yBAAyB,GAAG,IAAI,cAAc,CAAC,2BAA2B;;MCK1E,6BAA6B,CAAA;AACxC;;;;AAIG;AACI,IAAA,eAAe,CAAC,eAAuC,EAAA;AAC5D,QAAA,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;;AAGhD;;;;;AAKG;IACI,gBAAgB,CAAC,eAAuC,EAAE,OAAoB,EAAA;QACnF,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;YACpD,OAAO,CAAC,eAAe,EAAE;;aACpB;YACL,MAAM,YAAY,GAAkB,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC;AACzE,YAAA,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC;;QAGrC,OAAO,CAAC,sBAAsB,EAAE;;+GAxBvB,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,6BAA6B,cAF5B,MAAM,EAAA,CAAA,CAAA;;4FAEP,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAHzC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCUY,kBAAkB,CAAA;AAC7B,IAAA,WAAA,CACyD,yBAAoD,EACnG,EAAe,EACf,iBAAgD,EAAA;QAFD,IAAyB,CAAA,yBAAA,GAAzB,yBAAyB;QACxE,IAAE,CAAA,EAAA,GAAF,EAAE;QACF,IAAiB,CAAA,iBAAA,GAAjB,iBAAiB;;AAG3B;;;;AAIG;AACI,IAAA,6BAA6B,CAAC,KAA4B,EAAA;AAC/D,QAAA,OAAO,OAAO,IAAI,CAAC,yBAAyB,KAAK,UAAU,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,GAAG,IAAI;;AAG5G;;;;;AAKG;AACI,IAAA,eAAe,CAAC,MAAyB,EAAA;QAC9C,MAAM,KAAK,GAAqB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;AAEjD,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AACrB,YAAA,GAAG,CAAC,OAAO,CAAC,CAAC,aAAa,KAAI;AAC5B,gBAAA,MAAM,cAAc,GAAuB;oBACzC,QAAQ,EAAE,aAAa,CAAC,QAAQ;oBAChC,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU;iBAC5E;gBAED,MAAM,kBAAkB,GAAG,aAAqD;gBAChF,MAAM,OAAO,GAAG,IAAI,kBAAkB,CACpC,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,IAAI,kBAAkB,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,QAAQ,EAAE,EAC7G,cAAc,CACf;gBAED,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC;AAC/C,aAAC,CAAC;AACJ,SAAC,CAAC;AAEF,QAAA,OAAO,KAAK;;AAGd;;;;;;;;;;;;;AAaG;AACI,IAAA,sBAAsB,CAC3B,OAAwB,EACxB,OAA4B,EAC5B,OAAuB,EAAA;QAEvB,OAAO,OAAO,CAAC,IAAI,CACjB,GAAG,CAAC,CAAC,IAAI,KAAI;AACX,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;gBACvB,OAAO;AACL,oBAAA,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;AACpB,oBAAA,KAAK,EAAE,OAAO,CAAC,IAAI;iBACpB;AACH,aAAC,CAAC;SACH,CAAC,CACH;;AAzEQ,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,kBAEnB,yBAAyB,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,6BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAFxB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAGI,MAAM;2BAAC,yBAAyB;;0BAAG;;;ACRxC;;AAEG;MACmB,oBAAoB,CAAA;AAMxC,IAAA,IAAI,EAAE,GAAA;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI;;AAGzC,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAE5C,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,CAA+D,4DAAA,EAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAE,CAAA,CAAC;;AAEnG,QAAA,OAAO,IAAI;;AAGb,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;;AAG3B,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO;;AAGtB,IAAA,QAAQ,CAAC,KAAc,EAAA;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;;IAGlB,YAAY,GAAA;AACjB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE;;AAGnC,IAAA,QAAQ,CAAC,IAAY,EAAA;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;;AAErC;;ACpCK,MAAO,6BAA8B,SAAQ,oBAAoB,CAAA;AAPvE,IAAA,WAAA,GAAA;;AAWY,QAAA,IAAA,CAAA,MAAM,GAAwC,IAAI,YAAY,EAAE;AAC3E;+GALY,6BAA6B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECf1C,wcAYM,EDFqB,MAAA,EAAA,CAAA,mXAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,qBAAqB,0oBAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKvF,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAPzC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,IAAI,EAAE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,SAAS,EAAE,kBAAkB,CAAC,YACzF,wBAAwB,EAAA,QAAA,EAAA,wcAAA,EAAA,MAAA,EAAA,CAAA,mXAAA,CAAA,EAAA;8BAKzB,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAES,MAAM,EAAA,CAAA;sBAAf;;;AEbH;;AAEG;MACmB,qBAAqB,CAAA;AAgBzC,IAAA,WAAA,CAAY,MAA8B,EAAA;QACxC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI;QAClC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG;QAChC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI;AACjC,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;QACvB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI;QAC/B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE;QACzC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,QAAQ;QAC3C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI;;AAGzC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC;QAC9D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;QAEnD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;;AAG/C,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;;IAElC,IAAI,QAAQ,CAAC,OAAgB,EAAA;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;;AAG9B,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE;;IAEvB,IAAI,MAAM,CAAC,MAAe,EAAA;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;;AAE3B;;AC9BD;;AAEG;AACG,MAAgB,0BAAwC,SAAQ,qBAAqB,CAAA;AAMzF,IAAA,WAAA,CAAY,MAAsC,EAAA;QAChD,KAAK,CAAC,MAAM,CAAC;QAEb,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI;AAE/C,QAAA,MAAM,GAAG,GAAa,MAAM,CAAC,KAAK,IAAI,IAAI;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC;AACvC,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY;;AAG1C,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;;IAEhC,IAAI,KAAK,CAAC,GAAa,EAAA;AACrB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AACtB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;;;AAG5B;;AClBD;;AAEG;AACG,MAAgB,2BAA+B,SAAQ,0BAA6B,CAAA;AAOxF,IAAA,WAAA,CAAY,MAAuC,EAAA;QACjD,KAAK,CAAC,MAAM,CAAC;QAJP,IAAQ,CAAA,QAAA,GAAgC,EAAE;QAC1C,IAAe,CAAA,eAAA,GAAqC,EAAE;QAK5D,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;YAC7C,OAAO,CAAC,KAAK,CAAC,CAAA,0CAAA,EAA6C,IAAI,CAAC,IAAI,CAAE,CAAA,CAAC;;AAGzE,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC;;AAC1C,aAAA,IAAI,MAAM,CAAC,cAAc,EAAE;YAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,cAAc,CAAC;;;AAIhE,IAAA,UAAU,CAAC,OAA6B,EAAA;AAC9C,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;AACvB,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAG1B,QAAA,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE;YACzB,OAAO,OAAO,CAAC,IAAI,CACjB,GAAG,CAAC,CAAC,CAAC,KAAI;AACR,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;gBACjB,OAAO,IAAI,CAAC,QAAQ;aACrB,CAAC,CACH;;AAGH,QAAA,OAAO,EAAE,CAAC,EAAE,CAAC;;AAGP,IAAA,iBAAiB,CAAC,cAA2C,EAAA;AACnE,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE;AACjC,YAAA,IAAI,CAAC,eAAe,GAAG,cAAc;AACrC,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC;;AAGjC,QAAA,IAAI,YAAY,CAAC,cAAc,CAAC,EAAE;YAChC,OAAO,cAAc,CAAC,IAAI,CACxB,GAAG,CAAC,CAAC,CAAC,KAAI;AACR,gBAAA,IAAI,CAAC,eAAe,GAAG,CAAC;gBACxB,OAAO,IAAI,CAAC,eAAe;aAC5B,CAAC,CACH;;AAGH,QAAA,OAAO,EAAE,CAAC,EAAE,CAAC;;AAEhB;;AC5FM,MAAM,iCAAiC,GAAG;AAS3C,MAAO,oBAAqB,SAAQ,2BAAmD,CAAA;AAM3F,IAAA,WAAA,CAAY,MAAkC,EAAA;QAC5C,KAAK,CAAC,MAAM,CAAC;QAHC,IAAI,CAAA,IAAA,GAAW,iCAAiC;QAK9D,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK;QACxC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK;;AAE3C;;ACVK,MAAO,sBAAuB,SAAQ,oBAAoB,CAAA;IAIvD,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;;+GALX,sBAAsB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECbnC,qMAOM,EAAA,MAAA,EAAA,CAAA,gHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDCM,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKd,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,eAAe,CAAC,YAChB,gBAAgB,EAAA,QAAA,EAAA,qMAAA,EAAA,MAAA,EAAA,CAAA,gHAAA,CAAA,EAAA;8BAKjB,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;;;AEZI,MAAM,yBAAyB,GAAG;AAiBnC,MAAO,aAAc,SAAQ,qBAAqB,CAAA;AAMtD,IAAA,WAAA,CAAY,MAA2B,EAAA;QACrC,KAAK,CAAC,MAAM,CAAC;QAHC,IAAI,CAAA,IAAA,GAAG,yBAAyB;QAK9C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI;AACjC,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;;AAEhC;;ACpBK,MAAO,wBAAyB,SAAQ,oBAAoB,CAAA;AANlE,IAAA,WAAA,GAAA;;AAUY,QAAA,IAAA,CAAA,MAAM,GAAoC,IAAI,YAAY,EAAE;AACvE;+GALY,wBAAwB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,ECZrC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,oYAWe,EDDH,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,mlBAAE,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,UAAA,EAAA,eAAA,EAAA,MAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAErC,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBANpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAEhB,IAAI,EAAA,OAAA,EACP,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,EAAA,QAAA,EAAA,oYAAA,EAAA;8BAGxC,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAES,MAAM,EAAA,CAAA;sBAAf;;;AEdI,MAAM,2BAA2B,GAAG;AAOrC,MAAO,eAAgB,SAAQ,0BAAmC,CAAA;AAMtE,IAAA,WAAA,CAAY,MAA6B,EAAA;QACvC,KAAK,CAAC,MAAM,CAAC;QAHC,IAAI,CAAA,IAAA,GAAW,2BAA2B;QAKxD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK;QAElC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,OAAO;AACpD,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,KAAK,IAAI,GAAG,IAAI,GAAG,KAAK;;AAGnE,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,KAAK,IAAI,KAAK;;IAG5B,IAAI,OAAO,CAAC,OAAgB,EAAA;AAC1B,QAAA,IAAI,CAAC,KAAK,GAAG,OAAO;;IAGf,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO;;AAE/B;;AClBK,MAAO,0BAA2B,SAAQ,oBAAoB,CAAA;AAPpE,IAAA,WAAA,GAAA;;AAWY,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAyB;AAC7D;+GALY,0BAA0B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjBvC,mvBAwBiB,EAAA,MAAA,EAAA,CAAA,8BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDZL,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,KAAA,EAAA,KAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKjF,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,IAAI,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,CAAC,YACnF,oBAAoB,EAAA,QAAA,EAAA,mvBAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,CAAA,EAAA;8BAKrB,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAES,MAAM,EAAA,CAAA;sBAAf;;;AEnBI,MAAM,6BAA6B,GAAG;AAevC,MAAO,iBAAkB,SAAQ,0BAAyD,CAAA;AAQ9F,IAAA,WAAA,CAAY,MAA+B,EAAA;QACzC,KAAK,CAAC,MAAM,CAAC;QAHC,IAAI,CAAA,IAAA,GAAG,6BAA6B;QAKlD,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI;QAC7B,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI;QAC7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI;QACrC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,OAAO;;AAE/C;;ACdK,MAAO,qBAAsB,SAAQ,oBAAoB,CAAA;AAP/D,IAAA,WAAA,GAAA;;AAaY,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAyB;AAsB7D;AApBC,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;;AAGxD,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,CAAA,EAAG,IAAI,CAAC,UAAU,CAAA,GAAA,EAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAA,CAAE;;AAGvD,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU;;AAG1E,IAAA,QAAQ,CAAC,KAAoC,EAAA;;AAElD,QAAA,IAAI,KAAK,YAAY,KAAK,EAAE;YAC1B,KAAK,CAAC,eAAe,EAAE;;AAGzB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAA8B,CAAC;;+GA1BvC,qBAAqB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,2LACrB,QAAQ,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpBrB,6zCA6CiB,EAAA,MAAA,EAAA,CAAA,qEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/BL,IAAI,EAAE,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,mBAAmB,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,sEAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,kBAAkB,6uBAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,mLAAE,wBAAwB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKtH,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,WACP,CAAC,IAAI,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,wBAAwB,CAAC,YACxH,eAAe,EAAA,QAAA,EAAA,6zCAAA,EAAA,MAAA,EAAA,CAAA,qEAAA,CAAA,EAAA;8BAKc,KAAK,EAAA,CAAA;sBAA3C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAE5B,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAES,MAAM,EAAA,CAAA;sBAAf;;;AEtBI,MAAM,wBAAwB,GAAG;AAoBlC,MAAO,YAAa,SAAQ,0BAA6C,CAAA;AAgB7E,IAAA,WAAA,CAAY,MAA0B,EAAA;QACpC,KAAK,CAAC,MAAM,CAAC;QAHC,IAAI,CAAA,IAAA,GAAG,wBAAwB;QAK7C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM;AAC3C,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE;QAC3D,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI;QAC7B,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI;AAC7B,QAAA,IAAI,CAAC,SAAS,GAAG,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI;AAC/E,QAAA,IAAI,CAAC,SAAS,GAAG,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI;QAC/E,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI;QAC/B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE;QACnC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,KAAK;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI;QACnC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,KAAK;QAClD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC;;AAEvD;;ACzCK,MAAO,0BAA2B,SAAQ,oBAAoB,CAAA;AAPpE,IAAA,WAAA,GAAA;;AAWY,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAkB;AACtD;+GALY,0BAA0B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECdvC,shBAcM,EAAA,MAAA,EAAA,CAAA,8OAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDLM,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,eAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,SAAA,EAAA,OAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAK5D,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,SAAS,CAAC,YAC9D,qBAAqB,EAAA,QAAA,EAAA,shBAAA,EAAA,MAAA,EAAA,CAAA,8OAAA,CAAA,EAAA;8BAKtB,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAES,MAAM,EAAA,CAAA;sBAAf;;;AEhBI,MAAM,8BAA8B,GAAG;AASxC,MAAO,iBAAkB,SAAQ,2BAAmD,CAAA;AAMxF,IAAA,WAAA,CAAY,MAA+B,EAAA;QACzC,KAAK,CAAC,MAAM,CAAC;QAHC,IAAI,CAAA,IAAA,GAAW,8BAA8B;QAK3D,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,OAAO;QACpD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK;;AAEvC;;ACXK,MAAO,wBAAyB,SAAQ,oBAAoB,CAAA;+GAArD,wBAAwB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZrC,2KAKM,EAAA,MAAA,EAAA,CAAA,qSAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEM,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKlB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,mBAAmB,CAAC,YACpB,kBAAkB,EAAA,QAAA,EAAA,2KAAA,EAAA,MAAA,EAAA,CAAA,qSAAA,CAAA,EAAA;8BAKnB,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;;;AEZI,MAAM,2BAA2B,GAAG;AAMrC,MAAO,eAAgB,SAAQ,0BAAgD,CAAA;AAGnF,IAAA,WAAA,CAAY,MAA6B,EAAA;QACvC,KAAK,CAAC,MAAM,CAAC;QAHC,IAAI,CAAA,IAAA,GAAG,2BAA2B;;AAKnD;;ACGK,MAAO,sBAAuB,SAAQ,oBAAoB,CAAA;AAPhE,IAAA,WAAA,GAAA;;AAWY,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAmB;AACvD;+GALY,sBAAsB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,ECjBnC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,+4EAyEiB,ED7DL,MAAA,EAAA,CAAA,4EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAI,4FAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,2BAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EAAE,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,SAAS,6CAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAKzG,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,WACP,CAAC,IAAI,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,CAAC,YAC3G,gBAAgB,EAAA,QAAA,EAAA,+4EAAA,EAAA,MAAA,EAAA,CAAA,4EAAA,CAAA,EAAA;8BAKjB,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAES,MAAM,EAAA,CAAA;sBAAf;;;AEnBI,MAAM,yBAAyB,GAAG;AAcnC,MAAO,aAAiB,SAAQ,2BAA8B,CAAA;AAMlE,IAAA,WAAA,CAAY,MAA8B,EAAA;QACxC,KAAK,CAAC,MAAM,CAAC;QAHC,IAAI,CAAA,IAAA,GAAG,yBAAyB;QAK9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK;QACpC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK;;AAE3C;;ACZK,MAAO,wBAAyB,SAAQ,oBAAoB,CAAA;AAPlE,IAAA,WAAA,GAAA;;AAaY,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAyB;AAkB7D;AAhBC,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;;AAG9D,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,CAAA,EAAG,IAAI,CAAC,UAAU,CAAA,GAAA,EAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAA,CAAE;;AAGhD,IAAA,QAAQ,CAAC,KAAoC,EAAA;;AAElD,QAAA,IAAI,KAAK,YAAY,KAAK,EAAE;YAC1B,KAAK,CAAC,eAAe,EAAE;;AAGzB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAA8B,CAAC;;+GAtBvC,wBAAwB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACxB,QAAQ,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjBrB,g/BA8BiB,EAAA,MAAA,EAAA,CAAA,8BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnBL,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAK5D,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAPpC,SAAS;iCACI,IAAI,EAAA,OAAA,EACP,CAAC,IAAI,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAC9D,kBAAkB,EAAA,QAAA,EAAA,g/BAAA,EAAA,MAAA,EAAA,CAAA,8BAAA,CAAA,EAAA;8BAKW,QAAQ,EAAA,CAAA;sBAA9C,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;gBAE5B,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAES,MAAM,EAAA,CAAA;sBAAf;;;AEpBI,MAAM,2BAA2B,GAAG;AAoCrC,MAAO,eAAgB,SAAQ,0BAAgD,CAAA;AAWnF,IAAA,WAAA,CAAY,MAA6B,EAAA;QACvC,KAAK,CAAC,MAAM,CAAC;QAHC,IAAI,CAAA,IAAA,GAAG,2BAA2B;QAKhD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE;QAC3C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI;QACzC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,KAAK;QAChD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI;QACnC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI;;AAEpD;;MCzDY,qBAAqB,CAAA;AAChC;;;AAGG;IACH,OAAO,KAAK,CAAC,GAAY,EAAA;AACvB,QAAA,MAAM,OAAO,GAAW,GAAG,IAAI,wBAAwB;AACvD,QAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE;;AAGhE;;;;AAIG;AACH,IAAA,OAAO,GAAG,CAAC,GAAW,EAAE,GAAY,EAAA;AAClC,QAAA,MAAM,OAAO,GAAW,GAAG,IAAI,CAAc,WAAA,EAAA,GAAG,EAAE;AAClD,QAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE;;AAGjE;;;;AAIG;AACH,IAAA,OAAO,GAAG,CAAC,GAAW,EAAE,GAAY,EAAA;AAClC,QAAA,MAAM,OAAO,GAAW,GAAG,IAAI,CAAc,WAAA,EAAA,GAAG,EAAE;AAClD,QAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE;;AAGjE;;;;AAIG;AACH,IAAA,OAAO,SAAS,CAAC,GAAW,EAAE,GAAY,EAAA;AACxC,QAAA,MAAM,OAAO,GAAW,GAAG,IAAI,CAAY,SAAA,EAAA,GAAG,SAAS;AACvD,QAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE;;AAGvE;;;;AAIG;AACH,IAAA,OAAO,SAAS,CAAC,GAAW,EAAE,GAAY,EAAA;AACxC,QAAA,MAAM,OAAO,GAAW,GAAG,IAAI,CAAY,SAAA,EAAA,GAAG,SAAS;AACvD,QAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE;;AAGvE;;;;AAIG;AACH,IAAA,OAAO,OAAO,CAAC,OAAwB,EAAE,GAAY,EAAA;AACnD,QAAA,MAAM,OAAO,GAAW,GAAG,IAAI,qBAAqB;AACpD,QAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE;;AAG7E;;;AAGG;IACH,OAAO,QAAQ,CAAC,GAAY,EAAA;AAC1B,QAAA,MAAM,OAAO,GAAW,GAAG,IAAI,uBAAuB;AAEtD,QAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE;;AAGtE;;;AAGG;IACH,OAAO,YAAY,CAAC,GAAY,EAAA;AAC9B,QAAA,MAAM,OAAO,GAAW,GAAG,IAAI,uBAAuB;AACtD,QAAA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,CAAC,YAAY,EAAE,OAAO,EAAE;;AAE/E;;ICjFW;AAAZ,CAAA,UAAY,kBAAkB,EAAA;AAC5B,IAAA,kBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,kBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,kBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,kBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,kBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,kBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EAPW,kBAAkB,KAAlB,kBAAkB,GAO7B,EAAA,CAAA,CAAA;IAEW;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,gBAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACX,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,GAG3B,EAAA,CAAA,CAAA;;ACED,MAAM,cAAc,GAA0B;IAC5C,IAAI,EAAE,kBAAkB,CAAC,QAAQ;IACjC,YAAY,EAAE,kBAAkB,CAAC,OAAO;IACxC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAA;AACpB,QAAA,KAAK,CAAC,QAAQ,GAAG,QAAQ;;CAE5B;AAED,MAAM,aAAa,GAA0B;IAC3C,IAAI,EAAE,kBAAkB,CAAC,MAAM;IAC/B,YAAY,EAAE,kBAAkB,CAAC,OAAO;IACxC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAA;AACpB,QAAA,KAAK,CAAC,MAAM,GAAG,QAAQ;;CAE1B;AAED,MAAM,eAAe,GAA0B;IAC7C,IAAI,EAAE,kBAAkB,CAAC,QAAQ;IACjC,YAAY,EAAE,kBAAkB,CAAC,QAAQ;AACzC,IAAA,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAA;QACvC,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AACnF,QAAA,IAAI,UAAkC;QAEtC,IAAI,QAAQ,EAAE;YACZ,UAAU,GAAG,qBAAqB,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,qBAAqB,CAAC,QAAQ,EAAE,CAAC;;aAC1G;AACL,YAAA,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;;AAGpE,QAAA,QAAQ,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC;;CAEpF;AAEM,MAAM,gBAAgB,GAA4B,CAAC,cAAc,EAAE,aAAa,EAAE,eAAe,CAAC;;MCpC5F,2BAA2B,CAAA;AAHxC,IAAA,WAAA,GAAA;AAIU,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAuHrC;AArHC;;;;;AAKG;IACI,oBAAoB,CAAC,KAA4B,EAAE,KAAgB,EAAA;AACxE,QAAA,MAAM,gBAAgB,GAAG,CAAC,QAA6B,EAAE,SAA4B,KAAI;YACvF,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,SAAU;;AAExD,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC;kBACrB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;kBAC7B,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,SAAU,CAAwB;YAE3D,IAAI,CAAC,OAAO,EAAE;gBACZ,OAAO,CAAC,IAAI,CAAC,CAAA,sCAAA,EAAyC,SAAS,CAAC,SAAS,CAAQ,MAAA,CAAA,CAAC;AAClF,gBAAA,OAAO,QAAQ;;AAGjB,YAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,OAAO;AAC7B,YAAA,OAAO,QAAQ;AACjB,SAAC;AAED,QAAA,MAAM,gBAAgB,GAAG,CAAC,QAA6B,EAAE,QAAkC,KAAI;YAC7F,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC;AAC/D,SAAC;QAED,OAAO,KAAK,CAAC,SAAU,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,CAAC;;AAG/C,IAAA,wBAAwB,CAC7B,mBAAwC,EACxC,KAA4B,EAC5B,OAAoB,EAAA;QAEpB,MAAM,IAAI,GAAmB,EAAE;;QAG/B,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,KAAI;YAC5D,IAAI,CAAC,IAAI,CACP,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,SAAS,CAAC,MAAK;gBACvG,KAAK,CAAC,SAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;;oBAEpC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAClC,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY,CAC/F;oBAED,IAAI,MAAM,EAAE;AACV,wBAAA,MAAM,aAAa,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,CAAC;AAExF,wBAAA,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;;AAEhE,iBAAC,CAAC;aACH,CAAC,CACH;AACH,SAAC,CAAC;AAEF,QAAA,OAAO,IAAI;;AAGb;;;;;;AAMG;AACK,IAAA,sBAAsB,CAC5B,QAAkC,EAClC,eAAoC,EACpC,MAA6B,EAAA;;;QAI7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,gBAAgB,CAAC,GAAG;;QAG1D,MAAM,OAAO,GAAG,CAAC,OAAgB,EAAE,SAA4B,EAAE,KAAa,KAAa;;AAEzF,YAAA,IAAI,cAA8C;AAElD,YAAA,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;AAClE,gBAAA,IAAI,SAAS,MAAM,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE;oBACzD,cAAc,GAAG,OAAO;oBACxB;;;AAIJ,YAAA,IAAI,CAAC,cAAc;AAAE,gBAAA,OAAO,KAAK;;YAGjC,IAAI,QAAQ,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI,EAAE;;gBAEvC,IAAI,KAAK,GAAG,CAAC,IAAI,QAAQ,KAAK,gBAAgB,CAAC,GAAG,IAAI,CAAC,OAAO;AAAE,oBAAA,OAAO,KAAK;;gBAG5E,IAAI,KAAK,GAAG,CAAC,IAAI,QAAQ,KAAK,gBAAgB,CAAC,EAAE,IAAI,OAAO;AAAE,oBAAA,OAAO,IAAI;gBAEzE,OAAO,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;;;YAI9C,IAAI,QAAQ,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY,EAAE;;gBAE/C,IAAI,KAAK,GAAG,CAAC,IAAI,QAAQ,KAAK,gBAAgB,CAAC,GAAG,IAAI,OAAO;AAAE,oBAAA,OAAO,IAAI;;gBAG1E,IAAI,KAAK,GAAG,CAAC,IAAI,QAAQ,KAAK,gBAAgB,CAAC,EAAE,IAAI,CAAC,OAAO;AAAE,oBAAA,OAAO,KAAK;gBAE3E,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;;AAG/C,YAAA,OAAO,KAAK;AACd,SAAC;QAED,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;;+GAtHxC,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cAF1B,MAAM,EAAA,CAAA,CAAA;;4FAEP,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCuCY,yBAAyB,CAAA;AAPtC,IAAA,WAAA,GAAA;AAaY,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAyB;AAE3C,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACrD,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAG1C,QAAA,IAAA,CAAA,KAAK,GAAG,IAAI,YAAY,EAAE;AA8HnC;;AA3HC,IAAA,IAAY,aAAa,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,uBAAuB,EAAE;;IAG5G,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB;YAErE,IAAI,CAAC,0BAA0B,EAAE;YACjC,IAAI,CAAC,gBAAgB,EAAE;;;IAI3B,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;;AAG1B;;;AAGG;IACK,uBAAuB,GAAA;AAC7B,QAAA,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,YAAA,KAAK,yBAAyB;AAC5B,gBAAA,OAAO,sBAAsB;AAC/B,YAAA,KAAK,iCAAiC;AACpC,gBAAA,OAAO,6BAA6B;AACtC,YAAA,KAAK,2BAA2B;AAC9B,gBAAA,OAAO,wBAAwB;AACjC,YAAA,KAAK,6BAA6B;AAChC,gBAAA,OAAO,0BAA0B;AACnC,YAAA,KAAK,wBAAwB;AAC3B,gBAAA,OAAO,qBAAqB;AAC9B,YAAA,KAAK,8BAA8B;AACjC,gBAAA,OAAO,0BAA0B;AACnC,YAAA,KAAK,2BAA2B;AAC9B,gBAAA,OAAO,wBAAwB;AACjC,YAAA,KAAK,yBAAyB;AAC5B,gBAAA,OAAO,sBAAsB;AAC/B,YAAA,KAAK,2BAA2B;AAC9B,gBAAA,OAAO,wBAAwB;AACjC,YAAA;gBACE,OAAO,CAAC,IAAI,CACV,CAA0B,uBAAA,EAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2F,yFAAA,CAAA,CACrI;AACD,gBAAA,OAAO,IAAI;;;IAIT,0BAA0B,GAAA;AAChC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa;AAEpC,QAAA,IAAI,SAAS,IAAI,IAAI,EAAE;YACrB,IAAI,YAAY,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,SAAS,CAAC;AAEzE,YAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,QAAQ;YAE/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAEpF,YAAA,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AACpC,YAAA,iBAAiB,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;;;AAIxC;;AAEG;IACK,gBAAgB,GAAA;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAA8B;;QAGjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;;QAG1F,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;;QAG7F,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE;YAChC,IAAI,CAAC,cAAc,EAAE;;;AAIzB;;AAEG;IACK,cAAc,GAAA;;AAEpB,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;AAE7F,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,mBAAmB,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC;;AAG1G,QAAA,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;AAG5C;;;AAGG;AACK,IAAA,aAAa,CAAC,KAAc,EAAA;AAClC,QAAA,IAAI,IAAI,CAAC,KAAK,YAAY,0BAA0B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE;AAClF,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK;;;AAI5B;;;;AAIG;AACK,IAAA,gBAAgB,CAAC,QAAiB,EAAA;AACxC,QAAA,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AAE3D,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;;AAGnB,IAAA,QAAQ,CAAC,EAAW,EAAA;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;;IAGrD,sBAAsB,CAAC,KAAc,EAAE,IAA+B,EAAA;QAC5E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;;+GAzI1E,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,sQACS,gBAAgB,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClD/D,oLAGM,EDyCM,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,mFAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAK3B,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAPrC,SAAS;iCACI,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAC7B,oBAAoB,EAAA,eAAA,EAEb,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,oLAAA,EAAA;8BAGgC,sBAAsB,EAAA,CAAA;sBAApG,SAAS;uBAAC,wBAAwB,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE;gBAEpE,KAAK,EAAA,CAAA;sBAAb;gBACQ,KAAK,EAAA,CAAA;sBAAb;gBAES,MAAM,EAAA,CAAA;sBAAf;;;MEpCU,oBAAoB,CAAA;AATjC,IAAA,WAAA,GAAA;AAaY,QAAA,IAAA,CAAA,MAAM,GAAwC,IAAI,YAAY,EAAE;AAsC3E;AApCC;;AAEG;AACH,IAAA,IAAW,cAAc,GAAA;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;;AAGpE;;;AAGG;IACI,YAAY,CAAc,qBAAqB,GAAG,IAAI,EAAA;QAC3D,MAAM,SAAS,GAAG,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;AAErF,QAAA,OAAO,SAAS;;AAGlB;;;;;AAKG;AACI,IAAA,eAAe,CAAC,IAAY,EAAA;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAElC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAA,iBAAA,CAAmB,CAAC;;QAG/E,OAAO,KAAK,CAAC,YAAY;;AAGpB,IAAA,QAAQ,CAAC,KAA4B,EAAA;AAC1C,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;;+GAxCd,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAHpB,CAAC,kBAAkB,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChBjC,2ZAaC,EAAA,MAAA,EAAA,CAAA,o/JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDDW,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAOtD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAThC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,WACP,CAAC,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,CAAC,EACxD,QAAA,EAAA,cAAc,aAGb,CAAC,kBAAkB,CAAC,EACd,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2ZAAA,EAAA,MAAA,EAAA,CAAA,o/JAAA,CAAA,EAAA;8BAGpB,KAAK,EAAA,CAAA;sBAA/B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACE,UAAU,EAAA,CAAA;sBAApC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAEf,MAAM,EAAA,CAAA;sBAAf;;;AEvBH;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"olafvv-ngx-dynamic-form.mjs","sources":["../../../projects/ngx-dynamic-form/src/lib/models/tokens/dynamic-form-field-map-fn.token.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-validations.service.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-form.service.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-base.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.component.html","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-value-model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-field-option-model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button-toggles/dynamic-button-toggles.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/button/dynamic-button.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/checkbox/dynamic-checkbox.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/datepicker/dynamic-datepicker.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/input/dynamic-input.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/radio-group/dynamic-radio-group.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/readonly/dynamic-readonly.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/select/dynamic-select.model.ts","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.component.ts","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.component.html","../../../projects/ngx-dynamic-form/src/lib/controls/textarea/dynamic-textarea.model.ts","../../../projects/ngx-dynamic-form/src/lib/models/classes/dynamic-form-validators.ts","../../../projects/ngx-dynamic-form/src/lib/models/interfaces/dynamic-form-field-relation.interface.ts","../../../projects/ngx-dynamic-form/src/lib/models/constants/dynamic-relations.const.ts","../../../projects/ngx-dynamic-form/src/lib/services/dynamic-form-relations.service.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form-field/dynamic-form-field.component.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form-field/dynamic-form-field.component.html","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form/dynamic-form.component.ts","../../../projects/ngx-dynamic-form/src/lib/components/dynamic-form/dynamic-form.component.html","../../../projects/ngx-dynamic-form/src/public-api.ts","../../../projects/ngx-dynamic-form/src/olafvv-ngx-dynamic-form.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const DYNAMIC_FORM_FIELD_MAP_FN = new InjectionToken('DYNAMIC_FORM_FIELD_MAP_FN');\n","import { Injectable } from '@angular/core';\nimport { FormControl, ValidatorFn } from '@angular/forms';\nimport { DynamicFormValidator } from '../models/interfaces/dynamic-form-validator.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormValidationsService {\n /**\n * Get all Validator Functions from the validator configuration\n * @param validatorConfig\n * @returns\n */\n public getValidatorFns(validatorConfig: DynamicFormValidator[]): ValidatorFn[] {\n return validatorConfig.map((v) => v.validator);\n }\n\n /**\n * Update the validators on a FormControl based on the provided validator configuration.\n * This will replace any existing validators on the control or removes all validators when none provided\n * @param validatorConfig\n * @param control\n */\n public updateValidators(validatorConfig: DynamicFormValidator[], control: FormControl): void {\n if (!validatorConfig || validatorConfig.length === 0) {\n control.clearValidators();\n } else {\n const validatorFns: ValidatorFn[] = this.getValidatorFns(validatorConfig);\n control.setValidators(validatorFns);\n }\n\n control.updateValueAndValidity();\n }\n}\n","import { Inject, Injectable, Optional, Type } from '@angular/core';\nimport { FormBuilder, FormControlOptions, UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { map, Observable } from 'rxjs';\nimport { DynamicFormField } from '../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldModel } from '../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldOption } from '../models/classes/dynamic-form-field-option-model';\nimport { DynamicFormFieldValueConfig } from '../models/classes/dynamic-form-field-value-model';\nimport { DYNAMIC_FORM_FIELD_MAP_FN } from '../models/tokens/dynamic-form-field-map-fn.token';\nimport { DynamicFormConfig } from '../models/types/dynamic-form-config.type';\nimport { DynamicFormValidationsService } from './dynamic-validations.service';\n\nexport type DynamicFormFieldTypeMapFn = (field: DynamicFormFieldModel) => Type<DynamicFormField> | null;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormService {\n constructor(\n @Inject(DYNAMIC_FORM_FIELD_MAP_FN) @Optional() private DYNAMIC_FORM_FIELD_MAP_FN: DynamicFormFieldTypeMapFn,\n private fb: FormBuilder,\n private validatorsService: DynamicFormValidationsService\n ) {}\n\n /**\n * Check if there is a function provided to use custom form controls\n * @param model\n * @returns\n */\n public getCustomControlComponentType(model: DynamicFormFieldModel): Type<DynamicFormField> | null {\n return typeof this.DYNAMIC_FORM_FIELD_MAP_FN === 'function' ? this.DYNAMIC_FORM_FIELD_MAP_FN(model) : null;\n }\n\n /**\n * Create a FormGroup from the provided form configuration.\n * Returns a FormGroup.\n * @param {DynamicFormConfig} config Configuration object of a form\n * @returns {UntypedFormGroup}\n */\n public createFormGroup(config: DynamicFormConfig): UntypedFormGroup {\n const group: UntypedFormGroup = this.fb.group({});\n\n config.forEach((row) => {\n row.forEach((controlConfig) => {\n const controlOptions: FormControlOptions = {\n updateOn: controlConfig.updateOn,\n validators: this.validatorsService.getValidatorFns(controlConfig.validators)\n };\n\n const controlValueConfig = controlConfig as DynamicFormFieldValueConfig<unknown>;\n const control = new UntypedFormControl(\n { value: controlValueConfig.value ?? controlValueConfig.defaultValue, disabled: controlValueConfig.disabled },\n controlOptions\n );\n\n group.addControl(controlConfig.name, control);\n });\n });\n\n return group;\n }\n\n /**\n * Transform any list (Observable) to a list of DynamicFormFieldOption which is used in any Dynamic Form Field with options (e.g. DynamicSelect).\n * Possible to provide the method with Type definitions to define the provided list type and desired option value type:\n *\n * `dynamicFormService.toDynamicOptionList<T, K>(...)`\n *\n * Generic types:\n * - T = The type of the items in the provided list\n * - K = The type of the value inside an DynamicFormFieldOption. Default is 'string'\n * @param listObs An Observable of a list of items of type T\n * @param labelCb Callback to define the label of the options in the template\n * @param valueCb Callback to define the value of the options. Must return a value of type K (default string)\n * @returns\n */\n public toDynamicOptionListObs<T, K = string>(\n listObs: Observable<T[]>,\n labelCb: (item: T) => string,\n valueCb: (item: T) => K\n ): Observable<DynamicFormFieldOption<K>[]> {\n return listObs.pipe(\n map((list) => {\n return list.map((item) => {\n return {\n label: labelCb(item),\n value: valueCb(item)\n };\n });\n })\n );\n }\n}\n","import { EventEmitter } from '@angular/core';\nimport { AbstractControl, UntypedFormGroup } from '@angular/forms';\nimport { DynamicFormFieldModel } from './dynamic-form-field-model';\n\nexport interface DynamicFormField {\n group: UntypedFormGroup;\n model: DynamicFormFieldModel;\n change: EventEmitter<any>;\n}\n\n/**\n * Base class for the DynamicFormField component classes\n */\nexport abstract class DynamicFormFieldBase implements DynamicFormField {\n group!: UntypedFormGroup;\n model!: DynamicFormFieldModel;\n\n change!: EventEmitter<any>;\n\n get id(): string {\n return this.model.id ?? this.model.name;\n }\n\n get control(): AbstractControl {\n const ctrl = this.group.get(this.model.name);\n\n if (!ctrl) {\n throw new Error(`Provided FormGroup does not contain a control with the name ${this.model.name}`);\n }\n return ctrl;\n }\n\n get isValid(): boolean {\n return this.control.valid;\n }\n\n get isInvalid(): boolean {\n return this.control.invalid;\n }\n\n public onChange(event: unknown) {\n this.change.emit(event);\n }\n\n public resetControl() {\n this.group.get(this.model.name)?.reset();\n }\n\n public hasError(name: string): boolean {\n return this.control.hasError(name);\n }\n}\n","import { AsyncPipe, NgClass, NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatButtonToggleChange, MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicButtonToggles } from './dynamic-button-toggles.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, NgClass, MatButtonToggleModule, ReactiveFormsModule, AsyncPipe, MatFormFieldModule],\n selector: 'dynamic-button-toggles',\n templateUrl: './dynamic-button-toggles.component.html',\n styleUrls: ['./dynamic-button-toggles.component.scss']\n})\nexport class DynamicButtonTogglesComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicButtonToggles;\n @Input() group!: UntypedFormGroup;\n\n @Output() change: EventEmitter<MatButtonToggleChange> = new EventEmitter();\n}\n","<div class=\"dynamic-button-toggles-wrapper\"\n [formGroup]=\"group\">\n <mat-button-toggle-group [id]=\"id\"\n [formControlName]=\"model.name\"\n [multiple]=\"model.multiple\"\n [vertical]=\"model.vertical\"\n (change)=\"onChange($event)\">\n\n @for(option of model.options$ | async; track option.value) {\n <mat-button-toggle [value]=\"option.value\">{{option.label}}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n</div>","import { signal, WritableSignal } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { DynamicFormFieldConfig } from '../interfaces/dynamic-form-field-config.interface';\nimport { DynamicFormFieldRelation } from '../interfaces/dynamic-form-field-relation.interface';\nimport { DynamicFormValidator } from '../interfaces/dynamic-form-validator.interface';\n\n/**\n * Base class for all DynamicFormFields\n */\nexport abstract class DynamicFormFieldModel {\n public id: string;\n public width: number;\n public label: string | null;\n public name: string;\n public hint: string | null;\n public validators: DynamicFormValidator[];\n public updateOn: 'submit' | 'blur' | 'change';\n public relations: DynamicFormFieldRelation[] | null;\n public disabledChange: Observable<boolean>;\n\n abstract readonly type: string;\n\n private readonly disabled$: BehaviorSubject<boolean>;\n private readonly $hidden: WritableSignal<boolean>;\n\n constructor(config: DynamicFormFieldConfig) {\n this.id = config.id ?? config.name;\n this.width = config.width ?? 100;\n this.label = config.label ?? null;\n this.name = config.name;\n this.hint = config.hint ?? null;\n this.validators = config.validators ?? [];\n this.updateOn = config.updateOn ?? 'change';\n this.relations = config.relations ?? null;\n\n // Create a disabled Subject and Observable to change the state of the FormControl inside DynamicFormFieldComponent by subscribing to disabledChange\n this.disabled$ = new BehaviorSubject(config.disabled ?? false);\n this.disabledChange = this.disabled$.asObservable();\n\n this.$hidden = signal(config.hidden ?? false);\n }\n\n get disabled(): boolean {\n return this.disabled$.getValue();\n }\n set disabled(disable: boolean) {\n this.disabled$.next(disable);\n }\n\n get hidden(): boolean {\n return this.$hidden();\n }\n set hidden(hidden: boolean) {\n this.$hidden.set(hidden);\n }\n}\n","import { BehaviorSubject } from 'rxjs';\nimport { DynamicFormFieldConfig } from '../interfaces/dynamic-form-field-config.interface';\nimport { DynamicFormFieldModel } from './dynamic-form-field-model';\n\nexport interface DynamicFormFieldValueConfig<T> extends DynamicFormFieldConfig {\n /**\n * The value of the control.\n * This value will change when the control is used.\n * @optional\n */\n value?: T;\n /**\n * The default value of the control when initializing or resetting the control.\n * @optional\n */\n defaultValue?: T;\n /**\n * A function that gets called everytime the value of the control changes.\n * Passes the value of the control as parameter.\n * If you don't want to get an event on every keystroke without delay, use the ReactiveFormsModule `valueChanges` Observable\n * @optional\n */\n valueChanged?: (val: T | null) => any;\n}\n\n/**\n * Base class for a DynamicFormField with a value\n */\nexport abstract class DynamicFormFieldValueModel<T = unknown> extends DynamicFormFieldModel {\n public defaultValue: T | null;\n\n private _value$: BehaviorSubject<T | null>;\n private _valueChanged: ((val: T | null) => any) | undefined;\n\n constructor(config: DynamicFormFieldValueConfig<T>) {\n super(config);\n\n this.defaultValue = config.defaultValue ?? null;\n\n const val: T | null = config.value ?? null;\n this._value$ = new BehaviorSubject(val);\n this._valueChanged = config.valueChanged;\n }\n\n get value(): T | null {\n return this._value$.getValue();\n }\n set value(val: T | null) {\n this._value$.next(val);\n if (this._valueChanged) {\n this._valueChanged(val);\n }\n }\n}\n","import { isObservable, map, Observable, of } from 'rxjs';\nimport { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from './dynamic-form-field-value-model';\n\nexport type DynamicOptionList<T> = DynamicFormFieldOption<T>[] | Observable<DynamicFormFieldOption<T>[]>;\n\nexport type DynamicGroupedOptionList<T> = DynamicFormFieldOptionGroup<T>[] | Observable<DynamicFormFieldOptionGroup<T>[]>;\n\n/**\n * Interface for the objects inside a list of options of Dynamic FormField\n */\nexport interface DynamicFormFieldOption<T> {\n /** The text shown as label */\n label: string;\n /** Extra line of text shown as subtitle */\n subTitle?: string;\n /** The value the option holds */\n value: T;\n}\n\n/**\n * Interface for a group op options inside a Dynamic FormField (optgroup)\n */\nexport interface DynamicFormFieldOptionGroup<T> {\n name: string;\n options: DynamicFormFieldOption<T>[];\n}\n\n/**\n * Base interface for any DynamicFormFieldConfig with options (e.g. DynamicSelectConfig or DynamicAutocompleteConfig).\n */\nexport interface DynamicFormFieldOptionConfig<T> extends DynamicFormFieldValueConfig<T> {\n options?: DynamicOptionList<T>;\n groupedOptions?: DynamicGroupedOptionList<T>;\n}\n\n/**\n * Base class for any DynamicFormField with options (e.g. DynamicSelect or DynamicAutocomplete)\n */\nexport abstract class DynamicFormFieldOptionModel<T> extends DynamicFormFieldValueModel<T> {\n public options$!: Observable<DynamicFormFieldOption<T>[]>;\n public groupedOptions$!: Observable<DynamicFormFieldOptionGroup<T>[]>;\n\n private _options: DynamicFormFieldOption<T>[] = [];\n private _groupedOptions: DynamicFormFieldOptionGroup<T>[] = [];\n\n constructor(config: DynamicFormFieldOptionConfig<T>) {\n super(config);\n\n if (!config.options && !config.groupedOptions) {\n console.error(`No options or groupedOptions provided for ${this.name}`);\n }\n\n if (config.options) {\n this.options$ = this.setOptions(config.options);\n } else if (config.groupedOptions) {\n this.groupedOptions$ = this.setGroupedOptions(config.groupedOptions);\n }\n }\n\n private setOptions(options: DynamicOptionList<T>): Observable<DynamicFormFieldOption<T>[]> {\n if (Array.isArray(options)) {\n this._options = options;\n return of(this._options);\n }\n\n if (isObservable(options)) {\n return options.pipe(\n map((o) => {\n this._options = o;\n return this._options;\n })\n );\n }\n\n return of([]);\n }\n\n private setGroupedOptions(groupedOptions: DynamicGroupedOptionList<T>): Observable<DynamicFormFieldOptionGroup<T>[]> {\n if (Array.isArray(groupedOptions)) {\n this._groupedOptions = groupedOptions;\n return of(this._groupedOptions);\n }\n\n if (isObservable(groupedOptions)) {\n return groupedOptions.pipe(\n map((o) => {\n this._groupedOptions = o;\n return this._groupedOptions;\n })\n );\n }\n\n return of([]);\n }\n}\n","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_BUTTON_TOGGLES = 'button-toggles';\n\nexport interface DynamicButtonTogglesConfig extends Omit<DynamicFormFieldOptionConfig<string | number | null>, 'label'> {\n /** Whether to allow multiple options to be selected. Default is false */\n multiple?: boolean;\n /** Whether the toggle group is vertical. Default is false */\n vertical?: boolean;\n}\n\nexport class DynamicButtonToggles extends DynamicFormFieldOptionModel<string | number | null> {\n public multiple: boolean;\n public vertical: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_BUTTON_TOGGLES;\n\n constructor(config: DynamicButtonTogglesConfig) {\n super(config);\n\n this.multiple = config.multiple ?? false;\n this.vertical = config.vertical ?? false;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { UntypedFormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicButton } from './dynamic-button.model';\n\n@Component({\n standalone: true,\n imports: [MatButtonModule],\n selector: 'dynamic-button',\n templateUrl: './dynamic-button.component.html',\n styleUrl: './dynamic-button.component.scss'\n})\nexport class DynamicButtonComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicButton;\n @Input() group!: UntypedFormGroup;\n\n public onClick() {\n this.model.onClick();\n }\n}\n","<div class=\"dynamic-button-wrapper\">\n <button mat-button\n [id]=\"id\"\n [disabled]=\"model.disabled\"\n (click)=\"onClick()\">\n <span>{{model.label}}</span>\n </button>\n</div>","import { DynamicFormFieldModel } from '../../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldConfig } from '../../models/interfaces/dynamic-form-field-config.interface';\n\nexport const DYNAMIC_FORM_FIELD_BUTTON = 'button';\n\ntype OmittedProperties = 'hint' | 'validators' | 'updateOn';\n\nexport interface DynamicButtonConfig extends Omit<DynamicFormFieldConfig, OmittedProperties> {\n /**\n * Label shown inside the button\n */\n label: string;\n /**\n * Function called when the button is clicked.\n * Provides no parameters.\n * @returns\n */\n onClick: () => any;\n}\n\nexport class DynamicButton extends DynamicFormFieldModel {\n public label: string | null;\n public onClick: () => any;\n\n public readonly type = DYNAMIC_FORM_FIELD_BUTTON;\n\n constructor(config: DynamicButtonConfig) {\n super(config);\n\n this.label = config.label ?? null;\n this.onClick = config.onClick;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicCheckbox } from './dynamic-checkbox.model';\n\n@Component({\n selector: 'dynamic-checkbox',\n templateUrl: 'dynamic-checkbox.component.html',\n standalone: true,\n imports: [ReactiveFormsModule, MatCheckboxModule]\n})\nexport class DynamicCheckboxComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicCheckbox;\n @Input() group!: UntypedFormGroup;\n\n @Output() change: EventEmitter<MatCheckboxChange> = new EventEmitter();\n}\n","<ng-container [formGroup]=\"group\">\n <mat-checkbox [checked]=\"model.checked\"\n [formControlName]=\"model.name\"\n [indeterminate]=\"model.indeterminate\"\n [labelPosition]=\"model.labelPosition\"\n [name]=\"model.name\"\n [id]=\"id\"\n (change)=\"onChange($event)\">\n\n <span class=\"checkbox-label\">{{model.label}}</span>\n </mat-checkbox>\n</ng-container>","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_CHECKBOX = 'checkbox';\n\nexport interface DynamicCheckboxConfig extends DynamicFormFieldValueConfig<boolean> {\n labelPosition?: 'before' | 'after';\n indeterminate?: boolean;\n}\n\nexport class DynamicCheckbox extends DynamicFormFieldValueModel<boolean> {\n public labelPosition: 'before' | 'after';\n public indeterminate: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_CHECKBOX;\n\n constructor(config: DynamicCheckboxConfig) {\n super(config);\n\n this.value = config.value ?? false;\n\n this.labelPosition = config.labelPosition ?? 'after';\n this.indeterminate = config.indeterminate === true ? true : false;\n }\n\n get checked(): boolean {\n return this.value ?? false;\n }\n\n set checked(checked: boolean) {\n this.value = checked;\n }\n\n public toggle() {\n this.checked = !this.checked;\n }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldEvent } from '../../models/interfaces/dynamic-form-field-event.interface';\nimport { DynamicDatepicker } from './dynamic-datepicker.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatDatepickerModule],\n selector: 'dynamic-datepicker',\n templateUrl: './dynamic-datepicker.component.html',\n styleUrl: './dynamic-datepicker.component.scss'\n})\nexport class DynamicDatepickerComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicDatepicker;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<DynamicFormFieldEvent>();\n}\n","<mat-form-field [formGroup]=\"group\"\n [id]=\"model.id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <input matInput\n [min]=\"model.min\"\n [max]=\"model.max\"\n [matDatepicker]=\"picker\">\n\n <mat-hint *ngIf=\"model.hint\">{{model.hint}}</mat-hint>\n\n <mat-datepicker-toggle matIconSuffix\n [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker\n [startAt]=\"model.startAt\"\n [startView]=\"model.startView\"></mat-datepicker>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n\n</mat-form-field>","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_DATEPICKER = 'datepicker';\n\nexport type DynamicDatepickerControlValue = Date | object | string | null;\n\nexport interface DynamicDatepickerConfig extends DynamicFormFieldValueConfig<DynamicDatepickerControlValue> {\n /** Maximum date selectable in the datepicker */\n max?: DynamicDatepickerControlValue;\n /** Minimum date selectable in the datepicker */\n min?: DynamicDatepickerControlValue;\n /** The initial date visible inside the datepicker when opening the picker */\n startAt?: DynamicDatepickerControlValue;\n /** The view the picker is initializing when opening */\n startView?: 'month' | 'year' | 'multi-year';\n}\n\nexport class DynamicDatepicker extends DynamicFormFieldValueModel<DynamicDatepickerControlValue> {\n public max: DynamicDatepickerControlValue | null;\n public min: DynamicDatepickerControlValue | null;\n public startAt: DynamicDatepickerControlValue | null;\n public startView: 'month' | 'year' | 'multi-year';\n\n public readonly type = DYNAMIC_FORM_FIELD_DATEPICKER;\n\n constructor(config: DynamicDatepickerConfig) {\n super(config);\n\n this.max = config.max ?? null;\n this.min = config.min ?? null;\n this.startAt = config.startAt ?? null;\n this.startView = config.startView ?? 'month';\n }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldEvent } from '../../models/interfaces/dynamic-form-field-event.interface';\nimport { DynamicInput } from './dynamic-input.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule],\n selector: 'dynamic-input',\n templateUrl: './dynamic-input.component.html',\n styleUrl: './dynamic-input.component.scss'\n})\nexport class DynamicInputComponent extends DynamicFormFieldBase {\n @ViewChild(MatInput, { static: true }) input!: MatInput;\n\n @Input() model!: DynamicInput;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<DynamicFormFieldEvent>();\n\n get valueCount(): number {\n return this.input?.value ? this.input.value.length : 0;\n }\n\n get maxCountText(): string {\n return `${this.valueCount} / ${this.model.maxLength}`;\n }\n\n get showClear(): boolean {\n return !!this.control.value && !this.control.disabled && !this.model.showLoader;\n }\n\n public onChange(event: Event | DynamicFormFieldEvent): void {\n // Ignore the native HTML 5 change event\n if (event instanceof Event) {\n event.stopPropagation();\n }\n\n this.change.emit(event as DynamicFormFieldEvent);\n }\n}\n","<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <span matTextPrefix\n *ngIf=\"model.prefix\">{{model.prefix}}</span>\n\n <input matInput\n [type]=\"model.inputType\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.min]=\"model.min\"\n [attr.max]=\"model.max\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [pattern]=\"model.pattern\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\" />\n\n <button matSuffix\n mat-icon-button\n *ngIf=\"showClear\"\n (click)=\"resetControl()\">\n <mat-icon fontIcon=\"clear\"></mat-icon>\n </button>\n\n <div matSuffix\n *ngIf=\"model.showLoader()\"\n class=\"loaderIcon\">\n <mat-spinner diameter=\"16\"\n color=\"primary\"></mat-spinner>\n </div>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>","import { signal, WritableSignal } from '@angular/core';\nimport { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_INPUT = 'input';\n\nexport type HtmlInputType = 'text' | 'number' | 'tel' | 'email' | 'password' | 'date' | 'time' | 'color';\nexport type DynamicInputValue = string | number | Date | null;\n\nexport interface DynamicInputConfig extends DynamicFormFieldValueConfig<DynamicInputValue> {\n inputType?: HtmlInputType;\n placeholder?: string;\n max?: number;\n min?: number;\n maxLength?: number;\n minLength?: number;\n step?: number;\n pattern?: string | RegExp;\n autocomplete?: 'on' | 'off';\n prefix?: string;\n hideClearIcon?: boolean;\n showLoader?: WritableSignal<boolean>;\n}\n\nexport class DynamicInput extends DynamicFormFieldValueModel<DynamicInputValue> {\n public inputType: HtmlInputType;\n public placeholder: string;\n public max: number | null;\n public min: number | null;\n public maxLength: number | null;\n public minLength: number | null;\n public step: number | null;\n public pattern: string | RegExp;\n public autocomplete: 'on' | 'off';\n public prefix: string | null;\n public hideClearIcon: boolean;\n public showLoader: WritableSignal<boolean>;\n\n public readonly type = DYNAMIC_FORM_FIELD_INPUT;\n\n constructor(config: DynamicInputConfig) {\n super(config);\n\n this.inputType = config.inputType ?? 'text';\n this.placeholder = config.placeholder ?? config.label ?? '';\n this.max = config.max ?? null;\n this.min = config.min ?? null;\n this.maxLength = typeof config.maxLength === 'number' ? config.maxLength : null;\n this.minLength = typeof config.minLength === 'number' ? config.minLength : null;\n this.step = config.step ?? null;\n this.pattern = config.pattern ?? '';\n this.autocomplete = config.autocomplete ?? 'off';\n this.prefix = config.prefix ?? null;\n this.hideClearIcon = config.hideClearIcon ?? false;\n this.showLoader = config.showLoader ?? signal(false);\n }\n}\n","import { AsyncPipe, NgClass, NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatRadioChange, MatRadioModule } from '@angular/material/radio';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicRadioGroup } from './dynamic-radio-group.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, NgClass, ReactiveFormsModule, MatRadioModule, AsyncPipe],\n selector: 'dynamic-radio-group',\n templateUrl: './dynamic-radio-group.component.html',\n styleUrls: ['./dynamic-radio-group.component.scss']\n})\nexport class DymamicRadioGroupComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicRadioGroup;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<MatRadioChange>();\n}\n","<div class=\"dynamic-radio-group-wrapper\"\n [formGroup]=\"group\">\n <label *ngIf=\"model.label\">{{model.label}}</label>\n <mat-radio-group [formControlName]=\"model.name\"\n class=\"radio-group\"\n [ngClass]=\"{'inline': model.inline}\"\n (change)=\"onChange($event)\">\n @for(option of model.options$ | async; track option.value) {\n <mat-radio-button [value]=\"option.value\"\n [labelPosition]=\"model.labelPosition\">\n {{option.label}}\n </mat-radio-button>\n }\n </mat-radio-group>\n</div>","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_RADIO_GROUP = 'radio-group';\n\nexport interface DynamicRadioGroupConfig extends DynamicFormFieldOptionConfig<string | number | null> {\n /** Placement of the option label. Default is 'before' */\n labelPosition?: 'before' | 'after';\n /** Whether the options are shown inline (horizontally). Default is false */\n inline?: boolean;\n}\n\nexport class DynamicRadioGroup extends DynamicFormFieldOptionModel<string | number | null> {\n public labelPosition: 'before' | 'after';\n public inline: boolean;\n\n public readonly type: string = DYNAMIC_FORM_FIELD_RADIO_GROUP;\n\n constructor(config: DynamicRadioGroupConfig) {\n super(config);\n\n this.labelPosition = config.labelPosition ?? 'after';\n this.inline = config.inline ?? false;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicReadonly } from './dynamic-readonly.model';\n\n@Component({\n standalone: true,\n imports: [ReactiveFormsModule],\n selector: 'dynamic-readonly',\n templateUrl: './dynamic-readonly.component.html',\n styleUrls: ['./dynamic-readonly.component.scss']\n})\nexport class DynamicReadonlyComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicReadonly;\n @Input() group!: UntypedFormGroup;\n}\n","<div class=\"dynamic-form-field-readonly\"\n [formGroup]=\"group\"\n [id]=\"id\">\n <div class=\"label\">{{model.label}}</div>\n <span>{{model.value}}</span>\n</div>","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_READONLY = 'readonly';\nexport type DynamicReadonlyValue = string | number | null;\n\nexport interface DynamicReadonlyConfig\n extends Omit<DynamicFormFieldValueConfig<DynamicReadonlyValue>, 'validators' | 'relations' | 'updateOn'> {}\n\nexport class DynamicReadonly extends DynamicFormFieldValueModel<DynamicReadonlyValue> {\n public readonly type = DYNAMIC_FORM_FIELD_READONLY;\n\n constructor(config: DynamicReadonlyConfig) {\n super(config);\n }\n}\n","import { AsyncPipe, NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatOptionModule } from '@angular/material/core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicSelect } from './dynamic-select.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, MatFormFieldModule, ReactiveFormsModule, MatSelectModule, MatOptionModule, AsyncPipe, MatInputModule],\n selector: 'dynamic-select',\n templateUrl: './dynamic-select.component.html',\n styleUrls: ['./dynamic-select.component.scss']\n})\nexport class DynamicSelectComponent extends DynamicFormFieldBase {\n @Input() model!: DynamicSelect<string>;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<MatSelectChange>();\n}\n","<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label>{{model.label}}</mat-label>\n\n <!-- Template for select without grouped options -->\n <ng-container *ngIf=\"model.options$ | async as options\">\n <ng-container *ngIf=\"!model.native else nativeSelect\">\n <mat-select [formControlName]=\"model.name\"\n [multiple]=\"model.multiple\"\n (selectionChange)=\"onChange($event)\">\n @for(option of options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n }\n </mat-select>\n </ng-container>\n\n <ng-template #nativeSelect>\n <select matNativeControl\n (selectionchange)=\"onChange($event)\">\n @for(option of options; track option.value) {\n <option [value]=\"option.value\">\n {{option.label}}\n </option>\n }\n </select>\n </ng-template>\n </ng-container>\n\n <!-- Template for select with grouped options -->\n <ng-container *ngIf=\"model.groupedOptions$ | async as groupedOptions\">\n <ng-container *ngIf=\"!model.native else nativeSelectGrouped\">\n <mat-select [formControlName]=\"model.name\"\n (selectionChange)=\"onChange($event)\">\n @for(group of groupedOptions; track group.name) {\n <mat-optgroup [label]=\"group.name\">\n @for(option of group.options; track option.value) {\n <mat-option [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n }\n </mat-optgroup>\n }\n\n </mat-select>\n </ng-container>\n\n <ng-template #nativeSelectGrouped>\n <select matNativeControl\n (selectionchange)=\"onChange($event)\">\n @for(group of groupedOptions; track group.name) {=\n <optgroup [label]=\"group.name\">\n @for(option of group.options; track option.value) {\n <option [value]=\"option.value\">\n {{option.label}}\n </option>\n }\n </optgroup>\n }\n </select>\n </ng-template>\n </ng-container>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>","import { DynamicFormFieldOptionConfig, DynamicFormFieldOptionModel } from '../../models/classes/dynamic-form-field-option-model';\n\nexport const DYNAMIC_FORM_FIELD_SELECT = 'select';\n\nexport interface DynamicSelectConfig<T> extends DynamicFormFieldOptionConfig<T> {\n /**\n * Show the native dropdown instead of the Angular Material styled dropdown\n */\n native?: boolean;\n /**\n * Whether it is possible to select multiple options.\n * Default value is false\n */\n multiple?: boolean;\n}\n\nexport class DynamicSelect<T> extends DynamicFormFieldOptionModel<T> {\n public native: boolean;\n public multiple: boolean;\n\n public readonly type = DYNAMIC_FORM_FIELD_SELECT;\n\n constructor(config: DynamicSelectConfig<T>) {\n super(config);\n\n this.native = config.native ?? false;\n this.multiple = config.multiple ?? false;\n }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { DynamicFormFieldBase } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldEvent } from '../../models/interfaces/dynamic-form-field-event.interface';\nimport { DynamicTextarea } from './dynamic-textarea.model';\n\n@Component({\n standalone: true,\n imports: [NgIf, MatFormFieldModule, MatInputModule, ReactiveFormsModule],\n selector: 'dynamic-textarea',\n templateUrl: './dynamic-textarea.component.html',\n styles: ['mat-form-field {width: 100%;}']\n})\nexport class DynamicTextareaComponent extends DynamicFormFieldBase {\n @ViewChild(MatInput, { static: true }) textarea!: MatInput;\n\n @Input() model!: DynamicTextarea;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<DynamicFormFieldEvent>();\n\n get valueCount(): number {\n return this.textarea?.value ? this.textarea.value.length : 0;\n }\n\n get maxCountText(): string {\n return `${this.valueCount} / ${this.model.maxLength}`;\n }\n\n public onChange(event: Event | DynamicFormFieldEvent): void {\n // Ignore the native HTML 5 change event\n if (event instanceof Event) {\n event.stopPropagation();\n }\n\n this.change.emit(event as DynamicFormFieldEvent);\n }\n}\n","<mat-form-field [formGroup]=\"group\"\n [id]=\"id\"\n color=\"primary\">\n <mat-label *ngIf=\"model.label\">{{model.label}}</mat-label>\n\n <textarea matInput\n [cdkTextareaAutosize]=\"model.resize\"\n [cdkAutosizeMinRows]=\"model.rows\"\n [cdkAutosizeMaxRows]=\"model.resizeMaxRows\"\n [id]=\"id\"\n [formControlName]=\"model.name\"\n [placeholder]=\"model.placeholder\"\n [attr.minLength]=\"model.minLength\"\n [attr.maxLength]=\"model.maxLength\"\n [rows]=\"model.rows\"\n [autocomplete]=\"model.autocomplete\"\n (change)=\"onChange($event)\">\n </textarea>\n\n <mat-hint *ngIf=\"model.hint\"\n align=\"start\">{{model.hint}}</mat-hint>\n\n <mat-hint *ngIf=\"model.maxLength\"\n align=\"end\">{{maxCountText}}</mat-hint>\n\n @for(validator of model.validators; track validator.name) {\n <ng-container ngProjectAs=\"mat-error\">\n <mat-error *ngIf=\"hasError(validator.name)\">{{validator.message}}</mat-error>\n </ng-container>\n }\n</mat-form-field>","import { DynamicFormFieldValueConfig, DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\n\nexport const DYNAMIC_FORM_FIELD_TEXTAREA = 'textarea';\nexport type DynamicTextareaValue = string | null;\n\nexport interface DynamicTextareaConfig extends DynamicFormFieldValueConfig<DynamicTextareaValue> {\n /**\n * Placeholder text inside the textarea.\n * Only visible when the field is empty and in focus.\n */\n placeholder?: string;\n /**\n * Minimum amount of characters needed in the textarea\n */\n minLength?: number;\n /**\n * Maximum amount of characters it is possible to fill in the textarea\n */\n maxLength?: number;\n /**\n * Enables or disabled the browser natie autocomplete bubble when the control is in focus.\n * Default value is 'off'\n */\n autocomplete?: 'on' | 'off';\n /**\n * Amount of rows the textarea initializes on\n */\n rows?: number;\n /**\n * Whether the textare automatically resizes to fit its content\n */\n resize?: boolean;\n /**\n * Maximum amount of rows the textarea show resize to\n */\n resizeMaxRows?: number;\n}\n\nexport class DynamicTextarea extends DynamicFormFieldValueModel<DynamicTextareaValue> {\n public placeholder: string;\n public minLength: number | null;\n public maxLength: number | null;\n public autocomplete: 'on' | 'off';\n public rows: number;\n public resize: boolean;\n public resizeMaxRows: number | null;\n\n public readonly type = DYNAMIC_FORM_FIELD_TEXTAREA;\n\n constructor(config: DynamicTextareaConfig) {\n super(config);\n\n this.placeholder = config.placeholder ?? '';\n this.minLength = config.minLength ?? 0;\n this.maxLength = config.minLength ?? null;\n this.autocomplete = config.autocomplete ?? 'off';\n this.rows = config.rows ?? 3;\n this.resize = config.resize ?? true;\n this.resizeMaxRows = config.resizeMaxRows ?? null;\n }\n}\n","import { Validators } from '@angular/forms';\nimport { DynamicFormValidator } from '../interfaces/dynamic-form-validator.interface';\n\nexport class DynamicFormValidators {\n /**\n * Default email validator, the value of the control has to be a valid email address\n * @param msg\n */\n static email(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Geen geldig emailadres';\n return { name: 'email', validator: Validators.email, message };\n }\n\n /**\n * Default min validator, the value has to be greater or equal than the the provided number\n * @param min number\n * @param msg\n */\n static min(min: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Minimum is ${min}`;\n return { name: 'min', validator: Validators.min(min), message };\n }\n\n /**\n * Default max validator, the value has to be less or equal than the the provided number\n * @param max number\n * @param msg\n */\n static max(max: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Maximum is ${max}`;\n return { name: 'max', validator: Validators.max(max), message };\n }\n\n /**\n * Default minLength validator, the value has to contain a minimum amount of characters\n * @param min number\n * @param msg\n */\n static minLength(min: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Minimaal ${min} tekens`;\n return { name: 'minLength', validator: Validators.min(min), message };\n }\n\n /**\n * Default maxLength validator, the value has to contain a maximum amount of characters\n * @param max number\n * @param msg\n */\n static maxLength(max: number, msg?: string): DynamicFormValidator {\n const message: string = msg ?? `Maximaal ${max} tekens`;\n return { name: 'maxLength', validator: Validators.max(max), message };\n }\n\n /**\n * Default pattern validator, the value of the control has to match the provided pattern\n * @param pattern: string | RegExp\n * @param msg\n */\n static pattern(pattern: string | RegExp, msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Geen geldige invoer';\n return { name: 'pattern', validator: Validators.pattern(pattern), message };\n }\n\n /**\n * Default required validator, the control must contain a value\n * @param msg\n */\n static required(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Dit veld is verplicht';\n\n return { name: 'required', validator: Validators.required, message };\n }\n\n /**\n * Default requiredTrue validator, the value of the control has to be true\n * @param msg\n */\n static requiredTrue(msg?: string): DynamicFormValidator {\n const message: string = msg ?? 'Dit veld is verplicht';\n return { name: 'requiredTrue', validator: Validators.requiredTrue, message };\n }\n}\n","export enum RelationActionType {\n DISABLED = 'DISABLED',\n ENABLED = 'ENABLED',\n HIDDEN = 'HIDDEN',\n VISIBLE = 'VISIBLE',\n REQUIRED = 'REQUIRED',\n OPTIONAL = 'OPTIONAL'\n}\n\nexport enum RelationOperator {\n AND = 'AND',\n OR = 'OR'\n}\n\nexport interface RelationCondition {\n /** Name of a field in the same form this field is depended on */\n fieldName?: string;\n /**\n * Path to the related field.\n * This must be used when working with nested FormGroups and you want to relate a field in a different group.\n */\n path?: string;\n /** Method that returns true when the condition is met. The passed parameter is the value of the depended field */\n value: (val: any) => boolean;\n}\n\nexport interface DynamicFormFieldRelation {\n actionType: RelationActionType;\n conditions: RelationCondition[];\n operator?: RelationOperator;\n}\n","import { Injector } from '@angular/core';\nimport { UntypedFormControl } from '@angular/forms';\nimport { DynamicFormValidationsService } from '../../services/dynamic-validations.service';\nimport { DynamicFormFieldModel } from '../classes/dynamic-form-field-model';\nimport { DynamicFormValidators } from '../classes/dynamic-form-validators';\nimport { RelationActionType } from '../interfaces/dynamic-form-field-relation.interface';\nimport { DynamicFormValidator } from '../interfaces/dynamic-form-validator.interface';\n\nexport interface DynamicRelationAction {\n type: RelationActionType;\n reversedType?: string;\n change(hasMatch: boolean, model: DynamicFormFieldModel, control: UntypedFormControl, injector: Injector): void;\n}\n\n/**\n * Relation action to disable/enable a form control.\n */\nconst DISABLE_ACTION: DynamicRelationAction = {\n type: RelationActionType.DISABLED,\n reversedType: RelationActionType.ENABLED,\n change(hasMatch, model) {\n model.disabled = hasMatch;\n }\n};\n\n/**\n * Relation action to toggle the visibility of a form control\n */\nconst HIDDEN_ACTION: DynamicRelationAction = {\n type: RelationActionType.HIDDEN,\n reversedType: RelationActionType.VISIBLE,\n change(hasMatch, model) {\n model.hidden = hasMatch;\n }\n};\n\n/**\n * Relation action to add or remove the required validator to a form control\n */\nconst REQUIRED_ACTION: DynamicRelationAction = {\n type: RelationActionType.REQUIRED,\n reversedType: RelationActionType.OPTIONAL,\n change(hasMatch, model, control, injector) {\n const hasRequiredValidation = !!model.validators.find((f) => f.name === 'required');\n let validators: DynamicFormValidator[];\n\n if (hasMatch) {\n // If the model already contains the required validator, return the model validators.\n // Otherwise, add the required validator\n validators = hasRequiredValidation ? model.validators : [...model.validators, DynamicFormValidators.required()];\n } else {\n validators = model.validators.filter((f) => f.name !== 'required');\n }\n\n injector.get(DynamicFormValidationsService).updateValidators(validators, control);\n }\n};\n\n/**\n * Export all Relation actions so the DynamicFormService can easily access all Relation actions.\n * This way if there are any new actions, all you have to do is add them here.\n * TODO: This can be potentially be expanded towords an InjectionToken to provide the possibility for custom relationactions.\n */\nexport const RELATION_ACTIONS: DynamicRelationAction[] = [DISABLE_ACTION, HIDDEN_ACTION, REQUIRED_ACTION];\n","import { inject, Injectable, Injector } from '@angular/core';\nimport { FormControl, FormGroup, UntypedFormControl } from '@angular/forms';\nimport { distinctUntilChanged, startWith, Subscription } from 'rxjs';\nimport { DynamicFormFieldModel } from '../models/classes/dynamic-form-field-model';\nimport { DynamicRelationAction, RELATION_ACTIONS } from '../models/constants/dynamic-relations.const';\nimport { DynamicFormFieldRelation, RelationCondition, RelationOperator } from '../models/interfaces/dynamic-form-field-relation.interface';\nimport { RelatedFormControls } from '../models/types/related-form-controls.type';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DynamicFormRelationsService {\n private _injector = inject(Injector);\n\n /**\n * Get an object with all FormField the provided model has a relation with\n * @param model\n * @param group\n * @returns\n */\n public findRelatedFormField(model: DynamicFormFieldModel, group: FormGroup): RelatedFormControls {\n const conditionReducer = (controls: RelatedFormControls, condition: RelationCondition) => {\n const fieldName = condition.path ?? condition.fieldName!;\n // Get the control using the provided path or fieldName\n const control = condition.path\n ? (group.root.get(condition.path) as UntypedFormControl)\n : (group.get(condition.fieldName!) as UntypedFormControl);\n\n if (!control) {\n console.warn(`No related form control with the name ${fieldName} found`);\n return controls;\n }\n\n controls[fieldName] = control;\n return controls;\n };\n\n const relationsReducer = (controls: RelatedFormControls, relation: DynamicFormFieldRelation) => {\n return relation.conditions.reduce(conditionReducer, controls);\n };\n\n return model.relations!.reduce(relationsReducer, {});\n }\n\n public getRelationSubscriptions(\n relatedFormControls: RelatedFormControls,\n model: DynamicFormFieldModel,\n control: FormControl\n ): Subscription[] {\n const subs: Subscription[] = [];\n\n // Subscribe to value changes of all FormControls, provide the current value inside the startWith\n Object.values(relatedFormControls).forEach((relatedControl) => {\n subs.push(\n relatedControl.valueChanges.pipe(startWith(relatedControl.value), distinctUntilChanged()).subscribe(() => {\n model.relations!.forEach((relation) => {\n // Find the RelationAction object based on the actionType passed inside the DynamicFormConfig\n const action = RELATION_ACTIONS.find(\n (action) => relation.actionType === action.type || relation.actionType === action.reversedType\n );\n\n if (action) {\n const shouldTrigger = this.checkRelationCondition(relation, relatedFormControls, action);\n\n action.change(shouldTrigger, model, control, this._injector);\n }\n });\n })\n );\n });\n\n return subs;\n }\n\n /**\n * Check the conditions inside the relations\n * @param relation\n * @param relatedControl\n * @param action\n * @returns\n */\n private checkRelationCondition(\n relation: DynamicFormFieldRelation,\n relatedControls: RelatedFormControls,\n action: DynamicRelationAction\n ): boolean {\n // Default operator is AND, meaning all conditions should return true before the provided action is triggered.\n // In the case of a reversed type, the return value whould be false.\n const operator = relation.operator ?? RelationOperator.AND;\n\n // Use a reducer to map all conditions to a single boolean value to decide if we want to trigger the provided action type\n const reducer = (isMatch: boolean, condition: RelationCondition, index: number): boolean => {\n // Find the FormControl of the related field\n let relatedControl: UntypedFormControl | undefined;\n\n for (const [fieldName, control] of Object.entries(relatedControls)) {\n if (fieldName === (condition.path ?? condition.fieldName)) {\n relatedControl = control;\n break;\n }\n }\n\n if (!relatedControl) return false;\n\n // Using the 'normal' type should return true when the condition matches\n if (relation.actionType === action.type) {\n // Shortcut to false when a previous condition check was resolved as false in case of the AND operator\n if (index > 0 && operator === RelationOperator.AND && !isMatch) return false;\n\n // Shortcut to true when a previous condition check was resolved as true in case of the OR operator\n if (index > 0 && operator === RelationOperator.OR && isMatch) return true;\n\n return condition.value(relatedControl.value);\n }\n\n // Using the reversed type should return false when the condition matches, because we want to the opposite of the configured change Function\n if (relation.actionType === action.reversedType) {\n // Shortcut to true when a previous condition check was resolved as true\n if (index > 0 && operator === RelationOperator.AND && isMatch) return true;\n\n // Shortcut to false when a previous condition check was resolved as false\n if (index > 0 && operator === RelationOperator.OR && !isMatch) return false;\n\n return !condition.value(relatedControl.value);\n }\n\n return false;\n };\n\n return relation.conditions.reduce(reducer, false);\n }\n}\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n Type,\n ViewChild,\n ViewContainerRef\n} from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormControl, UntypedFormGroup } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { DynamicButtonTogglesComponent } from '../../controls/button-toggles/dynamic-button-toggles.component';\nimport { DYNAMIC_FORM_FIELD_BUTTON_TOGGLES } from '../../controls/button-toggles/dynamic-button-toggles.model';\nimport { DynamicButtonComponent } from '../../controls/button/dynamic-button.component';\nimport { DYNAMIC_FORM_FIELD_BUTTON } from '../../controls/button/dynamic-button.model';\nimport { DynamicCheckboxComponent } from '../../controls/checkbox/dynamic-checkbox.component';\nimport { DYNAMIC_FORM_FIELD_CHECKBOX } from '../../controls/checkbox/dynamic-checkbox.model';\nimport { DynamicDatepickerComponent } from '../../controls/datepicker/dynamic-datepicker.component';\nimport { DYNAMIC_FORM_FIELD_DATEPICKER } from '../../controls/datepicker/dynamic-datepicker.model';\nimport { DynamicInputComponent } from '../../controls/input/dynamic-input.component';\nimport { DYNAMIC_FORM_FIELD_INPUT } from '../../controls/input/dynamic-input.model';\nimport { DymamicRadioGroupComponent } from '../../controls/radio-group/dynamic-radio-group.component';\nimport { DYNAMIC_FORM_FIELD_RADIO_GROUP } from '../../controls/radio-group/dynamic-radio-group.model';\nimport { DynamicReadonlyComponent } from '../../controls/readonly/dynamic-readonly.component';\nimport { DYNAMIC_FORM_FIELD_READONLY } from '../../controls/readonly/dynamic-readonly.model';\nimport { DynamicSelectComponent } from '../../controls/select/dynamic-select.component';\nimport { DYNAMIC_FORM_FIELD_SELECT } from '../../controls/select/dynamic-select.model';\nimport { DynamicTextareaComponent } from '../../controls/textarea/dynamic-textarea.component';\nimport { DYNAMIC_FORM_FIELD_TEXTAREA } from '../../controls/textarea/dynamic-textarea.model';\nimport { DynamicFormField } from '../../models/classes/dynamic-form-field-base';\nimport { DynamicFormFieldModel } from '../../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldValueModel } from '../../models/classes/dynamic-form-field-value-model';\nimport { DynamicFormFieldEvent, DynamicFormFieldEventType } from '../../models/interfaces/dynamic-form-field-event.interface';\nimport { DynamicFormRelationsService } from '../../services/dynamic-form-relations.service';\nimport { DynamicFormService } from '../../services/dynamic-form.service';\n\n@Component({\n standalone: true,\n imports: [NgClass, ReactiveFormsModule],\n selector: 'dynamic-form-field',\n templateUrl: 'dynamic-form-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DynamicFormFieldComponent implements OnInit, OnDestroy {\n @ViewChild('componentViewContainer', { read: ViewContainerRef, static: true }) componentViewContainer!: ViewContainerRef;\n\n @Input() model!: DynamicFormFieldModel;\n @Input() group!: UntypedFormGroup;\n\n @Output() change = new EventEmitter<DynamicFormFieldEvent>();\n\n private readonly dynamicFormService = inject(DynamicFormService);\n private readonly relationService = inject(DynamicFormRelationsService);\n private readonly cdRef = inject(ChangeDetectorRef);\n\n private _control!: UntypedFormControl;\n private _subs = new Subscription();\n\n /** Get the instance of a control component using the injected custom method or local method */\n private get componentType(): Type<DynamicFormField> | null {\n return this.dynamicFormService.getCustomControlComponentType(this.model) || this.getControlComponentType();\n }\n\n ngOnInit(): void {\n if (this.group) {\n this._control = this.group.get(this.model.name) as UntypedFormControl;\n\n this.createFormControlComponent();\n this.setSubscriptions();\n }\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Finds the instance of a control component by type\n * @returns\n */\n private getControlComponentType(): Type<DynamicFormField> | null {\n switch (this.model.type) {\n case DYNAMIC_FORM_FIELD_BUTTON:\n return DynamicButtonComponent;\n case DYNAMIC_FORM_FIELD_BUTTON_TOGGLES:\n return DynamicButtonTogglesComponent;\n case DYNAMIC_FORM_FIELD_CHECKBOX:\n return DynamicCheckboxComponent;\n case DYNAMIC_FORM_FIELD_DATEPICKER:\n return DynamicDatepickerComponent;\n case DYNAMIC_FORM_FIELD_INPUT:\n return DynamicInputComponent;\n case DYNAMIC_FORM_FIELD_RADIO_GROUP:\n return DymamicRadioGroupComponent;\n case DYNAMIC_FORM_FIELD_READONLY:\n return DynamicReadonlyComponent;\n case DYNAMIC_FORM_FIELD_SELECT:\n return DynamicSelectComponent;\n case DYNAMIC_FORM_FIELD_TEXTAREA:\n return DynamicTextareaComponent;\n default:\n console.warn(\n `Model of type 'dynamic-${this.model.type}' is not implemented yet. Add this type to dynamic-form-field.component.ts to add support`\n );\n return null;\n }\n }\n\n private createFormControlComponent(): void {\n const component = this.componentType;\n\n if (component != null) {\n let componentRef = this.componentViewContainer.createComponent(component);\n\n const componentInstance = componentRef.instance;\n\n this._subs.add(componentInstance.change?.subscribe((event) => this.onChange(event)));\n\n componentInstance.group = this.group;\n componentInstance.model = this.model;\n }\n }\n\n /**\n * Setup all necessary subscriptions of the FormControl\n */\n private setSubscriptions(): void {\n const model = this.model as DynamicFormFieldModel;\n\n // Subscribe to the value change inside the control to change the value inside the model as well\n this._subs.add(this._control.valueChanges.subscribe((value) => this.onValueChange(value)));\n\n // Subscribe to the disabled change inside the model to change the disabled state of the FormControl\n this._subs.add(model.disabledChange.subscribe((disabled) => this.onDisabledChange(disabled)));\n\n // Setup subscriptions for any possible relation\n if (this.model.relations?.length) {\n this.setUpRelations();\n }\n }\n\n /**\n * Set up all relations of the current model\n */\n private setUpRelations(): void {\n // Array of all FormControls the current model has a relation to\n const relatedFormControls = this.relationService.findRelatedFormField(this.model, this.group);\n\n const subs = this.relationService.getRelationSubscriptions(relatedFormControls, this.model, this._control);\n\n // Add all relations as subscription to the main Subscription object\n subs.forEach((sub) => this._subs.add(sub));\n }\n\n /**\n * Fired when the value changes of the control and updates the value inside the model\n * @param value\n */\n private onValueChange(value: unknown): void {\n if (this.model instanceof DynamicFormFieldValueModel && this.model.value !== value) {\n this.model.value = value;\n }\n }\n\n /**\n * Enables/disabled the control based on the provided parameter.\n * Is fired when disabled state is changed inside the model and should not be directly used outside this component.\n * @param disabled\n */\n private onDisabledChange(disabled: boolean): void {\n disabled ? this._control.disable() : this._control.enable();\n\n this.cdRef.markForCheck();\n }\n\n private onChange(ev: unknown): void {\n this.change.emit(this.createDynamicFormEvent(ev, 'change'));\n }\n\n private createDynamicFormEvent(event: unknown, type: DynamicFormFieldEventType): DynamicFormFieldEvent {\n return { event, type, control: this._control, form: this.group, model: this.model };\n }\n}\n","<div [formGroup]=\"group\"\n [ngClass]=\"['dynamic-form-field-container', 'dynamic-form-field-' + model.type]\">\n <ng-container #componentViewContainer></ng-container>\n</div>","import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { DynamicFormFieldModel } from '../../models/classes/dynamic-form-field-model';\nimport { DynamicFormFieldEvent } from '../../models/interfaces/dynamic-form-field-event.interface';\nimport { DynamicFormConfig } from '../../models/types/dynamic-form-config.type';\nimport { DynamicFormService } from '../../services/dynamic-form.service';\nimport { DynamicFormFieldComponent } from '../dynamic-form-field/dynamic-form-field.component';\n\n@Component({\n standalone: true,\n imports: [NgClass, DynamicFormFieldComponent, ReactiveFormsModule],\n selector: 'dynamic-form',\n templateUrl: 'dynamic-form.component.html',\n styleUrls: ['./dynamic-form.component.scss'],\n providers: [DynamicFormService],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DynamicFormComponent {\n @Input({ required: true }) group!: UntypedFormGroup;\n @Input({ required: true }) formConfig!: DynamicFormConfig;\n\n @Output() change: EventEmitter<DynamicFormFieldEvent> = new EventEmitter();\n\n /**\n * Get the formConfig as flat array.\n */\n public get flatFormConfig(): DynamicFormFieldModel[] {\n return this.formConfig.reduce((acc, curr) => acc.concat(curr), []);\n }\n\n /**\n * Get the current value of the form.\n * @param includeDisabledFields Include the disabled fields of the form, is enabled by default\n */\n public getFormValue<T = unknown>(includeDisabledFields = true): T {\n const formValue = includeDisabledFields ? this.group.getRawValue() : this.group.value;\n\n return formValue;\n }\n\n /**\n * Provides an Observable to listen to changes of a specific field in the form.\n *\n * @param name Name of the field\n * @returns Observable<unknown>\n */\n public onControlChange(name: string): Observable<unknown> {\n const field = this.group.get(name);\n\n if (!field) {\n throw new Error(`Cannot find a field with the name ${name} in the FormGroup`);\n }\n\n return field.valueChanges;\n }\n\n public onChange(event: DynamicFormFieldEvent) {\n this.change.emit(event);\n }\n}\n","@for(row of formConfig; track $index) {\n<div class=\"dynamic-form-row\">\n @for(field of row; track field.id) {\n <dynamic-form-field class=\"dynamic-form-field\"\n [id]=\"field.id\"\n [hidden]=\"field.hidden\"\n [ngClass]=\"[field.type, 'form-field-width-' + field.width]\"\n [group]=\"group\"\n [model]=\"field\"\n (change)=\"onChange($event)\">\n </dynamic-form-field>\n }\n</div>\n}","/*\n * Public API Surface of ngx-dynamic-form\n */\nexport * from './lib/components/dynamic-form/dynamic-form.component';\n\nexport * from './lib/controls/controls';\nexport * from './lib/models';\n\nexport * from './lib/services/dynamic-form.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.DynamicFormValidationsService","i2","i1","i4","i3","i5"],"mappings":"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"}
|
|
@@ -7,4 +7,9 @@ export interface DynamicRelationAction {
|
|
|
7
7
|
reversedType?: string;
|
|
8
8
|
change(hasMatch: boolean, model: DynamicFormFieldModel, control: UntypedFormControl, injector: Injector): void;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Export all Relation actions so the DynamicFormService can easily access all Relation actions.
|
|
12
|
+
* This way if there are any new actions, all you have to do is add them here.
|
|
13
|
+
* TODO: This can be potentially be expanded towords an InjectionToken to provide the possibility for custom relationactions.
|
|
14
|
+
*/
|
|
10
15
|
export declare const RELATION_ACTIONS: DynamicRelationAction[];
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@olafvv/ngx-dynamic-form",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@angular/common": "^
|
|
6
|
-
"@angular/core": "^
|
|
7
|
-
"@angular/forms": "^
|
|
8
|
-
"@angular/material": "^
|
|
5
|
+
"@angular/common": "^18.2.12",
|
|
6
|
+
"@angular/core": "^18.2.12",
|
|
7
|
+
"@angular/forms": "^18.2.12",
|
|
8
|
+
"@angular/material": "^18.2.14",
|
|
9
9
|
"rxjs": "^7.5.0"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|