@abp/ng.components 10.1.0 → 10.2.0-rc.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"abp-ng.components-dynamic-form.mjs","sources":["../../../../packages/components/dynamic-form/src/dynamic-form.service.ts","../../../../packages/components/dynamic-form/src/dynamic-form.models.ts","../../../../packages/components/dynamic-form/src/dynamic-form-field/dynamic-form-field.component.ts","../../../../packages/components/dynamic-form/src/dynamic-form-field/dynamic-form-field.component.html","../../../../packages/components/dynamic-form/src/dynamic-form-field/dynamic-form-field-host.component.ts","../../../../packages/components/dynamic-form/src/dynamic-form-array/dynamic-form-array.component.ts","../../../../packages/components/dynamic-form/src/dynamic-form-array/dynamic-form-array.component.html","../../../../packages/components/dynamic-form/src/dynamic-form-group/dynamic-form-group.component.ts","../../../../packages/components/dynamic-form/src/dynamic-form-group/dynamic-form-group.component.html","../../../../packages/components/dynamic-form/src/dynamic-form.component.ts","../../../../packages/components/dynamic-form/src/dynamic-form.component.html","../../../../packages/components/dynamic-form/src/abp-ng.components-dynamic-form.ts"],"sourcesContent":["import {Injectable, inject} from '@angular/core';\r\nimport {FormControl, FormGroup, FormArray, ValidatorFn, Validators, FormBuilder} from '@angular/forms';\r\nimport {FormFieldConfig, ValidatorConfig} from './dynamic-form.models';\r\nimport { RestService } from '@abp/ng.core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class DynamicFormService {\r\n\r\n private formBuilder = inject(FormBuilder);\r\n private restService = inject(RestService);\r\n apiName = 'DynamicFormService';\r\n\r\n createFormGroup(fields: FormFieldConfig[]): FormGroup {\r\n const group: any = {};\r\n\r\n fields.forEach(field => {\r\n // Nested Group\r\n if (field.type === 'group') {\r\n group[field.key] = this.createFormGroup(field.children || []);\r\n }\r\n // Nested Array\r\n else if (field.type === 'array') {\r\n group[field.key] = this.createFormArray(field);\r\n }\r\n // Regular Field\r\n else {\r\n const validators = this.buildValidators(field.validators || []);\r\n const initialValue = this.getInitialValue(field);\r\n\r\n group[field.key] = new FormControl({\r\n value: initialValue,\r\n disabled: field.disabled || false\r\n }, validators);\r\n }\r\n });\r\n\r\n return this.formBuilder.group(group);\r\n }\r\n\r\n createFormArray(arrayConfig: FormFieldConfig): FormArray {\r\n const items: FormGroup[] = [];\r\n const minItems = arrayConfig.minItems || 0;\r\n\r\n // Create minimum required items\r\n for (let i = 0; i < minItems; i++) {\r\n items.push(this.createFormGroup(arrayConfig.children || []));\r\n }\r\n\r\n return this.formBuilder.array(items);\r\n }\r\n\r\n getInitialValues(fields: FormFieldConfig[]): any {\r\n const initialValues: any = {};\r\n fields.forEach(field => {\r\n if (field.type === 'group') {\r\n initialValues[field.key] = this.getInitialValues(field.children || []);\r\n } else if (field.type === 'array') {\r\n initialValues[field.key] = [];\r\n } else {\r\n initialValues[field.key] = this.getInitialValue(field);\r\n }\r\n });\r\n return initialValues;\r\n }\r\n\r\n getOptions(url: string, apiName?: string): any {\r\n return this.restService.request<any, any[]>({\r\n method: 'GET',\r\n url,\r\n },\r\n { apiName: apiName || this.apiName });\r\n }\r\n\r\n private buildValidators(validatorConfigs: ValidatorConfig[]): ValidatorFn[] {\r\n return validatorConfigs.map(config => {\r\n switch (config.type) {\r\n case 'required':\r\n return Validators.required;\r\n case 'email':\r\n return Validators.email;\r\n case 'minLength':\r\n return Validators.minLength(config.value);\r\n case 'maxLength':\r\n return Validators.maxLength(config.value);\r\n case 'pattern':\r\n return Validators.pattern(config.value);\r\n case 'min':\r\n return Validators.min(config.value);\r\n case 'max':\r\n return Validators.max(config.value);\r\n case 'requiredTrue':\r\n return Validators.requiredTrue;\r\n default:\r\n return Validators.nullValidator;\r\n }\r\n });\r\n }\r\n\r\n private getInitialValue(field: FormFieldConfig): any {\r\n if (field.value !== undefined) {\r\n return field.value;\r\n }\r\n switch (field.type) {\r\n case 'checkbox':\r\n return false;\r\n case 'number':\r\n return 0;\r\n case 'group':\r\n return this.getInitialValues(field.children || []);\r\n case 'array':\r\n return [];\r\n default:\r\n return '';\r\n }\r\n }\r\n}\r\n","import { Type } from '@angular/core';\r\nimport { ControlValueAccessor } from '@angular/forms';\r\n\r\nexport interface FormFieldConfig<T = any> {\r\n key: string;\r\n value?: any;\r\n type: 'text' | 'email' | 'number' | 'select' | 'checkbox' | 'date' | 'textarea' | 'datetime-local' | 'time' | 'password' | 'tel' | 'url' | 'radio' | 'file' | 'range' | 'color' | 'group' | 'array';\r\n label: string;\r\n placeholder?: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n options?: OptionProps<T>;\r\n validators?: ValidatorConfig[];\r\n conditionalLogic?: ConditionalRule[];\r\n order?: number;\r\n gridSize?: number;\r\n component?: Type<ControlValueAccessor>;\r\n // Additional field attributes\r\n min?: number | string; // For number, date, time, range\r\n max?: number | string; // For number, date, time, range\r\n step?: number | string; // For number, time, range\r\n minLength?: number; // For text, password\r\n maxLength?: number; // For text, password\r\n pattern?: string; // For tel, text\r\n accept?: string; // For file input (e.g., \"image/*\")\r\n multiple?: boolean; // For file input\r\n // Nested form support (for group and array types)\r\n children?: FormFieldConfig[]; // Child fields for nested forms\r\n minItems?: number; // For array type: minimum number of items\r\n maxItems?: number; // For array type: maximum number of items\r\n}\r\n\r\nexport interface ValidatorConfig {\r\n type: 'required' | 'email' | 'minLength' | 'maxLength' | 'pattern' | 'custom' | 'min' | 'max' | 'requiredTrue';\r\n value?: any;\r\n message: string;\r\n}\r\n\r\nexport interface ConditionalRule {\r\n dependsOn: string;\r\n condition: 'equals' | 'notEquals' | 'contains' | 'greaterThan' | 'lessThan';\r\n value: any;\r\n action: 'show' | 'hide' | 'enable' | 'disable';\r\n}\r\n\r\nexport enum ConditionalAction {\r\n SHOW = 'show',\r\n HIDE = 'hide',\r\n ENABLE = 'enable',\r\n DISABLE = 'disable'\r\n}\r\n\r\nexport interface OptionProps<T = any> {\r\n defaultValues?: T[];\r\n url?: string;\r\n disabled?: (option: T) => boolean;\r\n labelProp?: string;\r\n valueProp?: string;\r\n apiName?: string;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n forwardRef,\r\n inject,\r\n InjectionToken, Injector,\r\n input,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { FormFieldConfig } from '../dynamic-form.models';\r\nimport {\r\n ControlValueAccessor,\r\n FormBuilder,\r\n FormControl,\r\n FormControlName,\r\n FormGroupDirective,\r\n NG_VALUE_ACCESSOR,\r\n NgControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\r\nimport { LocalizationPipe } from '@abp/ng.core';\r\nimport { FormCheckboxComponent } from '@abp/ng.theme.shared';\r\nimport { Observable, of } from 'rxjs';\r\nimport { DynamicFormService } from '../dynamic-form.service';\r\n\r\nexport const ABP_DYNAMIC_FORM_FIELD = new InjectionToken<DynamicFormFieldComponent>('AbpDynamicFormField');\r\n\r\nconst DYNAMIC_FORM_FIELD_CONTROL_VALUE_ACCESSOR = {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DynamicFormFieldComponent),\r\n multi: true,\r\n};\r\n\r\n@Component({\r\n selector: 'abp-dynamic-form-field',\r\n templateUrl: './dynamic-form-field.component.html',\r\n styleUrls: ['./dynamic-form-field.component.scss'],\r\n providers: [\r\n { provide: ABP_DYNAMIC_FORM_FIELD, useExisting: DynamicFormFieldComponent },\r\n DYNAMIC_FORM_FIELD_CONTROL_VALUE_ACCESSOR,\r\n ],\r\n host: { class: 'abp-dynamic-form-field' },\r\n exportAs: 'abpDynamicFormField',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [NgTemplateOutlet, LocalizationPipe, ReactiveFormsModule, FormCheckboxComponent, AsyncPipe],\r\n})\r\nexport class DynamicFormFieldComponent implements OnInit, ControlValueAccessor {\r\n field = input.required<FormFieldConfig>();\r\n visible = input<boolean>(true);\r\n control!: FormControl;\r\n fieldFormGroup: FormGroup;\r\n readonly changeDetectorRef = inject(ChangeDetectorRef);\r\n readonly destroyRef = inject(DestroyRef);\r\n private injector = inject(Injector);\r\n private formBuilder = inject(FormBuilder);\r\n private dynamicFormService = inject(DynamicFormService);\r\n\r\n options$: Observable<{ key: string; value: any }[]> = of([]);\r\n\r\n // Accessibility: Generate unique IDs for ARIA\r\n get fieldId(): string {\r\n return `field-${this.field().key}`;\r\n }\r\n\r\n get errorId(): string {\r\n return `${this.fieldId}-error`;\r\n }\r\n\r\n get helpTextId(): string {\r\n return `${this.fieldId}-help`;\r\n }\r\n\r\n constructor() {\r\n this.fieldFormGroup = this.formBuilder.group({\r\n value: [{ value: '' }],\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n const ngControl = this.injector.get(NgControl, null);\r\n if (ngControl) {\r\n this.control = this.injector.get(FormGroupDirective).getControl(ngControl as FormControlName);\r\n }\r\n this.value.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(value => {\r\n this.onChange(value);\r\n });\r\n\r\n const options = this.field().options;\r\n\r\n if (options?.url) {\r\n this.options$ = this.dynamicFormService.getOptions(options.url, options.apiName);\r\n } else if (options?.defaultValues?.length) {\r\n this.options$ = of(\r\n options.defaultValues.map(item => {\r\n return {\r\n key: item[options.valueProp || 'key'] || item,\r\n value: item[options.labelProp || 'value'] || item\r\n };\r\n })\r\n );\r\n } else {\r\n this.options$ = of([]);\r\n }\r\n }\r\n\r\n writeValue(value: any[]): void {\r\n this.value.setValue(value || '');\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n if (isDisabled) {\r\n this.value.disable();\r\n } else {\r\n this.value.enable();\r\n }\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n\r\n get isInvalid(): boolean {\r\n if (this.control) {\r\n return this.control.invalid && (this.control.dirty || this.control.touched);\r\n }\r\n return false;\r\n }\r\n\r\n get errors(): string[] {\r\n if (!this.control?.errors) return [];\r\n if (this.control && this.control.errors) {\r\n const errorKeys = Object.keys(this.control.errors);\r\n const validators = this.field().validators || [];\r\n return errorKeys.map(key => {\r\n const validator = validators.find(\r\n v => v.type.toLowerCase() === key.toLowerCase(),\r\n );\r\n if (validator && validator.message) {\r\n return validator.message;\r\n }\r\n // Fallback error messages\r\n if (key === 'required') return `${this.field().label} is required`;\r\n if (key === 'email') return 'Please enter a valid email address';\r\n if (key === 'minlength')\r\n return `Minimum length is ${this.control.errors[key].requiredLength}`;\r\n if (key === 'maxlength')\r\n return `Maximum length is ${this.control.errors[key].requiredLength}`;\r\n return `${this.field().label} is invalid due to ${key} validation.`;\r\n });\r\n }\r\n return [];\r\n }\r\n get value() {\r\n return this.fieldFormGroup.get('value');\r\n }\r\n\r\n onFileChange(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files) {\r\n const files = Array.from(input.files);\r\n const value = this.field().multiple ? files : files[0];\r\n this.value.setValue(value);\r\n this.onChange(value);\r\n }\r\n }\r\n\r\n private onChange: (value: any) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n}\r\n","@if (visible()) {\r\n<div [formGroup]=\"fieldFormGroup\" role=\"group\" [attr.aria-labelledby]=\"fieldId + '-label'\">\r\n \r\n <!-- NOTE: Group and Array types are NOT rendered here, they should be rendered at parent level -->\r\n <!-- This component only handles leaf/primitive field types -->\r\n \r\n @if (field().type === 'text') {\r\n <!-- Text Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n [id]=\"fieldId\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'select') {\r\n <!-- Select Dropdown -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <select \r\n [id]=\"fieldId\"\r\n formControlName=\"value\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n <option value=\"\">{{ '::Select' | abpLocalization }}</option>\r\n @for (option of options$ | async; track option.key) {\r\n <option [value]=\"option.key\">\r\n {{ option.value | abpLocalization }}\r\n </option>\r\n }\r\n </select>\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'checkbox') {\r\n <!-- Checkbox -->\r\n <div class=\"form-group form-check mb-3\" role=\"group\">\r\n <abp-checkbox \r\n [label]=\"field().label | abpLocalization\" \r\n formControlName=\"value\" \r\n [id]=\"fieldId\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\" />\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'email') {\r\n <!-- Email Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"email\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\"\r\n autocomplete=\"email\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'textarea') {\r\n <!-- Textarea -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <textarea \r\n [id]=\"fieldId\"\r\n formControlName=\"value\" \r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\"\r\n [class.is-invalid]=\"isInvalid\" \r\n rows=\"4\" \r\n class=\"form-control\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n </textarea>\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'number') {\r\n <!-- Number Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"number\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.min]=\"field().min || null\"\r\n [attr.max]=\"field().max || null\"\r\n [attr.step]=\"field().step || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'date') {\r\n <!-- Date Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"date\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.min]=\"field().min || null\"\r\n [attr.max]=\"field().max || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'datetime-local') {\r\n <!-- DateTime Local Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"datetime-local\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.min]=\"field().min || null\"\r\n [attr.max]=\"field().max || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'time') {\r\n <!-- Time Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"time\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.min]=\"field().min || null\"\r\n [attr.max]=\"field().max || null\"\r\n [attr.step]=\"field().step || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'password') {\r\n <!-- Password Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"password\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.minlength]=\"field().minLength || null\"\r\n [attr.maxlength]=\"field().maxLength || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\"\r\n autocomplete=\"new-password\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'tel') {\r\n <!-- Tel Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"tel\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.pattern]=\"field().pattern || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\"\r\n autocomplete=\"tel\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'url') {\r\n <!-- URL Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"url\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\"\r\n autocomplete=\"url\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'radio') {\r\n <!-- Radio Group -->\r\n <div class=\"form-group mb-3\" role=\"radiogroup\" [attr.aria-labelledby]=\"fieldId + '-label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <div class=\"radio-group\">\r\n @for (option of options$ | async; track option.key) {\r\n <div class=\"form-check\">\r\n <input \r\n type=\"radio\" \r\n [id]=\"fieldId + '-' + option.key\"\r\n [value]=\"option.key\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-check-input\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\">\r\n <label [for]=\"fieldId + '-' + option.key\" class=\"form-check-label\">\r\n {{ option.value | abpLocalization }}\r\n </label>\r\n </div>\r\n }\r\n </div>\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'file') {\r\n <!-- File Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"file\" \r\n [id]=\"fieldId\"\r\n (change)=\"onFileChange($event)\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.accept]=\"field().accept || null\"\r\n [attr.multiple]=\"field().multiple || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'range') {\r\n <!-- Range Slider -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <input \r\n type=\"range\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-range flex-grow-1\"\r\n [attr.min]=\"field().min || 0\"\r\n [attr.max]=\"field().max || 100\"\r\n [attr.step]=\"field().step || 1\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\"\r\n [attr.aria-valuenow]=\"value.value\"\r\n [attr.aria-valuemin]=\"field().min || 0\"\r\n [attr.aria-valuemax]=\"field().max || 100\">\r\n <output [for]=\"fieldId\" class=\"badge bg-primary\">{{ value.value }}</output>\r\n </div>\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'color') {\r\n <!-- Color Picker -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <input \r\n type=\"color\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control form-control-color\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n <code class=\"text-muted\">{{ value.value || '#000000' }}</code>\r\n </div>\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n<ng-template #labelTemplate>\r\n <label \r\n [for]=\"fieldId\"\r\n [id]=\"fieldId + '-label'\"\r\n [class.required]=\"field().required\">\r\n {{ field().label | abpLocalization }}\r\n @if (field().required) {\r\n <span class=\"text-danger\" aria-label=\"required\">*</span>\r\n }\r\n </label>\r\n</ng-template>\r\n\r\n<ng-template #errorTemplate>\r\n <div \r\n class=\"invalid-feedback\" \r\n [id]=\"errorId\"\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\">\r\n @for (error of errors; track error) {\r\n <div>{{ error | abpLocalization }}</div>\r\n }\r\n </div>\r\n</ng-template>","import {\r\n Component,\r\n ViewChild,\r\n ViewContainerRef,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n Type,\r\n effect,\r\n DestroyRef,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor, NG_VALUE_ACCESSOR, FormControl, ReactiveFormsModule\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\ntype controlValueAccessorLike = Partial<ControlValueAccessor> & { setDisabledState?(d: boolean): void };\r\ntype acceptsFormControl = { formControl?: FormControl };\r\n\r\n@Component({\r\n selector: 'abp-dynamic-form-field-host',\r\n imports: [CommonModule, ReactiveFormsModule],\r\n template: `<ng-template #vcRef></ng-template>`,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DynamicFieldHostComponent),\r\n multi: true\r\n }]\r\n})\r\nexport class DynamicFieldHostComponent implements ControlValueAccessor {\r\n component = input<Type<ControlValueAccessor>>();\r\n inputs = input<Record<string, any>>({});\r\n\r\n @ViewChild('vcRef', { read: ViewContainerRef, static: true }) viewContainerRef!: ViewContainerRef;\r\n private componentRef?: any;\r\n\r\n private value: any;\r\n private disabled = false;\r\n\r\n // if child has not implemented ControlValueAccessor. Create form control\r\n private innerControl = new FormControl<any>(null);\r\n readonly destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.component()) {\r\n this.createChild();\r\n } else if (this.componentRef && this.inputs()) {\r\n this.applyInputs();\r\n }\r\n });\r\n }\r\n\r\n private createChild() {\r\n this.viewContainerRef.clear();\r\n if (!this.component()) return;\r\n\r\n this.componentRef = this.viewContainerRef.createComponent(this.component());\r\n this.applyInputs();\r\n\r\n const instance: any = this.componentRef.instance as controlValueAccessorLike & acceptsFormControl;\r\n\r\n if (this.isCVA(instance)) {\r\n // Child CVA ise wrapper -> child delege\r\n instance.registerOnChange?.((v: any) => this.onChange(v));\r\n instance.registerOnTouched?.(() => this.onTouched());\r\n if (this.disabled && instance.setDisabledState) {\r\n instance.setDisabledState(true);\r\n }\r\n // set initial value\r\n if (this.value !== undefined) {\r\n instance.writeValue?.(this.value);\r\n }\r\n } else {\r\n // No CVA -> use form control\r\n if ('formControl' in instance) {\r\n instance.formControl = this.innerControl;\r\n // apply initial value/disabled state\r\n if (this.value !== undefined) {\r\n this.innerControl.setValue(this.value, { emitEvent: false });\r\n }\r\n this.innerControl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(v => this.onChange(v));\r\n this.innerControl.disabled ? null : (this.disabled && this.innerControl.disable({ emitEvent: false }));\r\n }\r\n }\r\n }\r\n\r\n private applyInputs() {\r\n if (!this.componentRef) return;\r\n const inst = this.componentRef.instance;\r\n for (const [k, v] of Object.entries(this.inputs ?? {})) {\r\n inst[k] = v;\r\n }\r\n this.componentRef.changeDetectorRef?.markForCheck?.();\r\n }\r\n\r\n private isCVA(obj: any): obj is controlValueAccessorLike {\r\n return obj && typeof obj.writeValue === 'function' && typeof obj.registerOnChange === 'function';\r\n }\r\n\r\n writeValue(obj: any): void {\r\n this.value = obj;\r\n if (!this.componentRef) return;\r\n\r\n const inst: any = this.componentRef.instance as controlValueAccessorLike & acceptsFormControl;\r\n\r\n if (this.isCVA(inst)) {\r\n inst.writeValue?.(obj);\r\n } else if ('formControl' in inst && inst.formControl instanceof FormControl) {\r\n inst.formControl.setValue(obj, { emitEvent: false });\r\n }\r\n }\r\n\r\n private onChange: (v: any) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n registerOnChange(fn: any): void { this.onChange = fn; }\r\n registerOnTouched(fn: any): void { this.onTouched = fn; }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n if (!this.componentRef) return;\r\n\r\n const inst = this.componentRef.instance as controlValueAccessorLike & acceptsFormControl;\r\n\r\n if (this.isCVA(inst) && inst.setDisabledState) {\r\n inst.setDisabledState(isDisabled);\r\n } else if ('formControl' in inst && inst.formControl instanceof FormControl) {\r\n isDisabled ? inst.formControl.disable({ emitEvent: false }) : inst.formControl.enable({ emitEvent: false });\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n inject,\r\n ChangeDetectorRef,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { FormGroup, FormArray, FormBuilder, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormFieldConfig } from '../dynamic-form.models';\r\nimport { DynamicFormService } from '../dynamic-form.service';\r\nimport { LocalizationPipe } from '@abp/ng.core';\r\nimport { DynamicFormFieldComponent } from '../dynamic-form-field';\r\nimport { DynamicFormGroupComponent } from '../dynamic-form-group';\r\n\r\n@Component({\r\n selector: 'abp-dynamic-form-array',\r\n templateUrl: './dynamic-form-array.component.html',\r\n styleUrls: ['./dynamic-form-array.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n LocalizationPipe,\r\n DynamicFormFieldComponent,\r\n DynamicFormGroupComponent,\r\n forwardRef(() => DynamicFormArrayComponent), // Self reference for recursion\r\n ],\r\n})\r\nexport class DynamicFormArrayComponent {\r\n arrayConfig = input.required<FormFieldConfig>();\r\n formGroup = input.required<FormGroup>();\r\n visible = input<boolean>(true);\r\n\r\n private fb = inject(FormBuilder);\r\n private dynamicFormService = inject(DynamicFormService);\r\n private cdr = inject(ChangeDetectorRef);\r\n\r\n get formArray(): FormArray {\r\n return this.formGroup().get(this.arrayConfig().key) as FormArray;\r\n }\r\n\r\n get sortedChildren(): FormFieldConfig[] {\r\n const children = this.arrayConfig().children || [];\r\n return children.sort((a, b) => (a.order || 0) - (b.order || 0));\r\n }\r\n\r\n get canAddItem(): boolean {\r\n const maxItems = this.arrayConfig().maxItems;\r\n return maxItems ? this.formArray.length < maxItems : true;\r\n }\r\n\r\n get canRemoveItem(): boolean {\r\n const minItems = this.arrayConfig().minItems || 0;\r\n return this.formArray.length > minItems;\r\n }\r\n\r\n addItem() {\r\n if (!this.canAddItem) return;\r\n \r\n const itemGroup = this.dynamicFormService.createFormGroup(\r\n this.arrayConfig().children || []\r\n );\r\n \r\n this.formArray.push(itemGroup);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n removeItem(index: number) {\r\n if (!this.canRemoveItem) return;\r\n \r\n this.formArray.removeAt(index);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n getItemFormGroup(index: number): FormGroup {\r\n return this.formArray.at(index) as FormGroup;\r\n }\r\n\r\n getNestedFormGroup(index: number, key: string): FormGroup {\r\n return this.getItemFormGroup(index).get(key) as FormGroup;\r\n }\r\n\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","@if (visible()) {\r\n <div class=\"form-array-container\" role=\"region\" [attr.aria-label]=\"arrayConfig().label | abpLocalization\">\r\n \r\n <!-- Header with Add Button -->\r\n <div class=\"array-header d-flex justify-content-between align-items-center mb-3\">\r\n <label class=\"form-array-label\">\r\n {{ arrayConfig().label | abpLocalization }}\r\n @if (arrayConfig().required) {\r\n <span class=\"text-danger\" aria-label=\"required\">*</span>\r\n }\r\n </label>\r\n <button \r\n type=\"button\" \r\n class=\"btn btn-sm btn-primary\"\r\n (click)=\"addItem()\"\r\n [disabled]=\"!canAddItem\"\r\n [attr.aria-label]=\"'Add ' + (arrayConfig().label | abpLocalization)\">\r\n <i class=\"fa fa-plus me-1\"></i>\r\n {{ '::Add' | abpLocalization }}\r\n </button>\r\n </div>\r\n\r\n <!-- Array Items -->\r\n <div class=\"array-items\" role=\"list\">\r\n @for (item of formArray.controls; track trackByIndex($index)) {\r\n <div class=\"array-item border rounded p-3 mb-3\" role=\"listitem\" [formGroup]=\"getItemFormGroup($index)\">\r\n \r\n <!-- Item Header -->\r\n <div class=\"item-header d-flex justify-content-between align-items-center mb-3\">\r\n <strong class=\"item-title\">\r\n {{ arrayConfig().label | abpLocalization }} #{{ $index + 1 }}\r\n </strong>\r\n <button \r\n type=\"button\" \r\n class=\"btn btn-sm btn-danger\"\r\n (click)=\"removeItem($index)\"\r\n [disabled]=\"!canRemoveItem\"\r\n [attr.aria-label]=\"'Remove ' + (arrayConfig().label | abpLocalization) + ' #' + ($index + 1)\">\r\n <i class=\"fa fa-trash me-1\"></i>\r\n {{ '::Remove' | abpLocalization }}\r\n </button>\r\n </div>\r\n\r\n <!-- Item Fields -->\r\n <div class=\"row\">\r\n @for (field of sortedChildren; track field.key) {\r\n <div [ngClass]=\"'col-md-' + (field.gridSize || 12)\">\r\n \r\n <!-- Nested Group -->\r\n @if (field.type === 'group') {\r\n <abp-dynamic-form-group\r\n [groupConfig]=\"field\"\r\n [formGroup]=\"getNestedFormGroup($index, field.key)\" />\r\n }\r\n \r\n <!-- Nested Array (recursive) -->\r\n @else if (field.type === 'array') {\r\n <abp-dynamic-form-array\r\n [arrayConfig]=\"field\"\r\n [formGroup]=\"getItemFormGroup($index)\" />\r\n }\r\n \r\n <!-- Regular Field -->\r\n @else {\r\n <abp-dynamic-form-field\r\n [field]=\"field\"\r\n [formControlName]=\"field.key\" />\r\n }\r\n \r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @empty {\r\n <div class=\"alert alert-info\" role=\"status\">\r\n <i class=\"fa fa-info-circle me-2\"></i>\r\n {{ '::NoItemsAdded' | abpLocalization }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Item Count -->\r\n <div class=\"array-footer text-muted small\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {{ formArray.length }} {{ '::Items' | abpLocalization }}\r\n @if (arrayConfig().minItems) {\r\n ({{ '::Min' | abpLocalization }}: {{ arrayConfig().minItems }})\r\n }\r\n @if (arrayConfig().maxItems) {\r\n ({{ '::Max' | abpLocalization }}: {{ arrayConfig().maxItems }})\r\n }\r\n </div>\r\n </div>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormFieldConfig } from '../dynamic-form.models';\r\nimport { LocalizationPipe } from '@abp/ng.core';\r\nimport { DynamicFormFieldComponent } from '../dynamic-form-field';\r\nimport { DynamicFormArrayComponent } from '../dynamic-form-array';\r\n\r\n@Component({\r\n selector: 'abp-dynamic-form-group',\r\n templateUrl: './dynamic-form-group.component.html',\r\n styleUrls: ['./dynamic-form-group.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n LocalizationPipe,\r\n DynamicFormFieldComponent,\r\n forwardRef(() => DynamicFormArrayComponent),\r\n forwardRef(() => DynamicFormGroupComponent), // Self reference for recursion\r\n ],\r\n})\r\nexport class DynamicFormGroupComponent {\r\n groupConfig = input.required<FormFieldConfig>();\r\n formGroup = input.required<FormGroup>();\r\n visible = input<boolean>(true);\r\n\r\n get sortedChildren(): FormFieldConfig[] {\r\n const children = this.groupConfig().children || [];\r\n return children.sort((a, b) => (a.order || 0) - (b.order || 0));\r\n }\r\n\r\n getChildFormGroup(key: string): FormGroup {\r\n return this.formGroup().get(key) as FormGroup;\r\n }\r\n\r\n getChildControl(key: string) {\r\n return this.formGroup().get(key);\r\n }\r\n}\r\n","@if (visible()) {\r\n <fieldset class=\"form-group-container\" [formGroup]=\"formGroup()\" role=\"group\" [attr.aria-labelledby]=\"groupConfig().key + '-legend'\">\r\n <legend [id]=\"groupConfig().key + '-legend'\" class=\"form-group-legend\">\r\n {{ groupConfig().label | abpLocalization }}\r\n </legend>\r\n \r\n <div class=\"row\">\r\n @for (field of sortedChildren; track field.key) {\r\n <div [ngClass]=\"'col-md-' + (field.gridSize || 12)\">\r\n \r\n <!-- Nested Group (Recursive) -->\r\n @if (field.type === 'group') {\r\n <abp-dynamic-form-group\r\n [groupConfig]=\"field\"\r\n [formGroup]=\"getChildFormGroup(field.key)\" />\r\n }\r\n \r\n <!-- Nested Array -->\r\n @else if (field.type === 'array') {\r\n <abp-dynamic-form-array\r\n [arrayConfig]=\"field\"\r\n [formGroup]=\"formGroup()\" />\r\n }\r\n \r\n <!-- Regular Field -->\r\n @else {\r\n <abp-dynamic-form-field\r\n [field]=\"field\"\r\n [formControlName]=\"field.key\" />\r\n }\r\n \r\n </div>\r\n }\r\n </div>\r\n </fieldset>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n output,\r\n inject,\r\n OnInit,\r\n DestroyRef,\r\n ChangeDetectorRef,\r\n} from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DynamicFormService } from './dynamic-form.service';\r\nimport { ConditionalAction, FormFieldConfig } from './dynamic-form.models';\r\nimport { DynamicFormFieldComponent, DynamicFieldHostComponent } from './dynamic-form-field';\r\nimport { DynamicFormGroupComponent } from './dynamic-form-group';\r\nimport { DynamicFormArrayComponent } from './dynamic-form-array';\r\n\r\n@Component({\r\n selector: 'abp-dynamic-form',\r\n templateUrl: './dynamic-form.component.html',\r\n styleUrls: ['./dynamic-form.component.scss'],\r\n host: { class: 'abp-dynamic-form' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n exportAs: 'abpDynamicForm',\r\n imports: [\r\n CommonModule,\r\n DynamicFormFieldComponent,\r\n DynamicFormGroupComponent,\r\n DynamicFormArrayComponent,\r\n ReactiveFormsModule,\r\n DynamicFieldHostComponent,\r\n ],\r\n})\r\nexport class DynamicFormComponent implements OnInit {\r\n fields = input<FormFieldConfig[]>([]);\r\n values = input<Record<string, any>>();\r\n submitButtonText = input<string>('Submit');\r\n submitInProgress = input<boolean>(false);\r\n showCancelButton = input<boolean>(false);\r\n onSubmit = output<any>();\r\n formCancel = output<void>();\r\n private dynamicFormService = inject(DynamicFormService);\r\n readonly destroyRef = inject(DestroyRef);\r\n readonly changeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n dynamicForm!: FormGroup;\r\n fieldVisibility: { [key: string]: boolean } = {};\r\n\r\n ngOnInit() {\r\n this.setupFormAndLogic();\r\n }\r\n\r\n get sortedFields(): FormFieldConfig[] {\r\n return this.fields().sort((a, b) => (a.order || 0) - (b.order || 0));\r\n }\r\n\r\n submit() {\r\n if (this.dynamicForm.valid) {\r\n this.onSubmit.emit(this.dynamicForm.getRawValue());\r\n } else {\r\n this.markAllFieldsAsTouched();\r\n this.focusFirstInvalidField();\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.formCancel.emit();\r\n }\r\n\r\n onFieldChange(event: { fieldKey: string; value: any }) {\r\n this.evaluateConditionalLogic(event.fieldKey);\r\n }\r\n\r\n isFieldVisible(field: FormFieldConfig): boolean {\r\n return this.fieldVisibility[field.key] !== false;\r\n }\r\n\r\n getChildFormGroup(key: string): FormGroup {\r\n return this.dynamicForm.get(key) as FormGroup;\r\n }\r\n\r\n resetForm() {\r\n const initialValues: { [key: string]: any } = this.dynamicFormService.getInitialValues(\r\n this.fields(),\r\n );\r\n this.dynamicForm.reset({ ...initialValues });\r\n this.dynamicForm.markAsUntouched();\r\n this.dynamicForm.markAsPristine();\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n\r\n private initializeFieldVisibility() {\r\n this.fields().forEach(field => {\r\n this.fieldVisibility = {\r\n ...this.fieldVisibility,\r\n [field.key]: !field.conditionalLogic?.length,\r\n };\r\n });\r\n }\r\n\r\n private setupConditionalLogic() {\r\n this.fields().forEach(field => {\r\n if (field.conditionalLogic) {\r\n field.conditionalLogic.forEach(rule => {\r\n const dependentControl = this.dynamicForm.get(rule.dependsOn);\r\n if (dependentControl) {\r\n this.evaluateConditionalLogic(field.key);\r\n dependentControl.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.evaluateConditionalLogic(field.key);\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n private evaluateConditionalLogic(fieldKey: string) {\r\n const field = this.fields().find(f => f.key === fieldKey);\r\n if (!field?.conditionalLogic) return;\r\n\r\n field.conditionalLogic.forEach(rule => {\r\n const dependentValue = this.dynamicForm.get(rule.dependsOn)?.value;\r\n const conditionMet = this.evaluateCondition(dependentValue, rule.condition, rule.value);\r\n\r\n this.applyConditionalAction(fieldKey, rule.action, conditionMet);\r\n });\r\n }\r\n\r\n private evaluateCondition(fieldValue: any, condition: string, ruleValue: any): boolean {\r\n switch (condition) {\r\n case 'equals':\r\n return fieldValue === ruleValue;\r\n case 'notEquals':\r\n return fieldValue !== ruleValue;\r\n case 'contains':\r\n return fieldValue && fieldValue.includes && fieldValue.includes(ruleValue);\r\n case 'greaterThan':\r\n return Number(fieldValue) > Number(ruleValue);\r\n case 'lessThan':\r\n return Number(fieldValue) < Number(ruleValue);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private applyConditionalAction(fieldKey: string, action: string, shouldApply: boolean) {\r\n const control = this.dynamicForm.get(fieldKey);\r\n\r\n switch (action) {\r\n case ConditionalAction.SHOW:\r\n this.fieldVisibility = { ...this.fieldVisibility, [fieldKey]: shouldApply };\r\n break;\r\n case ConditionalAction.HIDE:\r\n this.fieldVisibility = { ...this.fieldVisibility, [fieldKey]: !shouldApply };\r\n break;\r\n case ConditionalAction.ENABLE:\r\n if (control) {\r\n shouldApply ? control.enable() : control.disable();\r\n }\r\n break;\r\n case ConditionalAction.DISABLE:\r\n if (control) {\r\n shouldApply ? control.disable() : control.enable();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n private setupFormAndLogic() {\r\n this.dynamicForm = this.dynamicFormService.createFormGroup(this.fields());\r\n this.initializeFieldVisibility();\r\n this.setupConditionalLogic();\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n\r\n private markAllFieldsAsTouched() {\r\n Object.keys(this.dynamicForm.controls).forEach(key => {\r\n this.dynamicForm.get(key)?.markAsTouched();\r\n });\r\n }\r\n\r\n private focusFirstInvalidField() {\r\n // Accessibility: Focus first invalid field for screen readers\r\n const firstInvalidField = this.sortedFields.find(field => {\r\n const control = this.dynamicForm.get(field.key);\r\n return control && control.invalid && control.touched;\r\n });\r\n\r\n if (firstInvalidField) {\r\n setTimeout(() => {\r\n const element = document.getElementById(`field-${firstInvalidField.key}`);\r\n if (element) {\r\n element.focus();\r\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }, 100);\r\n }\r\n }\r\n}\r\n","<div class=\"form-wrapper\">\r\n<form \r\n [formGroup]=\"dynamicForm\" \r\n (ngSubmit)=\"submit()\" \r\n class=\"dynamic-form\"\r\n role=\"form\"\r\n [attr.aria-label]=\"'Dynamic Form'\">\r\n <div class=\"row\" role=\"group\">\r\n @for (field of sortedFields; track field.key) {\r\n <div [ngClass]=\"'col-md-' + (field.gridSize || 12)\">\r\n \r\n <!-- Custom Component -->\r\n @if (field.component) {\r\n <abp-dynamic-form-field-host\r\n [component]=\"field.component\"\r\n [inputs]=\"{ field: field, visible: isFieldVisible(field) }\"\r\n formControlName=\"{{ field.key }}\">\r\n </abp-dynamic-form-field-host>\r\n }\r\n \r\n <!-- Nested Group -->\r\n @else if (field.type === 'group') {\r\n <abp-dynamic-form-group\r\n [groupConfig]=\"field\"\r\n [formGroup]=\"getChildFormGroup(field.key)\"\r\n [visible]=\"isFieldVisible(field)\">\r\n </abp-dynamic-form-group>\r\n }\r\n \r\n <!-- Nested Array -->\r\n @else if (field.type === 'array') {\r\n <abp-dynamic-form-array\r\n [arrayConfig]=\"field\"\r\n [formGroup]=\"dynamicForm\"\r\n [visible]=\"isFieldVisible(field)\">\r\n </abp-dynamic-form-array>\r\n }\r\n \r\n <!-- Regular Field -->\r\n @else {\r\n <abp-dynamic-form-field\r\n [field]=\"field\"\r\n [formControlName]=\"field.key\"\r\n [visible]=\"isFieldVisible(field)\">\r\n </abp-dynamic-form-field>\r\n }\r\n \r\n </div>\r\n }\r\n </div>\r\n <ng-content select=\"[actions]\">\r\n <ng-container [ngTemplateOutlet]=\"defaultActions\"></ng-container>\r\n </ng-content>\r\n\r\n</form>\r\n\r\n<ng-template #defaultActions>\r\n <div class=\"form-actions\" role=\"group\" aria-label=\"Form actions\">\r\n @if (showCancelButton()) {\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-secondary\"\r\n (click)=\"onCancel()\"\r\n aria-label=\"Cancel form\">\r\n Cancel\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"!dynamicForm.valid || submitInProgress()\"\r\n [attr.aria-busy]=\"submitInProgress() || null\"\r\n [attr.aria-label]=\"submitInProgress() ? 'Submitting form...' : submitButtonText()\">\r\n {{ submitButtonText() }}\r\n </button>\r\n </div>\r\n</ng-template>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;MASa,kBAAkB,CAAA;AAJ/B,IAAA,WAAA,GAAA;AAMU,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACzC,IAAA,CAAA,OAAO,GAAG,oBAAoB;AAyG/B,IAAA;AAvGC,IAAA,eAAe,CAAC,MAAyB,EAAA;QACvC,MAAM,KAAK,GAAQ,EAAE;AAErB,QAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;;AAErB,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;AAC1B,gBAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC/D;;AAEK,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;AAC/B,gBAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAChD;;iBAEK;AACH,gBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;gBAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;gBAEhD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC;AACjC,oBAAA,KAAK,EAAE,YAAY;AACnB,oBAAA,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI;iBAC7B,EAAE,UAAU,CAAC;YAChB;AACF,QAAA,CAAC,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;IACtC;AAEA,IAAA,eAAe,CAAC,WAA4B,EAAA;QAC1C,MAAM,KAAK,GAAgB,EAAE;AAC7B,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,CAAC;;AAG1C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE;AACjC,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC9D;QAEA,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;IACtC;AAEA,IAAA,gBAAgB,CAAC,MAAyB,EAAA;QACxC,MAAM,aAAa,GAAQ,EAAE;AAC7B,QAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;AACrB,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;AAC1B,gBAAA,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;YACxE;AAAO,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;AACjC,gBAAA,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAC/B;iBAAO;AACL,gBAAA,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YACxD;AACF,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,aAAa;IACtB;IAEA,UAAU,CAAC,GAAW,EAAE,OAAgB,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAa;AACxC,YAAA,MAAM,EAAE,KAAK;YACb,GAAG;SACJ,EACD,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;IACzC;AAEQ,IAAA,eAAe,CAAC,gBAAmC,EAAA;AACzD,QAAA,OAAO,gBAAgB,CAAC,GAAG,CAAC,MAAM,IAAG;AACnC,YAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,gBAAA,KAAK,UAAU;oBACb,OAAO,UAAU,CAAC,QAAQ;AAC5B,gBAAA,KAAK,OAAO;oBACV,OAAO,UAAU,CAAC,KAAK;AACzB,gBAAA,KAAK,WAAW;oBACd,OAAO,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;AAC3C,gBAAA,KAAK,WAAW;oBACd,OAAO,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;AAC3C,gBAAA,KAAK,SAAS;oBACZ,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AACzC,gBAAA,KAAK,KAAK;oBACR,OAAO,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AACrC,gBAAA,KAAK,KAAK;oBACR,OAAO,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AACrC,gBAAA,KAAK,cAAc;oBACjB,OAAO,UAAU,CAAC,YAAY;AAChC,gBAAA;oBACE,OAAO,UAAU,CAAC,aAAa;;AAErC,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,eAAe,CAAC,KAAsB,EAAA;AAC5C,QAAA,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE;YAC7B,OAAO,KAAK,CAAC,KAAK;QACpB;AACA,QAAA,QAAQ,KAAK,CAAC,IAAI;AAChB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,KAAK;AACd,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,CAAC;AACV,YAAA,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;AACpD,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,EAAE;AACX,YAAA;AACE,gBAAA,OAAO,EAAE;;IAEf;8GA5GW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAHjB,MAAM,EAAA,CAAA,CAAA;;2FAGP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ICsCW;AAAZ,CAAA,UAAY,iBAAiB,EAAA;AAC3B,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,iBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,iBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EALW,iBAAiB,KAAjB,iBAAiB,GAAA,EAAA,CAAA,CAAA;;MCfhB,sBAAsB,GAAG,IAAI,cAAc,CAA4B,qBAAqB;AAEzG,MAAM,yCAAyC,GAAG;AAChD,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,WAAW,EAAE,UAAU,CAAC,MAAM,yBAAyB,CAAC;AACxD,IAAA,KAAK,EAAE,IAAI;CACZ;MAeY,yBAAyB,CAAA;;AAcpC,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,CAAA,MAAA,EAAS,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE;IACpC;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,OAAO,QAAQ;IAChC;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,CAAA,EAAG,IAAI,CAAC,OAAO,OAAO;IAC/B;AAEA,IAAA,WAAA,GAAA;AAzBA,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,gDAAmB;AACzC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,IAAI,mDAAC;AAGrB,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC7C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAEvD,QAAA,IAAA,CAAA,QAAQ,GAA8C,EAAE,CAAC,EAAE,CAAC;AAmHpD,QAAA,IAAA,CAAA,QAAQ,GAAyB,MAAK,EAAG,CAAC;AAC1C,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAG,CAAC;QApGvC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3C,YAAA,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACvB,SAAA,CAAC;IACJ;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC;QACpD,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,SAA4B,CAAC;QAC/F;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,IAAG;AAClF,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACtB,QAAA,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO;AAEpC,QAAA,IAAI,OAAO,EAAE,GAAG,EAAE;AAChB,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC;QAClF;AAAO,aAAA,IAAI,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE;AACzC,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAChB,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAG;gBAC/B,OAAO;oBACL,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,IAAI;oBAC7C,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI;iBAC9C;YACH,CAAC,CAAC,CACH;QACH;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC;QACxB;IACF;AAEA,IAAA,UAAU,CAAC,KAAY,EAAA;QACrB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;IACvC;AAEA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;QAClC,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QACtB;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;QACrB;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;IACvC;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC7E;AACA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM;AAAE,YAAA,OAAO,EAAE;QACpC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACvC,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,IAAI,EAAE;AAChD,YAAA,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,IAAG;gBACzB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAC/B,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE,CAChD;AACD,gBAAA,IAAI,SAAS,IAAI,SAAS,CAAC,OAAO,EAAE;oBAClC,OAAO,SAAS,CAAC,OAAO;gBAC1B;;gBAEA,IAAI,GAAG,KAAK,UAAU;oBAAE,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,cAAc;gBAClE,IAAI,GAAG,KAAK,OAAO;AAAE,oBAAA,OAAO,oCAAoC;gBAChE,IAAI,GAAG,KAAK,WAAW;AACrB,oBAAA,OAAO,CAAA,kBAAA,EAAqB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAA,CAAE;gBACvE,IAAI,GAAG,KAAK,WAAW;AACrB,oBAAA,OAAO,CAAA,kBAAA,EAAqB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAA,CAAE;gBACvE,OAAO,CAAA,EAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAA,mBAAA,EAAsB,GAAG,CAAA,YAAA,CAAc;AACrE,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,OAAO,EAAE;IACX;AACA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;IACzC;AAEA,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,IAAI,KAAK,CAAC,KAAK,EAAE;YACf,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;AACtD,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC1B,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACtB;IACF;8GA5HW,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,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,EAAA,SAAA,EATzB;AACT,YAAA,EAAE,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,yBAAyB,EAAE;YAC3E,yCAAyC;SAC1C,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7CH,ixcAkXc,EAAA,MAAA,EAAA,CAAA,yHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDjUF,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAoB,mBAAmB,8xDAAE,qBAAqB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,eAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAA5D,gBAAgB,EAAA,IAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAA8C,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAExF,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,SAAA,EAGvB;AACT,wBAAA,EAAE,OAAO,EAAE,sBAAsB,EAAE,WAAW,2BAA2B,EAAE;wBAC3E,yCAAyC;qBAC1C,EAAA,IAAA,EACK,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAA,QAAA,EAC/B,qBAAqB,EAAA,eAAA,EACd,uBAAuB,CAAC,MAAM,WACtC,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,ixcAAA,EAAA,MAAA,EAAA,CAAA,yHAAA,CAAA,EAAA;;;MEjBzF,yBAAyB,CAAA;AAcpC,IAAA,WAAA,GAAA;QAbA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA8B;AAC/C,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAsB,EAAE,kDAAC;QAM/B,IAAA,CAAA,QAAQ,GAAG,KAAK;;AAGhB,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,WAAW,CAAM,IAAI,CAAC;AACxC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAwEhC,QAAA,IAAA,CAAA,QAAQ,GAAqB,MAAK,EAAE,CAAC;AACrC,QAAA,IAAA,CAAA,SAAS,GAAe,MAAK,EAAE,CAAC;QAtEtC,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;gBACpB,IAAI,CAAC,WAAW,EAAE;YACpB;iBAAO,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gBAC7C,IAAI,CAAC,WAAW,EAAE;YACpB;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;AAEvB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3E,IAAI,CAAC,WAAW,EAAE;AAElB,QAAA,MAAM,QAAQ,GAAQ,IAAI,CAAC,YAAY,CAAC,QAAyD;AAEjG,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;;AAExB,YAAA,QAAQ,CAAC,gBAAgB,GAAG,CAAC,CAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACzD,YAAA,QAAQ,CAAC,iBAAiB,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACpD,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,gBAAgB,EAAE;AAC9C,gBAAA,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACjC;;AAEA,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;gBAC5B,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;YACnC;QACF;aAAO;;AAEL,YAAA,IAAI,aAAa,IAAI,QAAQ,EAAE;AAC7B,gBAAA,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY;;AAExC,gBAAA,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE;AAC5B,oBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAC9D;AACA,gBAAA,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACzG,gBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YACxG;QACF;IACF;IAEQ,WAAW,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AACxB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ;AACvC,QAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;AACtD,YAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACb;QACA,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,YAAY,IAAI;IACvD;AAEQ,IAAA,KAAK,CAAC,GAAQ,EAAA;AACpB,QAAA,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,UAAU,IAAI,OAAO,GAAG,CAAC,gBAAgB,KAAK,UAAU;IAClG;AAEA,IAAA,UAAU,CAAC,GAAQ,EAAA;AACjB,QAAA,IAAI,CAAC,KAAK,GAAG,GAAG;QAChB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AAExB,QAAA,MAAM,IAAI,GAAQ,IAAI,CAAC,YAAY,CAAC,QAAyD;AAE7F,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACpB,YAAA,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACxB;aAAO,IAAI,aAAa,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,YAAY,WAAW,EAAE;AAC3E,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACtD;IACF;IAKA,gBAAgB,CAAC,EAAO,EAAA,EAAU,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IACtD,iBAAiB,CAAC,EAAO,EAAA,EAAU,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;AAExD,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;QAC1B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AAExB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,QAAyD;QAExF,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC7C,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QACnC;aAAO,IAAI,aAAa,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,YAAY,WAAW,EAAE;AAC3E,YAAA,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC7G;IACF;8GArGW,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,QAAA,EAAA,IAAA,EAAA,yBAAyB,qVANzB,CAAC;AACV,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,yBAAyB,CAAC;AACxD,gBAAA,KAAK,EAAE;AACR,aAAA,CAAC,gHAM0B,gBAAgB,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAZlC,oCAAoC,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EADpC,YAAY,8BAAE,mBAAmB,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAShC,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAXrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,6BAA6B;AACvC,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,mBAAmB,CAAC;AAC5C,oBAAA,QAAQ,EAAE,CAAA,kCAAA,CAAoC;oBAC9C,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,SAAS,EAAE,CAAC;AACV,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,+BAA+B,CAAC;AACxD,4BAAA,KAAK,EAAE;yBACR;AACF,iBAAA;;sBAKE,SAAS;uBAAC,OAAO,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE;;;MCNjD,yBAAyB,CAAA;AAdtC,IAAA,WAAA,GAAA;AAeE,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,sDAAmB;AAC/C,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,oDAAa;AACvC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,IAAI,mDAAC;AAEtB,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACxB,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC/C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAkDxC,IAAA;AAhDC,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAc;IAClE;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,IAAI,EAAE;QAClD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACjE;AAEA,IAAA,IAAI,UAAU,GAAA;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ;AAC5C,QAAA,OAAO,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,QAAQ,GAAG,IAAI;IAC3D;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,IAAI,CAAC;AACjD,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,QAAQ;IACzC;IAEA,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;AAEtB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CACvD,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,IAAI,EAAE,CAClC;AAED,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;AAC9B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;AAEzB,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,gBAAgB,CAAC,KAAa,EAAA;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAc;IAC9C;IAEA,kBAAkB,CAAC,KAAa,EAAE,GAAW,EAAA;QAC3C,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAc;IAC3D;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,OAAO,KAAK;IACd;8GAxDW,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,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BtC,0tHA6FA,EAAA,MAAA,EAAA,CAAA,k9BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MD/Da,yBAAyB,CAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MARlC,YAAY,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MACZ,mBAAmB,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAA,EAAA,CAAA,kBAAA,CAAA,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,UAAA,CAAA,MAAA,EAAA,CAAA,eAAA,CAAA,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,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAEnB,yBAAyB,CAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MACzB,yBAAyB,oIAFzB,gBAAgB,CAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAMP,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAdrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,eAAA,EAGjB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,gBAAgB;wBAChB,yBAAyB;wBACzB,yBAAyB;AACzB,wBAAA,UAAU,CAAC,MAAK,yBAA0B,CAAC;AAC5C,qBAAA,EAAA,QAAA,EAAA,0tHAAA,EAAA,MAAA,EAAA,CAAA,k9BAAA,CAAA,EAAA;;;MEDU,yBAAyB,CAAA;AAdtC,IAAA,WAAA,GAAA;AAeE,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAC,QAAQ,sDAAmB;AAC/C,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,oDAAa;AACvC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,IAAI,mDAAC;AAc/B,IAAA;AAZC,IAAA,IAAI,cAAc,GAAA;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,IAAI,EAAE;QAClD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACjE;AAEA,IAAA,iBAAiB,CAAC,GAAW,EAAA;QAC3B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,CAAc;IAC/C;AAEA,IAAA,eAAe,CAAC,GAAW,EAAA;QACzB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IAClC;8GAhBW,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,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3BtC,gwCAoCA,EAAA,MAAA,EAAA,CAAA,ohBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MDTa,yBAAyB,CAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MARlC,YAAY,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MACZ,mBAAmB,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAAA,EAAA,CAAA,kBAAA,CAAA,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,UAAA,CAAA,MAAA,EAAA,CAAA,eAAA,CAAA,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,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAEnB,yBAAyB,CAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MACR,yBAAyB,oIAF1C,gBAAgB,CAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAMP,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAdrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,wBAAwB,EAAA,eAAA,EAGjB,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,gBAAgB;wBAChB,yBAAyB;AACzB,wBAAA,UAAU,CAAC,MAAM,yBAAyB,CAAC;AAC3C,wBAAA,UAAU,CAAC,MAAK,yBAA0B,CAAC;AAC5C,qBAAA,EAAA,QAAA,EAAA,gwCAAA,EAAA,MAAA,EAAA,CAAA,ohBAAA,CAAA,EAAA;;;MEUU,oBAAoB,CAAA;AAhBjC,IAAA,WAAA,GAAA;AAiBE,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAoB,EAAE,kDAAC;QACrC,IAAA,CAAA,MAAM,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,QAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAuB;AACrC,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAS,QAAQ,4DAAC;AAC1C,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAU,KAAK,4DAAC;AACxC,QAAA,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAU,KAAK,4DAAC;QACxC,IAAA,CAAA,QAAQ,GAAG,MAAM,EAAO;QACxB,IAAA,CAAA,UAAU,GAAG,MAAM,EAAQ;AACnB,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC9C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAGtD,IAAA,CAAA,eAAe,GAA+B,EAAE;AA0JjD,IAAA;IAxJC,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACtE;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QACpD;aAAO;YACL,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,sBAAsB,EAAE;QAC/B;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;AAEA,IAAA,aAAa,CAAC,KAAuC,EAAA;AACnD,QAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC/C;AAEA,IAAA,cAAc,CAAC,KAAsB,EAAA;QACnC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK;IAClD;AAEA,IAAA,iBAAiB,CAAC,GAAW,EAAA;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAc;IAC/C;IAEA,SAAS,GAAA;AACP,QAAA,MAAM,aAAa,GAA2B,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CACpF,IAAI,CAAC,MAAM,EAAE,CACd;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC;AAC5C,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;AAClC,QAAA,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE;AACjC,QAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;IACvC;IAEQ,yBAAyB,GAAA;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,IAAG;YAC5B,IAAI,CAAC,eAAe,GAAG;gBACrB,GAAG,IAAI,CAAC,eAAe;gBACvB,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,MAAM;aAC7C;AACH,QAAA,CAAC,CAAC;IACJ;IAEQ,qBAAqB,GAAA;QAC3B,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,IAAG;AAC5B,YAAA,IAAI,KAAK,CAAC,gBAAgB,EAAE;AAC1B,gBAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAG;AACpC,oBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;oBAC7D,IAAI,gBAAgB,EAAE;AACpB,wBAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC;AACxC,wBAAA,gBAAgB,CAAC;AACd,6BAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;6BACxC,SAAS,CAAC,MAAK;AACd,4BAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC;AAC1C,wBAAA,CAAC,CAAC;oBACN;AACF,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,wBAAwB,CAAC,QAAgB,EAAA;AAC/C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC;QACzD,IAAI,CAAC,KAAK,EAAE,gBAAgB;YAAE;AAE9B,QAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAG;AACpC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK;AAClE,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;YAEvF,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAClE,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,iBAAiB,CAAC,UAAe,EAAE,SAAiB,EAAE,SAAc,EAAA;QAC1E,QAAQ,SAAS;AACf,YAAA,KAAK,QAAQ;gBACX,OAAO,UAAU,KAAK,SAAS;AACjC,YAAA,KAAK,WAAW;gBACd,OAAO,UAAU,KAAK,SAAS;AACjC,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,UAAU,IAAI,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC5E,YAAA,KAAK,aAAa;gBAChB,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;AAC/C,YAAA,KAAK,UAAU;gBACb,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;AAC/C,YAAA;AACE,gBAAA,OAAO,KAAK;;IAElB;AAEQ,IAAA,sBAAsB,CAAC,QAAgB,EAAE,MAAc,EAAE,WAAoB,EAAA;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;QAE9C,QAAQ,MAAM;YACZ,KAAK,iBAAiB,CAAC,IAAI;AACzB,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,GAAG,WAAW,EAAE;gBAC3E;YACF,KAAK,iBAAiB,CAAC,IAAI;AACzB,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,GAAG,CAAC,WAAW,EAAE;gBAC5E;YACF,KAAK,iBAAiB,CAAC,MAAM;gBAC3B,IAAI,OAAO,EAAE;AACX,oBAAA,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE;gBACpD;gBACA;YACF,KAAK,iBAAiB,CAAC,OAAO;gBAC5B,IAAI,OAAO,EAAE;AACX,oBAAA,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE;gBACpD;gBACA;;IAEN;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACzE,IAAI,CAAC,yBAAyB,EAAE;QAChC,IAAI,CAAC,qBAAqB,EAAE;AAC5B,QAAA,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;IACvC;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;YACnD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE;AAC5C,QAAA,CAAC,CAAC;IACJ;IAEQ,sBAAsB,GAAA;;QAE5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,IAAG;AACvD,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;YAC/C,OAAO,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO;AACtD,QAAA,CAAC,CAAC;QAEF,IAAI,iBAAiB,EAAE;YACrB,UAAU,CAAC,MAAK;AACd,gBAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAA,MAAA,EAAS,iBAAiB,CAAC,GAAG,CAAA,CAAE,CAAC;gBACzE,IAAI,OAAO,EAAE;oBACX,OAAO,CAAC,KAAK,EAAE;AACf,oBAAA,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;gBACjE;YACF,CAAC,EAAE,GAAG,CAAC;QACT;IACF;8GAtKW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnCjC,imFA8EA,EAAA,MAAA,EAAA,CAAA,oMAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnDI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,yBAAyB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,yBAAyB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,yBAAyB,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACzB,mBAAmB,ysBACnB,yBAAyB,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGhB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAhBhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,EAAA,IAAA,EAGtB,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAA,eAAA,EAClB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,gBAAgB,EAAA,OAAA,EACjB;wBACP,YAAY;wBACZ,yBAAyB;wBACzB,yBAAyB;wBACzB,yBAAyB;wBACzB,mBAAmB;wBACnB,yBAAyB;AAC1B,qBAAA,EAAA,QAAA,EAAA,imFAAA,EAAA,MAAA,EAAA,CAAA,oMAAA,CAAA,EAAA;;;AEjCH;;AAEG;;;;"}
1
+ {"version":3,"file":"abp-ng.components-dynamic-form.mjs","sources":["../../../../packages/components/dynamic-form/src/dynamic-form.service.ts","../../../../packages/components/dynamic-form/src/dynamic-form.models.ts","../../../../packages/components/dynamic-form/src/dynamic-form-field/dynamic-form-field.component.ts","../../../../packages/components/dynamic-form/src/dynamic-form-field/dynamic-form-field.component.html","../../../../packages/components/dynamic-form/src/dynamic-form-field/dynamic-form-field-host.component.ts","../../../../packages/components/dynamic-form/src/dynamic-form-array/dynamic-form-array.component.ts","../../../../packages/components/dynamic-form/src/dynamic-form-array/dynamic-form-array.component.html","../../../../packages/components/dynamic-form/src/dynamic-form-group/dynamic-form-group.component.ts","../../../../packages/components/dynamic-form/src/dynamic-form-group/dynamic-form-group.component.html","../../../../packages/components/dynamic-form/src/dynamic-form.component.ts","../../../../packages/components/dynamic-form/src/dynamic-form.component.html","../../../../packages/components/dynamic-form/src/abp-ng.components-dynamic-form.ts"],"sourcesContent":["import {Injectable, inject} from '@angular/core';\r\nimport {FormControl, FormGroup, FormArray, ValidatorFn, Validators, FormBuilder} from '@angular/forms';\r\nimport {FormFieldConfig, ValidatorConfig} from './dynamic-form.models';\r\nimport { RestService } from '@abp/ng.core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\n\r\nexport class DynamicFormService {\r\n\r\n private formBuilder = inject(FormBuilder);\r\n private restService = inject(RestService);\r\n apiName = 'DynamicFormService';\r\n\r\n createFormGroup(fields: FormFieldConfig[]): FormGroup {\r\n const group: any = {};\r\n\r\n fields.forEach(field => {\r\n // Nested Group\r\n if (field.type === 'group') {\r\n group[field.key] = this.createFormGroup(field.children || []);\r\n }\r\n // Nested Array\r\n else if (field.type === 'array') {\r\n group[field.key] = this.createFormArray(field);\r\n }\r\n // Regular Field\r\n else {\r\n const validators = this.buildValidators(field.validators || []);\r\n const initialValue = this.getInitialValue(field);\r\n\r\n group[field.key] = new FormControl({\r\n value: initialValue,\r\n disabled: field.disabled || false\r\n }, validators);\r\n }\r\n });\r\n\r\n return this.formBuilder.group(group);\r\n }\r\n\r\n createFormArray(arrayConfig: FormFieldConfig): FormArray {\r\n const items: FormGroup[] = [];\r\n const minItems = arrayConfig.minItems || 0;\r\n\r\n // Create minimum required items\r\n for (let i = 0; i < minItems; i++) {\r\n items.push(this.createFormGroup(arrayConfig.children || []));\r\n }\r\n\r\n return this.formBuilder.array(items);\r\n }\r\n\r\n getInitialValues(fields: FormFieldConfig[]): any {\r\n const initialValues: any = {};\r\n fields.forEach(field => {\r\n if (field.type === 'group') {\r\n initialValues[field.key] = this.getInitialValues(field.children || []);\r\n } else if (field.type === 'array') {\r\n initialValues[field.key] = [];\r\n } else {\r\n initialValues[field.key] = this.getInitialValue(field);\r\n }\r\n });\r\n return initialValues;\r\n }\r\n\r\n getOptions(url: string, apiName?: string): any {\r\n return this.restService.request<any, any[]>({\r\n method: 'GET',\r\n url,\r\n },\r\n { apiName: apiName || this.apiName });\r\n }\r\n\r\n private buildValidators(validatorConfigs: ValidatorConfig[]): ValidatorFn[] {\r\n return validatorConfigs.map(config => {\r\n switch (config.type) {\r\n case 'required':\r\n return Validators.required;\r\n case 'email':\r\n return Validators.email;\r\n case 'minLength':\r\n return Validators.minLength(config.value);\r\n case 'maxLength':\r\n return Validators.maxLength(config.value);\r\n case 'pattern':\r\n return Validators.pattern(config.value);\r\n case 'min':\r\n return Validators.min(config.value);\r\n case 'max':\r\n return Validators.max(config.value);\r\n case 'requiredTrue':\r\n return Validators.requiredTrue;\r\n default:\r\n return Validators.nullValidator;\r\n }\r\n });\r\n }\r\n\r\n private getInitialValue(field: FormFieldConfig): any {\r\n if (field.value !== undefined) {\r\n return field.value;\r\n }\r\n switch (field.type) {\r\n case 'checkbox':\r\n return false;\r\n case 'number':\r\n return 0;\r\n case 'group':\r\n return this.getInitialValues(field.children || []);\r\n case 'array':\r\n return [];\r\n default:\r\n return '';\r\n }\r\n }\r\n}\r\n","import { Type } from '@angular/core';\r\nimport { ControlValueAccessor } from '@angular/forms';\r\n\r\nexport interface FormFieldConfig<T = any> {\r\n key: string;\r\n value?: any;\r\n type: 'text' | 'email' | 'number' | 'select' | 'checkbox' | 'date' | 'textarea' | 'datetime-local' | 'time' | 'password' | 'tel' | 'url' | 'radio' | 'file' | 'range' | 'color' | 'group' | 'array';\r\n label: string;\r\n placeholder?: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n options?: OptionProps<T>;\r\n validators?: ValidatorConfig[];\r\n conditionalLogic?: ConditionalRule[];\r\n order?: number;\r\n gridSize?: number;\r\n component?: Type<ControlValueAccessor>;\r\n // Additional field attributes\r\n min?: number | string; // For number, date, time, range\r\n max?: number | string; // For number, date, time, range\r\n step?: number | string; // For number, time, range\r\n minLength?: number; // For text, password\r\n maxLength?: number; // For text, password\r\n pattern?: string; // For tel, text\r\n accept?: string; // For file input (e.g., \"image/*\")\r\n multiple?: boolean; // For file input\r\n // Nested form support (for group and array types)\r\n children?: FormFieldConfig[]; // Child fields for nested forms\r\n minItems?: number; // For array type: minimum number of items\r\n maxItems?: number; // For array type: maximum number of items\r\n}\r\n\r\nexport interface ValidatorConfig {\r\n type: 'required' | 'email' | 'minLength' | 'maxLength' | 'pattern' | 'custom' | 'min' | 'max' | 'requiredTrue';\r\n value?: any;\r\n message: string;\r\n}\r\n\r\nexport interface ConditionalRule {\r\n dependsOn: string;\r\n condition: 'equals' | 'notEquals' | 'contains' | 'greaterThan' | 'lessThan';\r\n value: any;\r\n action: 'show' | 'hide' | 'enable' | 'disable';\r\n}\r\n\r\nexport enum ConditionalAction {\r\n SHOW = 'show',\r\n HIDE = 'hide',\r\n ENABLE = 'enable',\r\n DISABLE = 'disable'\r\n}\r\n\r\nexport interface OptionProps<T = any> {\r\n defaultValues?: T[];\r\n url?: string;\r\n disabled?: (option: T) => boolean;\r\n labelProp?: string;\r\n valueProp?: string;\r\n apiName?: string;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n forwardRef,\r\n inject,\r\n InjectionToken, Injector,\r\n input,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { FormFieldConfig } from '../dynamic-form.models';\r\nimport {\r\n ControlValueAccessor,\r\n FormBuilder,\r\n FormControl,\r\n FormControlName,\r\n FormGroupDirective,\r\n NG_VALUE_ACCESSOR,\r\n NgControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { NgTemplateOutlet, AsyncPipe } from '@angular/common';\r\nimport { LocalizationPipe } from '@abp/ng.core';\r\nimport { FormCheckboxComponent } from '@abp/ng.theme.shared';\r\nimport { Observable, of } from 'rxjs';\r\nimport { DynamicFormService } from '../dynamic-form.service';\r\n\r\nexport const ABP_DYNAMIC_FORM_FIELD = new InjectionToken<DynamicFormFieldComponent>('AbpDynamicFormField');\r\n\r\nconst DYNAMIC_FORM_FIELD_CONTROL_VALUE_ACCESSOR = {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DynamicFormFieldComponent),\r\n multi: true,\r\n};\r\n\r\n@Component({\r\n selector: 'abp-dynamic-form-field',\r\n templateUrl: './dynamic-form-field.component.html',\r\n styleUrls: ['./dynamic-form-field.component.scss'],\r\n providers: [\r\n { provide: ABP_DYNAMIC_FORM_FIELD, useExisting: DynamicFormFieldComponent },\r\n DYNAMIC_FORM_FIELD_CONTROL_VALUE_ACCESSOR,\r\n ],\r\n host: { class: 'abp-dynamic-form-field' },\r\n exportAs: 'abpDynamicFormField',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [NgTemplateOutlet, LocalizationPipe, ReactiveFormsModule, FormCheckboxComponent, AsyncPipe],\r\n})\r\nexport class DynamicFormFieldComponent implements OnInit, ControlValueAccessor {\r\n field = input.required<FormFieldConfig>();\r\n visible = input<boolean>(true);\r\n control!: FormControl;\r\n fieldFormGroup: FormGroup;\r\n readonly changeDetectorRef = inject(ChangeDetectorRef);\r\n readonly destroyRef = inject(DestroyRef);\r\n private injector = inject(Injector);\r\n private formBuilder = inject(FormBuilder);\r\n private dynamicFormService = inject(DynamicFormService);\r\n\r\n options$: Observable<{ key: string; value: any }[]> = of([]);\r\n\r\n // Accessibility: Generate unique IDs for ARIA\r\n get fieldId(): string {\r\n return `field-${this.field().key}`;\r\n }\r\n\r\n get errorId(): string {\r\n return `${this.fieldId}-error`;\r\n }\r\n\r\n get helpTextId(): string {\r\n return `${this.fieldId}-help`;\r\n }\r\n\r\n constructor() {\r\n this.fieldFormGroup = this.formBuilder.group({\r\n value: [{ value: '' }],\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n const ngControl = this.injector.get(NgControl, null);\r\n if (ngControl) {\r\n this.control = this.injector.get(FormGroupDirective).getControl(ngControl as FormControlName);\r\n }\r\n this.value.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(value => {\r\n this.onChange(value);\r\n });\r\n\r\n const options = this.field().options;\r\n\r\n if (options?.url) {\r\n this.options$ = this.dynamicFormService.getOptions(options.url, options.apiName);\r\n } else if (options?.defaultValues?.length) {\r\n this.options$ = of(\r\n options.defaultValues.map(item => {\r\n return {\r\n key: item[options.valueProp || 'key'] || item,\r\n value: item[options.labelProp || 'value'] || item\r\n };\r\n })\r\n );\r\n } else {\r\n this.options$ = of([]);\r\n }\r\n }\r\n\r\n writeValue(value: any[]): void {\r\n this.value.setValue(value || '');\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n if (isDisabled) {\r\n this.value.disable();\r\n } else {\r\n this.value.enable();\r\n }\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n\r\n get isInvalid(): boolean {\r\n if (this.control) {\r\n return this.control.invalid && (this.control.dirty || this.control.touched);\r\n }\r\n return false;\r\n }\r\n\r\n get errors(): string[] {\r\n if (!this.control?.errors) return [];\r\n if (this.control && this.control.errors) {\r\n const errorKeys = Object.keys(this.control.errors);\r\n const validators = this.field().validators || [];\r\n return errorKeys.map(key => {\r\n const validator = validators.find(\r\n v => v.type.toLowerCase() === key.toLowerCase(),\r\n );\r\n if (validator && validator.message) {\r\n return validator.message;\r\n }\r\n // Fallback error messages\r\n if (key === 'required') return `${this.field().label} is required`;\r\n if (key === 'email') return 'Please enter a valid email address';\r\n if (key === 'minlength')\r\n return `Minimum length is ${this.control.errors[key].requiredLength}`;\r\n if (key === 'maxlength')\r\n return `Maximum length is ${this.control.errors[key].requiredLength}`;\r\n return `${this.field().label} is invalid due to ${key} validation.`;\r\n });\r\n }\r\n return [];\r\n }\r\n get value() {\r\n return this.fieldFormGroup.get('value');\r\n }\r\n\r\n onFileChange(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files) {\r\n const files = Array.from(input.files);\r\n const value = this.field().multiple ? files : files[0];\r\n this.value.setValue(value);\r\n this.onChange(value);\r\n }\r\n }\r\n\r\n private onChange: (value: any) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n}\r\n","@if (visible()) {\r\n<div [formGroup]=\"fieldFormGroup\" role=\"group\" [attr.aria-labelledby]=\"fieldId + '-label'\">\r\n \r\n <!-- NOTE: Group and Array types are NOT rendered here, they should be rendered at parent level -->\r\n <!-- This component only handles leaf/primitive field types -->\r\n \r\n @if (field().type === 'text') {\r\n <!-- Text Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n [id]=\"fieldId\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'select') {\r\n <!-- Select Dropdown -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <select \r\n [id]=\"fieldId\"\r\n formControlName=\"value\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n <option value=\"\">{{ '::Select' | abpLocalization }}</option>\r\n @for (option of options$ | async; track option.key) {\r\n <option [value]=\"option.key\">\r\n {{ option.value | abpLocalization }}\r\n </option>\r\n }\r\n </select>\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'checkbox') {\r\n <!-- Checkbox -->\r\n <div class=\"form-group form-check mb-3\" role=\"group\">\r\n <abp-checkbox \r\n [label]=\"field().label | abpLocalization\" \r\n formControlName=\"value\" \r\n [id]=\"fieldId\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\" />\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'email') {\r\n <!-- Email Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"email\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\"\r\n autocomplete=\"email\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'textarea') {\r\n <!-- Textarea -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <textarea \r\n [id]=\"fieldId\"\r\n formControlName=\"value\" \r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\"\r\n [class.is-invalid]=\"isInvalid\" \r\n rows=\"4\" \r\n class=\"form-control\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n </textarea>\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'number') {\r\n <!-- Number Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"number\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.min]=\"field().min || null\"\r\n [attr.max]=\"field().max || null\"\r\n [attr.step]=\"field().step || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'date') {\r\n <!-- Date Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"date\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.min]=\"field().min || null\"\r\n [attr.max]=\"field().max || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'datetime-local') {\r\n <!-- DateTime Local Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"datetime-local\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.min]=\"field().min || null\"\r\n [attr.max]=\"field().max || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'time') {\r\n <!-- Time Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"time\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.min]=\"field().min || null\"\r\n [attr.max]=\"field().max || null\"\r\n [attr.step]=\"field().step || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'password') {\r\n <!-- Password Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"password\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.minlength]=\"field().minLength || null\"\r\n [attr.maxlength]=\"field().maxLength || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\"\r\n autocomplete=\"new-password\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'tel') {\r\n <!-- Tel Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"tel\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.pattern]=\"field().pattern || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\"\r\n autocomplete=\"tel\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'url') {\r\n <!-- URL Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"url\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [placeholder]=\"(field().placeholder || '') | abpLocalization\" \r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\"\r\n autocomplete=\"url\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'radio') {\r\n <!-- Radio Group -->\r\n <div class=\"form-group mb-3\" role=\"radiogroup\" [attr.aria-labelledby]=\"fieldId + '-label'\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <div class=\"radio-group\">\r\n @for (option of options$ | async; track option.key) {\r\n <div class=\"form-check\">\r\n <input \r\n type=\"radio\" \r\n [id]=\"fieldId + '-' + option.key\"\r\n [value]=\"option.key\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-check-input\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\">\r\n <label [for]=\"fieldId + '-' + option.key\" class=\"form-check-label\">\r\n {{ option.value | abpLocalization }}\r\n </label>\r\n </div>\r\n }\r\n </div>\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'file') {\r\n <!-- File Input -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <input \r\n type=\"file\" \r\n [id]=\"fieldId\"\r\n (change)=\"onFileChange($event)\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control\"\r\n [attr.accept]=\"field().accept || null\"\r\n [attr.multiple]=\"field().multiple || null\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'range') {\r\n <!-- Range Slider -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <input \r\n type=\"range\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-range flex-grow-1\"\r\n [attr.min]=\"field().min || 0\"\r\n [attr.max]=\"field().max || 100\"\r\n [attr.step]=\"field().step || 1\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\"\r\n [attr.aria-valuenow]=\"value.value\"\r\n [attr.aria-valuemin]=\"field().min || 0\"\r\n [attr.aria-valuemax]=\"field().max || 100\">\r\n <output [for]=\"fieldId\" class=\"badge bg-primary\">{{ value.value }}</output>\r\n </div>\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n } @else if (field().type === 'color') {\r\n <!-- Color Picker -->\r\n <div class=\"form-group mb-3\">\r\n <ng-container [ngTemplateOutlet]=\"labelTemplate\" />\r\n <div class=\"d-flex align-items-center gap-3\">\r\n <input \r\n type=\"color\" \r\n [id]=\"fieldId\"\r\n formControlName=\"value\"\r\n [class.is-invalid]=\"isInvalid\" \r\n class=\"form-control form-control-color\"\r\n [attr.aria-required]=\"field().required || null\"\r\n [attr.aria-invalid]=\"isInvalid || null\"\r\n [attr.aria-describedby]=\"isInvalid ? errorId : null\"\r\n [attr.aria-label]=\"field().label | abpLocalization\">\r\n <code class=\"text-muted\">{{ value.value || '#000000' }}</code>\r\n </div>\r\n @if (isInvalid) {\r\n <ng-container [ngTemplateOutlet]=\"errorTemplate\" />\r\n }\r\n </div>\r\n }\r\n</div>\r\n}\r\n\r\n<ng-template #labelTemplate>\r\n <label \r\n [for]=\"fieldId\"\r\n [id]=\"fieldId + '-label'\"\r\n [class.required]=\"field().required\">\r\n {{ field().label | abpLocalization }}\r\n @if (field().required) {\r\n <span class=\"text-danger\" aria-label=\"required\">*</span>\r\n }\r\n </label>\r\n</ng-template>\r\n\r\n<ng-template #errorTemplate>\r\n <div \r\n class=\"invalid-feedback\" \r\n [id]=\"errorId\"\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\">\r\n @for (error of errors; track error) {\r\n <div>{{ error | abpLocalization }}</div>\r\n }\r\n </div>\r\n</ng-template>","import {\r\n Component,\r\n ViewContainerRef,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n Type,\r\n effect,\r\n DestroyRef,\r\n inject,\r\n input,\r\n viewChild\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor, NG_VALUE_ACCESSOR, FormControl, ReactiveFormsModule\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\ntype controlValueAccessorLike = Partial<ControlValueAccessor> & { setDisabledState?(d: boolean): void };\r\ntype acceptsFormControl = { formControl?: FormControl };\r\n\r\n@Component({\r\n selector: 'abp-dynamic-form-field-host',\r\n imports: [CommonModule, ReactiveFormsModule],\r\n template: `<ng-template #vcRef></ng-template>`,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DynamicFieldHostComponent),\r\n multi: true\r\n }]\r\n})\r\nexport class DynamicFieldHostComponent implements ControlValueAccessor {\r\n component = input<Type<ControlValueAccessor>>();\r\n inputs = input<Record<string, any>>({});\r\n\r\n readonly viewContainerRef = viewChild.required('vcRef', { read: ViewContainerRef });\r\n private componentRef?: any;\r\n\r\n private value: any;\r\n private disabled = false;\r\n\r\n // if child has not implemented ControlValueAccessor. Create form control\r\n private innerControl = new FormControl<any>(null);\r\n readonly destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.component()) {\r\n this.createChild();\r\n } else if (this.componentRef && this.inputs()) {\r\n this.applyInputs();\r\n }\r\n });\r\n }\r\n\r\n private createChild() {\r\n this.viewContainerRef().clear();\r\n if (!this.component()) return;\r\n\r\n this.componentRef = this.viewContainerRef().createComponent(this.component());\r\n this.applyInputs();\r\n\r\n const instance: any = this.componentRef.instance as controlValueAccessorLike & acceptsFormControl;\r\n\r\n if (this.isCVA(instance)) {\r\n // Child CVA ise wrapper -> child delege\r\n instance.registerOnChange?.((v: any) => this.onChange(v));\r\n instance.registerOnTouched?.(() => this.onTouched());\r\n if (this.disabled && instance.setDisabledState) {\r\n instance.setDisabledState(true);\r\n }\r\n // set initial value\r\n if (this.value !== undefined) {\r\n instance.writeValue?.(this.value);\r\n }\r\n } else {\r\n // No CVA -> use form control\r\n if ('formControl' in instance) {\r\n instance.formControl = this.innerControl;\r\n // apply initial value/disabled state\r\n if (this.value !== undefined) {\r\n this.innerControl.setValue(this.value, { emitEvent: false });\r\n }\r\n this.innerControl.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(v => this.onChange(v));\r\n this.innerControl.disabled ? null : (this.disabled && this.innerControl.disable({ emitEvent: false }));\r\n }\r\n }\r\n }\r\n\r\n private applyInputs() {\r\n if (!this.componentRef) return;\r\n const inst = this.componentRef.instance;\r\n for (const [k, v] of Object.entries(this.inputs ?? {})) {\r\n inst[k] = v;\r\n }\r\n this.componentRef.changeDetectorRef?.markForCheck?.();\r\n }\r\n\r\n private isCVA(obj: any): obj is controlValueAccessorLike {\r\n return obj && typeof obj.writeValue === 'function' && typeof obj.registerOnChange === 'function';\r\n }\r\n\r\n writeValue(obj: any): void {\r\n this.value = obj;\r\n if (!this.componentRef) return;\r\n\r\n const inst: any = this.componentRef.instance as controlValueAccessorLike & acceptsFormControl;\r\n\r\n if (this.isCVA(inst)) {\r\n inst.writeValue?.(obj);\r\n } else if ('formControl' in inst && inst.formControl instanceof FormControl) {\r\n inst.formControl.setValue(obj, { emitEvent: false });\r\n }\r\n }\r\n\r\n private onChange: (v: any) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n registerOnChange(fn: any): void { this.onChange = fn; }\r\n registerOnTouched(fn: any): void { this.onTouched = fn; }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n if (!this.componentRef) return;\r\n\r\n const inst = this.componentRef.instance as controlValueAccessorLike & acceptsFormControl;\r\n\r\n if (this.isCVA(inst) && inst.setDisabledState) {\r\n inst.setDisabledState(isDisabled);\r\n } else if ('formControl' in inst && inst.formControl instanceof FormControl) {\r\n isDisabled ? inst.formControl.disable({ emitEvent: false }) : inst.formControl.enable({ emitEvent: false });\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n inject,\r\n ChangeDetectorRef,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { FormGroup, FormArray, FormBuilder, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormFieldConfig } from '../dynamic-form.models';\r\nimport { DynamicFormService } from '../dynamic-form.service';\r\nimport { LocalizationPipe } from '@abp/ng.core';\r\nimport { DynamicFormFieldComponent } from '../dynamic-form-field';\r\nimport { DynamicFormGroupComponent } from '../dynamic-form-group';\r\n\r\n@Component({\r\n selector: 'abp-dynamic-form-array',\r\n templateUrl: './dynamic-form-array.component.html',\r\n styleUrls: ['./dynamic-form-array.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n LocalizationPipe,\r\n DynamicFormFieldComponent,\r\n DynamicFormGroupComponent,\r\n forwardRef(() => DynamicFormArrayComponent), // Self reference for recursion\r\n ],\r\n})\r\nexport class DynamicFormArrayComponent {\r\n arrayConfig = input.required<FormFieldConfig>();\r\n formGroup = input.required<FormGroup>();\r\n visible = input<boolean>(true);\r\n\r\n private fb = inject(FormBuilder);\r\n private dynamicFormService = inject(DynamicFormService);\r\n private cdr = inject(ChangeDetectorRef);\r\n\r\n get formArray(): FormArray {\r\n return this.formGroup().get(this.arrayConfig().key) as FormArray;\r\n }\r\n\r\n get sortedChildren(): FormFieldConfig[] {\r\n const children = this.arrayConfig().children || [];\r\n return children.sort((a, b) => (a.order || 0) - (b.order || 0));\r\n }\r\n\r\n get canAddItem(): boolean {\r\n const maxItems = this.arrayConfig().maxItems;\r\n return maxItems ? this.formArray.length < maxItems : true;\r\n }\r\n\r\n get canRemoveItem(): boolean {\r\n const minItems = this.arrayConfig().minItems || 0;\r\n return this.formArray.length > minItems;\r\n }\r\n\r\n addItem() {\r\n if (!this.canAddItem) return;\r\n \r\n const itemGroup = this.dynamicFormService.createFormGroup(\r\n this.arrayConfig().children || []\r\n );\r\n \r\n this.formArray.push(itemGroup);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n removeItem(index: number) {\r\n if (!this.canRemoveItem) return;\r\n \r\n this.formArray.removeAt(index);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n getItemFormGroup(index: number): FormGroup {\r\n return this.formArray.at(index) as FormGroup;\r\n }\r\n\r\n getNestedFormGroup(index: number, key: string): FormGroup {\r\n return this.getItemFormGroup(index).get(key) as FormGroup;\r\n }\r\n\r\n trackByIndex(index: number): number {\r\n return index;\r\n }\r\n}\r\n","@if (visible()) {\r\n <div class=\"form-array-container\" role=\"region\" [attr.aria-label]=\"arrayConfig().label | abpLocalization\">\r\n \r\n <!-- Header with Add Button -->\r\n <div class=\"array-header d-flex justify-content-between align-items-center mb-3\">\r\n <label class=\"form-array-label\">\r\n {{ arrayConfig().label | abpLocalization }}\r\n @if (arrayConfig().required) {\r\n <span class=\"text-danger\" aria-label=\"required\">*</span>\r\n }\r\n </label>\r\n <button \r\n type=\"button\" \r\n class=\"btn btn-sm btn-primary\"\r\n (click)=\"addItem()\"\r\n [disabled]=\"!canAddItem\"\r\n [attr.aria-label]=\"'Add ' + (arrayConfig().label | abpLocalization)\">\r\n <i class=\"fa fa-plus me-1\"></i>\r\n {{ '::Add' | abpLocalization }}\r\n </button>\r\n </div>\r\n\r\n <!-- Array Items -->\r\n <div class=\"array-items\" role=\"list\">\r\n @for (item of formArray.controls; track trackByIndex($index)) {\r\n <div class=\"array-item border rounded p-3 mb-3\" role=\"listitem\" [formGroup]=\"getItemFormGroup($index)\">\r\n \r\n <!-- Item Header -->\r\n <div class=\"item-header d-flex justify-content-between align-items-center mb-3\">\r\n <strong class=\"item-title\">\r\n {{ arrayConfig().label | abpLocalization }} #{{ $index + 1 }}\r\n </strong>\r\n <button \r\n type=\"button\" \r\n class=\"btn btn-sm btn-danger\"\r\n (click)=\"removeItem($index)\"\r\n [disabled]=\"!canRemoveItem\"\r\n [attr.aria-label]=\"'Remove ' + (arrayConfig().label | abpLocalization) + ' #' + ($index + 1)\">\r\n <i class=\"fa fa-trash me-1\"></i>\r\n {{ '::Remove' | abpLocalization }}\r\n </button>\r\n </div>\r\n\r\n <!-- Item Fields -->\r\n <div class=\"row\">\r\n @for (field of sortedChildren; track field.key) {\r\n <div [ngClass]=\"'col-md-' + (field.gridSize || 12)\">\r\n \r\n <!-- Nested Group -->\r\n @if (field.type === 'group') {\r\n <abp-dynamic-form-group\r\n [groupConfig]=\"field\"\r\n [formGroup]=\"getNestedFormGroup($index, field.key)\" />\r\n }\r\n \r\n <!-- Nested Array (recursive) -->\r\n @else if (field.type === 'array') {\r\n <abp-dynamic-form-array\r\n [arrayConfig]=\"field\"\r\n [formGroup]=\"getItemFormGroup($index)\" />\r\n }\r\n \r\n <!-- Regular Field -->\r\n @else {\r\n <abp-dynamic-form-field\r\n [field]=\"field\"\r\n [formControlName]=\"field.key\" />\r\n }\r\n \r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @empty {\r\n <div class=\"alert alert-info\" role=\"status\">\r\n <i class=\"fa fa-info-circle me-2\"></i>\r\n {{ '::NoItemsAdded' | abpLocalization }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Item Count -->\r\n <div class=\"array-footer text-muted small\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {{ formArray.length }} {{ '::Items' | abpLocalization }}\r\n @if (arrayConfig().minItems) {\r\n ({{ '::Min' | abpLocalization }}: {{ arrayConfig().minItems }})\r\n }\r\n @if (arrayConfig().maxItems) {\r\n ({{ '::Max' | abpLocalization }}: {{ arrayConfig().maxItems }})\r\n }\r\n </div>\r\n </div>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormFieldConfig } from '../dynamic-form.models';\r\nimport { LocalizationPipe } from '@abp/ng.core';\r\nimport { DynamicFormFieldComponent } from '../dynamic-form-field';\r\nimport { DynamicFormArrayComponent } from '../dynamic-form-array';\r\n\r\n@Component({\r\n selector: 'abp-dynamic-form-group',\r\n templateUrl: './dynamic-form-group.component.html',\r\n styleUrls: ['./dynamic-form-group.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n LocalizationPipe,\r\n DynamicFormFieldComponent,\r\n forwardRef(() => DynamicFormArrayComponent),\r\n forwardRef(() => DynamicFormGroupComponent), // Self reference for recursion\r\n ],\r\n})\r\nexport class DynamicFormGroupComponent {\r\n groupConfig = input.required<FormFieldConfig>();\r\n formGroup = input.required<FormGroup>();\r\n visible = input<boolean>(true);\r\n\r\n get sortedChildren(): FormFieldConfig[] {\r\n const children = this.groupConfig().children || [];\r\n return children.sort((a, b) => (a.order || 0) - (b.order || 0));\r\n }\r\n\r\n getChildFormGroup(key: string): FormGroup {\r\n return this.formGroup().get(key) as FormGroup;\r\n }\r\n\r\n getChildControl(key: string) {\r\n return this.formGroup().get(key);\r\n }\r\n}\r\n","@if (visible()) {\r\n <fieldset class=\"form-group-container\" [formGroup]=\"formGroup()\" role=\"group\" [attr.aria-labelledby]=\"groupConfig().key + '-legend'\">\r\n <legend [id]=\"groupConfig().key + '-legend'\" class=\"form-group-legend\">\r\n {{ groupConfig().label | abpLocalization }}\r\n </legend>\r\n \r\n <div class=\"row\">\r\n @for (field of sortedChildren; track field.key) {\r\n <div [ngClass]=\"'col-md-' + (field.gridSize || 12)\">\r\n \r\n <!-- Nested Group (Recursive) -->\r\n @if (field.type === 'group') {\r\n <abp-dynamic-form-group\r\n [groupConfig]=\"field\"\r\n [formGroup]=\"getChildFormGroup(field.key)\" />\r\n }\r\n \r\n <!-- Nested Array -->\r\n @else if (field.type === 'array') {\r\n <abp-dynamic-form-array\r\n [arrayConfig]=\"field\"\r\n [formGroup]=\"formGroup()\" />\r\n }\r\n \r\n <!-- Regular Field -->\r\n @else {\r\n <abp-dynamic-form-field\r\n [field]=\"field\"\r\n [formControlName]=\"field.key\" />\r\n }\r\n \r\n </div>\r\n }\r\n </div>\r\n </fieldset>\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n output,\r\n inject,\r\n OnInit,\r\n DestroyRef,\r\n ChangeDetectorRef,\r\n} from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DynamicFormService } from './dynamic-form.service';\r\nimport { ConditionalAction, FormFieldConfig } from './dynamic-form.models';\r\nimport { DynamicFormFieldComponent, DynamicFieldHostComponent } from './dynamic-form-field';\r\nimport { DynamicFormGroupComponent } from './dynamic-form-group';\r\nimport { DynamicFormArrayComponent } from './dynamic-form-array';\r\n\r\n@Component({\r\n selector: 'abp-dynamic-form',\r\n templateUrl: './dynamic-form.component.html',\r\n styleUrls: ['./dynamic-form.component.scss'],\r\n host: { class: 'abp-dynamic-form' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n exportAs: 'abpDynamicForm',\r\n imports: [\r\n CommonModule,\r\n DynamicFormFieldComponent,\r\n DynamicFormGroupComponent,\r\n DynamicFormArrayComponent,\r\n ReactiveFormsModule,\r\n DynamicFieldHostComponent,\r\n ],\r\n})\r\nexport class DynamicFormComponent implements OnInit {\r\n fields = input<FormFieldConfig[]>([]);\r\n values = input<Record<string, any>>();\r\n submitButtonText = input<string>('Submit');\r\n submitInProgress = input<boolean>(false);\r\n showCancelButton = input<boolean>(false);\r\n onSubmit = output<any>();\r\n formCancel = output<void>();\r\n private dynamicFormService = inject(DynamicFormService);\r\n readonly destroyRef = inject(DestroyRef);\r\n readonly changeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n dynamicForm!: FormGroup;\r\n fieldVisibility: { [key: string]: boolean } = {};\r\n\r\n ngOnInit() {\r\n this.setupFormAndLogic();\r\n }\r\n\r\n get sortedFields(): FormFieldConfig[] {\r\n return this.fields().sort((a, b) => (a.order || 0) - (b.order || 0));\r\n }\r\n\r\n submit() {\r\n if (this.dynamicForm.valid) {\r\n this.onSubmit.emit(this.dynamicForm.getRawValue());\r\n } else {\r\n this.markAllFieldsAsTouched();\r\n this.focusFirstInvalidField();\r\n }\r\n }\r\n\r\n onCancel() {\r\n this.formCancel.emit();\r\n }\r\n\r\n onFieldChange(event: { fieldKey: string; value: any }) {\r\n this.evaluateConditionalLogic(event.fieldKey);\r\n }\r\n\r\n isFieldVisible(field: FormFieldConfig): boolean {\r\n return this.fieldVisibility[field.key] !== false;\r\n }\r\n\r\n getChildFormGroup(key: string): FormGroup {\r\n return this.dynamicForm.get(key) as FormGroup;\r\n }\r\n\r\n resetForm() {\r\n const initialValues: { [key: string]: any } = this.dynamicFormService.getInitialValues(\r\n this.fields(),\r\n );\r\n this.dynamicForm.reset({ ...initialValues });\r\n this.dynamicForm.markAsUntouched();\r\n this.dynamicForm.markAsPristine();\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n\r\n private initializeFieldVisibility() {\r\n this.fields().forEach(field => {\r\n this.fieldVisibility = {\r\n ...this.fieldVisibility,\r\n [field.key]: !field.conditionalLogic?.length,\r\n };\r\n });\r\n }\r\n\r\n private setupConditionalLogic() {\r\n this.fields().forEach(field => {\r\n if (field.conditionalLogic) {\r\n field.conditionalLogic.forEach(rule => {\r\n const dependentControl = this.dynamicForm.get(rule.dependsOn);\r\n if (dependentControl) {\r\n this.evaluateConditionalLogic(field.key);\r\n dependentControl.valueChanges\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.evaluateConditionalLogic(field.key);\r\n });\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n private evaluateConditionalLogic(fieldKey: string) {\r\n const field = this.fields().find(f => f.key === fieldKey);\r\n if (!field?.conditionalLogic) return;\r\n\r\n field.conditionalLogic.forEach(rule => {\r\n const dependentValue = this.dynamicForm.get(rule.dependsOn)?.value;\r\n const conditionMet = this.evaluateCondition(dependentValue, rule.condition, rule.value);\r\n\r\n this.applyConditionalAction(fieldKey, rule.action, conditionMet);\r\n });\r\n }\r\n\r\n private evaluateCondition(fieldValue: any, condition: string, ruleValue: any): boolean {\r\n switch (condition) {\r\n case 'equals':\r\n return fieldValue === ruleValue;\r\n case 'notEquals':\r\n return fieldValue !== ruleValue;\r\n case 'contains':\r\n return fieldValue && fieldValue.includes && fieldValue.includes(ruleValue);\r\n case 'greaterThan':\r\n return Number(fieldValue) > Number(ruleValue);\r\n case 'lessThan':\r\n return Number(fieldValue) < Number(ruleValue);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private applyConditionalAction(fieldKey: string, action: string, shouldApply: boolean) {\r\n const control = this.dynamicForm.get(fieldKey);\r\n\r\n switch (action) {\r\n case ConditionalAction.SHOW:\r\n this.fieldVisibility = { ...this.fieldVisibility, [fieldKey]: shouldApply };\r\n break;\r\n case ConditionalAction.HIDE:\r\n this.fieldVisibility = { ...this.fieldVisibility, [fieldKey]: !shouldApply };\r\n break;\r\n case ConditionalAction.ENABLE:\r\n if (control) {\r\n shouldApply ? control.enable() : control.disable();\r\n }\r\n break;\r\n case ConditionalAction.DISABLE:\r\n if (control) {\r\n shouldApply ? control.disable() : control.enable();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n private setupFormAndLogic() {\r\n this.dynamicForm = this.dynamicFormService.createFormGroup(this.fields());\r\n this.initializeFieldVisibility();\r\n this.setupConditionalLogic();\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n\r\n private markAllFieldsAsTouched() {\r\n Object.keys(this.dynamicForm.controls).forEach(key => {\r\n this.dynamicForm.get(key)?.markAsTouched();\r\n });\r\n }\r\n\r\n private focusFirstInvalidField() {\r\n // Accessibility: Focus first invalid field for screen readers\r\n const firstInvalidField = this.sortedFields.find(field => {\r\n const control = this.dynamicForm.get(field.key);\r\n return control && control.invalid && control.touched;\r\n });\r\n\r\n if (firstInvalidField) {\r\n setTimeout(() => {\r\n const element = document.getElementById(`field-${firstInvalidField.key}`);\r\n if (element) {\r\n element.focus();\r\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }, 100);\r\n }\r\n }\r\n}\r\n","<div class=\"form-wrapper\">\r\n<form \r\n [formGroup]=\"dynamicForm\" \r\n (ngSubmit)=\"submit()\" \r\n class=\"dynamic-form\"\r\n role=\"form\"\r\n [attr.aria-label]=\"'Dynamic Form'\">\r\n <div class=\"row\" role=\"group\">\r\n @for (field of sortedFields; track field.key) {\r\n <div [ngClass]=\"'col-md-' + (field.gridSize || 12)\">\r\n \r\n <!-- Custom Component -->\r\n @if (field.component) {\r\n <abp-dynamic-form-field-host\r\n [component]=\"field.component\"\r\n [inputs]=\"{ field: field, visible: isFieldVisible(field) }\"\r\n formControlName=\"{{ field.key }}\">\r\n </abp-dynamic-form-field-host>\r\n }\r\n \r\n <!-- Nested Group -->\r\n @else if (field.type === 'group') {\r\n <abp-dynamic-form-group\r\n [groupConfig]=\"field\"\r\n [formGroup]=\"getChildFormGroup(field.key)\"\r\n [visible]=\"isFieldVisible(field)\">\r\n </abp-dynamic-form-group>\r\n }\r\n \r\n <!-- Nested Array -->\r\n @else if (field.type === 'array') {\r\n <abp-dynamic-form-array\r\n [arrayConfig]=\"field\"\r\n [formGroup]=\"dynamicForm\"\r\n [visible]=\"isFieldVisible(field)\">\r\n </abp-dynamic-form-array>\r\n }\r\n \r\n <!-- Regular Field -->\r\n @else {\r\n <abp-dynamic-form-field\r\n [field]=\"field\"\r\n [formControlName]=\"field.key\"\r\n [visible]=\"isFieldVisible(field)\">\r\n </abp-dynamic-form-field>\r\n }\r\n \r\n </div>\r\n }\r\n </div>\r\n <ng-content select=\"[actions]\">\r\n <ng-container [ngTemplateOutlet]=\"defaultActions\"></ng-container>\r\n </ng-content>\r\n\r\n</form>\r\n\r\n<ng-template #defaultActions>\r\n <div class=\"form-actions\" role=\"group\" aria-label=\"Form actions\">\r\n @if (showCancelButton()) {\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-secondary\"\r\n (click)=\"onCancel()\"\r\n aria-label=\"Cancel form\">\r\n Cancel\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"!dynamicForm.valid || submitInProgress()\"\r\n [attr.aria-busy]=\"submitInProgress() || null\"\r\n [attr.aria-label]=\"submitInProgress() ? 'Submitting form...' : submitButtonText()\">\r\n {{ submitButtonText() }}\r\n </button>\r\n </div>\r\n</ng-template>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}