@bsachref/ng-form
Version:
A dynamic form component for Angular using PrimeNG or Angular Material
1 lines • 51.5 kB
Source Map (JSON)
{"version":3,"file":"bsachref-ng-form.mjs","sources":["../../../ngForm/src/app/validation-messages/validation-messages.component.ts","../../../ngForm/src/app/validation-messages/validation-messages.component.html","../../../ngForm/src/app/base.component.ts","../../../ngForm/src/app/default-forms/default-forms.component.ts","../../../ngForm/src/app/default-forms/default-forms.component.html","../../../ngForm/src/app/material-form/material-form.component.ts","../../../ngForm/src/app/material-form/material-form.component.html","../../../ngForm/src/app/prime-form/prime-form.component.ts","../../../ngForm/src/app/prime-form/prime-form.component.html","../../../ngForm/src/bsachref-ng-form.ts"],"sourcesContent":["import { Component, Input } from '@angular/core';\nimport { AbstractControl, ValidationErrors } from '@angular/forms';\nimport { FormControlConfig } from '../formControlConfig';\n\n@Component({\n selector: 'validation-messages',\n standalone: true,\n imports: [],\n templateUrl: './validation-messages.component.html',\n})\nexport class ValidationMessagesComponent {\n @Input() control!: AbstractControl | null; // The form control to validate\n @Input() controlName!: string; // The name of the control (for displaying in messages)\n @Input() config!: FormControlConfig; // The configuration for the control\n\n getValidatorValue(validatorName: keyof ValidationErrors, key: string): any {\n return this.control?.errors?.[validatorName]?.[key];\n }\n\n getCustomErrorMessage(): string | null {\n if (this.control?.errors?.['custom']) {\n return this.control.errors['custom'].message ?? 'Invalid input';\n }\n return null;\n }\n}\n","@if (control?.invalid && control?.touched) {\n <section class=\"error-messages\" style=\"color: red\">\n @if (control?.errors?.[\"required\"]) {\n <small>{{ controlName }} is required</small>\n }\n @if (control?.errors?.[\"minlength\"]) {\n <small\n >Minimum length:\n {{ getValidatorValue(\"minlength\", \"requiredLength\") }}</small\n >\n }\n @if (control?.errors?.[\"maxlength\"]) {\n <small\n >Maximum length:\n {{ getValidatorValue(\"maxlength\", \"requiredLength\") }}</small\n >\n }\n @if (control?.errors?.[\"pattern\"]) {\n <small>Invalid format</small>\n }\n @if (control?.errors?.[\"email\"]) {\n <small>Invalid email address</small>\n }\n @if (control?.errors?.[\"min\"]) {\n <small\n >Value must be at least {{ getValidatorValue(\"min\", \"min\") }}</small\n >\n }\n @if (control?.errors?.[\"max\"]) {\n <small>Value must not exceed {{ getValidatorValue(\"max\", \"max\") }}</small>\n }\n @if (control?.errors?.[\"custom\"]) {\n <small>{{ getCustomErrorMessage() }}</small>\n }\n </section>\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n input,\n output,\n} from '@angular/core';\nimport {\n ReactiveFormsModule,\n FormsModule,\n FormGroup,\n FormBuilder,\n ValidatorFn,\n Validators,\n AbstractControl,\n} from '@angular/forms';\nimport { BehaviorSubject } from 'rxjs';\nimport { ValidationMessagesComponent } from './validation-messages/validation-messages.component';\nimport { FormControlConfig } from '../public-api';\n\n@Component({\n selector: 'base-forms',\n standalone: true,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n ValidationMessagesComponent,\n ],\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseFormsComponent {\n formName = input.required<string>();\n controls = input.required<FormControlConfig[]>();\n formSubmit = output<Record<string, any>>();\n\n form!: FormGroup;\n protected formChanges$ = new BehaviorSubject<boolean>(false);\n\n constructor(\n protected fb: FormBuilder,\n protected cdr: ChangeDetectorRef,\n ) {}\n\n ngOnInit(): void {\n this.initializeForm();\n }\n\n protected initializeForm(): void {\n const formControls: { [key: string]: any } = {};\n\n this.controls().forEach((control) => {\n formControls[control.name] = [\n control.value ?? '',\n this.getValidators(control),\n ];\n });\n\n this.form = this.fb.group(formControls);\n\n this.controls().forEach((control) => {\n const formControl = this.form.get(control.name);\n if (formControl) {\n formControl.valueChanges.subscribe((value) => {\n // Only update validators if the value actually changes\n if (formControl.value !== value) {\n this.updateValidators(formControl, value);\n }\n });\n }\n });\n\n this.formChanges$.subscribe(() => this.cdr.markForCheck());\n }\n\n protected getValidators(control: FormControlConfig): ValidatorFn[] {\n const validators: ValidatorFn[] = [];\n\n if (control.validators) {\n control.validators.forEach((validator) => {\n if (validator.required) validators.push(Validators.required);\n if (validator.minlength)\n validators.push(Validators.minLength(validator.minlength));\n if (validator.maxlength)\n validators.push(Validators.maxLength(validator.maxlength));\n if (validator.pattern)\n validators.push(Validators.pattern(validator.pattern));\n if (validator.email) validators.push(Validators.email);\n if (validator.custom) validators.push(validator.custom);\n });\n }\n\n return validators;\n }\n\n protected updateValidators(control: AbstractControl, value: any): void {\n const requiresValidation = this.shouldRequireValidation(value);\n\n // Check if the validators need to be updated\n const hasRequiredValidator = control.hasValidator(Validators.required);\n\n if (requiresValidation && !hasRequiredValidator) {\n control.addValidators(Validators.required);\n control.updateValueAndValidity();\n } else if (!requiresValidation && hasRequiredValidator) {\n control.removeValidators(Validators.required);\n control.updateValueAndValidity();\n }\n\n this.formChanges$.next(true);\n }\n\n protected shouldRequireValidation(value: any): boolean {\n return value !== null && value !== '';\n }\n\n onSubmit(): void {\n this.form.markAllAsTouched();\n this.form.markAsDirty();\n this.form.updateValueAndValidity();\n\n if (this.form.valid) {\n this.formSubmit.emit(this.form.value);\n this.form.reset();\n } else {\n console.error('Form Invalid');\n }\n\n this.formChanges$.next(true);\n }\n}","/**\n * @component DefaultFormsComponent\n * @description\n * The `DefaultFormsComponent` is an Angular standalone component that provides a dynamic form generation\n * based on the provided configuration. It uses reactive forms to handle form controls and their validations.\n * The component is designed to be highly configurable and supports various types of form validators.\n *\n * @selector default-forms\n * @standalone true\n * @imports\n * - ReactiveFormsModule\n * - CommonModule\n * - FormsModule\n * - ValidationMessagesComponent\n * @templateUrl ./default-forms.component.html\n * @styleUrl ./default-forms.component.css\n * @changeDetection ChangeDetectionStrategy.OnPush\n *\n * @input\n * - `formName: string` - The name of the form.\n * - `controls: FormControlConfig[]` - An array of form control configurations.\n *\n * @output\n * - `formSubmit: EventEmitter<Record<string, any>>` - Emits the form value when the form is submitted.\n *\n * @class DefaultFormsComponent\n * @implements OnInit\n *\n * @property {string} formName - The name of the form.\n * @property {FormControlConfig[]} controls - The configuration for the form controls.\n * @property {EventEmitter<Record<string, any>>} formSubmit - Event emitter for form submission.\n * @property {FormGroup} form - The reactive form group instance.\n * @property {BehaviorSubject<boolean>} formChanges$ - A subject to track form changes.\n *\n * @constructor\n * @param {FormBuilder} fb - Angular's FormBuilder service to create form controls.\n * @param {ChangeDetectorRef} cdr - Angular's ChangeDetectorRef service to manually trigger change detection.\n *\n * @method ngOnInit\n * @description Lifecycle hook that is called after the component's view has been initialized. It initializes the form.\n *\n * @method initializeForm\n * @description Initializes the form by creating form controls based on the provided configuration and sets up value change subscriptions.\n *\n * @method getValidators\n * @param {FormControlConfig} control - The configuration for a form control.\n * @returns {ValidatorFn[]} An array of validators for the form control.\n * @description Generates an array of validators based on the provided control configuration.\n *\n * @method updateValidators\n * @param {AbstractControl} control - The form control to update validators for.\n * @param {any} value - The current value of the form control.\n * @description Updates the validators for a form control based on its current value.\n *\n * @method shouldRequireValidation\n * @param {any} value - The value to check for validation requirement.\n * @returns {boolean} Whether the value requires validation.\n * @description Determines if a value should require validation.\n *\n * @method onSubmit\n * @description Handles the form submission. Marks the form as touched and dirty, validates the form, emits the form value if valid, and resets the form.\n */\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { ValidationMessagesComponent } from '../validation-messages/validation-messages.component';\nimport { BaseFormsComponent } from '../base.component';\n\n@Component({\n selector: 'default-forms',\n standalone: true,\n imports: [\n BaseFormsComponent,\n ReactiveFormsModule,\n CommonModule,\n FormsModule,\n ValidationMessagesComponent,\n ],\n templateUrl: './default-forms.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DefaultFormsComponent extends BaseFormsComponent {}\n","<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"default\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.label) {\n <label\n [attr.for]=\"control.name\"\n [ngClass]=\"control.labelClass\"\n [ngStyle]=\"control.labelStyle\"\n >\n {{ control.label }}\n </label>\n }\n\n @if (control.type === \"input\") {\n <input\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n type=\"text\"\n />\n }\n @if (control.type === \"select\") {\n <select [formControlName]=\"control.name\" [id]=\"control.name\">\n @for (option of control.options; track $index) {\n <option [value]=\"option\">{{ option }}</option>\n }\n </select>\n }\n @if (control.type === \"textarea\") {\n <textarea\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n ></textarea>\n }\n @if (control.type === \"checkbox\") {\n <input\n type=\"checkbox\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n />\n }\n @if (control.type === \"radio\") {\n @for (option of control.options ?? []; track $index) {\n <div>\n <input\n type=\"radio\"\n [formControlName]=\"control.name\"\n [id]=\"control.name + '-' + option\"\n [value]=\"option\"\n />\n <label [for]=\"control.name + '-' + option\">{{ option }}</label>\n </div>\n }\n }\n\n <validation-messages\n [control]=\"form.get(control.name)\"\n [controlName]=\"control.name\"\n [config]=\"control\"\n ></validation-messages>\n </section>\n }\n }\n }\n <button type=\"submit\" [disabled]=\"form.invalid\">Submit</button>\n</form>\n","/**\n * @component\n * @name MaterialFormsComponent\n * @description\n * A standalone Angular component that renders a dynamic form using Angular Material components.\n * The form configuration is provided via inputs, and the form submission is handled via an output event.\n * \n * @selector material-forms\n * @standalone true\n * @imports\n * - CommonModule\n * - ReactiveFormsModule\n * - MatInputModule\n * - MatSelectModule\n * - MatCheckboxModule\n * - MatRadioModule\n * - MatButtonModule\n * - ValidationMessagesComponent\n * - MatDatepickerModule\n * - MatFormFieldModule\n * @providers provideNativeDateAdapter\n * @templateUrl ./material-form.component.html\n * @styleUrl ./material-form.component.css\n * @changeDetection ChangeDetectionStrategy.OnPush\n * \n * @inputs\n * @property {string} formName - The name of the form.\n * @property {FormControlConfig[]} controls - The configuration for the form controls.\n * \n * @outputs\n * @property {EventEmitter<Record<string, any>>} formSubmit - Event emitted when the form is submitted.\n * \n * @class\n * @name MaterialFormsComponent\n * @description\n * This class defines the MaterialFormsComponent which initializes the form based on the provided controls configuration,\n * handles form submission, and provides validation for the form controls.\n * \n * @constructor\n * @param {FormBuilder} fb - Angular FormBuilder service to create form groups and controls.\n * @param {ChangeDetectorRef} cdr - Angular ChangeDetectorRef service to manually trigger change detection.\n * \n * @method\n * @name ngOnInit\n * @description\n * Lifecycle hook that is called after the component's view has been initialized. It initializes the form.\n * \n * @method\n * @name initializeForm\n * @description\n * Initializes the form controls based on the provided configuration. Supports datepicker range controls.\n * \n * @method\n * @name getValidators\n * @description\n * Returns an array of Angular validators based on the provided control configuration.\n * @param {FormControlConfig} control - The configuration for the form control.\n * @returns {Validators[]} - An array of Angular validators.\n * \n * @method\n * @name onSubmit\n * @description\n * Handles the form submission. Marks all controls as touched and dirty, updates the form's validity,\n * emits the form values if the form is valid, and resets the form. Triggers change detection.\n */\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport {\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatButtonModule } from '@angular/material/button';\nimport { ValidationMessagesComponent } from '../validation-messages/validation-messages.component';\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { provideNativeDateAdapter } from '@angular/material/core';\nimport { BaseFormsComponent } from '../base.component';\n\n\n@Component({\n selector: 'material-forms',\n standalone: true,\n imports: [\n BaseFormsComponent,\n CommonModule,\n ReactiveFormsModule,\n MatInputModule,\n MatSelectModule,\n MatCheckboxModule,\n MatRadioModule,\n MatButtonModule,\n ValidationMessagesComponent,\n MatDatepickerModule,\n MatFormFieldModule,\n ],\n providers: [provideNativeDateAdapter()],\n templateUrl: './material-form.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MaterialFormsComponent extends BaseFormsComponent {}","<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"material\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.type === \"input\") {\n <mat-form-field appearance=\"outline\">\n @if (control.label) {\n <mat-label>{{ control.label }}</mat-label>\n }\n <input matInput [formControlName]=\"control.name\" [id]=\"control.name\" type=\"text\" />\n </mat-form-field>\n }\n @if (control.type === \"select\") {\n <mat-form-field appearance=\"outline\">\n @if (control.label) {\n <mat-label>{{ control.label }}</mat-label>\n }\n <mat-select [formControlName]=\"control.name\" [id]=\"control.name\">\n @for (option of control.options ?? []; track $index) {\n <mat-option [value]=\"option\">{{ option }}</mat-option>\n }\n </mat-select>\n </mat-form-field>\n }\n @if (control.type === \"checkbox\") {\n <mat-checkbox [formControlName]=\"control.name\" [id]=\"control.name\">\n {{ control.label }}\n </mat-checkbox>\n }\n @if (control.type === \"radio\") {\n <mat-radio-group [formControlName]=\"control.name\">\n @for (option of control.options ?? []; track $index) {\n <mat-radio-button [id]=\"control.name + '-' + option\" [value]=\"option\">\n {{ option }}\n </mat-radio-button>\n }\n </mat-radio-group>\n }\n @if (control.type === \"datepicker\") {\n @if (control.datePickerMode === \"single\") {\n <mat-form-field appearance=\"outline\">\n <mat-label>Choose a date</mat-label>\n <input matInput [matDatepicker]=\"datepicker\" [formControlName]=\"control.name\" />\n <mat-datepicker-toggle matIconSuffix [for]=\"datepicker\"></mat-datepicker-toggle>\n <mat-datepicker #datepicker></mat-datepicker>\n </mat-form-field>\n } @else if (control.datePickerMode === \"range\") {\n <mat-form-field>\n <mat-label>Enter a date range</mat-label>\n <mat-date-range-input [rangePicker]=\"picker\" [formGroup]=\"form\" ]>\n <input matStartDate formControlName=\"{{ control.name }}_Start\" placeholder=\"Start date\" />\n <input matEndDate formControlName=\"{{ control.name }}_End\" placeholder=\"End date\" />\n </mat-date-range-input>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n\n <!-- @if (form.controls.start.hasError('matStartDateInvalid')) {\n <mat-error>Invalid start date</mat-error>\n }\n @if (form.controls.end.hasError('matEndDateInvalid')) {\n <mat-error>Invalid end date</mat-error>\n } -->\n </mat-form-field>\n }\n }\n\n <validation-messages [control]=\"form.get(control.name)\" [controlName]=\"control.name\"\n [config]=\"control\"></validation-messages>\n </section>\n }\n }\n }\n <button mat-raised-button color=\"primary\" type=\"submit\" [disabled]=\"form.invalid\">\n Submit\n </button>\n</form>","/**\n * PrimeNgFormsComponent is a standalone Angular component that dynamically generates\n * a form based on the provided configuration. It leverages PrimeNG UI components\n * and Angular Reactive Forms for form creation and validation.\n *\n * @selector primeng-forms\n * @standalone true\n * @imports [\n * CommonModule,\n * FormsModule,\n * ReactiveFormsModule,\n * ValidationMessagesComponent,\n * InputTextModule,\n * MultiSelectModule,\n * TextareaModule,\n * CheckboxModule,\n * RadioButtonModule,\n * DatePickerModule,\n * ToggleButtonModule,\n * FileUploadModule,\n * SliderModule,\n * ButtonModule,\n * SelectModule,\n * FileUploadValueAccessor\n * ]\n * @templateUrl ./prime-form.component.html\n * @styleUrl ./prime-form.component.css\n * @changeDetection ChangeDetectionStrategy.OnPush\n *\n * @property {string} formName - The name of the form.\n * @property {FormControlConfig[]} controls - The configuration for the form controls.\n * @property {EventEmitter<Record<string, any>>} formSubmit - Event emitter for form submission.\n * @property {FormGroup} form - The reactive form group.\n * @property {BehaviorSubject<boolean>} formChanges$ - Observable to track form changes.\n *\n * @constructor\n * @param {FormBuilder} fb - FormBuilder service to create form controls.\n * @param {ChangeDetectorRef} cdr - ChangeDetectorRef to manually trigger change detection.\n *\n * @method ngOnInit - Lifecycle hook that initializes the form.\n * @method initializeForm - Initializes the form controls and sets up value change subscriptions.\n * @method getValidators - Returns an array of validators for a given form control configuration.\n * @param {FormControlConfig} control - The configuration for a form control.\n * @returns {ValidatorFn[]} - An array of validator functions.\n * @method updateValidators - Updates the validators for a form control based on its value.\n * @param {AbstractControl} control - The form control to update.\n * @param {any} value - The current value of the form control.\n * @method shouldRequireValidation - Determines if a form control should require validation.\n * @param {any} value - The current value of the form control.\n * @returns {boolean} - True if validation is required, false otherwise.\n * @method onFileSelect - Handles file selection for file upload controls.\n * @param {any} event - The file selection event.\n * @param {string} controlName - The name of the form control.\n * @method onSubmit - Handles form submission, validates the form, and emits the form value.\n */\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { ValidationMessagesComponent } from '../validation-messages/validation-messages.component';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { TextareaModule } from 'primeng/textarea';\nimport { CheckboxModule } from 'primeng/checkbox';\nimport { RadioButtonModule } from 'primeng/radiobutton';\nimport { ToggleButtonModule } from 'primeng/togglebutton';\nimport { FileUploadModule } from 'primeng/fileupload';\nimport { SliderModule } from 'primeng/slider';\nimport { ButtonModule } from 'primeng/button';\nimport { DatePickerModule } from 'primeng/datepicker';\nimport { SelectModule } from 'primeng/select';\nimport { BaseFormsComponent } from '../base.component';\n\n@Component({\n selector: 'primeng-forms',\n standalone: true,\n imports: [\n BaseFormsComponent,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n ValidationMessagesComponent,\n InputTextModule,\n MultiSelectModule,\n TextareaModule,\n CheckboxModule,\n RadioButtonModule,\n DatePickerModule,\n ToggleButtonModule,\n FileUploadModule,\n SliderModule,\n ButtonModule,\n SelectModule,\n ],\n templateUrl: './prime-form.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PrimeNgFormsComponent extends BaseFormsComponent {\n onFileSelect(event: any, controlName: string) {\n const file = event.files[0];\n if (file) {\n this.form.get(controlName)?.setValue(file);\n this.form.get(controlName)?.updateValueAndValidity();\n\n const controlConfig = this.controls().find(\n (control) => control.name === controlName\n );\n if (controlConfig?.events?.onUpload) {\n controlConfig.events.onUpload(event);\n }\n }\n }\n}\n","<form [formGroup]=\"form\" [attr.name]=\"formName()\" (ngSubmit)=\"onSubmit()\">\n @for (control of controls(); track $index) {\n @if (control.uiFramework === \"primeng\" || !control.uiFramework) {\n @if (form.get(control.name)) {\n <section [ngClass]=\"control.class\" [ngStyle]=\"control.style\">\n @if (control.label) {\n <label\n [attr.for]=\"control.name\"\n [ngClass]=\"control.labelClass\"\n [ngStyle]=\"control.labelStyle\"\n >\n {{ control.label }}\n </label>\n }\n\n @switch (control.type) {\n @case (\"text\") {\n <input\n pInputText\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"number\") {\n <input\n pInputText\n type=\"number\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"password\") {\n <input\n pInputText\n type=\"password\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"email\") {\n <input\n pInputText\n type=\"email\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n />\n }\n @case (\"select\") {\n <p-select\n [options]=\"control.options\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n />\n }\n @case (\"multi-select\") {\n <p-multiSelect\n [options]=\"control.options\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-multiSelect>\n }\n @case (\"textarea\") {\n <textarea\n pTextarea\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n (change)=\"control.events?.onChange?.($event)\"\n (focus)=\"control.events?.onFocus?.($event)\"\n (blur)=\"control.events?.onBlur?.($event)\"\n (keyup)=\"control.events?.onKeyUp?.($event)\"\n (keydown)=\"control.events?.onKeyDown?.($event)\"\n (paste)=\"control.events?.onPaste?.($event)\"\n ></textarea>\n }\n @case (\"checkbox\") {\n <p-checkbox\n [binary]=\"true\"\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-checkbox>\n }\n @case (\"radio\") {\n @for (option of control.options ?? []; track $index) {\n <div>\n <p-radioButton\n [name]=\"control.name\"\n [formControlName]=\"control.name\"\n [value]=\"option\"\n [inputId]=\"'radio-' + option\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-radioButton>\n <label [for]=\"'radio-' + option\">{{ option }}</label>\n </div>\n }\n }\n @case (\"date\") {\n <p-datepicker\n [formControlName]=\"control.name\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n />\n }\n @case (\"toggle\") {\n <p-toggleButton\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onFocus)=\"control.events?.onFocus?.($event)\"\n (onBlur)=\"control.events?.onBlur?.($event)\"\n ></p-toggleButton>\n }\n <!-- @case (\"file\") {\n <p-fileUpload \n [customUpload]=\"true\"\n [formControlName]=\"control.name\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onClear)=\"control.events?.onClear?.($event)\"\n (onRemove)=\"control.events?.onRemove?.($event)\"\n (onError)=\"control.events?.onError?.($event)\"\n (onBeforeUpload)=\"control.events?.onBeforeUpload?.($event)\"\n (onProgress)=\"control.events?.onProgress?.($event)\"\n (onUpload)=\"control.events?.onUpload?.($event)\"\n >\n\n <p-fileUpload\n [customUpload]=\"true\"\n (onUpload)=\"onFileSelect($event, control.name)\"\n [formControlName]=\"control.name\"\n [id]=\"control.name\"\n [chooseLabel]=\"control.primeng?.chooseLabel\"\n [uploadLabel]=\"control.primeng?.uploadLabel\"\n [cancelLabel]=\"control.primeng?.cancelLabel\"\n [auto]=\"control.primeng?.auto\"\n [url]=\"control.primeng?.url\"\n [withCredentials]=\"control.primeng?.withCredentials\"\n [multiple]=\"control.primeng?.multiple\"\n [maxFileSize]=\"control.primeng?.maxFileSize\"\n [customUpload]=\"control.primeng?.customUpload\"\n [showUploadButton]=\"control.primeng?.showUploadButton\"\n [showCancelButton]=\"control.primeng?.showCancelButton\"\n [accept]=\"control.primeng?.accept\"\n [mode]=\"control.primeng?.mode\"\n [previewWidth]=\"control.primeng?.previewWidth\"\n (onSelect)=\"control.events?.onSelect?.($event)\"\n (onClear)=\"control.events?.onClear?.($event)\"\n (onRemove)=\"control.events?.onRemove?.($event)\"\n (onError)=\"control.events?.onError?.($event)\"\n (onBeforeUpload)=\"control.events?.onBeforeUpload?.($event)\"\n (onProgress)=\"control.events?.onProgress?.($event)\"\n (onUpload)=\"control.events?.onUpload?.($event)\"\n >\n <ng-template pTemplate=\"content\">\n <p-button label=\"Choose File\" icon=\"pi pi-upload\"></p-button>\n </ng-template>\n </p-fileUpload>\n } -->\n @case (\"slider\") {\n <p-slider\n [formControlName]=\"control.name\"\n (onChange)=\"control.events?.onChange?.($event)\"\n (onSlideEnd)=\"control.events?.onSlideEnd?.($event)\"\n ></p-slider>\n }\n }\n\n <validation-messages\n [control]=\"form.get(control.name)\"\n [controlName]=\"control.name\"\n [config]=\"control\"\n ></validation-messages>\n </section>\n }\n }\n }\n <button\n pButton\n type=\"submit\"\n [disabled]=\"form.invalid\"\n label=\"Submit\"\n ></button>\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i4","i5","i6","i7","i8","i9","i10"],"mappings":"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