@masterteam/forms 0.0.75 → 0.0.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/forms.css +2 -2
- package/fesm2022/masterteam-forms-client-form.mjs +51 -10
- package/fesm2022/masterteam-forms-client-form.mjs.map +1 -1
- package/fesm2022/masterteam-forms-dynamic-form.mjs +7 -0
- package/fesm2022/masterteam-forms-dynamic-form.mjs.map +1 -1
- package/package.json +2 -2
- package/types/masterteam-forms-client-form.d.ts +3 -0
- package/types/masterteam-forms-dynamic-form.d.ts +2 -0
|
@@ -207,6 +207,13 @@ class DynamicForm {
|
|
|
207
207
|
formulaRules: hasBlockingRuleErrors ? ruleErrors : null,
|
|
208
208
|
};
|
|
209
209
|
}
|
|
210
|
+
markAllAsTouched() {
|
|
211
|
+
this.form.markAllAsTouched();
|
|
212
|
+
this.onTouched();
|
|
213
|
+
}
|
|
214
|
+
isControlInvalid(fieldKey) {
|
|
215
|
+
return !!this.form.get(fieldKey)?.invalid;
|
|
216
|
+
}
|
|
210
217
|
/**
|
|
211
218
|
* Calculate default field state based on relations
|
|
212
219
|
* If field has 'show' action → start hidden (opposite)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-forms-dynamic-form.mjs","sources":["../../../../packages/masterteam/forms/dynamic-form/dynamic-form.ts","../../../../packages/masterteam/forms/dynamic-form/dynamic-form.html","../../../../packages/masterteam/forms/dynamic-form/masterteam-forms-dynamic-form.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n output,\r\n effect,\r\n OnDestroy,\r\n forwardRef,\r\n inject,\r\n signal,\r\n computed,\r\n untracked,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n AbstractControl,\r\n ValidatorFn,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n Validator,\r\n ValidationErrors,\r\n NG_VALIDATORS,\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { DynamicField } from '@masterteam/forms/dynamic-field';\r\nimport { SortPipe } from '@masterteam/forms/pipes';\r\n// import { SortPipe } from '../pipes/sort.pipe';\r\nimport {\r\n DynamicFormConfig,\r\n ValidatorConfig,\r\n createCustomValidator,\r\n wrapValidatorWithMessage,\r\n FieldState,\r\n FormulaRuntimeMessage,\r\n SectionConfig,\r\n} from '@masterteam/components';\r\nimport { Subscription } from 'rxjs';\r\nimport {\r\n FormulaRuntimeEngine,\r\n type FormulaConditionEvaluation,\r\n} from '@masterteam/components/formula';\r\n\r\n@Component({\r\n selector: 'mt-dynamic-form',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, DynamicField, SortPipe],\r\n templateUrl: './dynamic-form.html',\r\n styleUrls: ['./dynamic-form.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DynamicForm),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => DynamicForm),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DynamicForm implements OnDestroy, ControlValueAccessor, Validator {\r\n private fb = inject(FormBuilder);\r\n private transloco = inject(TranslocoService);\r\n private readonly formulaEngine = new FormulaRuntimeEngine();\r\n\r\n readonly formConfig = input.required<DynamicFormConfig>();\r\n readonly forcedHiddenFieldKeys = input<string[]>([]);\r\n readonly preserveForcedHiddenValues = input<boolean>(true);\r\n readonly visibleSectionKeys = input<string[] | null>(null);\r\n readonly runtimeMessagesChange = output<FormulaRuntimeMessage[]>();\r\n\r\n form = new FormGroup({});\r\n private formBuilt = signal(false);\r\n private initValue = signal<any>({});\r\n\r\n // ControlValueAccessor implementation\r\n private onChange = (_value: any) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n private formSubscription?: Subscription;\r\n private fieldStates = signal<Record<string, FieldState>>({});\r\n private readonly conditionRuntimeMessages = signal<FormulaRuntimeMessage[]>(\r\n [],\r\n );\r\n private readonly validationRuleErrors = signal<FormulaRuntimeMessage[]>([]);\r\n private readonly validationRuleWarnings = signal<FormulaRuntimeMessage[]>([]);\r\n private readonly DEFAULT_GRID_COLUMNS = 12;\r\n\r\n readonly runtimeMessages = computed(() => [\r\n ...this.conditionRuntimeMessages(),\r\n ...this.validationRuleErrors(),\r\n ...this.validationRuleWarnings(),\r\n ]);\r\n\r\n // Computed signal for field visibility - better performance\r\n readonly hiddenFields = computed(() => {\r\n const states = this.fieldStates();\r\n const hidden: Record<string, boolean> = {};\r\n Object.keys(states).forEach((key) => {\r\n hidden[key] = states[key].hidden;\r\n });\r\n return hidden;\r\n });\r\n\r\n readonly fieldColSpanStyles = computed(() => {\r\n const styles: Record<string, { [key: string]: string }> = {};\r\n const config = this.formConfig();\r\n\r\n config.sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (!field.key) return;\r\n if (!field.cssClass && !section.cssClass) {\r\n styles[field.key] = {\r\n 'grid-column': this.getColSpanStyleValue(field.colSpan),\r\n };\r\n }\r\n });\r\n });\r\n\r\n return styles;\r\n });\r\n\r\n readonly sectionGridStyles = computed(() => {\r\n const styles: Record<string, { [key: string]: string }> = {};\r\n const config = this.formConfig();\r\n\r\n config.sections.forEach((section, index) => {\r\n if (section.bodyClass) return;\r\n const key = this.getSectionStateKey(section, index);\r\n const cols = section.columns || this.DEFAULT_GRID_COLUMNS;\r\n styles[key] = {\r\n 'grid-template-columns': `repeat(${cols}, minmax(0, 1fr))`,\r\n };\r\n });\r\n\r\n return styles;\r\n });\r\n\r\n constructor() {\r\n // Effect to rebuild form when config changes\r\n effect(() => {\r\n this.buildForm();\r\n this.formBuilt.set(true);\r\n const initValue = untracked(() => this.initValue());\r\n if (initValue && Object.keys(initValue)?.length > 0) {\r\n this.form.patchValue(initValue, { emitEvent: false });\r\n this.initValue.set(null);\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n }\r\n });\r\n\r\n effect(() => {\r\n this.forcedHiddenFieldKeys();\r\n\r\n if (!this.formBuilt()) {\r\n return;\r\n }\r\n\r\n untracked(() => {\r\n this.evaluateRelations();\r\n });\r\n });\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void {\r\n this.onValidatorChange = fn;\r\n }\r\n registerOnChange(fn: (value: any) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n private buildForm() {\r\n if (this.formBuilt()) {\r\n return;\r\n }\r\n if (this.formSubscription) {\r\n this.formSubscription.unsubscribe();\r\n }\r\n\r\n const formControls: { [key: string]: AbstractControl } = {};\r\n const fieldStateMap: Record<string, FieldState> = {};\r\n\r\n this.formConfig().sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (field.key) {\r\n // Calculate default state from relations\r\n const defaultState = this.getDefaultFieldState(field);\r\n\r\n fieldStateMap[field.key] = {\r\n hidden: defaultState.hidden,\r\n disabled: defaultState.disabled,\r\n };\r\n\r\n const validators = this.buildValidators(field.validators || []);\r\n\r\n if (!this.shouldCreateControl(field.type)) {\r\n return;\r\n }\r\n\r\n // Check if field key contains dot notation (e.g., \"name.ar\", \"name.en\")\r\n if (field.key.includes('.')) {\r\n const [parentKey, childKey] = field.key.split('.');\r\n\r\n // Create or get the parent FormGroup\r\n if (!formControls[parentKey]) {\r\n formControls[parentKey] = this.fb.group({});\r\n }\r\n\r\n const parentGroup = formControls[parentKey] as FormGroup;\r\n\r\n // Add the child control to the parent group\r\n const control = this.fb.control(\r\n {\r\n value: null,\r\n disabled: defaultState.disabled,\r\n },\r\n validators,\r\n );\r\n\r\n parentGroup.addControl(childKey, control);\r\n } else {\r\n // Regular field without nesting\r\n const control = this.fb.control(\r\n {\r\n value: null,\r\n disabled: defaultState.disabled,\r\n },\r\n validators,\r\n );\r\n formControls[field.key] = control;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.form = this.fb.group(formControls);\r\n this.fieldStates.set(fieldStateMap);\r\n\r\n // Subscribe to form value changes and evaluate all relations\r\n this.formSubscription = this.form.valueChanges.subscribe(() => {\r\n this.refreshControlValidity();\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n });\r\n\r\n // Evaluate initial relations state\r\n this.evaluateRelations();\r\n\r\n // Trigger initial validation state\r\n // this.onValidatorChange();\r\n // this.onChange(this.form.getRawValue());\r\n }\r\n\r\n private shouldCreateControl(fieldType: string | undefined): boolean {\r\n return fieldType !== 'spacer' && fieldType !== 'lookup-matrix';\r\n }\r\n\r\n private refreshControlValidity(control: AbstractControl = this.form): void {\r\n if (control instanceof FormGroup) {\r\n Object.values(control.controls).forEach((childControl) => {\r\n this.refreshControlValidity(childControl);\r\n });\r\n control.updateValueAndValidity({ emitEvent: false });\r\n return;\r\n }\r\n\r\n control.updateValueAndValidity({ onlySelf: true, emitEvent: false });\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: any): void {\r\n if (value && this.form && this.formBuilt()) {\r\n this.form.patchValue(value, { emitEvent: false });\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n } else if (value && !this.formBuilt()) {\r\n this.initValue.set(value);\r\n }\r\n }\r\n\r\n validate(_control: AbstractControl): ValidationErrors | null {\r\n if (!this.form) {\r\n return null;\r\n }\r\n const ruleErrors = this.validationRuleErrors();\r\n const hasBlockingRuleErrors = ruleErrors.length > 0;\r\n if (this.form.valid && !hasBlockingRuleErrors) {\r\n return null;\r\n }\r\n\r\n return {\r\n invalidForm: true,\r\n formulaRules: hasBlockingRuleErrors ? ruleErrors : null,\r\n };\r\n }\r\n\r\n /**\r\n * Calculate default field state based on relations\r\n * If field has 'show' action → start hidden (opposite)\r\n * If field has 'enable' action → start disabled (opposite)\r\n */\r\n private getDefaultFieldState(field: any): {\r\n hidden: boolean;\r\n disabled: boolean;\r\n } {\r\n let hidden = !!field.hidden;\r\n let disabled = !!field.disabled;\r\n\r\n // If has relations, set opposite state\r\n if (field.relations?.length) {\r\n field.relations.forEach((relation: any) => {\r\n if (relation.action === 'show') {\r\n hidden = true;\r\n } else if (relation.action === 'hide') {\r\n hidden = false;\r\n } else if (relation.action === 'enable') {\r\n disabled = true;\r\n } else if (relation.action === 'disable') {\r\n disabled = false;\r\n }\r\n });\r\n }\r\n\r\n if (\r\n field.formulaCondition?.mode &&\r\n field.formulaCondition.mode !== 'auto'\r\n ) {\r\n if (field.formulaCondition.mode === 'show') {\r\n hidden = true;\r\n } else if (field.formulaCondition.mode === 'hide') {\r\n hidden = false;\r\n } else if (field.formulaCondition.mode === 'enable') {\r\n disabled = true;\r\n } else if (field.formulaCondition.mode === 'disable') {\r\n disabled = false;\r\n }\r\n }\r\n\r\n return { hidden, disabled };\r\n }\r\n\r\n /**\r\n * Evaluate all relations - runs on every form change\r\n * Simple: if dependency matches → apply action, else apply opposite\r\n */\r\n private evaluateRelations() {\r\n const newStates: Record<string, FieldState> = {};\r\n const conditionMessages: FormulaRuntimeMessage[] = [];\r\n const forcedHiddenFields = new Set(this.forcedHiddenFieldKeys() ?? []);\r\n const values = this.form.getRawValue();\r\n\r\n // Process all fields with relations\r\n this.formConfig().sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (!field.key) {\r\n return;\r\n }\r\n\r\n // Calculate default state\r\n const defaultState = this.getDefaultFieldState(field);\r\n\r\n // Start with default\r\n newStates[field.key] = {\r\n hidden: defaultState.hidden,\r\n disabled: defaultState.disabled,\r\n };\r\n\r\n // If has relations, check and apply\r\n if (field.relations?.length) {\r\n field.relations.forEach((relation) => {\r\n const dependencyControl = this.form.get(relation.key);\r\n if (!dependencyControl) {\r\n return;\r\n }\r\n\r\n const matches = this.doesRelationMatch(\r\n dependencyControl.value,\r\n relation.value,\r\n );\r\n\r\n // If matches, apply the action\r\n if (matches) {\r\n const state = newStates[field.key!];\r\n switch (relation.action) {\r\n case 'show':\r\n state.hidden = false;\r\n break;\r\n case 'hide':\r\n state.hidden = true;\r\n break;\r\n case 'enable':\r\n state.disabled = false;\r\n break;\r\n case 'disable':\r\n state.disabled = true;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (field.formulaCondition) {\r\n const conditionResult: FormulaConditionEvaluation =\r\n this.formulaEngine.evaluateCondition(field.formulaCondition, {\r\n values,\r\n });\r\n\r\n if (conditionResult.errors.length > 0) {\r\n conditionMessages.push(\r\n ...conditionResult.errors.map<FormulaRuntimeMessage>((error) => ({\r\n code: error.code,\r\n severity: 'warning',\r\n message: this.transloco.translate(\r\n 'clientForm.condition-formula-failed',\r\n { key: field.key, message: error.message },\r\n ),\r\n formulaText: field.formulaCondition?.formulaText,\r\n fieldKey: field.key,\r\n })),\r\n );\r\n } else {\r\n if (typeof conditionResult.hidden === 'boolean') {\r\n newStates[field.key].hidden = conditionResult.hidden;\r\n }\r\n if (typeof conditionResult.disabled === 'boolean') {\r\n newStates[field.key].disabled = conditionResult.disabled;\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n forcedHiddenFields.forEach((fieldKey) => {\r\n if (!newStates[fieldKey]) return;\r\n newStates[fieldKey].hidden = true;\r\n newStates[fieldKey].disabled = true;\r\n });\r\n\r\n // Update states\r\n this.fieldStates.set(newStates);\r\n\r\n // Sync form controls and clear values when disabled/hidden\r\n Object.keys(newStates).forEach((key) => {\r\n const control = this.form.get(key);\r\n if (!control) {\r\n return;\r\n }\r\n\r\n const state = newStates[key];\r\n const hiddenByExternalOverride = forcedHiddenFields.has(key);\r\n const keepValueWhenHidden =\r\n hiddenByExternalOverride && this.preserveForcedHiddenValues();\r\n const shouldDisable = state.hidden || state.disabled;\r\n\r\n // Handle disabled state changes\r\n if (shouldDisable && !control.disabled) {\r\n control.disable({ emitEvent: false });\r\n if (!keepValueWhenHidden) {\r\n control.reset(undefined, { emitEvent: false }); // Clear value when disabled\r\n }\r\n } else if (!shouldDisable && control.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n\r\n // Clear value when hidden\r\n if (state.hidden && control.value && !keepValueWhenHidden) {\r\n control.reset(undefined, { emitEvent: false }); // Clear value when hidden\r\n }\r\n });\r\n\r\n this.conditionRuntimeMessages.set(conditionMessages);\r\n this.evaluateFormValidationRules(newStates, this.form.getRawValue());\r\n this.runtimeMessagesChange.emit(this.runtimeMessages());\r\n this.onValidatorChange();\r\n }\r\n\r\n private doesRelationMatch(sourceValue: any, targetValue: any): boolean {\r\n if (Array.isArray(sourceValue)) {\r\n if (Array.isArray(targetValue)) {\r\n return targetValue.every((value) => sourceValue.includes(value));\r\n }\r\n return sourceValue.includes(targetValue);\r\n }\r\n return sourceValue === targetValue;\r\n }\r\n\r\n private evaluateFormValidationRules(\r\n fieldStates: Record<string, FieldState>,\r\n values: Record<string, any>,\r\n ): void {\r\n const validationRules = this.formConfig().validationRules ?? [];\r\n const evaluation = this.formulaEngine.evaluateValidationRules(\r\n validationRules,\r\n { values },\r\n {\r\n isDependencyActive: (dependency: string) => {\r\n const state = fieldStates[dependency];\r\n return !state || (!state.hidden && !state.disabled);\r\n },\r\n },\r\n );\r\n\r\n this.validationRuleErrors.set(evaluation.errors);\r\n this.validationRuleWarnings.set(evaluation.warnings);\r\n }\r\n\r\n private buildValidators(validatorConfigs: ValidatorConfig[]): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n validatorConfigs.forEach((config) => {\r\n let validator: ValidatorFn | null = null;\r\n\r\n switch (config.type) {\r\n case 'required':\r\n validator = Validators.required;\r\n break;\r\n case 'email':\r\n validator = Validators.email;\r\n break;\r\n case 'minLength':\r\n if (config.value) {\r\n validator = Validators.minLength(config.value);\r\n }\r\n break;\r\n case 'maxLength':\r\n if (config.value) {\r\n validator = Validators.maxLength(config.value);\r\n }\r\n break;\r\n case 'min':\r\n if (config.value !== undefined) {\r\n validator = Validators.min(config.value);\r\n }\r\n break;\r\n case 'max':\r\n if (config.value !== undefined) {\r\n validator = Validators.max(config.value);\r\n }\r\n break;\r\n case 'pattern':\r\n if (config.value) {\r\n validator = Validators.pattern(config.value);\r\n }\r\n break;\r\n case 'custom':\r\n if (config.customValidator) {\r\n validators.push(\r\n createCustomValidator(config.customValidator, config.message),\r\n );\r\n }\r\n break;\r\n }\r\n\r\n // If we have a validator and a custom message, wrap it\r\n if (validator && config.message) {\r\n validators.push(\r\n wrapValidatorWithMessage(validator, config.type, config.message),\r\n );\r\n } else if (validator) {\r\n validators.push(validator);\r\n }\r\n });\r\n\r\n return validators;\r\n }\r\n\r\n private getSectionStateKey(section: SectionConfig, index: number): string {\r\n return section.key || `section-${index}`;\r\n }\r\n\r\n protected shouldRenderSection(\r\n section: SectionConfig,\r\n index: number,\r\n ): boolean {\r\n const visibleSectionKeys = this.visibleSectionKeys();\r\n if (!visibleSectionKeys?.length) {\r\n return true;\r\n }\r\n\r\n return visibleSectionKeys.includes(this.getSectionStateKey(section, index));\r\n }\r\n\r\n private getColSpanStyleValue(colSpan?: number | any): string {\r\n if (!colSpan) {\r\n return `span ${this.DEFAULT_GRID_COLUMNS} / span ${this.DEFAULT_GRID_COLUMNS}`;\r\n }\r\n\r\n if (typeof colSpan === 'number') {\r\n return `span ${colSpan} / span ${colSpan}`;\r\n }\r\n\r\n const breakpointKeys = ['xs', 'sm', 'md', 'lg', 'xl'] as const;\r\n const span =\r\n breakpointKeys\r\n .map((key) => colSpan[key])\r\n .find((value) => value !== undefined) ?? this.DEFAULT_GRID_COLUMNS;\r\n\r\n return `span ${span} / span ${span}`;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.formSubscription) {\r\n this.formSubscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\">\r\n <div\r\n class=\"flex flex-col gap-6\"\r\n [class]=\"formConfig().layout?.containerClass\"\r\n >\r\n @for (\r\n section of formConfig().sections | sort: \"order\";\r\n track section.key || $index\r\n ) {\r\n @if (shouldRenderSection(section, $index)) {\r\n <div\r\n [class]=\"\r\n section.cssClass ||\r\n formConfig().layout?.sectionClass ||\r\n 'flex flex-col gap-4'\r\n \"\r\n >\r\n @if (section.type === \"header\" && section.label) {\r\n <h3\r\n [class]=\"\r\n section?.headerClass ||\r\n 'text-lg font-semibold text-color border-b-2 border-gray-200 pb-2 mb-3'\r\n \"\r\n >\r\n {{ section.label }}\r\n </h3>\r\n }\r\n\r\n <div\r\n [class]=\"section?.bodyClass || '@container grid gap-4 items-start'\"\r\n [style]=\"\r\n !section?.bodyClass\r\n ? sectionGridStyles()[section.key || 'section-' + $index]\r\n : {}\r\n \"\r\n >\r\n @for (field of section.fields | sort: \"order\"; track field.key) {\r\n <div\r\n [class]=\"\r\n field.cssClass ||\r\n formConfig().layout?.fieldClass ||\r\n 'flex flex-col h-full justify-center gap-1'\r\n \"\r\n [style]=\"fieldColSpanStyles()[field.key!]\"\r\n [hidden]=\"field.type !== 'spacer' && hiddenFields()[field.key!]\"\r\n >\r\n @if (field.type === \"spacer\") {\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"field.key!\"\r\n />\r\n } @else if (field.key!.includes(\".\")) {\r\n <!-- Handle nested fields (e.g., name.ar, name.en) -->\r\n @let parentKey = field.key!.split(\".\")[0];\r\n @let childKey = field.key!.split(\".\")[1];\r\n <div [formGroup]=\"form.get(parentKey)\">\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"childKey\"\r\n />\r\n </div>\r\n } @else {\r\n <!-- Handle regular fields -->\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"field.key!\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</form>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;MAgEa,WAAW,CAAA;AACd,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AACxB,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3B,IAAA,aAAa,GAAG,IAAI,oBAAoB,EAAE;AAElD,IAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,gFAAqB;AAChD,IAAA,qBAAqB,GAAG,KAAK,CAAW,EAAE,4FAAC;AAC3C,IAAA,0BAA0B,GAAG,KAAK,CAAU,IAAI,iGAAC;AACjD,IAAA,kBAAkB,GAAG,KAAK,CAAkB,IAAI,yFAAC;IACjD,qBAAqB,GAAG,MAAM,EAA2B;AAElE,IAAA,IAAI,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC;AAChB,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,gFAAC;AACzB,IAAA,SAAS,GAAG,MAAM,CAAM,EAAE,gFAAC;;AAG3B,IAAA,QAAQ,GAAG,CAAC,MAAW,KAAI,EAAE,CAAC;AAC9B,IAAA,SAAS,GAAG,MAAK,EAAE,CAAC;AACpB,IAAA,iBAAiB,GAAG,MAAK,EAAE,CAAC;AAC5B,IAAA,gBAAgB;AAChB,IAAA,WAAW,GAAG,MAAM,CAA6B,EAAE,kFAAC;AAC3C,IAAA,wBAAwB,GAAG,MAAM,CAChD,EAAE,+FACH;AACgB,IAAA,oBAAoB,GAAG,MAAM,CAA0B,EAAE,2FAAC;AAC1D,IAAA,sBAAsB,GAAG,MAAM,CAA0B,EAAE,6FAAC;IAC5D,oBAAoB,GAAG,EAAE;AAEjC,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM;QACxC,GAAG,IAAI,CAAC,wBAAwB,EAAE;QAClC,GAAG,IAAI,CAAC,oBAAoB,EAAE;QAC9B,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACjC,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;;AAGO,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;QACjC,MAAM,MAAM,GAA4B,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YAClC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM;AAClC,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,mFAAC;AAEO,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;QAC1C,MAAM,MAAM,GAA8C,EAAE;AAC5D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAEhC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YAClC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;gBAC/B,IAAI,CAAC,KAAK,CAAC,GAAG;oBAAE;gBAChB,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;AACxC,oBAAA,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;wBAClB,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC;qBACxD;gBACH;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,yFAAC;AAEO,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,MAAM,GAA8C,EAAE;AAC5D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAEhC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,KAAI;YACzC,IAAI,OAAO,CAAC,SAAS;gBAAE;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC;YACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,oBAAoB;YACzD,MAAM,CAAC,GAAG,CAAC,GAAG;gBACZ,uBAAuB,EAAE,CAAA,OAAA,EAAU,IAAI,CAAA,iBAAA,CAAmB;aAC3D;AACH,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,wFAAC;AAEF,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;AACnD,YAAA,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE;AACnD,gBAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACrD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxB,IAAI,CAAC,iBAAiB,EAAE;gBACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,qBAAqB,EAAE;AAE5B,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;gBACrB;YACF;YAEA,SAAS,CAAC,MAAK;gBACb,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,yBAAyB,CAAC,EAAc,EAAA;AACtC,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE;IAC7B;AACA,IAAA,gBAAgB,CAAC,EAAwB,EAAA;AACvC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACpB;QACF;AACA,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE;QACrC;QAEA,MAAM,YAAY,GAAuC,EAAE;QAC3D,MAAM,aAAa,GAA+B,EAAE;QAEpD,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC/B,gBAAA,IAAI,KAAK,CAAC,GAAG,EAAE;;oBAEb,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;AAErD,oBAAA,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;wBACzB,MAAM,EAAE,YAAY,CAAC,MAAM;wBAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;qBAChC;AAED,oBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;oBAE/D,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;wBACzC;oBACF;;oBAGA,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC3B,wBAAA,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;;AAGlD,wBAAA,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE;AAC5B,4BAAA,YAAY,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC7C;AAEA,wBAAA,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,CAAc;;AAGxD,wBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC7B;AACE,4BAAA,KAAK,EAAE,IAAI;4BACX,QAAQ,EAAE,YAAY,CAAC,QAAQ;yBAChC,EACD,UAAU,CACX;AAED,wBAAA,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC;oBAC3C;yBAAO;;AAEL,wBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC7B;AACE,4BAAA,KAAK,EAAE,IAAI;4BACX,QAAQ,EAAE,YAAY,CAAC,QAAQ;yBAChC,EACD,UAAU,CACX;AACD,wBAAA,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO;oBACnC;gBACF;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;AACvC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC;;AAGnC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;YAC5D,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACxC,QAAA,CAAC,CAAC;;QAGF,IAAI,CAAC,iBAAiB,EAAE;;;;IAK1B;AAEQ,IAAA,mBAAmB,CAAC,SAA6B,EAAA;AACvD,QAAA,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,eAAe;IAChE;AAEQ,IAAA,sBAAsB,CAAC,OAAA,GAA2B,IAAI,CAAC,IAAI,EAAA;AACjE,QAAA,IAAI,OAAO,YAAY,SAAS,EAAE;AAChC,YAAA,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,KAAI;AACvD,gBAAA,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC;AAC3C,YAAA,CAAC,CAAC;YACF,OAAO,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACpD;QACF;AAEA,QAAA,OAAO,CAAC,sBAAsB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACtE;;AAGA,IAAA,UAAU,CAAC,KAAU,EAAA;QACnB,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AAC1C,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACjD,IAAI,CAAC,iBAAiB,EAAE;YACxB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC;aAAO,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;AACrC,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA,IAAA,QAAQ,CAAC,QAAyB,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AACd,YAAA,OAAO,IAAI;QACb;AACA,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC9C,QAAA,MAAM,qBAAqB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC;QACnD,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,qBAAqB,EAAE;AAC7C,YAAA,OAAO,IAAI;QACb;QAEA,OAAO;AACL,YAAA,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,qBAAqB,GAAG,UAAU,GAAG,IAAI;SACxD;IACH;AAEA;;;;AAIG;AACK,IAAA,oBAAoB,CAAC,KAAU,EAAA;AAIrC,QAAA,IAAI,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM;AAC3B,QAAA,IAAI,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ;;AAG/B,QAAA,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE;YAC3B,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAa,KAAI;AACxC,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE;oBAC9B,MAAM,GAAG,IAAI;gBACf;AAAO,qBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE;oBACrC,MAAM,GAAG,KAAK;gBAChB;AAAO,qBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;oBACvC,QAAQ,GAAG,IAAI;gBACjB;AAAO,qBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE;oBACxC,QAAQ,GAAG,KAAK;gBAClB;AACF,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IACE,KAAK,CAAC,gBAAgB,EAAE,IAAI;AAC5B,YAAA,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,MAAM,EACtC;YACA,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,MAAM,EAAE;gBAC1C,MAAM,GAAG,IAAI;YACf;iBAAO,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,MAAM,EAAE;gBACjD,MAAM,GAAG,KAAK;YAChB;iBAAO,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACnD,QAAQ,GAAG,IAAI;YACjB;iBAAO,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,KAAK,SAAS,EAAE;gBACpD,QAAQ,GAAG,KAAK;YAClB;QACF;AAEA,QAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;IAC7B;AAEA;;;AAGG;IACK,iBAAiB,GAAA;QACvB,MAAM,SAAS,GAA+B,EAAE;QAChD,MAAM,iBAAiB,GAA4B,EAAE;AACrD,QAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;;QAGtC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YAC7C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;oBACd;gBACF;;gBAGA,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;;AAGrD,gBAAA,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;oBACrB,MAAM,EAAE,YAAY,CAAC,MAAM;oBAC3B,QAAQ,EAAE,YAAY,CAAC,QAAQ;iBAChC;;AAGD,gBAAA,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE;oBAC3B,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AACnC,wBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;wBACrD,IAAI,CAAC,iBAAiB,EAAE;4BACtB;wBACF;AAEA,wBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CACpC,iBAAiB,CAAC,KAAK,EACvB,QAAQ,CAAC,KAAK,CACf;;wBAGD,IAAI,OAAO,EAAE;4BACX,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAI,CAAC;AACnC,4BAAA,QAAQ,QAAQ,CAAC,MAAM;AACrB,gCAAA,KAAK,MAAM;AACT,oCAAA,KAAK,CAAC,MAAM,GAAG,KAAK;oCACpB;AACF,gCAAA,KAAK,MAAM;AACT,oCAAA,KAAK,CAAC,MAAM,GAAG,IAAI;oCACnB;AACF,gCAAA,KAAK,QAAQ;AACX,oCAAA,KAAK,CAAC,QAAQ,GAAG,KAAK;oCACtB;AACF,gCAAA,KAAK,SAAS;AACZ,oCAAA,KAAK,CAAC,QAAQ,GAAG,IAAI;oCACrB;;wBAEN;AACF,oBAAA,CAAC,CAAC;gBACJ;AAEA,gBAAA,IAAI,KAAK,CAAC,gBAAgB,EAAE;oBAC1B,MAAM,eAAe,GACnB,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,EAAE;wBAC3D,MAAM;AACP,qBAAA,CAAC;oBAEJ,IAAI,eAAe,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACrC,wBAAA,iBAAiB,CAAC,IAAI,CACpB,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAwB,CAAC,KAAK,MAAM;4BAC/D,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,4BAAA,QAAQ,EAAE,SAAS;4BACnB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAC/B,qCAAqC,EACrC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAC3C;AACD,4BAAA,WAAW,EAAE,KAAK,CAAC,gBAAgB,EAAE,WAAW;4BAChD,QAAQ,EAAE,KAAK,CAAC,GAAG;yBACpB,CAAC,CAAC,CACJ;oBACH;yBAAO;AACL,wBAAA,IAAI,OAAO,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE;4BAC/C,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM;wBACtD;AACA,wBAAA,IAAI,OAAO,eAAe,CAAC,QAAQ,KAAK,SAAS,EAAE;4BACjD,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ;wBAC1D;oBACF;gBACF;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,kBAAkB,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AACtC,YAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;gBAAE;AAC1B,YAAA,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,IAAI;AACjC,YAAA,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,IAAI;AACrC,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;;QAG/B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE;gBACZ;YACF;AAEA,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC;YAC5B,MAAM,wBAAwB,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC;YAC5D,MAAM,mBAAmB,GACvB,wBAAwB,IAAI,IAAI,CAAC,0BAA0B,EAAE;YAC/D,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ;;AAGpD,YAAA,IAAI,aAAa,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;gBACtC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACrC,IAAI,CAAC,mBAAmB,EAAE;AACxB,oBAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACjD;YACF;AAAO,iBAAA,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE;gBAC7C,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACtC;;YAGA,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,mBAAmB,EAAE;AACzD,gBAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,iBAAiB,CAAC;AACpD,QAAA,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACpE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvD,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEQ,iBAAiB,CAAC,WAAgB,EAAE,WAAgB,EAAA;AAC1D,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC9B,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AAC9B,gBAAA,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClE;AACA,YAAA,OAAO,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1C;QACA,OAAO,WAAW,KAAK,WAAW;IACpC;IAEQ,2BAA2B,CACjC,WAAuC,EACvC,MAA2B,EAAA;QAE3B,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,eAAe,IAAI,EAAE;AAC/D,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAC3D,eAAe,EACf,EAAE,MAAM,EAAE,EACV;AACE,YAAA,kBAAkB,EAAE,CAAC,UAAkB,KAAI;AACzC,gBAAA,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC;AACrC,gBAAA,OAAO,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YACrD,CAAC;AACF,SAAA,CACF;QAED,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAChD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;IACtD;AAEQ,IAAA,eAAe,CAAC,gBAAmC,EAAA;QACzD,MAAM,UAAU,GAAkB,EAAE;AAEpC,QAAA,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;YAClC,IAAI,SAAS,GAAuB,IAAI;AAExC,YAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,gBAAA,KAAK,UAAU;AACb,oBAAA,SAAS,GAAG,UAAU,CAAC,QAAQ;oBAC/B;AACF,gBAAA,KAAK,OAAO;AACV,oBAAA,SAAS,GAAG,UAAU,CAAC,KAAK;oBAC5B;AACF,gBAAA,KAAK,WAAW;AACd,oBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;wBAChB,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;oBAChD;oBACA;AACF,gBAAA,KAAK,WAAW;AACd,oBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;wBAChB,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;oBAChD;oBACA;AACF,gBAAA,KAAK,KAAK;AACR,oBAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;wBAC9B,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC1C;oBACA;AACF,gBAAA,KAAK,KAAK;AACR,oBAAA,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE;wBAC9B,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC1C;oBACA;AACF,gBAAA,KAAK,SAAS;AACZ,oBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;wBAChB,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC9C;oBACA;AACF,gBAAA,KAAK,QAAQ;AACX,oBAAA,IAAI,MAAM,CAAC,eAAe,EAAE;AAC1B,wBAAA,UAAU,CAAC,IAAI,CACb,qBAAqB,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,CAC9D;oBACH;oBACA;;;AAIJ,YAAA,IAAI,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE;AAC/B,gBAAA,UAAU,CAAC,IAAI,CACb,wBAAwB,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CACjE;YACH;iBAAO,IAAI,SAAS,EAAE;AACpB,gBAAA,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YAC5B;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,UAAU;IACnB;IAEQ,kBAAkB,CAAC,OAAsB,EAAE,KAAa,EAAA;AAC9D,QAAA,OAAO,OAAO,CAAC,GAAG,IAAI,CAAA,QAAA,EAAW,KAAK,EAAE;IAC1C;IAEU,mBAAmB,CAC3B,OAAsB,EACtB,KAAa,EAAA;AAEb,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACpD,QAAA,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE;AAC/B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7E;AAEQ,IAAA,oBAAoB,CAAC,OAAsB,EAAA;QACjD,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAC,oBAAoB,WAAW,IAAI,CAAC,oBAAoB,CAAA,CAAE;QAChF;AAEA,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,YAAA,OAAO,CAAA,KAAA,EAAQ,OAAO,CAAA,QAAA,EAAW,OAAO,EAAE;QAC5C;AAEA,QAAA,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU;QAC9D,MAAM,IAAI,GACR;aACG,GAAG,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;AACzB,aAAA,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC,oBAAoB;AAEtE,QAAA,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,QAAA,EAAW,IAAI,EAAE;IACtC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE;QACrC;IACF;uGAriBW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,SAAA,EAbX;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,WAAW,CAAC;AAC1C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,aAAa;AACtB,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,WAAW,CAAC;AAC1C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;SACF,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9DH,6tFA4EA,yDD5BY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,8FAAE,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;2FAgBxD,WAAW,EAAA,UAAA,EAAA,CAAA;kBAnBvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAA,SAAA,EAGzD;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC;AAC1C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,aAAa;AACtB,4BAAA,WAAW,EAAE,UAAU,CAAC,iBAAiB,CAAC;AAC1C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,6tFAAA,EAAA;;;AE9DH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"masterteam-forms-dynamic-form.mjs","sources":["../../../../packages/masterteam/forms/dynamic-form/dynamic-form.ts","../../../../packages/masterteam/forms/dynamic-form/dynamic-form.html","../../../../packages/masterteam/forms/dynamic-form/masterteam-forms-dynamic-form.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n output,\r\n effect,\r\n OnDestroy,\r\n forwardRef,\r\n inject,\r\n signal,\r\n computed,\r\n untracked,\r\n} from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n Validators,\r\n AbstractControl,\r\n ValidatorFn,\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n Validator,\r\n ValidationErrors,\r\n NG_VALIDATORS,\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { DynamicField } from '@masterteam/forms/dynamic-field';\r\nimport { SortPipe } from '@masterteam/forms/pipes';\r\n// import { SortPipe } from '../pipes/sort.pipe';\r\nimport {\r\n DynamicFormConfig,\r\n ValidatorConfig,\r\n createCustomValidator,\r\n wrapValidatorWithMessage,\r\n FieldState,\r\n FormulaRuntimeMessage,\r\n SectionConfig,\r\n} from '@masterteam/components';\r\nimport { Subscription } from 'rxjs';\r\nimport {\r\n FormulaRuntimeEngine,\r\n type FormulaConditionEvaluation,\r\n} from '@masterteam/components/formula';\r\n\r\n@Component({\r\n selector: 'mt-dynamic-form',\r\n standalone: true,\r\n imports: [CommonModule, ReactiveFormsModule, DynamicField, SortPipe],\r\n templateUrl: './dynamic-form.html',\r\n styleUrls: ['./dynamic-form.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DynamicForm),\r\n multi: true,\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: forwardRef(() => DynamicForm),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DynamicForm implements OnDestroy, ControlValueAccessor, Validator {\r\n private fb = inject(FormBuilder);\r\n private transloco = inject(TranslocoService);\r\n private readonly formulaEngine = new FormulaRuntimeEngine();\r\n\r\n readonly formConfig = input.required<DynamicFormConfig>();\r\n readonly forcedHiddenFieldKeys = input<string[]>([]);\r\n readonly preserveForcedHiddenValues = input<boolean>(true);\r\n readonly visibleSectionKeys = input<string[] | null>(null);\r\n readonly runtimeMessagesChange = output<FormulaRuntimeMessage[]>();\r\n\r\n form = new FormGroup({});\r\n private formBuilt = signal(false);\r\n private initValue = signal<any>({});\r\n\r\n // ControlValueAccessor implementation\r\n private onChange = (_value: any) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n private formSubscription?: Subscription;\r\n private fieldStates = signal<Record<string, FieldState>>({});\r\n private readonly conditionRuntimeMessages = signal<FormulaRuntimeMessage[]>(\r\n [],\r\n );\r\n private readonly validationRuleErrors = signal<FormulaRuntimeMessage[]>([]);\r\n private readonly validationRuleWarnings = signal<FormulaRuntimeMessage[]>([]);\r\n private readonly DEFAULT_GRID_COLUMNS = 12;\r\n\r\n readonly runtimeMessages = computed(() => [\r\n ...this.conditionRuntimeMessages(),\r\n ...this.validationRuleErrors(),\r\n ...this.validationRuleWarnings(),\r\n ]);\r\n\r\n // Computed signal for field visibility - better performance\r\n readonly hiddenFields = computed(() => {\r\n const states = this.fieldStates();\r\n const hidden: Record<string, boolean> = {};\r\n Object.keys(states).forEach((key) => {\r\n hidden[key] = states[key].hidden;\r\n });\r\n return hidden;\r\n });\r\n\r\n readonly fieldColSpanStyles = computed(() => {\r\n const styles: Record<string, { [key: string]: string }> = {};\r\n const config = this.formConfig();\r\n\r\n config.sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (!field.key) return;\r\n if (!field.cssClass && !section.cssClass) {\r\n styles[field.key] = {\r\n 'grid-column': this.getColSpanStyleValue(field.colSpan),\r\n };\r\n }\r\n });\r\n });\r\n\r\n return styles;\r\n });\r\n\r\n readonly sectionGridStyles = computed(() => {\r\n const styles: Record<string, { [key: string]: string }> = {};\r\n const config = this.formConfig();\r\n\r\n config.sections.forEach((section, index) => {\r\n if (section.bodyClass) return;\r\n const key = this.getSectionStateKey(section, index);\r\n const cols = section.columns || this.DEFAULT_GRID_COLUMNS;\r\n styles[key] = {\r\n 'grid-template-columns': `repeat(${cols}, minmax(0, 1fr))`,\r\n };\r\n });\r\n\r\n return styles;\r\n });\r\n\r\n constructor() {\r\n // Effect to rebuild form when config changes\r\n effect(() => {\r\n this.buildForm();\r\n this.formBuilt.set(true);\r\n const initValue = untracked(() => this.initValue());\r\n if (initValue && Object.keys(initValue)?.length > 0) {\r\n this.form.patchValue(initValue, { emitEvent: false });\r\n this.initValue.set(null);\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n }\r\n });\r\n\r\n effect(() => {\r\n this.forcedHiddenFieldKeys();\r\n\r\n if (!this.formBuilt()) {\r\n return;\r\n }\r\n\r\n untracked(() => {\r\n this.evaluateRelations();\r\n });\r\n });\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void {\r\n this.onValidatorChange = fn;\r\n }\r\n registerOnChange(fn: (value: any) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n private buildForm() {\r\n if (this.formBuilt()) {\r\n return;\r\n }\r\n if (this.formSubscription) {\r\n this.formSubscription.unsubscribe();\r\n }\r\n\r\n const formControls: { [key: string]: AbstractControl } = {};\r\n const fieldStateMap: Record<string, FieldState> = {};\r\n\r\n this.formConfig().sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (field.key) {\r\n // Calculate default state from relations\r\n const defaultState = this.getDefaultFieldState(field);\r\n\r\n fieldStateMap[field.key] = {\r\n hidden: defaultState.hidden,\r\n disabled: defaultState.disabled,\r\n };\r\n\r\n const validators = this.buildValidators(field.validators || []);\r\n\r\n if (!this.shouldCreateControl(field.type)) {\r\n return;\r\n }\r\n\r\n // Check if field key contains dot notation (e.g., \"name.ar\", \"name.en\")\r\n if (field.key.includes('.')) {\r\n const [parentKey, childKey] = field.key.split('.');\r\n\r\n // Create or get the parent FormGroup\r\n if (!formControls[parentKey]) {\r\n formControls[parentKey] = this.fb.group({});\r\n }\r\n\r\n const parentGroup = formControls[parentKey] as FormGroup;\r\n\r\n // Add the child control to the parent group\r\n const control = this.fb.control(\r\n {\r\n value: null,\r\n disabled: defaultState.disabled,\r\n },\r\n validators,\r\n );\r\n\r\n parentGroup.addControl(childKey, control);\r\n } else {\r\n // Regular field without nesting\r\n const control = this.fb.control(\r\n {\r\n value: null,\r\n disabled: defaultState.disabled,\r\n },\r\n validators,\r\n );\r\n formControls[field.key] = control;\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.form = this.fb.group(formControls);\r\n this.fieldStates.set(fieldStateMap);\r\n\r\n // Subscribe to form value changes and evaluate all relations\r\n this.formSubscription = this.form.valueChanges.subscribe(() => {\r\n this.refreshControlValidity();\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n });\r\n\r\n // Evaluate initial relations state\r\n this.evaluateRelations();\r\n\r\n // Trigger initial validation state\r\n // this.onValidatorChange();\r\n // this.onChange(this.form.getRawValue());\r\n }\r\n\r\n private shouldCreateControl(fieldType: string | undefined): boolean {\r\n return fieldType !== 'spacer' && fieldType !== 'lookup-matrix';\r\n }\r\n\r\n private refreshControlValidity(control: AbstractControl = this.form): void {\r\n if (control instanceof FormGroup) {\r\n Object.values(control.controls).forEach((childControl) => {\r\n this.refreshControlValidity(childControl);\r\n });\r\n control.updateValueAndValidity({ emitEvent: false });\r\n return;\r\n }\r\n\r\n control.updateValueAndValidity({ onlySelf: true, emitEvent: false });\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: any): void {\r\n if (value && this.form && this.formBuilt()) {\r\n this.form.patchValue(value, { emitEvent: false });\r\n this.evaluateRelations();\r\n this.onChange(this.form.getRawValue());\r\n } else if (value && !this.formBuilt()) {\r\n this.initValue.set(value);\r\n }\r\n }\r\n\r\n validate(_control: AbstractControl): ValidationErrors | null {\r\n if (!this.form) {\r\n return null;\r\n }\r\n const ruleErrors = this.validationRuleErrors();\r\n const hasBlockingRuleErrors = ruleErrors.length > 0;\r\n if (this.form.valid && !hasBlockingRuleErrors) {\r\n return null;\r\n }\r\n\r\n return {\r\n invalidForm: true,\r\n formulaRules: hasBlockingRuleErrors ? ruleErrors : null,\r\n };\r\n }\r\n\r\n markAllAsTouched(): void {\r\n this.form.markAllAsTouched();\r\n this.onTouched();\r\n }\r\n\r\n isControlInvalid(fieldKey: string): boolean {\r\n return !!this.form.get(fieldKey)?.invalid;\r\n }\r\n\r\n /**\r\n * Calculate default field state based on relations\r\n * If field has 'show' action → start hidden (opposite)\r\n * If field has 'enable' action → start disabled (opposite)\r\n */\r\n private getDefaultFieldState(field: any): {\r\n hidden: boolean;\r\n disabled: boolean;\r\n } {\r\n let hidden = !!field.hidden;\r\n let disabled = !!field.disabled;\r\n\r\n // If has relations, set opposite state\r\n if (field.relations?.length) {\r\n field.relations.forEach((relation: any) => {\r\n if (relation.action === 'show') {\r\n hidden = true;\r\n } else if (relation.action === 'hide') {\r\n hidden = false;\r\n } else if (relation.action === 'enable') {\r\n disabled = true;\r\n } else if (relation.action === 'disable') {\r\n disabled = false;\r\n }\r\n });\r\n }\r\n\r\n if (\r\n field.formulaCondition?.mode &&\r\n field.formulaCondition.mode !== 'auto'\r\n ) {\r\n if (field.formulaCondition.mode === 'show') {\r\n hidden = true;\r\n } else if (field.formulaCondition.mode === 'hide') {\r\n hidden = false;\r\n } else if (field.formulaCondition.mode === 'enable') {\r\n disabled = true;\r\n } else if (field.formulaCondition.mode === 'disable') {\r\n disabled = false;\r\n }\r\n }\r\n\r\n return { hidden, disabled };\r\n }\r\n\r\n /**\r\n * Evaluate all relations - runs on every form change\r\n * Simple: if dependency matches → apply action, else apply opposite\r\n */\r\n private evaluateRelations() {\r\n const newStates: Record<string, FieldState> = {};\r\n const conditionMessages: FormulaRuntimeMessage[] = [];\r\n const forcedHiddenFields = new Set(this.forcedHiddenFieldKeys() ?? []);\r\n const values = this.form.getRawValue();\r\n\r\n // Process all fields with relations\r\n this.formConfig().sections.forEach((section) => {\r\n section.fields.forEach((field) => {\r\n if (!field.key) {\r\n return;\r\n }\r\n\r\n // Calculate default state\r\n const defaultState = this.getDefaultFieldState(field);\r\n\r\n // Start with default\r\n newStates[field.key] = {\r\n hidden: defaultState.hidden,\r\n disabled: defaultState.disabled,\r\n };\r\n\r\n // If has relations, check and apply\r\n if (field.relations?.length) {\r\n field.relations.forEach((relation) => {\r\n const dependencyControl = this.form.get(relation.key);\r\n if (!dependencyControl) {\r\n return;\r\n }\r\n\r\n const matches = this.doesRelationMatch(\r\n dependencyControl.value,\r\n relation.value,\r\n );\r\n\r\n // If matches, apply the action\r\n if (matches) {\r\n const state = newStates[field.key!];\r\n switch (relation.action) {\r\n case 'show':\r\n state.hidden = false;\r\n break;\r\n case 'hide':\r\n state.hidden = true;\r\n break;\r\n case 'enable':\r\n state.disabled = false;\r\n break;\r\n case 'disable':\r\n state.disabled = true;\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (field.formulaCondition) {\r\n const conditionResult: FormulaConditionEvaluation =\r\n this.formulaEngine.evaluateCondition(field.formulaCondition, {\r\n values,\r\n });\r\n\r\n if (conditionResult.errors.length > 0) {\r\n conditionMessages.push(\r\n ...conditionResult.errors.map<FormulaRuntimeMessage>((error) => ({\r\n code: error.code,\r\n severity: 'warning',\r\n message: this.transloco.translate(\r\n 'clientForm.condition-formula-failed',\r\n { key: field.key, message: error.message },\r\n ),\r\n formulaText: field.formulaCondition?.formulaText,\r\n fieldKey: field.key,\r\n })),\r\n );\r\n } else {\r\n if (typeof conditionResult.hidden === 'boolean') {\r\n newStates[field.key].hidden = conditionResult.hidden;\r\n }\r\n if (typeof conditionResult.disabled === 'boolean') {\r\n newStates[field.key].disabled = conditionResult.disabled;\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n forcedHiddenFields.forEach((fieldKey) => {\r\n if (!newStates[fieldKey]) return;\r\n newStates[fieldKey].hidden = true;\r\n newStates[fieldKey].disabled = true;\r\n });\r\n\r\n // Update states\r\n this.fieldStates.set(newStates);\r\n\r\n // Sync form controls and clear values when disabled/hidden\r\n Object.keys(newStates).forEach((key) => {\r\n const control = this.form.get(key);\r\n if (!control) {\r\n return;\r\n }\r\n\r\n const state = newStates[key];\r\n const hiddenByExternalOverride = forcedHiddenFields.has(key);\r\n const keepValueWhenHidden =\r\n hiddenByExternalOverride && this.preserveForcedHiddenValues();\r\n const shouldDisable = state.hidden || state.disabled;\r\n\r\n // Handle disabled state changes\r\n if (shouldDisable && !control.disabled) {\r\n control.disable({ emitEvent: false });\r\n if (!keepValueWhenHidden) {\r\n control.reset(undefined, { emitEvent: false }); // Clear value when disabled\r\n }\r\n } else if (!shouldDisable && control.disabled) {\r\n control.enable({ emitEvent: false });\r\n }\r\n\r\n // Clear value when hidden\r\n if (state.hidden && control.value && !keepValueWhenHidden) {\r\n control.reset(undefined, { emitEvent: false }); // Clear value when hidden\r\n }\r\n });\r\n\r\n this.conditionRuntimeMessages.set(conditionMessages);\r\n this.evaluateFormValidationRules(newStates, this.form.getRawValue());\r\n this.runtimeMessagesChange.emit(this.runtimeMessages());\r\n this.onValidatorChange();\r\n }\r\n\r\n private doesRelationMatch(sourceValue: any, targetValue: any): boolean {\r\n if (Array.isArray(sourceValue)) {\r\n if (Array.isArray(targetValue)) {\r\n return targetValue.every((value) => sourceValue.includes(value));\r\n }\r\n return sourceValue.includes(targetValue);\r\n }\r\n return sourceValue === targetValue;\r\n }\r\n\r\n private evaluateFormValidationRules(\r\n fieldStates: Record<string, FieldState>,\r\n values: Record<string, any>,\r\n ): void {\r\n const validationRules = this.formConfig().validationRules ?? [];\r\n const evaluation = this.formulaEngine.evaluateValidationRules(\r\n validationRules,\r\n { values },\r\n {\r\n isDependencyActive: (dependency: string) => {\r\n const state = fieldStates[dependency];\r\n return !state || (!state.hidden && !state.disabled);\r\n },\r\n },\r\n );\r\n\r\n this.validationRuleErrors.set(evaluation.errors);\r\n this.validationRuleWarnings.set(evaluation.warnings);\r\n }\r\n\r\n private buildValidators(validatorConfigs: ValidatorConfig[]): ValidatorFn[] {\r\n const validators: ValidatorFn[] = [];\r\n\r\n validatorConfigs.forEach((config) => {\r\n let validator: ValidatorFn | null = null;\r\n\r\n switch (config.type) {\r\n case 'required':\r\n validator = Validators.required;\r\n break;\r\n case 'email':\r\n validator = Validators.email;\r\n break;\r\n case 'minLength':\r\n if (config.value) {\r\n validator = Validators.minLength(config.value);\r\n }\r\n break;\r\n case 'maxLength':\r\n if (config.value) {\r\n validator = Validators.maxLength(config.value);\r\n }\r\n break;\r\n case 'min':\r\n if (config.value !== undefined) {\r\n validator = Validators.min(config.value);\r\n }\r\n break;\r\n case 'max':\r\n if (config.value !== undefined) {\r\n validator = Validators.max(config.value);\r\n }\r\n break;\r\n case 'pattern':\r\n if (config.value) {\r\n validator = Validators.pattern(config.value);\r\n }\r\n break;\r\n case 'custom':\r\n if (config.customValidator) {\r\n validators.push(\r\n createCustomValidator(config.customValidator, config.message),\r\n );\r\n }\r\n break;\r\n }\r\n\r\n // If we have a validator and a custom message, wrap it\r\n if (validator && config.message) {\r\n validators.push(\r\n wrapValidatorWithMessage(validator, config.type, config.message),\r\n );\r\n } else if (validator) {\r\n validators.push(validator);\r\n }\r\n });\r\n\r\n return validators;\r\n }\r\n\r\n private getSectionStateKey(section: SectionConfig, index: number): string {\r\n return section.key || `section-${index}`;\r\n }\r\n\r\n protected shouldRenderSection(\r\n section: SectionConfig,\r\n index: number,\r\n ): boolean {\r\n const visibleSectionKeys = this.visibleSectionKeys();\r\n if (!visibleSectionKeys?.length) {\r\n return true;\r\n }\r\n\r\n return visibleSectionKeys.includes(this.getSectionStateKey(section, index));\r\n }\r\n\r\n private getColSpanStyleValue(colSpan?: number | any): string {\r\n if (!colSpan) {\r\n return `span ${this.DEFAULT_GRID_COLUMNS} / span ${this.DEFAULT_GRID_COLUMNS}`;\r\n }\r\n\r\n if (typeof colSpan === 'number') {\r\n return `span ${colSpan} / span ${colSpan}`;\r\n }\r\n\r\n const breakpointKeys = ['xs', 'sm', 'md', 'lg', 'xl'] as const;\r\n const span =\r\n breakpointKeys\r\n .map((key) => colSpan[key])\r\n .find((value) => value !== undefined) ?? this.DEFAULT_GRID_COLUMNS;\r\n\r\n return `span ${span} / span ${span}`;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.formSubscription) {\r\n this.formSubscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","<form [formGroup]=\"form\">\r\n <div\r\n class=\"flex flex-col gap-6\"\r\n [class]=\"formConfig().layout?.containerClass\"\r\n >\r\n @for (\r\n section of formConfig().sections | sort: \"order\";\r\n track section.key || $index\r\n ) {\r\n @if (shouldRenderSection(section, $index)) {\r\n <div\r\n [class]=\"\r\n section.cssClass ||\r\n formConfig().layout?.sectionClass ||\r\n 'flex flex-col gap-4'\r\n \"\r\n >\r\n @if (section.type === \"header\" && section.label) {\r\n <h3\r\n [class]=\"\r\n section?.headerClass ||\r\n 'text-lg font-semibold text-color border-b-2 border-gray-200 pb-2 mb-3'\r\n \"\r\n >\r\n {{ section.label }}\r\n </h3>\r\n }\r\n\r\n <div\r\n [class]=\"section?.bodyClass || '@container grid gap-4 items-start'\"\r\n [style]=\"\r\n !section?.bodyClass\r\n ? sectionGridStyles()[section.key || 'section-' + $index]\r\n : {}\r\n \"\r\n >\r\n @for (field of section.fields | sort: \"order\"; track field.key) {\r\n <div\r\n [class]=\"\r\n field.cssClass ||\r\n formConfig().layout?.fieldClass ||\r\n 'flex flex-col h-full justify-center gap-1'\r\n \"\r\n [style]=\"fieldColSpanStyles()[field.key!]\"\r\n [hidden]=\"field.type !== 'spacer' && hiddenFields()[field.key!]\"\r\n >\r\n @if (field.type === \"spacer\") {\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"field.key!\"\r\n />\r\n } @else if (field.key!.includes(\".\")) {\r\n <!-- Handle nested fields (e.g., name.ar, name.en) -->\r\n @let parentKey = field.key!.split(\".\")[0];\r\n @let childKey = field.key!.split(\".\")[1];\r\n <div [formGroup]=\"form.get(parentKey)\">\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"childKey\"\r\n />\r\n </div>\r\n } @else {\r\n <!-- Handle regular fields -->\r\n <mt-dynamic-field\r\n [fieldConfig]=\"field\"\r\n [fieldName]=\"field.key!\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</form>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masterteam/forms",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.77",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"directory": "../../../dist/masterteam/forms",
|
|
6
6
|
"linkDirectory": true,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"primeng": "21.1.5",
|
|
18
18
|
"@primeuix/themes": "^2.0.3",
|
|
19
19
|
"rxjs": "^7.8.2",
|
|
20
|
-
"@masterteam/components": "^0.0.
|
|
20
|
+
"@masterteam/components": "^0.0.168"
|
|
21
21
|
},
|
|
22
22
|
"sideEffects": false,
|
|
23
23
|
"exports": {
|
|
@@ -352,6 +352,7 @@ declare class ClientForm implements OnDestroy {
|
|
|
352
352
|
private readonly confirmationService;
|
|
353
353
|
protected readonly state: ClientFormStateService;
|
|
354
354
|
readonly validationSummary: _angular_core.Signal<ElementRef<HTMLElement> | undefined>;
|
|
355
|
+
private readonly dynamicForm;
|
|
355
356
|
private loadSub?;
|
|
356
357
|
private submitSub?;
|
|
357
358
|
private formValueSub?;
|
|
@@ -490,6 +491,8 @@ declare class ClientForm implements OnDestroy {
|
|
|
490
491
|
private isBlockedFutureStep;
|
|
491
492
|
private resolveValidateIsSteps;
|
|
492
493
|
private hasLocalBlockingValidationIssues;
|
|
494
|
+
private validateLocalFormForSubmit;
|
|
495
|
+
private showFirstInvalidSection;
|
|
493
496
|
private handleValidationRequestFailure;
|
|
494
497
|
private createValidationFeedbackMessage;
|
|
495
498
|
private confirmValidationWarnings;
|
|
@@ -41,6 +41,8 @@ declare class DynamicForm implements OnDestroy, ControlValueAccessor, Validator
|
|
|
41
41
|
private refreshControlValidity;
|
|
42
42
|
writeValue(value: any): void;
|
|
43
43
|
validate(_control: AbstractControl): ValidationErrors | null;
|
|
44
|
+
markAllAsTouched(): void;
|
|
45
|
+
isControlInvalid(fieldKey: string): boolean;
|
|
44
46
|
/**
|
|
45
47
|
* Calculate default field state based on relations
|
|
46
48
|
* If field has 'show' action → start hidden (opposite)
|