@masterteam/forms 0.0.57 → 0.0.59

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.
@@ -460,7 +460,7 @@ class DynamicForm {
460
460
  useExisting: forwardRef(() => DynamicForm),
461
461
  multi: true,
462
462
  },
463
- ], ngImport: i0, template: "<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 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", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicField, selector: "mt-dynamic-field", inputs: ["fieldConfig", "fieldName"] }, { kind: "pipe", type: SortPipe, name: "sort" }] });
463
+ ], ngImport: i0, template: "<form [formGroup]=\"form\">\n <div\n class=\"flex flex-col gap-6\"\n [class]=\"formConfig().layout?.containerClass\"\n >\n @for (\n section of formConfig().sections | sort: \"order\";\n track section.key || $index\n ) {\n @if (shouldRenderSection(section, $index)) {\n <div\n [class]=\"\n section.cssClass ||\n formConfig().layout?.sectionClass ||\n 'flex flex-col gap-4'\n \"\n >\n @if (section.type === \"header\" && section.label) {\n <h3\n [class]=\"\n section?.headerClass ||\n 'text-lg font-semibold text-color border-b-2 border-gray-200 pb-2 mb-3'\n \"\n >\n {{ section.label }}\n </h3>\n }\n\n <div\n [class]=\"section?.bodyClass || '@container grid gap-4 items-start'\"\n [style]=\"\n !section?.bodyClass\n ? sectionGridStyles()[section.key || 'section-' + $index]\n : {}\n \"\n >\n @for (field of section.fields | sort: \"order\"; track field.key) {\n <div\n [class]=\"\n field.cssClass ||\n formConfig().layout?.fieldClass ||\n 'flex flex-col gap-1'\n \"\n [style]=\"fieldColSpanStyles()[field.key!]\"\n [hidden]=\"field.type !== 'spacer' && hiddenFields()[field.key!]\"\n >\n @if (field.type === \"spacer\") {\n <mt-dynamic-field\n [fieldConfig]=\"field\"\n [fieldName]=\"field.key!\"\n />\n } @else if (field.key!.includes(\".\")) {\n <!-- Handle nested fields (e.g., name.ar, name.en) -->\n @let parentKey = field.key!.split(\".\")[0];\n @let childKey = field.key!.split(\".\")[1];\n <div [formGroup]=\"form.get(parentKey)\">\n <mt-dynamic-field\n [fieldConfig]=\"field\"\n [fieldName]=\"childKey\"\n />\n </div>\n } @else {\n <!-- Handle regular fields -->\n <mt-dynamic-field\n [fieldConfig]=\"field\"\n [fieldName]=\"field.key!\"\n />\n }\n </div>\n }\n </div>\n </div>\n }\n }\n </div>\n</form>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicField, selector: "mt-dynamic-field", inputs: ["fieldConfig", "fieldName"] }, { kind: "pipe", type: SortPipe, name: "sort" }] });
464
464
  }
465
465
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: DynamicForm, decorators: [{
466
466
  type: Component,
@@ -475,7 +475,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
475
475
  useExisting: forwardRef(() => DynamicForm),
476
476
  multi: true,
477
477
  },
478
- ], template: "<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 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" }]
478
+ ], template: "<form [formGroup]=\"form\">\n <div\n class=\"flex flex-col gap-6\"\n [class]=\"formConfig().layout?.containerClass\"\n >\n @for (\n section of formConfig().sections | sort: \"order\";\n track section.key || $index\n ) {\n @if (shouldRenderSection(section, $index)) {\n <div\n [class]=\"\n section.cssClass ||\n formConfig().layout?.sectionClass ||\n 'flex flex-col gap-4'\n \"\n >\n @if (section.type === \"header\" && section.label) {\n <h3\n [class]=\"\n section?.headerClass ||\n 'text-lg font-semibold text-color border-b-2 border-gray-200 pb-2 mb-3'\n \"\n >\n {{ section.label }}\n </h3>\n }\n\n <div\n [class]=\"section?.bodyClass || '@container grid gap-4 items-start'\"\n [style]=\"\n !section?.bodyClass\n ? sectionGridStyles()[section.key || 'section-' + $index]\n : {}\n \"\n >\n @for (field of section.fields | sort: \"order\"; track field.key) {\n <div\n [class]=\"\n field.cssClass ||\n formConfig().layout?.fieldClass ||\n 'flex flex-col gap-1'\n \"\n [style]=\"fieldColSpanStyles()[field.key!]\"\n [hidden]=\"field.type !== 'spacer' && hiddenFields()[field.key!]\"\n >\n @if (field.type === \"spacer\") {\n <mt-dynamic-field\n [fieldConfig]=\"field\"\n [fieldName]=\"field.key!\"\n />\n } @else if (field.key!.includes(\".\")) {\n <!-- Handle nested fields (e.g., name.ar, name.en) -->\n @let parentKey = field.key!.split(\".\")[0];\n @let childKey = field.key!.split(\".\")[1];\n <div [formGroup]=\"form.get(parentKey)\">\n <mt-dynamic-field\n [fieldConfig]=\"field\"\n [fieldName]=\"childKey\"\n />\n </div>\n } @else {\n <!-- Handle regular fields -->\n <mt-dynamic-field\n [fieldConfig]=\"field\"\n [fieldName]=\"field.key!\"\n />\n }\n </div>\n }\n </div>\n </div>\n }\n }\n </div>\n</form>\n" }]
479
479
  }], ctorParameters: () => [], propDecorators: { formConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "formConfig", required: true }] }], forcedHiddenFieldKeys: [{ type: i0.Input, args: [{ isSignal: true, alias: "forcedHiddenFieldKeys", required: false }] }], preserveForcedHiddenValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "preserveForcedHiddenValues", required: false }] }], visibleSectionKeys: [{ type: i0.Input, args: [{ isSignal: true, alias: "visibleSectionKeys", required: false }] }], runtimeMessagesChange: [{ type: i0.Output, args: ["runtimeMessagesChange"] }] } });
