UNPKG

tuain-ng-forms-lib

Version:

Componentes y Clases Angular para la gestión de formularios TUAIN

1 lines 402 kB
{"version":3,"file":"tuain-ng-forms-lib.mjs","sources":["../../../projects/tuain-ng-forms-lib/src/lib/tokens/icon-resolver.token.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/piece.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/piece-propagate.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/form.constants.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/element.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/field.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/action.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/subsection.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/section.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/table/column.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/table/action.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/table/row-data.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/table/table.ts","../../../projects/tuain-ng-forms-lib/src/lib/classes/forms/form.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/layout/piece.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/layout/element.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/layout/form-error.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/layout/form-header.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/shared/constants.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/layout/section.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/layout/sub-section.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/action.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/field.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/tables/table.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/tables/table-record-field.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/elements/tables/table-record-action.component.ts","../../../projects/tuain-ng-forms-lib/src/lib/services/form-manager.service.ts","../../../projects/tuain-ng-forms-lib/src/lib/services/event-manager.service.ts","../../../projects/tuain-ng-forms-lib/src/lib/services/file-manager.service.ts","../../../projects/tuain-ng-forms-lib/src/lib/components/forms/basic-form.ts","../../../projects/tuain-ng-forms-lib/src/lib/services/icon-dictionary.service.ts","../../../projects/tuain-ng-forms-lib/src/lib/services/base-icon-resolver.service.ts","../../../projects/tuain-ng-forms-lib/src/lib/tuain-ng-forms-lib.module.ts","../../../projects/tuain-ng-forms-lib/src/public-api.ts","../../../projects/tuain-ng-forms-lib/src/tuain-ng-forms-lib.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { IIconResolver } from '../interfaces/icon-resolver.interface';\n\nexport const ICON_RESOLVER = new InjectionToken<IIconResolver>('ICON_RESOLVER');\n","import { Subject, takeUntil } from 'rxjs';\nimport { FormStateEvent, IFormConfig, PieceDefinition } from '../../interfaces/form-config.interface';\n\nexport abstract class FormPiece {\n protected destroy$ = new Subject<void>();\n\n protected _formState: string = '';\n protected _visibleForced: boolean;\n protected _isForced: boolean;\n protected _absoluteVisible: boolean = true;\n protected _absoluteDisabled: boolean = false;\n protected _widget: any = null;\n\n protected visibleStates: string[] = [];\n protected enabledStates: string[] = [];\n\n protected _form: any = null;\n protected _formConfig: IFormConfig;\n protected _visible: boolean = true;\n protected _disabled: boolean = false;\n public customAttributes: Record<string, any> = {};\n\n constructor(pieceDefinition: PieceDefinition, formConfig: IFormConfig) {\n this._formConfig = formConfig;\n this._isForced = false;\n this._visibleForced = false;\n this.setVisibleStates(pieceDefinition.visibleStates);\n this.setEnabledStates(pieceDefinition.enabledStates);\n\n this.enabled = !pieceDefinition?.disabled;\n this.setVisibility(pieceDefinition?.visible ?? true);\n this.customAttributes = pieceDefinition?.customAttributes ?? {};\n if (pieceDefinition?.customAttributes) {\n Object.keys(pieceDefinition?.customAttributes)\n ?.forEach(attr => this.customAttributes[attr] = pieceDefinition?.customAttributes?.[attr])\n }\n }\n\n getCustomAttribute(name: string): any { return this.customAttributes?.[name] ?? null; }\n setCustomAttribute(name: string, value: any): void { if (name) { this.customAttributes[name] = value; } }\n\n setCustomAttributes(attributes: Record<string, any>): FormPiece {\n Object.entries(attributes).forEach(([name, value]) => {\n this.setCustomAttribute(name, value);\n });\n return this;\n }\n\n matchAttribute(name: string, value: string): boolean { return this.customAttributes?.[name] === value; }\n\n setVisibleStates(newStates: any): void {\n const visibleStates = (!Array.isArray(newStates) && typeof newStates === 'string')\n ? newStates.split(',').map(state => state.trim()).filter(state => state.length > 0)\n : newStates;\n this.visibleStates = (Array.isArray(visibleStates)) ? [...(new Set(visibleStates))] : [];\n }\n\n addVisibleState(state: string): void {\n if (!this.visibleStates.includes(state)) {\n this.visibleStates.push(state);\n }\n }\n\n removeVisibleState(state: string): void {\n const existStateIdx = this.visibleStates.findIndex(st => st === state);\n if (existStateIdx >= 0) {\n this.visibleStates.splice(existStateIdx, 1);\n }\n }\n\n setEnabledStates(newStates: any): void {\n const enabledStates = (!Array.isArray(newStates) && typeof newStates === 'string')\n ? newStates.split(',').map(state => state.trim()).filter(state => state.length > 0)\n : newStates;\n this.enabledStates = (Array.isArray(enabledStates)) ? [...(new Set(enabledStates))] : [];\n }\n\n addEnabledState(state: string): void {\n if (!this.enabledStates.includes(state)) {\n this.enabledStates.push(state);\n }\n }\n\n removeEnabledState(state: string): void {\n const existStateIdx = this.enabledStates.findIndex(st => st === state);\n if (existStateIdx >= 0) {\n this.enabledStates.splice(existStateIdx, 1);\n }\n }\n\n viewOnState(state: string): boolean { return (this.visibleStates && state) ? this.visibleStates.includes(state) : false; }\n enabledOnState(state: string): boolean { return (this.enabledStates && state) ? this.enabledStates.includes(state) : false; }\n\n get absoluteVisible(): boolean { return this._absoluteVisible; }\n get absoluteDisabled(): boolean { return this._absoluteDisabled; }\n\n get visible(): boolean { return this._visible; }\n set visible(visible: boolean) { this.setVisibility(visible); }\n\n visibleOn(state: string): boolean {\n return this._absoluteVisible && this.viewOnState(state);\n }\n\n enabledOn(state: string): boolean {\n return !this._absoluteDisabled && this.enabledOnState(state);\n }\n\n setVisibility(visible: boolean, forced: boolean | null = null): void {\n this._absoluteVisible = !!visible;\n if (forced !== null) {\n this._isForced = forced;\n this._visibleForced = visible;\n }\n this._visible = this._absoluteVisible && this.viewOnState(this._formState);\n }\n\n show(forced: boolean | null = null): void {\n this.setVisibility(true, forced);\n }\n\n hide(forced: boolean | null = null): void {\n this.setVisibility(false, forced);\n }\n\n get enabled(): boolean { return !this._disabled; }\n set enabled(enabled) {\n this._absoluteDisabled = !enabled;\n this._disabled = this._absoluteDisabled || !this.enabledOnState(this._formState);\n }\n\n get editable(): boolean { return !this._disabled; }\n\n get disabled(): boolean { return this._disabled; }\n\n set disabled(disabled) { this.enabled = !disabled; }\n\n enable(): void { this.enabled = true; }\n disable(): void { this.enabled = false; }\n\n formStateChangeCustomSubscribe(form: any, formChangeSubject: any): void { }\n\n formStateChange(state: any): void {\n if (state) {\n this._formState = state;\n this._visible = this._absoluteVisible && this.viewOnState(state);\n this._disabled = this._absoluteDisabled || !this.enabledOnState(state);\n }\n }\n\n connectWithParentForm(form: any, formChangeSubject: any): void {\n this._form = form;\n this.formStateChangeCustomSubscribe(form, formChangeSubject);\n formChangeSubject\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (event: FormStateEvent) => this.formStateChange(event?.state),\n error: (err: any) => console.error(`Error en formStateChange subscription: ${err}`)\n });\n }\n\n get form(): any { return this._form; }\n get formConfig(): IFormConfig { return this._formConfig; }\n\n set widget(widget) { this._widget = widget; }\n get widget(): any { return this._widget; }\n\n destroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n}\n","import { BehaviorSubject, Observable } from 'rxjs';\nimport { FormPiece } from './piece';\nimport { AttributeChange, IFormConfig, PieceDefinition } from '../../interfaces/form-config.interface';\n\nconst VISIBLE = 'visible';\nconst DISABLED = 'disabled';\n\nexport abstract class FormPiecePropagate extends FormPiece {\n protected _attributeChange: BehaviorSubject<AttributeChange | null>;\n\n constructor(pieceDefinition: PieceDefinition, formConfig: IFormConfig) {\n super(pieceDefinition, formConfig);\n this._attributeChange = new BehaviorSubject<AttributeChange | null>(null);\n }\n\n get attributeChange(): Observable<AttributeChange | null> { return this._attributeChange.asObservable(); }\n\n propagateAttribute(name: string, value: any): void {\n this._attributeChange?.next({ name, value });\n }\n\n override setCustomAttribute(name: string, value: any): void {\n super.setCustomAttribute(name, value);\n const fullName = `customAttributes.${name}`;\n this.propagateAttribute(fullName, value);\n }\n\n override setVisibility(visible: boolean, forced: boolean | null = null): void {\n super.setVisibility(visible, forced);\n this.propagateAttribute(VISIBLE, this._visible);\n }\n\n override set enabled(enabled: boolean) {\n super.enabled = enabled;\n this.propagateAttribute(DISABLED, this._disabled);\n }\n\n override formStateChange(state: any): void {\n super.formStateChange(state);\n if (state) {\n this.propagateAttribute(VISIBLE, this._visible);\n this.propagateAttribute(DISABLED, this._disabled);\n }\n }\n}\n","export const NO_ERROR = '00' as const;\nexport const HEADER = 'HEADER' as const;\n\nexport enum ElementType {\n Action = 'ACTION',\n Field = 'FIELD',\n Table = 'TABLE',\n}\n\nexport enum FormActionType {\n TableAction = 'TABLEACTION',\n GetData = 'GETDATA',\n GetTableData = 'GETTABLEDATA',\n Validate = 'VALIDATE',\n}\n\nexport enum ComparisonOperator {\n G = 'G',\n L = 'L',\n GE = 'GE',\n LE = 'LE',\n EQ = 'EQ',\n NEQ = 'NEQ',\n HAS = 'HAS',\n NOTHAS = 'NOTHAS',\n BETWEEN = 'BETWEEN',\n IN = 'IN',\n}\n\n/** @deprecated Since v17. Use ElementType enum instead. Will be removed in v19. */\nexport const elementTypes = {\n action: ElementType.Action,\n field: ElementType.Field,\n table: ElementType.Table,\n};\n\n/** @deprecated Since v17. Use FormActionType enum instead. Will be removed in v19. */\nexport const formActions = {\n tableAction: FormActionType.TableAction,\n getData: FormActionType.GetData,\n getTableData: FormActionType.GetTableData,\n validate: FormActionType.Validate,\n};\n\n/** @deprecated Since v17. Use ComparisonOperator enum instead. Will be removed in v19. */\nexport const operators = {\n G: ComparisonOperator.G,\n L: ComparisonOperator.L,\n GE: ComparisonOperator.GE,\n LE: ComparisonOperator.LE,\n EQ: ComparisonOperator.EQ,\n NEQ: ComparisonOperator.NEQ,\n HAS: ComparisonOperator.HAS,\n NOTHAS: ComparisonOperator.NOTHAS,\n BETWEEN: ComparisonOperator.BETWEEN,\n IN: ComparisonOperator.IN,\n};\n","import { FormPiecePropagate } from './piece-propagate';\nimport { ElementType } from './form.constants';\nimport { ElementAttribute, IFormConfig, PieceDefinition } from '../../interfaces/form-config.interface';\n\nexport abstract class FormElement extends FormPiecePropagate {\n elementType: string | null = null;\n\n constructor(elementDefinition: PieceDefinition, formConfig: IFormConfig) {\n super(elementDefinition, formConfig);\n }\n\n setAttr(attr: ElementAttribute, value: any): void {\n const { name: attrName, propagate: name } = attr;\n try {\n const currentValue = (this as any)[attrName];\n if (currentValue !== value) {\n (this as any)[attrName] = value;\n name && this.propagateAttribute(name, value);\n }\n } catch (e) {\n console.log(`Atributo ${attrName} no presente o valor ${value} inconsistente. ${e}`);\n }\n }\n\n isField(): boolean { return this.elementType === ElementType.Field; }\n isAction(): boolean { return this.elementType === ElementType.Action; }\n isTable(): boolean { return this.elementType === ElementType.Table; }\n}\n","import { Observable, Subject } from 'rxjs';\nimport yn from 'yn';\nimport { ElementType, NO_ERROR } from './form.constants';\nimport { FormElement } from './element';\nimport { FieldDefinition, FieldEditionEvent, FieldCustomEventData, IFormConfig } from '../../interfaces/form-config.interface';\n\nconst UNDEFINED = 'undefined';\n\nconst DEFAULT_ERROR_TYPE = 'error';\nconst DEFAULT_CAPTURE_TYPE = 'INPUT';\nconst DEFAULT_ALIGNMENT = 'left';\n\nconst STD_MAX_LENGTH = 50;\nconst BIG_MAX_LENGTH = 500;\n\nconst directChanges = [\n 'defaultEditable', 'defaultValue', 'alignment', 'required', 'errorCode', 'errorMessage', 'errorType',\n 'tooltip', 'info', 'format', 'intrinsicErrorMessage', 'outputOnly', 'captureType', 'title', 'type',\n 'maxLength', 'maxValue', 'minLength', 'minValue', 'validateOnServer', 'serverAction', 'visibleLabel',\n 'options', 'placeholder',\n];\n\nconst attrs = {\n captureType: { name: '_captureType', propagate: 'captureType' },\n errorCode: { name: '_errorCode', propagate: 'errorCode' },\n errorMessage: { name: '_errorMessage', propagate: 'errorMessage' },\n errorType: { name: '_errorType', propagate: 'errorType' },\n defaultValue: { name: '_defaultValue', propagate: 'defaultValue' },\n defaultEditable: { name: '_defaultEditable', propagate: 'defaultEditable' },\n fieldAlignment: { name: '_fieldAlignment', propagate: 'alignment' },\n fieldCode: { name: '_fieldCode', propagate: 'code' },\n fieldInfo: { name: '_fieldInfo', propagate: 'info' },\n fieldRequired: { name: '_fieldRequired', propagate: 'required' },\n fieldTitle: { name: '_fieldTitle', propagate: 'title' },\n fieldType: { name: '_fieldType', propagate: 'type' },\n fieldFormat: { name: '_fieldFormat', propagate: 'format' },\n fieldOptions: { name: '_fieldOptions', propagate: 'options' },\n focus: { name: '_focus', propagate: 'focus' },\n hasChanged: { name: '_hasChanged', propagate: 'hasChanged' },\n intrinsicErrorMessage: { name: '_intrinsicErrorMessage', propagate: null as string | null },\n maxLength: { name: '_maxLength', propagate: 'maxLength' },\n maxValue: { name: '_maxValue', propagate: 'maxValue' },\n minLength: { name: '_minLength', propagate: 'minLength' },\n minValue: { name: '_minValue', propagate: 'minValue' },\n onValidation: { name: '_onValidation', propagate: 'onValidation' },\n outputOnly: { name: '_outputOnly', propagate: 'outputOnly' },\n placeholder: { name: '_placeholder', propagate: 'placeholder' },\n tooltipText: { name: '_tooltipText', propagate: 'tooltip' },\n validateOnServer: { name: '_validateOnServer', propagate: 'validateOnServer' },\n value: { name: '_value', propagate: 'value' },\n visibleLabel: { name: '_visibleLabel', propagate: 'visibleLabel' },\n};\n\nexport interface DetailEvent {\n code: string;\n detail: any;\n}\n\nexport interface FieldOption {\n fieldOptionValue: string;\n fieldOptionId: string;\n}\n\nexport class FieldDescriptor extends FormElement {\n private readonly _customEvent = new Subject<FieldCustomEventData>();\n private readonly _editionFinish = new Subject<FieldEditionEvent>();\n private readonly _editionPartial = new Subject<FieldEditionEvent>();\n private readonly _detailRequest = new Subject<DetailEvent>();\n\n private _errorType: string = '';\n private _errorCode: string = '';\n private _errorMessage: string = '';\n private _intrinsicErrorMessage: string = '';\n private _minValue: any;\n private _maxValue: any;\n private _maxLength: number = 0;\n private _minLength: number = 0;\n private _focus: boolean = false;\n private _onValidation: boolean = false;\n private _validateOnServer: boolean = false;\n private _value: any;\n private _visibleLabel: boolean = false;\n private _captureType: string = '';\n private _defaultValue: any = '';\n private _defaultEditable: boolean = false;\n private _externalValue: any;\n private _fieldAlignment: string = '';\n private _fieldInfo: any = '';\n private _fieldRequired: boolean = false;\n private _fieldTitle: string = '';\n private _fieldType: string = '';\n private _fieldFormat: RegExp | null = null;\n private _hasChanged: boolean = false;\n private _outputOnly: boolean = false;\n private _tooltipText: string = '';\n private _placeholder: string = '';\n private _fieldCode: string = '';\n private _fieldOptions: FieldOption[] | null = null;\n private _customEmpty: ((this: FieldDescriptor) => boolean) | null = null;\n\n constructor(inputFieldReceived: FieldDefinition, formConfig: IFormConfig) {\n super(inputFieldReceived, formConfig);\n this.elementType = ElementType.Field;\n const fld: any = (inputFieldReceived) ? inputFieldReceived : {};\n this.setAttr(attrs.fieldCode, fld.fieldCode);\n this.title = fld.fieldTitle ?? this._fieldCode;\n this.placeholder = fld.placeholder ?? this.title;\n this.type = fld.fieldTypeCode;\n this.captureType = fld.captureType ?? DEFAULT_CAPTURE_TYPE;\n\n const defaultValue = fld.defaultValue ?? null;\n if (this._fieldType === this._formConfig.fieldTypes.boolean) {\n this.defaultValue = defaultValue ?? false;\n } else {\n this.defaultValue = defaultValue;\n }\n const defaultTypeAlignment = (this._formConfig.tableFieldStyles[this._fieldType] != null)\n ? this._formConfig.tableFieldStyles[this._fieldType]['text-align'] : DEFAULT_ALIGNMENT;\n const fieldAlignment = (fld.alignment != null) ? fld.alignment.toLowerCase() : defaultTypeAlignment;\n this.alignment = fieldAlignment;\n this.info = fld.info || '';\n let fieldFormat;\n try {\n if (fld.format && typeof fld.format === 'string') {\n fieldFormat = new RegExp(fld.format);\n } else if (fld.format?.regExp) {\n fieldFormat = new RegExp(fld.format?.regExp);\n }\n } catch (e) {\n fieldFormat = null;\n }\n this.format = fieldFormat;\n this.validateOnServer = fld.serverAction ?? false;\n this.tooltip = fld.tooltip || '';\n this.defaultEditable = this.enabled;\n this.required = fld.required ?? false;\n this.outputOnly = fld.outputOnly ?? false;\n this.minValue = fld.minValue;\n this.maxValue = fld.maxValue;\n this.minLength = fld.minLength ?? 0;\n this.maxLength = fld.maxLength || (this._captureType === 'TEXTAREA' ? BIG_MAX_LENGTH : STD_MAX_LENGTH);\n this.intrinsicErrorMessage = this._formConfig?.fieldValidations?.[this._fieldType]?.message\n ?? this._formConfig?.fieldValidations?.DEFAULT?.message ?? '';\n\n this.setError(fld.errorCode, fld.errorMessage, fld.errorType ?? DEFAULT_ERROR_TYPE);\n this.setEditable(fld.editable ?? true);\n this.visibleLabel = fld.visibleLabel ?? true;\n this.setVisibility(fld.visible);\n this.options = fld.fieldOptions;\n this._setValue(fld.fieldValue ?? this._defaultValue ?? '');\n }\n\n get alignment(): string { return this._fieldAlignment; }\n set alignment(alignment) { this.setAttr(attrs.fieldAlignment, alignment); }\n get backend(): boolean { return this._validateOnServer; }\n\n get captureType(): string { return this._captureType; }\n set captureType(captureType) { this.setAttr(attrs.captureType, captureType); }\n\n get placeholder(): string { return this._placeholder; }\n set placeholder(placeholder) { this.setAttr(attrs.placeholder, placeholder); }\n\n get code(): string { return this._fieldCode; }\n get defaultValue(): any { return this._defaultValue; }\n set defaultValue(defaultValue) { this.setAttr(attrs.defaultValue, defaultValue); }\n get defaultEditable(): boolean { return this._defaultEditable; }\n set defaultEditable(editable) { this.setAttr(attrs.defaultEditable, editable); }\n get detailRequest(): Observable<DetailEvent> { return this._detailRequest.asObservable(); }\n get customEvent(): Observable<FieldCustomEventData> { return this._customEvent.asObservable(); }\n get editionFinish(): Observable<FieldEditionEvent> { return this._editionFinish.asObservable(); }\n get editionPartial(): Observable<FieldEditionEvent> { return this._editionPartial.asObservable(); }\n\n get empty(): boolean { return this._customEmpty ? this._customEmpty.call(this) : this.defaultEmpty(); }\n get error(): { type: string; code: string; message: string } { return { type: this._errorType, code: this._errorCode, message: this._errorMessage }; }\n set error(errorObj) { this.setError(errorObj.code, errorObj.message, errorObj.type ?? DEFAULT_ERROR_TYPE) }\n get errorCode(): string { return this._errorCode; }\n set errorCode(code) { this.setError(code, this._errorMessage); }\n get errorMessage(): string { return this._errorMessage; }\n set errorMessage(msg) { this.setError(this._errorCode, msg); }\n get errorType(): string { return this._errorType; }\n get externalValue(): any { return this._externalValue; }\n get format(): RegExp | null { return this._fieldFormat; }\n set format(format) { this.setAttr(attrs.fieldFormat, format); }\n get hasChanged(): boolean { return this._hasChanged; }\n set hasChanged(hasChanged) { this.setAttr(attrs.hasChanged, hasChanged); }\n\n get info(): any { return this._fieldInfo; }\n set info(newInfo: string) { this.setAttr(attrs.fieldInfo, newInfo); }\n set intrinsicErrorMessage(message: string) { this.setAttr(attrs.intrinsicErrorMessage, message); }\n get maxLength(): string { return (this._maxLength > 0) ? this._maxLength.toString() : ''; }\n set maxLength(requiredMaxLength: any) { this.setAttr(attrs.maxLength, requiredMaxLength ? +requiredMaxLength : null); }\n get maxValue(): any { return this._maxValue; }\n\n set maxValue(inputMaxValue) {\n let maxValue = inputMaxValue;\n if (this._fieldType === this._formConfig.fieldTypes.date) {\n maxValue = new Date(maxValue);\n }\n this.setAttr(attrs.maxValue, maxValue);\n }\n\n get minLength(): number { return this._minLength; }\n set minLength(requiredMinLength: number) {\n this.setAttr(attrs.minLength, requiredMinLength ? +requiredMinLength : null);\n }\n get minValue(): any { return this._minValue; }\n\n set minValue(inputMinValue) {\n let minValue = inputMinValue;\n if (this._fieldType === this._formConfig.fieldTypes.date) {\n minValue = new Date(minValue);\n }\n this.setAttr(attrs.minValue, minValue);\n }\n\n get name(): string { return this._fieldCode; }\n\n get options(): FieldOption[] | null {\n return this._fieldOptions?.map(option => {\n const optionCopy: FieldOption = { ...option };\n return optionCopy;\n }) ?? [];\n }\n\n set options(newOptions) {\n if ((!this._formConfig.captureTypesWithOptions.includes(this._captureType))\n || typeof newOptions === UNDEFINED || !newOptions\n || !Array.isArray(newOptions)) {\n return;\n }\n let fieldOptions = newOptions.map((option: any) => {\n if (option.text !== undefined && option.text !== null\n && option.value !== undefined && option.value !== null) {\n return { fieldOptionValue: option.text, fieldOptionId: option.value };\n }\n return option;\n });\n fieldOptions = (fieldOptions && Array.isArray(fieldOptions)\n && fieldOptions.length > 0) ? fieldOptions : [];\n this.setAttr(attrs.fieldOptions, fieldOptions);\n if (this._value) {\n if (this._fieldType === this._formConfig.fieldTypes.array && Array.isArray(this._value)) {\n const fieldValue = this._value?.filter(item =>\n this._fieldOptions?.find(opt => opt.fieldOptionId === item)\n );\n this.setAttr(attrs.value, fieldValue);\n } else {\n const valInOptions = this._fieldOptions?.find(item => item.fieldOptionId === this._value);\n if (!valInOptions) {\n this._setValue('');\n }\n }\n }\n if (this._fieldRequired && this._fieldOptions?.length === 1 && this._value !== this._fieldOptions?.[0].fieldOptionId) {\n this._setValue(this._fieldOptions?.[0].fieldOptionId);\n this.notifyEditionFinish();\n }\n }\n\n get optionText(): string | null { return this._fieldOptions?.find(item => item.fieldOptionId === this._value)?.fieldOptionValue ?? null; }\n get outputOnly(): boolean { return this._outputOnly; }\n set outputOnly(outputOnly) { this.setAttr(attrs.outputOnly, outputOnly); }\n get required(): boolean { return this._fieldRequired; }\n set required(required: boolean) { this.setAttr(attrs.fieldRequired, required ?? false); }\n get title(): string { return this._fieldTitle; }\n set title(title) { this.setAttr(attrs.fieldTitle, title?.toString() ?? ''); }\n get tooltip(): string { return this._tooltipText; }\n set tooltip(tooltip) { this.setAttr(attrs.tooltipText, tooltip); }\n get type(): string { return this._fieldType; }\n set type(fieldType) { this.setAttr(attrs.fieldType, fieldType); }\n get onValidation(): boolean { return this._onValidation; }\n get validating(): boolean { return this._onValidation; }\n set validating(isValidating: boolean) { this.setAttr(attrs.onValidation, isValidating); }\n get value(): any {\n return (this._fieldType === this._formConfig.fieldTypes.boolean\n || this._fieldType === this._formConfig.fieldTypes.check) ? yn(this._value) : this._value;\n }\n get validateOnServer(): boolean { return this._validateOnServer; }\n set validateOnServer(validateOnServer) { this.setAttr(attrs.validateOnServer, validateOnServer); }\n get serverAction(): boolean { return this._validateOnServer; }\n set serverAction(validateOnServer: boolean) { this.validateOnServer = validateOnServer; }\n\n set value(newValue) { this._setValue(newValue); }\n get visibleLabel(): boolean { return this._visibleLabel; }\n set visibleLabel(visibleLabel: boolean) { this.setAttr(attrs.visibleLabel, visibleLabel); }\n\n /**\n * @deprecated Since v17. Use value instead. Will be removed in v19.\n */\n get fieldValue(): any { return this.value; }\n\n /**\n * @deprecated Since v17. Use hasChanged instead. Will be removed in v19.\n */\n changed(hasChanged = true) { this.hasChanged = hasChanged; }\n\n clean(): void { this._setValue(this._defaultValue || ''); this.resetError(); }\n setCustomEmpty(fn: ((this: FieldDescriptor) => boolean) | null): void { this._customEmpty = fn; }\n focus(): void { this.setAttr(attrs.focus, true); }\n getErrorCode() { return this.error.code; }\n setErrorCode(code: string) { this.setError(code, this._errorMessage); }\n getErrorMessage() { return this.error.message; }\n setErrorMessage(msg: string) { this.setError(this._errorCode, msg); }\n getRequired() { return this.required; }\n hasError() { return this._errorCode !== NO_ERROR; }\n hideLabel(): void { this.visibleLabel = false; }\n resetError() { (this._errorCode !== NO_ERROR) && this.setError(NO_ERROR, null); }\n setEditable(editable: boolean = true) { (editable) ? this.enable() : this.disable(); }\n setValue(newValue: any, widgetUpdate: boolean = true) { this._setValue(newValue, widgetUpdate); }\n showLabel(): void { this.visibleLabel = true; }\n\n /**\n * @deprecated Since v17. Use code instead. Will be removed in v19.\n */\n get fieldCode(): string { return this._fieldCode; }\n\n\n /**\n * @deprecated Since v17. Use title instead. Will be removed in v19.\n */\n setLabel(label: string) { this.title = label; }\n\n /**\n * @deprecated Since v17. Use required instead. Will be removed in v19.\n */\n setRequired(required: boolean) { this.required = required; }\n\n /**\n * @deprecated Since v17. Use changed instead. Will be removed in v19.\n */\n setChanged(hasChanged: boolean) { this.changed(hasChanged); }\n\n /**\n * @deprecated Since v17. Use value instead. Will be removed in v19.\n */\n getValue(): any { return this.value; }\n\n /**\n * @deprecated Since v17. Use empty instead. Will be removed in v19.\n */\n isEmpty(): boolean { return this.empty }\n\n /**\n * @deprecated Since v17. Use error instead. Will be removed in v19.\n */\n getError() { return this.error; }\n\n /**\n * @deprecated Since v17. Use optionText instead. Will be removed in v19.\n */\n getOptionText() { return this.optionText; }\n\n /**\n * @deprecated Since v17. Use options instead. Will be removed in v19.\n */\n getFieldOptions() { return this.options; }\n\n /**\n * @deprecated Since v17. Use options instead. Will be removed in v19.\n */\n setFieldOptions(newOptions: any) { return this.options = newOptions; }\n\n /**\n * @deprecated Since v17. Use intrinsicErrorMessage instead. Will be removed in v19.\n */\n setIntrinsicErrorMessage(message: string) { this.intrinsicErrorMessage = message; }\n\n /**\n * @deprecated Since v17. Use maxValue instead. Will be removed in v19.\n */\n setMaxValue(inputMaxValue: any) { this.maxValue = inputMaxValue; }\n\n /**\n * @deprecated Since v17. Use minValue instead. Will be removed in v19.\n */\n setMinValue(inputMinValue: any) { this.minValue = inputMinValue; }\n\n /**\n * @deprecated Since v17. Use showLabel instead. Will be removed in v19.\n */\n setVisibleLabel(visibleLabel: boolean) { this.visibleLabel = visibleLabel; }\n\n defaultEmpty(): boolean {\n const fieldCurrentValue = this.value;\n if (fieldCurrentValue === undefined || fieldCurrentValue === null) {\n return true;\n }\n if (this._fieldType === this._formConfig.fieldTypes.array\n && Array.isArray(fieldCurrentValue) && fieldCurrentValue.length === 0) {\n return true;\n };\n if (this._fieldType === this._formConfig.fieldTypes.phone) {\n if (!Array.isArray(fieldCurrentValue)) {\n return true;\n }\n if (fieldCurrentValue.length !== 2 || !fieldCurrentValue[0] || !fieldCurrentValue[1]) {\n return true;\n }\n return false;\n };\n const arrayFieldTypes = this._formConfig.arrayFieldTypes ?? null;\n if (arrayFieldTypes && Object.keys(arrayFieldTypes).includes(this._fieldType)) {\n let arraySize = arrayFieldTypes[this._fieldType];\n arraySize = !Number.isNaN(+arraySize) ? +arraySize : 0;\n if (arraySize === 0) {\n return (Array.isArray(fieldCurrentValue) && fieldCurrentValue.length === 0);\n }\n return (Array.isArray(fieldCurrentValue) && fieldCurrentValue.length < arraySize);\n };\n return fieldCurrentValue === '';\n }\n\n\n notifyEditionPartial(): void {\n this.resetError();\n this._editionPartial.next({ code: this._fieldCode, intrinsicValidation: true });\n }\n\n triggerCustomEvent(eventName: string, eventData: any): void {\n this._customEvent.next({ code: this._fieldCode, eventName, eventData });\n }\n\n notifyEditionFinish(): void {\n const fieldValue = this.value;\n this.resetError();\n const validationConfig: any = this._formConfig.fieldValidations?.[this._fieldType] ?? {};\n const { type, validation } = validationConfig;\n let message = validationConfig?.message;\n let intrinsicValidation = true;\n if (fieldValue && (validation || this._fieldFormat)) {\n if (type === 'regexp') {\n intrinsicValidation = (validation?.test(fieldValue) ?? true)\n && (this._fieldFormat?.test(fieldValue) ?? true);\n } else if (type === 'function' && typeof validation === 'function') {\n const { valid, message: customMessage } = validation(fieldValue, this);\n intrinsicValidation = valid;\n message = customMessage;\n }\n if (!intrinsicValidation) {\n this.setError('99', message ?? this._intrinsicErrorMessage);\n }\n }\n if (intrinsicValidation && fieldValue && this._minValue && fieldValue < this._minValue) {\n intrinsicValidation = false;\n const formatedMinValue = !isNaN(+this._minValue)\n ? Number(this._minValue).toLocaleString('es-CO')\n : this._minValue;\n this.setError('99', `El valor de ${this.title} no puede ser inferior a ${formatedMinValue}`);\n }\n if (intrinsicValidation && fieldValue && this._maxValue && fieldValue > this._maxValue) {\n intrinsicValidation = false;\n const formatedMaxValue = !isNaN(+this._maxValue)\n ? Number(this._maxValue).toLocaleString('es-CO')\n : this._maxValue;\n this.setError('99', `El valor de ${this.title} no puede ser superior a ${formatedMaxValue}`);\n }\n if (intrinsicValidation && fieldValue && typeof fieldValue === 'string'\n && this._minLength && fieldValue?.length < this._minLength) {\n intrinsicValidation = false;\n this.setError('99', `Longitud de ${this._fieldTitle} debe ser de al menos ${this._minLength}`);\n }\n this._editionFinish.next({ code: this._fieldCode, intrinsicValidation });\n }\n\n notifyEditionDetailRequest(detail: any): void {\n const detailEvent: DetailEvent = { code: this._fieldCode, detail };\n this._detailRequest.next(detailEvent);\n }\n\n setError(code: string, message: string | null, type: string = DEFAULT_ERROR_TYPE) {\n this.setAttr(attrs.errorCode, code ?? NO_ERROR);\n this.setAttr(attrs.errorType, (this._errorCode === NO_ERROR) ? '' : type);\n this.setAttr(attrs.errorMessage, message ?? '');\n }\n\n updateFromServer(fld: any): void {\n const fieldKeys = Object.keys(fld);\n for (let index = 0; index < fieldKeys.length; index++) {\n const attrName = fieldKeys[index];\n const attrValue = fld[attrName];\n if (directChanges.includes(attrName)) {\n (this as any)[attrName] = attrValue;\n } else {\n (attrName === 'label') && (this.title = attrValue);\n (attrName === 'labelVisible') && (this.visibleLabel = attrValue);\n (attrName === 'editable') && this.setEditable(attrValue);\n (attrName === 'visible') && this.setVisibility(attrValue);\n (attrName === 'value') && (this._setValue(attrValue) && (this.hasChanged = false));\n (attrName === 'fieldValue') && (this._setValue(attrValue) && (this.hasChanged = false));\n (attrName === 'fieldOptions') && (this.options = attrValue);\n (attrName === 'fieldTitle') && (this.title = attrValue);\n (attrName === 'fieldTypeCode') && (this.type = attrValue);\n (attrName === 'fieldType') && (this.type = attrValue);\n (attrName === 'tooltipText') && (this.tooltip = attrValue);\n (attrName === 'customAttributes') && (this.setCustomAttributes(attrValue));\n }\n }\n }\n\n private _setValue(newValue: any, widgetUpdate: boolean = true) {\n if (typeof newValue === UNDEFINED) {\n return true;\n }\n if (newValue === null && this.required) {\n return true;\n }\n let newFinalValue;\n if (this._fieldType === this._formConfig.fieldTypes.boolean\n || this._fieldType === this._formConfig.fieldTypes.check) {\n newFinalValue = yn(newValue) ?? false;\n } else if (this._fieldType === this._formConfig.fieldTypes.array\n || this._fieldType === this._formConfig.fieldTypes.map) {\n if (newValue === null || newValue === '') {\n newFinalValue = [];\n } else if (Array.isArray(newValue)) {\n newFinalValue = newValue;\n } else {\n newFinalValue = newValue.toString().split(',');\n }\n } else {\n newFinalValue = newValue;\n }\n if (this._value !== newFinalValue) {\n this._hasChanged = true;\n if (widgetUpdate) {\n this.setAttr(attrs.value, newFinalValue);\n } else {\n this._value = newFinalValue;\n }\n }\n return true;\n }\n}\n","import { Observable, Subject, takeUntil } from 'rxjs';\nimport { ElementType, HEADER } from './form.constants';\nimport { FormElement } from './element';\nimport { ActionDefinition, IFormConfig } from '../../interfaces/form-config.interface';\n\nconst attrs = {\n actionCode: { name: '_actionCode', propagate: 'actionCode' },\n actionName: { name: '_actionName', propagate: 'actionName' },\n iconName: { name: '_iconName', propagate: 'iconName' },\n inProgress: { name: '_inProgress', propagate: 'inProgress' },\n restrictedOnField: { name: '_restrictedOnField', propagate: 'restrictedOnField' },\n restrictedOnOperator: { name: '_restrictedOnOperator', propagate: 'restrictedOnOperator' },\n restrictedOnValue: { name: '_restrictedOnValue', propagate: 'restrictedOnValue' },\n}\n\nexport class FormAction extends FormElement {\n private readonly _actionActivated = new Subject<string>();\n private _actionCode: string = '';\n private _actionName: string = '';\n private _iconName: string = '';\n private _inProgress = false;\n private _newState: string;\n private _backend: boolean;\n private _restrictedOnField: string | null = null;\n private _restrictedOnOperator: string | null = null;\n private _restrictedOnValue: string | null = null;\n\n constructor(actionDefinition: ActionDefinition, formConfig: IFormConfig) {\n super(actionDefinition, formConfig);\n this.elementType = ElementType.Action;\n this.setAttr(attrs.actionCode, actionDefinition.actionCode ? actionDefinition.actionCode.toString() : '');\n this.setAttr(attrs.actionName, actionDefinition.actionTitle);\n this.setAttr(attrs.iconName, actionDefinition.iconName || '');\n this.setAttr(attrs.restrictedOnField, actionDefinition.fieldRestrictedCode?.toString() ?? null);\n if (this._restrictedOnField) {\n this.setAttr(attrs.restrictedOnOperator, actionDefinition.operatorRestricted || '');\n this.setAttr(attrs.restrictedOnValue, actionDefinition.valueRestricted ?? '');\n }\n this._backend = actionDefinition?.serverAction ?? false;\n this._newState = actionDefinition?.newState;\n this.setCustomAttribute('location', actionDefinition.position || HEADER);\n }\n\n get actionCode(): string { return this._actionCode; }\n get actionName(): string { return this._actionName; }\n get iconName(): string { return this._iconName; }\n get inProgress(): boolean { return this._inProgress; }\n get newState(): string { return this._newState; }\n get backend(): boolean { return this._backend; }\n get restrictedOnField(): string | null { return this._restrictedOnField; }\n get restrictedOnOperator(): string | null { return this._restrictedOnOperator; }\n get restrictedOnValue(): string | null { return this._restrictedOnValue; }\n\n set actionCode(actionCode) { this.setAttr(attrs.actionCode, actionCode); }\n set actionName(actionName) { this.setAttr(attrs.actionName, actionName); }\n set iconName(iconName) { this.setAttr(attrs.iconName, iconName); }\n set inProgress(inProgress) { this.setAttr(attrs.inProgress, inProgress); }\n set newState(newState) { this._newState = newState; }\n set backend(backend) { this._backend = backend; }\n set restrictedOnField(restrictedOnField) { this.setAttr(attrs.restrictedOnField, restrictedOnField); }\n set restrictedOnOperator(restrictedOnOperator) { this.setAttr(attrs.restrictedOnOperator, restrictedOnOperator); }\n set restrictedOnValue(restrictedOnValue) { this.setAttr(attrs.restrictedOnValue, restrictedOnValue); }\n\n start(): void { this.inProgress = true; }\n stop(): void { this.inProgress = false; }\n\n override connectWithParentForm(form: any, formChangeSubject: any): void {\n super.connectWithParentForm(form, formChangeSubject);\n if (this._restrictedOnField) {\n const relatedField = this._form.fields?.[this._restrictedOnField];\n if (relatedField) {\n relatedField.editionFinish\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (event: any) => this.updateRestrictedVisibility(event),\n error: (err: any) => console.error(`Error en restricted visibility subscription: ${err}`)\n });\n relatedField.editionPartial\n .pipe(takeUntil(this.destroy$))\n .subscribe({\n next: (event: any) => this.updateRestrictedVisibility(event),\n error: (err: any) => console.error(`Error en restricted visibility subscription: ${err}`)\n });\n }\n }\n }\n\n updateRestrictedVisibility(event: any): void {\n const newVisible = this._absoluteVisible && this.viewOnState(this._formState);\n (this._visible !== newVisible) && this.setVisibility(newVisible);\n }\n\n override viewOnState(state: string): boolean {\n const actionVisible = (this.visibleStates && state) ? this.visibleStates.includes(state) : false;\n if (actionVisible && this._form && this._restrictedOnField) {\n const relatedField = this._form.fields?.[this._restrictedOnField];\n if (relatedField) {\n const fieldValue = relatedField.value;\n if ((this._restrictedOnOperator === '==' && fieldValue !== this._restrictedOnValue)\n || (this._restrictedOnOperator === '!=' && fieldValue === this._restrictedOnValue)) {\n return false;\n }\n }\n }\n return actionVisible;\n }\n\n get actionActivated(): Observable<string> { return this._actionActivated.asObservable(); }\n\n notifyActivation(): void { this._actionActivated.next(this._actionCode); }\n\n updateFromServer(receivedAction: any): void {\n for (const propertyName in receivedAction) {\n if (propertyName !== 'actionCode' && propertyName !== 'actionId') {\n try {\n (this as any)[propertyName] = receivedAction[propertyName];\n } catch (e) {\n console.log(`Error actualizando la propiedad ${propertyName} de la acción ${this.actionCode}. ${e}`);\n }\n }\n }\n }\n}\n","import { FormPiecePropagate } from './piece-propagate';\nimport { FormAction } from './action';\nimport { FieldDescriptor } from './field';\nimport { FormElement } from './element';\nimport { RecordTable } from './table/table';\nimport { ElementType } from './form.constants';\nimport { IFormConfig, SubsectionDefinition } from '../../interfaces/form-config.interface';\n\nexport class RecordFormSubSection extends FormPiecePropagate {\n private _customRender: string | null = null;\n private _subsectionId: string | null = null;\n private _subsectionCode: string | null = null;\n private _subsectionTitle: string | null = null;\n private _subSectionElements: FormElement[] = [];\n private _subSectionFields: FieldDescriptor[] = [];\n private _subSectionTables: RecordTable[] = [];\n private _subSectionActions: FormAction[] = [];\n private _elementsArray: Record<string, FormElement> = {};\n private _active = false;\n\n constructor(subsectionReceived: SubsectionDefinition, formObject: any, formConfig: IFormConfig) {\n super(subsectionReceived, formConfig);\n if (!subsectionReceived) { return; }\n this._subsectionId = (subsectionReceived.subsectionId) ? subsectionReceived.subsectionId.toString() : '';\n this._subsectionCode = (subsectionReceived.subsectionCode) ? subsectionReceived.subsectionCode : '';\n this._subsectionTitle = (subsectionReceived.subsectionTitle) ? subsectionReceived.subsectionTitle : '';\n if (subsectionReceived.elements) {\n for (const receivedElement of subsectionReceived.elements) {\n let elementObject: any = null;\n let arrayToAdd: any[] = [];\n const { type, code } = receivedElement;\n switch (type) {\n case ElementType.Field:\n elementObject = formObject.getField(code);\n arrayToAdd = this._subSectionFields;\n break;\n case ElementType.Table:\n elementObject = formObject.getTable(code);\n arrayToAdd = this._subSectionTables;\n break;\n case ElementType.Action:\n elementObject = formObject.getAction(code);\n arrayToAdd = this._subSectionActions;\n break;\n }\n if (elementObject) {\n elementObject.elementType = type;\n arrayToAdd.push(elementObject);\n this._subSectionElements.push(elementObject);\n this._elementsArray[code] = elementObject;\n }\n }\n }\n }\n\n get customRender(): string | null { return this._customRender; }\n set customRender(customRenderName) { this._customRender = customRenderName; }\n\n get subsectionId(): string | null { return this._subsectionId; }\n get subsectionCode(): string | null { return this._subsectionCode; }\n get subsectionTitle(): string | null { return this._subsectionTitle; }\n get subSectionElements(): FormElement[] { return this._subSectionElements; }\n get subSectionFields(): FieldDescriptor[] { return this._subSectionFields; }\n get subSectionTables(): RecordTable[] { return this._subSectionTables; }\n get subSectionActions(): FormAction[] { return this._subSectionActions; }\n get elementsArray(): Record<string, FormElement> { return this._elementsArray; }\n get active(): boolean { return this._active; }\n\n set subsectionId(subsectionId) { this._subsectionId = subsectionId; }\n set subsectionCode(subsectionCode) { this._subsectionCode = subsectionCode; }\n set subsectionTitle(subsectionTitle) { this._subsectionTitle = subsectionTitle; }\n set subSectionElements(subSectionElements) { this._subSectionElements = subSectionElements; }\n set subSectionFields(subSectionFields) { this._subSectionFields = subSectionFields; }\n set subSectionTables(subSectionTables) { this._subSectionTables = subSectionTables; }\n set subSectionActions(subSectionActions) { this._subSectionActions = subSectionActions; }\n set elementsArray(elementsArray) { this._elementsArray = elementsArray; }\n set active(active) { this._active = active; }\n\n getField(name: string): FieldDescriptor | undefined {\n return this._subSectionFields.find(fld => fld.name === name);\n }\n\n getFields(): FieldDescriptor[] {\n return this._subSectionFields;\n }\n\n getFieldNames(): string[] {\n return this._subSectionFields.map(field => field.code);\n }\n\n getActions(): FormAction[] {\n return this._subSectionActions;\n }\n\n getActionNames(): string[] {\n return this._subSectionActions.map(action => action.actionCode);\n }\n\n activate(): void {\n if (!this._active) {\n this._active = true;\n }\n }\n\n inactivate(): void {\n if (this._active) {\n this._active = false;\n }\n }\n}\n","import { Observable, Subject } from 'rxjs';\nimport { FormPiecePropagate } from './piece-propagate';\nimport { FormAction } from './action';\nimport { FieldDescriptor } from './field';\nimport { RecordFormSubSection } from './subsection';\nimport { SectionDefinition, IFormConfig } from '../../interfaces/form-config.interface';\n\nconst ACTIVE = 'active';\n\nexport class RecordFormSection extends FormPiecePropagate {\n private readonly _activation = new Subject<string>();\n private readonly _inactivation = new Subject<string>();\n private _active = false;\n private _sectionId: string | null = null;\n private _sectionCode: string | null = null;\n private _sectionTitle: string | null = null;\n private _subSections: RecordFormSubSection[] = [];\n private _subSectionsObj: Record<string, RecordFormSubSection> = {};\n private _exclusiveSubSectionsByAttr: Record<string, string> = {};\n\n constructor(sectionReceived: SectionDefinition, formObject: any, formConfig: IFormConfig) {\n super(sectionReceived, formConfig);\n if (!sectionReceived) { return; }\n this._sectionId = (sectionReceived.sectionId) ? sectionReceived.sectionId.toString() : '';\n this._sectionCode = (sectionReceived.sectionCode) ? sectionReceived.sectionCode : '';\n this._sectionTitle = (sectionReceived.sectionTitle) ? sectionReceived.sectionTitle : '';\n this._subSections = [];\n this._subSectionsObj = {};\n if (sectionReceived.subsections) {\n const subsections = sectionReceived.subsections.map(subSecDef => {\n const visibleStates = subSecDef.visibleStates ?? [];\n if (subSecDef.elements && Array.isArray(subSecDef.elements)) {\n subSecDef.elements = subSecDef.elements.map((elm: any) => ({ code: elm.elementCode, type: elm.elementTypeName }));\n }\n return { ...subSecDef, visibleStates };\n });\n for (const subsectionReceived of subsections) {\n const subSectionToAdd = new RecordFormSubSection(subsectionReceived, formObject, formConfig);\n const subsectionCode = subSectionToAdd.subsectionCode;\n if (subsectionCode) {\n this._subSections.push(subSectionToAdd);\n this._subSectionsObj[subsectionCode] = subSectionToAdd;\n }\n }\n }\n }\n\n get code(): string | null { return this._sectionCode; }\n get activation(): Observable<string> { return this._activation.asObservable(); }\n get inactivation(): Observable<string> { return this._inact