@masterteam/forms 0.0.74 → 0.0.75
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 +1 -1
- package/assets/i18n/ar.json +8 -1
- package/assets/i18n/en.json +8 -1
- package/fesm2022/masterteam-forms-client-form.mjs +44 -11
- package/fesm2022/masterteam-forms-client-form.mjs.map +1 -1
- package/fesm2022/masterteam-forms-dynamic-form.mjs +3 -1
- package/fesm2022/masterteam-forms-dynamic-form.mjs.map +1 -1
- package/package.json +2 -2
- package/types/masterteam-forms-client-form.d.ts +4 -2
- package/types/masterteam-forms-dynamic-form.d.ts +1 -0
|
@@ -3,6 +3,7 @@ import { inject, input, output, signal, computed, effect, untracked, forwardRef,
|
|
|
3
3
|
import * as i1 from '@angular/forms';
|
|
4
4
|
import { FormBuilder, FormGroup, Validators, ReactiveFormsModule, NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
|
|
5
5
|
import { CommonModule } from '@angular/common';
|
|
6
|
+
import { TranslocoService } from '@jsverse/transloco';
|
|
6
7
|
import { DynamicField } from '@masterteam/forms/dynamic-field';
|
|
7
8
|
import { SortPipe } from '@masterteam/forms/pipes';
|
|
8
9
|
import { createCustomValidator, wrapValidatorWithMessage } from '@masterteam/components';
|
|
@@ -10,6 +11,7 @@ import { FormulaRuntimeEngine } from '@masterteam/components/formula';
|
|
|
10
11
|
|
|
11
12
|
class DynamicForm {
|
|
12
13
|
fb = inject(FormBuilder);
|
|
14
|
+
transloco = inject(TranslocoService);
|
|
13
15
|
formulaEngine = new FormulaRuntimeEngine();
|
|
14
16
|
formConfig = input.required(...(ngDevMode ? [{ debugName: "formConfig" }] : /* istanbul ignore next */ []));
|
|
15
17
|
forcedHiddenFieldKeys = input([], ...(ngDevMode ? [{ debugName: "forcedHiddenFieldKeys" }] : /* istanbul ignore next */ []));
|
|
@@ -305,7 +307,7 @@ class DynamicForm {
|
|
|
305
307
|
conditionMessages.push(...conditionResult.errors.map((error) => ({
|
|
306
308
|
code: error.code,
|
|
307
309
|
severity: 'warning',
|
|
308
|
-
message:
|
|
310
|
+
message: this.transloco.translate('clientForm.condition-formula-failed', { key: field.key, message: error.message }),
|
|
309
311
|
formulaText: field.formulaCondition?.formulaText,
|
|
310
312
|
fieldKey: field.key,
|
|
311
313
|
})));
|
|
@@ -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.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: `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 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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"}
|
|
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":"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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.75",
|
|
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.166"
|
|
21
21
|
},
|
|
22
22
|
"sideEffects": false,
|
|
23
23
|
"exports": {
|
|
@@ -386,7 +386,7 @@ declare class ClientForm implements OnDestroy {
|
|
|
386
386
|
readonly readonly: _angular_core.InputSignal<boolean>;
|
|
387
387
|
readonly autoLoad: _angular_core.InputSignal<boolean>;
|
|
388
388
|
readonly formMode: _angular_core.InputSignal<"create" | "edit">;
|
|
389
|
-
readonly renderMode: _angular_core.InputSignal<"
|
|
389
|
+
readonly renderMode: _angular_core.InputSignal<"steps" | "tabs" | "wizard" | "form" | undefined>;
|
|
390
390
|
readonly showInternalStepActions: _angular_core.InputSignal<boolean>;
|
|
391
391
|
readonly confirmWarningsOnSubmit: _angular_core.InputSignal<boolean>;
|
|
392
392
|
readonly confirmWarningsOnStepChange: _angular_core.InputSignal<boolean>;
|
|
@@ -423,7 +423,7 @@ declare class ClientForm implements OnDestroy {
|
|
|
423
423
|
readonly editableFormConfig: _angular_core.Signal<DynamicFormConfig | null>;
|
|
424
424
|
readonly stepSections: _angular_core.Signal<_masterteam_components.SectionConfig[]>;
|
|
425
425
|
readonly hasEditableFormSections: _angular_core.Signal<boolean>;
|
|
426
|
-
readonly effectiveRenderMode: _angular_core.Signal<"
|
|
426
|
+
readonly effectiveRenderMode: _angular_core.Signal<"steps" | "tabs" | "wizard" | "form">;
|
|
427
427
|
readonly stepsEnabled: _angular_core.Signal<boolean>;
|
|
428
428
|
readonly tabsEnabled: _angular_core.Signal<boolean>;
|
|
429
429
|
readonly wizardEnabled: _angular_core.Signal<boolean>;
|
|
@@ -473,6 +473,7 @@ declare class ClientForm implements OnDestroy {
|
|
|
473
473
|
goToNextStep(): void;
|
|
474
474
|
canGoToPreviousStep(): boolean;
|
|
475
475
|
canGoToNextStep(): boolean;
|
|
476
|
+
isStepButtonDisabled(value: number): boolean;
|
|
476
477
|
getCurrentStep(): number;
|
|
477
478
|
getStepCount(): number;
|
|
478
479
|
isStepNavigationEnabled(): boolean;
|
|
@@ -486,6 +487,7 @@ declare class ClientForm implements OnDestroy {
|
|
|
486
487
|
private validateAndAdvanceStep;
|
|
487
488
|
private applyStepChange;
|
|
488
489
|
private requiresForwardStepValidation;
|
|
490
|
+
private isBlockedFutureStep;
|
|
489
491
|
private resolveValidateIsSteps;
|
|
490
492
|
private hasLocalBlockingValidationIssues;
|
|
491
493
|
private handleValidationRequestFailure;
|
|
@@ -5,6 +5,7 @@ import { DynamicFormConfig, FormulaRuntimeMessage, SectionConfig } from '@master
|
|
|
5
5
|
|
|
6
6
|
declare class DynamicForm implements OnDestroy, ControlValueAccessor, Validator {
|
|
7
7
|
private fb;
|
|
8
|
+
private transloco;
|
|
8
9
|
private readonly formulaEngine;
|
|
9
10
|
readonly formConfig: _angular_core.InputSignal<DynamicFormConfig>;
|
|
10
11
|
readonly forcedHiddenFieldKeys: _angular_core.InputSignal<string[]>;
|