480
480
 
481
481
  /**
@@ -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 { 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 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.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 // 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: `Condition formula failed for \"${field.key}\": ${error.message}`,\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 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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"}
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 { 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 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.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 // 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: `Condition formula failed for \"${field.key}\": ${error.message}`,\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\">\n <div\n class=\"flex flex-col gap-6\"\n [class]=\"formConfig().layout?.containerClass\"\n >\n @for (\n section of formConfig().sections | sort: \"order\";\n track section.key || $index\n ) {\n @if (shouldRenderSection(section, $index)) {\n <div\n [class]=\"\n section.cssClass ||\n formConfig().layout?.sectionClass ||\n 'flex flex-col gap-4'\n \"\n >\n @if (section.type === \"header\" && section.label) {\n <h3\n [class]=\"\n section?.headerClass ||\n 'text-lg font-semibold text-color border-b-2 border-gray-200 pb-2 mb-3'\n \"\n >\n {{ section.label }}\n </h3>\n }\n\n <div\n [class]=\"section?.bodyClass || '@container grid gap-4 items-start'\"\n [style]=\"\n !section?.bodyClass\n ? sectionGridStyles()[section.key || 'section-' + $index]\n : {}\n \"\n >\n @for (field of section.fields | sort: \"order\"; track field.key) {\n <div\n [class]=\"\n field.cssClass ||\n formConfig().layout?.fieldClass ||\n 'flex flex-col gap-1'\n \"\n [style]=\"fieldColSpanStyles()[field.key!]\"\n [hidden]=\"field.type !== 'spacer' && hiddenFields()[field.key!]\"\n >\n @if (field.type === \"spacer\") {\n <mt-dynamic-field\n [fieldConfig]=\"field\"\n [fieldName]=\"field.key!\"\n />\n } @else if (field.key!.includes(\".\")) {\n <!-- Handle nested fields (e.g., name.ar, name.en) -->\n @let parentKey = field.key!.split(\".\")[0];\n @let childKey = field.key!.split(\".\")[1];\n <div [formGroup]=\"form.get(parentKey)\">\n <mt-dynamic-field\n [fieldConfig]=\"field\"\n [fieldName]=\"childKey\"\n />\n </div>\n } @else {\n <!-- Handle regular fields -->\n <mt-dynamic-field\n [fieldConfig]=\"field\"\n [fieldName]=\"field.key!\"\n />\n }\n </div>\n }\n </div>\n </div>\n }\n }\n </div>\n</form>\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,23 +1,23 @@
1
1
  {
2
2
  "name": "@masterteam/forms",
3
- "version": "0.0.57",
3
+ "version": "0.0.59",
4
4
  "publishConfig": {
5
5
  "directory": "../../../dist/masterteam/forms",
6
6
  "linkDirectory": true,
7
7
  "access": "public"
8
8
  },
9
9
  "peerDependencies": {
10
- "@angular/common": "catalog:angular21",
11
- "@angular/core": "catalog:angular21",
12
- "@angular/forms": "catalog:angular21",
13
- "postcss": "catalog:",
14
- "@tailwindcss/postcss": "catalog:",
15
- "tailwindcss": "catalog:",
16
- "tailwindcss-primeui": "catalog:",
17
- "primeng": "catalog:",
18
- "@primeuix/themes": "catalog:",
19
- "rxjs": "catalog:angular21",
20
- "@masterteam/components": "workspace:^"
10
+ "@angular/common": "^21.0.3",
11
+ "@angular/core": "^21.0.3",
12
+ "@angular/forms": "^21.0.3",
13
+ "postcss": "^8.5.6",
14
+ "@tailwindcss/postcss": "^4.1.17",
15
+ "tailwindcss": "^4.1.17",
16
+ "tailwindcss-primeui": "^0.6.1",
17
+ "primeng": "21.0.1",
18
+ "@primeuix/themes": "^2.0.2",
19
+ "rxjs": "^7.8.2",
20
+ "@masterteam/components": "^0.0.124"
21
21
  },
22
22
  "sideEffects": false,
23
23
  "exports": {
@@ -51,6 +51,6 @@
51
51
  "module": "fesm2022/masterteam-forms.mjs",
52
52
  "typings": "types/masterteam-forms.d.ts",
53
53
  "dependencies": {
54
- "tslib": "catalog:angular21"
54
+ "tslib": "^2.8.1"
55
55
  }
56
56
  }
@@ -23,7 +23,7 @@ type ProcessFormMode = 'Approval' | 'Direct';
23
23
  type ProcessFormSubmitStatus = 'PendingApproval' | 'Executed';
24
24
  type OperationType = 'FormOperation' | 'ActionOperation';
25
25
  type ProcessFormSource = 'Step' | 'None';
26
- type ClientFormResolvedRenderMode = 'form' | 'steps' | 'tabs';
26
+ type ClientFormResolvedRenderMode = 'form' | 'steps' | 'tabs' | 'wizard';
27
27
  type ClientFormFooterActionMode = 'loading' | 'steps' | 'submit';
28
28
  interface ClientFormFooterState {
29
29
  loading: boolean;
@@ -144,7 +144,7 @@ interface ProcessFormContext {
144
144
  preview: boolean;
145
145
  }
146
146
  type ClientFieldWidth = '25' | '50' | '100';
147
- type ClientFormRenderMode = 'sections' | 'steps' | 'tabs';
147
+ type ClientFormRenderMode = 'sections' | 'steps' | 'tabs' | 'wizard' | undefined;
148
148
  interface ClientFormConfiguration {
149
149
  isActive?: boolean;
150
150
  renderMode?: ClientFormRenderMode;
@@ -355,7 +355,7 @@ declare class ClientForm implements OnDestroy {
355
355
  readonly readonly: _angular_core.InputSignal<boolean>;
356
356
  readonly autoLoad: _angular_core.InputSignal<boolean>;
357
357
  readonly formMode: _angular_core.InputSignal<"create" | "edit">;
358
- readonly renderMode: _angular_core.InputSignal<"form" | "steps" | "tabs" | undefined>;
358
+ readonly renderMode: _angular_core.InputSignal<"form" | "steps" | "tabs" | "wizard" | undefined>;
359
359
  readonly showInternalStepActions: _angular_core.InputSignal<boolean>;
360
360
  readonly lang: _angular_core.WritableSignal<"en" | "ar">;
361
361
  readonly lookups: _angular_core.InputSignal<ClientLookup[]>;
@@ -382,9 +382,11 @@ declare class ClientForm implements OnDestroy {
382
382
  readonly editableFormConfig: _angular_core.Signal<DynamicFormConfig | null>;
383
383
  readonly stepSections: _angular_core.Signal<_masterteam_components.SectionConfig[]>;
384
384
  readonly hasEditableFormSections: _angular_core.Signal<boolean>;
385
- readonly effectiveRenderMode: _angular_core.Signal<"form" | "steps" | "tabs">;
385
+ readonly effectiveRenderMode: _angular_core.Signal<"form" | "steps" | "tabs" | "wizard">;
386
386
  readonly stepsEnabled: _angular_core.Signal<boolean>;
387
387
  readonly tabsEnabled: _angular_core.Signal<boolean>;
388
+ readonly wizardEnabled: _angular_core.Signal<boolean>;
389
+ readonly wizardFormConfig: _angular_core.Signal<DynamicFormConfig | null>;
388
390
  readonly sectionNavigationEnabled: _angular_core.Signal<boolean>;
389
391
  readonly tabOptions: _angular_core.Signal<OptionItem[]>;
390
392
  readonly stepTimeline: _angular_core.Signal<StepTimelineItem[]>;