ngx-t-forms 2.0.29 → 2.0.30

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.
Files changed (62) hide show
  1. package/fesm2022/{ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs → ngx-t-forms-calculated-field-rules.component-Ct6_c_Lj.mjs} +3 -3
  2. package/fesm2022/{ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs.map → ngx-t-forms-calculated-field-rules.component-Ct6_c_Lj.mjs.map} +1 -1
  3. package/fesm2022/{ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs → ngx-t-forms-chip-options-creator-editor.component-yuM1KHho.mjs} +2 -2
  4. package/fesm2022/{ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs.map → ngx-t-forms-chip-options-creator-editor.component-yuM1KHho.mjs.map} +1 -1
  5. package/fesm2022/{ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs → ngx-t-forms-config-mscoa-additional-inputs.component-BptpYSe-.mjs} +2 -2
  6. package/fesm2022/{ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs.map → ngx-t-forms-config-mscoa-additional-inputs.component-BptpYSe-.mjs.map} +1 -1
  7. package/fesm2022/{ngx-t-forms-data-source-picker.component-DxORinAD.mjs → ngx-t-forms-data-source-picker.component-Badna1Rl.mjs} +5 -5
  8. package/fesm2022/{ngx-t-forms-data-source-picker.component-DxORinAD.mjs.map → ngx-t-forms-data-source-picker.component-Badna1Rl.mjs.map} +1 -1
  9. package/fesm2022/{ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs → ngx-t-forms-document-list-label-config-editor.component-2_8XzUgD.mjs} +3 -3
  10. package/fesm2022/{ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs.map → ngx-t-forms-document-list-label-config-editor.component-2_8XzUgD.mjs.map} +1 -1
  11. package/fesm2022/{ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs → ngx-t-forms-form-input-selector.component-DV4Sts9F.mjs} +2 -2
  12. package/fesm2022/{ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs.map → ngx-t-forms-form-input-selector.component-DV4Sts9F.mjs.map} +1 -1
  13. package/fesm2022/{ngx-t-forms-form-json-view.component-DePf44w6.mjs → ngx-t-forms-form-json-view.component-B8seYzMQ.mjs} +2 -2
  14. package/fesm2022/{ngx-t-forms-form-json-view.component-DePf44w6.mjs.map → ngx-t-forms-form-json-view.component-B8seYzMQ.mjs.map} +1 -1
  15. package/fesm2022/ngx-t-forms-form-section-stepper.component-x_83iAWA.mjs +281 -0
  16. package/fesm2022/ngx-t-forms-form-section-stepper.component-x_83iAWA.mjs.map +1 -0
  17. package/fesm2022/{ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs → ngx-t-forms-forms-builder-menu.component-UWo_dyVt.mjs} +4 -4
  18. package/fesm2022/{ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs.map → ngx-t-forms-forms-builder-menu.component-UWo_dyVt.mjs.map} +1 -1
  19. package/fesm2022/{ngx-t-forms-input-editor.component-D4xHO76K.mjs → ngx-t-forms-input-editor.component-B_kkOoEO.mjs} +2 -2
  20. package/fesm2022/{ngx-t-forms-input-editor.component-D4xHO76K.mjs.map → ngx-t-forms-input-editor.component-B_kkOoEO.mjs.map} +1 -1
  21. package/fesm2022/{ngx-t-forms-map-mat-options-keys-CbdW82su.mjs → ngx-t-forms-map-mat-options-keys-SM5XM9uy.mjs} +2 -2
  22. package/fesm2022/{ngx-t-forms-map-mat-options-keys-CbdW82su.mjs.map → ngx-t-forms-map-mat-options-keys-SM5XM9uy.mjs.map} +1 -1
  23. package/fesm2022/{ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs → ngx-t-forms-mat-chip-list-editor.component-C41AL9Et.mjs} +2 -2
  24. package/fesm2022/{ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs.map → ngx-t-forms-mat-chip-list-editor.component-C41AL9Et.mjs.map} +1 -1
  25. package/fesm2022/{ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs → ngx-t-forms-mat-slider-editor.component-BWe8U-sI.mjs} +2 -2
  26. package/fesm2022/{ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs.map → ngx-t-forms-mat-slider-editor.component-BWe8U-sI.mjs.map} +1 -1
  27. package/fesm2022/{ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs → ngx-t-forms-mat-slider-toggle-editor.component-B_XlkHuK.mjs} +2 -2
  28. package/fesm2022/{ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs.map → ngx-t-forms-mat-slider-toggle-editor.component-B_XlkHuK.mjs.map} +1 -1
  29. package/fesm2022/{ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs → ngx-t-forms-missing-form-configs.component-DPNNyKkt.mjs} +2 -2
  30. package/fesm2022/{ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs.map → ngx-t-forms-missing-form-configs.component-DPNNyKkt.mjs.map} +1 -1
  31. package/fesm2022/{ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs → ngx-t-forms-mscoa-chart-toolbar.component-DY1QnG08.mjs} +2 -2
  32. package/fesm2022/{ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs.map → ngx-t-forms-mscoa-chart-toolbar.component-DY1QnG08.mjs.map} +1 -1
  33. package/fesm2022/{ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs → ngx-t-forms-mscoa-error-display.component-CRc_4l3l.mjs} +2 -2
  34. package/fesm2022/{ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs.map → ngx-t-forms-mscoa-error-display.component-CRc_4l3l.mjs.map} +1 -1
  35. package/fesm2022/{ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs → ngx-t-forms-mscoa-segment-config.component-Ckr_nuZF.mjs} +2 -2
  36. package/fesm2022/{ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs.map → ngx-t-forms-mscoa-segment-config.component-Ckr_nuZF.mjs.map} +1 -1
  37. package/fesm2022/{ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs → ngx-t-forms-mscoa-temporary-hint.component-GYxT-56Y.mjs} +2 -2
  38. package/fesm2022/{ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs.map → ngx-t-forms-mscoa-temporary-hint.component-GYxT-56Y.mjs.map} +1 -1
  39. package/fesm2022/{ngx-t-forms-ngx-t-forms-D9qmig6g.mjs → ngx-t-forms-ngx-t-forms-DP2koSL5.mjs} +636 -79
  40. package/fesm2022/ngx-t-forms-ngx-t-forms-DP2koSL5.mjs.map +1 -0
  41. package/fesm2022/{ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs → ngx-t-forms-pipeline-generator.component-BxHetD_Q.mjs} +3 -3
  42. package/fesm2022/{ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs.map → ngx-t-forms-pipeline-generator.component-BxHetD_Q.mjs.map} +1 -1
  43. package/fesm2022/{ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs → ngx-t-forms-record-list-manager.component-BQuMkoXo.mjs} +2 -2
  44. package/fesm2022/{ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs.map → ngx-t-forms-record-list-manager.component-BQuMkoXo.mjs.map} +1 -1
  45. package/fesm2022/{ngx-t-forms-required-inputs.component-CSIJvSHq.mjs → ngx-t-forms-required-inputs.component-CLyq9dIR.mjs} +2 -2
  46. package/fesm2022/{ngx-t-forms-required-inputs.component-CSIJvSHq.mjs.map → ngx-t-forms-required-inputs.component-CLyq9dIR.mjs.map} +1 -1
  47. package/fesm2022/{ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs → ngx-t-forms-rest-api-call-setup.component-CWeIUKLz.mjs} +2 -2
  48. package/fesm2022/{ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs.map → ngx-t-forms-rest-api-call-setup.component-CWeIUKLz.mjs.map} +1 -1
  49. package/fesm2022/{ngx-t-forms-section-report.component-12-KdKT6.mjs → ngx-t-forms-section-report.component-BtaF39WD.mjs} +2 -2
  50. package/fesm2022/{ngx-t-forms-section-report.component-12-KdKT6.mjs.map → ngx-t-forms-section-report.component-BtaF39WD.mjs.map} +1 -1
  51. package/fesm2022/{ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs → ngx-t-forms-selection-options-editor.component-B4cEGWrK.mjs} +2 -2
  52. package/fesm2022/{ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs.map → ngx-t-forms-selection-options-editor.component-B4cEGWrK.mjs.map} +1 -1
  53. package/fesm2022/{ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs → ngx-t-forms-t-workflow-picker.component-BkVN4Wdk.mjs} +2 -2
  54. package/fesm2022/{ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs.map → ngx-t-forms-t-workflow-picker.component-BkVN4Wdk.mjs.map} +1 -1
  55. package/fesm2022/{ngx-t-forms-validators-config.component-B3j9Dmgu.mjs → ngx-t-forms-validators-config.component-Cq07Er-G.mjs} +3 -3
  56. package/fesm2022/{ngx-t-forms-validators-config.component-B3j9Dmgu.mjs.map → ngx-t-forms-validators-config.component-Cq07Er-G.mjs.map} +1 -1
  57. package/fesm2022/ngx-t-forms.mjs +1 -1
  58. package/package.json +2 -2
  59. package/types/ngx-t-forms.d.ts +148 -3
  60. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs +0 -270
  61. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs.map +0 -1
  62. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-t-forms-validators-config.component-B3j9Dmgu.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/validators-config/validators-config.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/validators-config/validators-config.component.html"],"sourcesContent":["import { Component, ElementRef, EventEmitter, HostBinding, Input, OnInit, Optional, Output, Self } from '@angular/core';\r\nimport { MenuCloseReason } from '@angular/material/menu';\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport { ElementTypes, FormControlCustomValidatorsInterface, IMultiple } from 'ngx-t-forms-types';\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { getInputIllustration } from '../../../../shared/functions/getInputIllustration';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormInputSelectorComponent } from '../form-input-selector/form-input-selector.component';\r\n\r\nimport { FormsModule, NgControl } from '@angular/forms';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { Subject } from 'rxjs';\r\nimport { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\n\r\n@Component({\r\n selector: 'app-validators-config',\r\n templateUrl: './validators-config.component.html',\r\n styleUrls: ['./validators-config.component.scss'],\r\n standalone: true,\r\n imports:[\r\n MatModulesModule,\r\n CommonModule,\r\n FormInputSelectorComponent,\r\n FormsModule\r\n ],\r\n providers: [{ provide: MatFormFieldControl, useExisting: ValidatorsConfigComponent}],\r\n})\r\nexport class ValidatorsConfigComponent implements OnInit,MatFormFieldControl<FormControlCustomValidatorsInterface []> {\r\n \r\n\r\n static nextId = 0;\r\n stateChanges = new Subject<void>();\r\n \r\n @HostBinding() id = `app-validators-config-${ValidatorsConfigComponent.nextId++}`;\r\n \r\n placeholder: string = ''\r\n constructor(@Optional() @Self() public ngControl: NgControl, private _elementRef: ElementRef<HTMLElement>,) { }\r\n focused: boolean = false;\r\n get empty() {\r\n return !this.value\r\n }\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n required: boolean = false;\r\n @Input() disabled: boolean = false;\r\nget errorState(): boolean {\r\n const hasError = !!this.ngControl?.control?.errors || (this.errors||[]).length > 0 && this.touched\r\n return !this.value && !!this.required || hasError\r\n }\r\n \r\n controlType?: string | undefined;\r\n autofilled?: boolean | undefined;\r\n userAriaDescribedBy?: string | undefined;\r\n disableAutomaticLabeling?: boolean | undefined;\r\n setDescribedByIds(ids: string[]) {\r\n // Ensure the component view is initialized\r\n if (this._elementRef && this._elementRef.nativeElement) {\r\n const controlElement = this._elementRef.nativeElement.querySelector('.app-validators-config');\r\n // Check if the controlElement exists before attempting to set its attribute\r\n if (controlElement) {\r\n controlElement.setAttribute('aria-describedby', ids.join(' '));\r\n }\r\n }\r\n }\r\n onContainerClick(event: MouseEvent): void {\r\n this.markAsTouched();\r\n this.stateChanges.next();\r\n }\r\n @Input() errors:IConfigElementError[] |undefined = [];\r\n touched: boolean = false;\r\n onTouched = () => {};\r\n markAsTouched() {\r\n if (!this.touched) {\r\n this.onTouched();\r\n this.touched = true;\r\n }\r\n } \r\n \r\n @Input() mapToData:FormColumnInputs | undefined = undefined;\r\n @Input() value!: (FormControlCustomValidatorsInterface )[];\r\n @Input() formInputs: Array<FormColumnInputs> = []\r\n @Output() valueChanged = new EventEmitter<any>();\r\n\r\n\r\n ngOnInit() {}\r\n\r\n edit:FormControlCustomValidatorsInterface | undefined\r\n menuClosed(event:MenuCloseReason){\r\n\r\n if (this.edit) {\r\n const editIndex = this.value.findIndex((item) => {\r\n if (typeof item === 'string') {\r\n return false;\r\n }\r\n return item.id === this.edit?.id;\r\n });\r\n\r\n if (editIndex !== -1) {\r\n this.value[editIndex] = this.edit;\r\n } \r\n this.valueChanged.emit([...this.value])\r\n\r\n\r\n }\r\n\r\n this.edit = undefined\r\n }\r\n showVariables :boolean = false\r\n editV(validator:string | FormControlCustomValidatorsInterface){\r\n if(this.edit?.id === (validator as FormControlCustomValidatorsInterface).id){\r\n this.edit = undefined\r\n return\r\n }\r\n this.edit = validator as any\r\n }\r\n remove(validator:FormControlCustomValidatorsInterface|string){\r\n const indexOfV = this.value.findIndex((item) => {\r\n if (typeof item === 'string') {\r\n return item === validator;\r\n }\r\n return item.id === (validator as FormControlCustomValidatorsInterface).id;\r\n }\r\n )\r\n\r\n\r\n this.value = [...this.value].filter((item,i)=>indexOfV !== i)\r\n this.valueChanged.emit([...this.value])\r\n\r\n }\r\n search: string = '';\r\n\r\n getInputIcon(element: ElementTypes) {\r\n\r\n return getInputIllustration(element)\r\n }\r\n \r\n selectInput(inputId: string) {\r\n const input = this.formInputs.find((input) => input.id === inputId)\r\n if(!input){\r\n return\r\n }\r\n if(input?.multipleInputInEditId){\r\n throw new Error('multipleInputInEditId is not supported')\r\n }\r\n if(!!this.edit){\r\n this.edit.expression = (this.edit?.expression || '' ).concat(input?.formControlName || '')\r\n if(!this.edit.inputsObservedForChanges.find((i)=>i.inputId === (input?.originalId || input?.id))){\r\n this.edit.inputsObservedForChanges.push({\r\n inputId: input?.originalId || input?.id,\r\n variable: input?.formControlName\r\n })\r\n }\r\n \r\n }\r\n \r\n\r\n this.showVariables = false\r\n\r\n }\r\n\r\n addVariable(event:any){\r\n this.showVariables = true\r\n event.stopPropagation()\r\n event.preventDefault()\r\n\r\n }\r\n getMultipleFormInputs(input: IMultiple) {\r\n if (\r\n input.element === ElementTypes.MultipleInput&&\r\n this.mapToData?.multipleInputInEditId === input.id\r\n ) {\r\n return input.formInputs;\r\n }\r\n return [];\r\n }\r\n returnExpression(){\r\n return this.edit?.expression.replace(/(word)/g, '<span style=\\'color: blue\\'>$1</span>')\r\n }\r\n addValidator(){\r\n this.edit = {\r\n message: '',\r\n expression: '',\r\n canOverride: false,\r\n inputsObservedForChanges: []\r\n } as any\r\n }\r\n\r\n onTextChange(event:Event,key:string){\r\n if(!this.edit) {\r\n this.edit = {} as any\r\n }\r\n (this.edit as any)[key] = (event.target as HTMLInputElement).value\r\n }\r\n saveVariable(event:any){\r\n if(!this.edit) return;\r\n const id = uuidv4()\r\n const val = {...this.edit, id}\r\n this.value = [...this.value, val]\r\n this.valueChanged.emit([...this.value])\r\n this.edit = undefined\r\n \r\n \r\n\r\n\r\n \r\n }\r\n removeObserved(event:any,item:{ inputId: string; variable: string; }){\r\n const i = this.edit?.inputsObservedForChanges.findIndex((i:any)=>i === item)\r\n if(i !== undefined && i !== -1 && this.edit){\r\n this.edit?.inputsObservedForChanges.splice(i, 1);\r\n this.edit.expression = this.edit?.expression.replace(new RegExp(`\\\\b${item}\\\\b`, 'g'), '')\r\n\r\n }\r\n\r\n event.stopPropagation()\r\n event.preventDefault()\r\n }\r\n isFormControlCustomValidator(validator: string |FormControlCustomValidatorsInterface ){\r\n if(typeof validator == 'string'){\r\n return validator\r\n }\r\n return validator.message\r\n\r\n }\r\n}\r\n\r\n\r\n\r\n","<div class=\"tree-instructions\">\r\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n <span>\r\n Custom validators are functions that take a form control as an argument and return an object of errors if the\r\n validation fails.\r\n </span>\r\n</div>\r\n\r\n<mat-list>\r\n<h5>\r\n Custom Validators\r\n</h5>\r\n <mat-chip-listbox [disabled]=\"disabled\" aria-label=\"Chip select options\">\r\n @for (validator of value; track $index) {\r\n <mat-chip-option\r\n style=\"height: fit-content;padding: 8px;\"\r\n [selected]=\"edit?.id === validator.id\"\r\n (click)=\"editV(validator)\"> \r\n <span style=\"white-space: normal;\">\r\n {{isFormControlCustomValidator(validator) | titlecase}}\r\n </span>\r\n \r\n <button *ngIf=\"this.edit?.id !== validator.id\" (click)=\"remove(validator)\" matChipRemove \r\n [attr.aria-label]=\"'remove ' \">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n <mat-icon *ngIf=\"this.edit?.id === validator.id\" matChipTrailingIcon>\r\n check_circle\r\n </mat-icon>\r\n \r\n \r\n </mat-chip-option>\r\n }\r\n <mat-chip-option\r\n matTooltip=\"Add a new custom validator\"\r\n selectable=\"false\"\r\n style=\"cursor: pointer !important;\"\r\n highlighted=\"true\" color=\"accent\" (click)=\"addValidator()\" *ngIf=\"!edit\">\r\n <span >\r\n\r\n </span>\r\n Add validator\r\n <mat-icon matChipTrailingIcon >add</mat-icon>\r\n\r\n \r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n\r\n \r\n \r\n\r\n\r\n</mat-list>\r\n<mat-card style=\"padding: 8px;background:var(--mat-sys-surface-container, var(--mat-app-surface))\"\r\n *ngIf=\"edit\">\r\n <ng-container *ngIf=\"edit && !showVariables; then validatorEditor\"></ng-container>\r\n <mat-toolbar *ngIf=\"!showVariables\" >\r\n <span class=\"spacer\"></span>\r\n <button (click)=\"edit=undefined\" mat-button>\r\n close\r\n </button>\r\n <button mat-raised-button [disabled]=\"!edit.expression ||!edit.message\"\r\n (click)=\"saveVariable($event)\" color=\"accent\">\r\n Save Validation\r\n </button>\r\n </mat-toolbar>\r\n <ng-container *ngIf=\"edit && !!showVariables; then variables\"></ng-container>\r\n</mat-card>\r\n\r\n\r\n\r\n\r\n<ng-template #validatorEditor>\r\n <div class=\"tree-instructions\">\r\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n <span>\r\n The expression is checked on value change. The message shows if it fails.\r\n <br>\r\n You can observe inputs for changes to re-evaluate the expression.\r\n </span>\r\n </div>\r\n <mat-list *ngIf=\"edit\">\r\n\r\n <mat-form-field style=\"margin-bottom: 16px;\" (click)=\"$event.stopPropagation();\" appearance=\"outline\" subscriptSizing=\"dynamic\" >\r\n <mat-label >Validation Message</mat-label>\r\n <textarea matInput #textarea [value]=\"edit.message\"\r\n (input)=\"onTextChange($event,'message')\"\r\n placeholder=\"\r\n Enter message\r\n \"></textarea>\r\n\r\n <mat-hint>\r\n The message to display when the validation fails\r\n </mat-hint>\r\n\r\n </mat-form-field>\r\n\r\n\r\n\r\n\r\n <mat-form-field (click)=\"$event.stopPropagation();\" appearance=\"outline\" subscriptSizing=\"dynamic\" >\r\n <mat-label >Expression</mat-label>\r\n <textarea matInput #textarea \r\n (input)=\"onTextChange($event,'expression')\"\r\n [value]=\"edit.expression\" placeholder=\"\r\n enter expression\r\n \"></textarea>\r\n\r\n <mat-hint>\r\n The expression to evaluate the validation\r\n </mat-hint>\r\n\r\n </mat-form-field>\r\n <mat-toolbar>\r\n <mat-slide-toggle (click)=\"$event.stopPropagation();\" name=\"CanOveride\" ngDefaultControl\r\n (change)=\"edit.canOverride = $event.checked\" [checked]=\"edit.canOverride\">\r\n <span style=\"margin-left: 5px;\"> Users can override this validation</span>\r\n\r\n </mat-slide-toggle>\r\n </mat-toolbar>\r\n <label >\r\n Observe inputs for changes\r\n </label>\r\n <mat-chip-listbox aria-label=\"Chip select options\">\r\n @for(input of edit.inputsObservedForChanges;track input){\r\n <mat-chip>input\r\n <button (click)=\"removeObserved($event,input)\" matChipRemove [attr.aria-label]=\"'remove ' \">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n }\r\n <mat-chip (click)=\"addVariable($event)\" color=\"primary\">\r\n Variable\r\n <mat-icon matChipTrailingIcon>\r\n add\r\n </mat-icon>\r\n </mat-chip>\r\n </mat-chip-listbox>\r\n\r\n <br>\r\n <mat-divider></mat-divider>\r\n\r\n\r\n </mat-list>\r\n</ng-template>\r\n\r\n<ng-template #variables>\r\n\r\n <section style=\"max-height: 360px; overflow-y: auto\">\r\n <lib-form-input-selector (change)=\"selectInput($event)\" [formInputs]=\"formInputs\">\r\n\r\n </lib-form-input-selector>\r\n\r\n <div class=\"contentBackground\" *ngIf=\"formInputs.length === 0\">\r\n <span style=\"\r\n display: block;\r\n text-align: center;\r\n font-style: italic;\r\n padding: 16px;\r\n \">No form inputs</span>\r\n </div>\r\n </section>\r\n <mat-toolbar>\r\n <span class=\"spacer\"></span>\r\n <button (click)=\"showVariables = !showVariables\" mat-flat-button>\r\n Close\r\n <mat-icon>\r\n close\r\n </mat-icon>\r\n </button>\r\n </mat-toolbar>\r\n</ng-template>\r\n"],"names":["uuidv4","i13"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-t-forms-validators-config.component-Cq07Er-G.mjs","sources":["../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/validators-config/validators-config.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/validators-config/validators-config.component.html"],"sourcesContent":["import { Component, ElementRef, EventEmitter, HostBinding, Input, OnInit, Optional, Output, Self } from '@angular/core';\r\nimport { MenuCloseReason } from '@angular/material/menu';\r\n\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport { ElementTypes, FormControlCustomValidatorsInterface, IMultiple } from 'ngx-t-forms-types';\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { getInputIllustration } from '../../../../shared/functions/getInputIllustration';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormInputSelectorComponent } from '../form-input-selector/form-input-selector.component';\r\n\r\nimport { FormsModule, NgControl } from '@angular/forms';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { Subject } from 'rxjs';\r\nimport { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\n\r\n@Component({\r\n selector: 'app-validators-config',\r\n templateUrl: './validators-config.component.html',\r\n styleUrls: ['./validators-config.component.scss'],\r\n standalone: true,\r\n imports:[\r\n MatModulesModule,\r\n CommonModule,\r\n FormInputSelectorComponent,\r\n FormsModule\r\n ],\r\n providers: [{ provide: MatFormFieldControl, useExisting: ValidatorsConfigComponent}],\r\n})\r\nexport class ValidatorsConfigComponent implements OnInit,MatFormFieldControl<FormControlCustomValidatorsInterface []> {\r\n \r\n\r\n static nextId = 0;\r\n stateChanges = new Subject<void>();\r\n \r\n @HostBinding() id = `app-validators-config-${ValidatorsConfigComponent.nextId++}`;\r\n \r\n placeholder: string = ''\r\n constructor(@Optional() @Self() public ngControl: NgControl, private _elementRef: ElementRef<HTMLElement>,) { }\r\n focused: boolean = false;\r\n get empty() {\r\n return !this.value\r\n }\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n required: boolean = false;\r\n @Input() disabled: boolean = false;\r\nget errorState(): boolean {\r\n const hasError = !!this.ngControl?.control?.errors || (this.errors||[]).length > 0 && this.touched\r\n return !this.value && !!this.required || hasError\r\n }\r\n \r\n controlType?: string | undefined;\r\n autofilled?: boolean | undefined;\r\n userAriaDescribedBy?: string | undefined;\r\n disableAutomaticLabeling?: boolean | undefined;\r\n setDescribedByIds(ids: string[]) {\r\n // Ensure the component view is initialized\r\n if (this._elementRef && this._elementRef.nativeElement) {\r\n const controlElement = this._elementRef.nativeElement.querySelector('.app-validators-config');\r\n // Check if the controlElement exists before attempting to set its attribute\r\n if (controlElement) {\r\n controlElement.setAttribute('aria-describedby', ids.join(' '));\r\n }\r\n }\r\n }\r\n onContainerClick(event: MouseEvent): void {\r\n this.markAsTouched();\r\n this.stateChanges.next();\r\n }\r\n @Input() errors:IConfigElementError[] |undefined = [];\r\n touched: boolean = false;\r\n onTouched = () => {};\r\n markAsTouched() {\r\n if (!this.touched) {\r\n this.onTouched();\r\n this.touched = true;\r\n }\r\n } \r\n \r\n @Input() mapToData:FormColumnInputs | undefined = undefined;\r\n @Input() value!: (FormControlCustomValidatorsInterface )[];\r\n @Input() formInputs: Array<FormColumnInputs> = []\r\n @Output() valueChanged = new EventEmitter<any>();\r\n\r\n\r\n ngOnInit() {}\r\n\r\n edit:FormControlCustomValidatorsInterface | undefined\r\n menuClosed(event:MenuCloseReason){\r\n\r\n if (this.edit) {\r\n const editIndex = this.value.findIndex((item) => {\r\n if (typeof item === 'string') {\r\n return false;\r\n }\r\n return item.id === this.edit?.id;\r\n });\r\n\r\n if (editIndex !== -1) {\r\n this.value[editIndex] = this.edit;\r\n } \r\n this.valueChanged.emit([...this.value])\r\n\r\n\r\n }\r\n\r\n this.edit = undefined\r\n }\r\n showVariables :boolean = false\r\n editV(validator:string | FormControlCustomValidatorsInterface){\r\n if(this.edit?.id === (validator as FormControlCustomValidatorsInterface).id){\r\n this.edit = undefined\r\n return\r\n }\r\n this.edit = validator as any\r\n }\r\n remove(validator:FormControlCustomValidatorsInterface|string){\r\n const indexOfV = this.value.findIndex((item) => {\r\n if (typeof item === 'string') {\r\n return item === validator;\r\n }\r\n return item.id === (validator as FormControlCustomValidatorsInterface).id;\r\n }\r\n )\r\n\r\n\r\n this.value = [...this.value].filter((item,i)=>indexOfV !== i)\r\n this.valueChanged.emit([...this.value])\r\n\r\n }\r\n search: string = '';\r\n\r\n getInputIcon(element: ElementTypes) {\r\n\r\n return getInputIllustration(element)\r\n }\r\n \r\n selectInput(inputId: string) {\r\n const input = this.formInputs.find((input) => input.id === inputId)\r\n if(!input){\r\n return\r\n }\r\n if(input?.multipleInputInEditId){\r\n throw new Error('multipleInputInEditId is not supported')\r\n }\r\n if(!!this.edit){\r\n this.edit.expression = (this.edit?.expression || '' ).concat(input?.formControlName || '')\r\n if(!this.edit.inputsObservedForChanges.find((i)=>i.inputId === (input?.originalId || input?.id))){\r\n this.edit.inputsObservedForChanges.push({\r\n inputId: input?.originalId || input?.id,\r\n variable: input?.formControlName\r\n })\r\n }\r\n \r\n }\r\n \r\n\r\n this.showVariables = false\r\n\r\n }\r\n\r\n addVariable(event:any){\r\n this.showVariables = true\r\n event.stopPropagation()\r\n event.preventDefault()\r\n\r\n }\r\n getMultipleFormInputs(input: IMultiple) {\r\n if (\r\n input.element === ElementTypes.MultipleInput&&\r\n this.mapToData?.multipleInputInEditId === input.id\r\n ) {\r\n return input.formInputs;\r\n }\r\n return [];\r\n }\r\n returnExpression(){\r\n return this.edit?.expression.replace(/(word)/g, '<span style=\\'color: blue\\'>$1</span>')\r\n }\r\n addValidator(){\r\n this.edit = {\r\n message: '',\r\n expression: '',\r\n canOverride: false,\r\n inputsObservedForChanges: []\r\n } as any\r\n }\r\n\r\n onTextChange(event:Event,key:string){\r\n if(!this.edit) {\r\n this.edit = {} as any\r\n }\r\n (this.edit as any)[key] = (event.target as HTMLInputElement).value\r\n }\r\n saveVariable(event:any){\r\n if(!this.edit) return;\r\n const id = uuidv4()\r\n const val = {...this.edit, id}\r\n this.value = [...this.value, val]\r\n this.valueChanged.emit([...this.value])\r\n this.edit = undefined\r\n \r\n \r\n\r\n\r\n \r\n }\r\n removeObserved(event:any,item:{ inputId: string; variable: string; }){\r\n const i = this.edit?.inputsObservedForChanges.findIndex((i:any)=>i === item)\r\n if(i !== undefined && i !== -1 && this.edit){\r\n this.edit?.inputsObservedForChanges.splice(i, 1);\r\n this.edit.expression = this.edit?.expression.replace(new RegExp(`\\\\b${item}\\\\b`, 'g'), '')\r\n\r\n }\r\n\r\n event.stopPropagation()\r\n event.preventDefault()\r\n }\r\n isFormControlCustomValidator(validator: string |FormControlCustomValidatorsInterface ){\r\n if(typeof validator == 'string'){\r\n return validator\r\n }\r\n return validator.message\r\n\r\n }\r\n}\r\n\r\n\r\n\r\n","<div class=\"tree-instructions\">\r\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n <span>\r\n Custom validators are functions that take a form control as an argument and return an object of errors if the\r\n validation fails.\r\n </span>\r\n</div>\r\n\r\n<mat-list>\r\n<h5>\r\n Custom Validators\r\n</h5>\r\n <mat-chip-listbox [disabled]=\"disabled\" aria-label=\"Chip select options\">\r\n @for (validator of value; track $index) {\r\n <mat-chip-option\r\n style=\"height: fit-content;padding: 8px;\"\r\n [selected]=\"edit?.id === validator.id\"\r\n (click)=\"editV(validator)\"> \r\n <span style=\"white-space: normal;\">\r\n {{isFormControlCustomValidator(validator) | titlecase}}\r\n </span>\r\n \r\n <button *ngIf=\"this.edit?.id !== validator.id\" (click)=\"remove(validator)\" matChipRemove \r\n [attr.aria-label]=\"'remove ' \">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n <mat-icon *ngIf=\"this.edit?.id === validator.id\" matChipTrailingIcon>\r\n check_circle\r\n </mat-icon>\r\n \r\n \r\n </mat-chip-option>\r\n }\r\n <mat-chip-option\r\n matTooltip=\"Add a new custom validator\"\r\n selectable=\"false\"\r\n style=\"cursor: pointer !important;\"\r\n highlighted=\"true\" color=\"accent\" (click)=\"addValidator()\" *ngIf=\"!edit\">\r\n <span >\r\n\r\n </span>\r\n Add validator\r\n <mat-icon matChipTrailingIcon >add</mat-icon>\r\n\r\n \r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n\r\n \r\n \r\n\r\n\r\n</mat-list>\r\n<mat-card style=\"padding: 8px;background:var(--mat-sys-surface-container, var(--mat-app-surface))\"\r\n *ngIf=\"edit\">\r\n <ng-container *ngIf=\"edit && !showVariables; then validatorEditor\"></ng-container>\r\n <mat-toolbar *ngIf=\"!showVariables\" >\r\n <span class=\"spacer\"></span>\r\n <button (click)=\"edit=undefined\" mat-button>\r\n close\r\n </button>\r\n <button mat-raised-button [disabled]=\"!edit.expression ||!edit.message\"\r\n (click)=\"saveVariable($event)\" color=\"accent\">\r\n Save Validation\r\n </button>\r\n </mat-toolbar>\r\n <ng-container *ngIf=\"edit && !!showVariables; then variables\"></ng-container>\r\n</mat-card>\r\n\r\n\r\n\r\n\r\n<ng-template #validatorEditor>\r\n <div class=\"tree-instructions\">\r\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n <span>\r\n The expression is checked on value change. The message shows if it fails.\r\n <br>\r\n You can observe inputs for changes to re-evaluate the expression.\r\n </span>\r\n </div>\r\n <mat-list *ngIf=\"edit\">\r\n\r\n <mat-form-field style=\"margin-bottom: 16px;\" (click)=\"$event.stopPropagation();\" appearance=\"outline\" subscriptSizing=\"dynamic\" >\r\n <mat-label >Validation Message</mat-label>\r\n <textarea matInput #textarea [value]=\"edit.message\"\r\n (input)=\"onTextChange($event,'message')\"\r\n placeholder=\"\r\n Enter message\r\n \"></textarea>\r\n\r\n <mat-hint>\r\n The message to display when the validation fails\r\n </mat-hint>\r\n\r\n </mat-form-field>\r\n\r\n\r\n\r\n\r\n <mat-form-field (click)=\"$event.stopPropagation();\" appearance=\"outline\" subscriptSizing=\"dynamic\" >\r\n <mat-label >Expression</mat-label>\r\n <textarea matInput #textarea \r\n (input)=\"onTextChange($event,'expression')\"\r\n [value]=\"edit.expression\" placeholder=\"\r\n enter expression\r\n \"></textarea>\r\n\r\n <mat-hint>\r\n The expression to evaluate the validation\r\n </mat-hint>\r\n\r\n </mat-form-field>\r\n <mat-toolbar>\r\n <mat-slide-toggle (click)=\"$event.stopPropagation();\" name=\"CanOveride\" ngDefaultControl\r\n (change)=\"edit.canOverride = $event.checked\" [checked]=\"edit.canOverride\">\r\n <span style=\"margin-left: 5px;\"> Users can override this validation</span>\r\n\r\n </mat-slide-toggle>\r\n </mat-toolbar>\r\n <label >\r\n Observe inputs for changes\r\n </label>\r\n <mat-chip-listbox aria-label=\"Chip select options\">\r\n @for(input of edit.inputsObservedForChanges;track input){\r\n <mat-chip>input\r\n <button (click)=\"removeObserved($event,input)\" matChipRemove [attr.aria-label]=\"'remove ' \">\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n }\r\n <mat-chip (click)=\"addVariable($event)\" color=\"primary\">\r\n Variable\r\n <mat-icon matChipTrailingIcon>\r\n add\r\n </mat-icon>\r\n </mat-chip>\r\n </mat-chip-listbox>\r\n\r\n <br>\r\n <mat-divider></mat-divider>\r\n\r\n\r\n </mat-list>\r\n</ng-template>\r\n\r\n<ng-template #variables>\r\n\r\n <section style=\"max-height: 360px; overflow-y: auto\">\r\n <lib-form-input-selector (change)=\"selectInput($event)\" [formInputs]=\"formInputs\">\r\n\r\n </lib-form-input-selector>\r\n\r\n <div class=\"contentBackground\" *ngIf=\"formInputs.length === 0\">\r\n <span style=\"\r\n display: block;\r\n text-align: center;\r\n font-style: italic;\r\n padding: 16px;\r\n \">No form inputs</span>\r\n </div>\r\n </section>\r\n <mat-toolbar>\r\n <span class=\"spacer\"></span>\r\n <button (click)=\"showVariables = !showVariables\" mat-flat-button>\r\n Close\r\n <mat-icon>\r\n close\r\n </mat-icon>\r\n </button>\r\n </mat-toolbar>\r\n</ng-template>\r\n"],"names":["uuidv4","i13"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { n as DialogTemplateComponent, o as FORM_ACTIONS_TOKEN, p as FORM_CONFIG_TOKEN, q as FORM_INPUTS_TOKEN, r as FORM_SLIDES_TOKEN, u as FormBuilderComponent, c as FormTowerControllerService, v as FormatDataPipe, w as FormsComponent, x as MSCOA_TREE_PROVIDER, y as MULTIPLE_FORM_INPUT_TOKEN, z as MscoaFormInputComponent, N as NGX_T_FORMS_CONFIG_TOKEN, B as NgxTFormsComponent, C as NgxTFormsService, P as PropertyAccessError, E as SignatureInputElementComponent, T as TDynamicDataEditComponent, b as TDynamicDataViewComponent, G as TFormInputComponent, U as UTILS_OBJECT_TOKEN, H as UserFormStepperComponent, V as ValidationExpressioCreatorComponent, a as assignDeepPropertyToObject, I as createFileFromBase64, K as formGenerator, L as getPipedValueFromDataType, O as getSampleValueForInput, Q as getSectionElements, R as getSignatureImage, W as getUrl, X as getValueFromValueAccessor, Y as initFormConfigToV2, Z as provideNgxTForms, $ as returnDeepProperty, a0 as returnMappedPathValue, s as safeReturnDeepProperty, t as testAgainstItem, a1 as textIconsForUserHints, a2 as validateExpressionSyntax, a3 as validateObjectAgainstString } from './ngx-t-forms-ngx-t-forms-D9qmig6g.mjs';
1
+ export { n as DialogTemplateComponent, o as FORM_ACTIONS_TOKEN, p as FORM_CONFIG_TOKEN, q as FORM_INPUTS_TOKEN, r as FORM_SLIDES_TOKEN, u as FormBuilderComponent, c as FormTowerControllerService, v as FormatDataPipe, w as FormsComponent, x as MSCOA_TREE_PROVIDER, y as MULTIPLE_FORM_INPUT_TOKEN, z as MscoaFormInputComponent, N as NGX_T_FORMS_CONFIG_TOKEN, B as NgxTFormsComponent, C as NgxTFormsService, P as PropertyAccessError, E as SignatureInputElementComponent, T as TDynamicDataEditComponent, b as TDynamicDataViewComponent, G as TFormImportController, H as TFormInputComponent, U as UTILS_OBJECT_TOKEN, I as UserFormStepperComponent, V as ValidationExpressioCreatorComponent, a as assignDeepPropertyToObject, K as createFileFromBase64, L as formGenerator, O as getPipedValueFromDataType, Q as getSampleValueForInput, R as getSectionElements, W as getSignatureImage, X as getUrl, Y as getValueFromValueAccessor, Z as initFormConfigToV2, $ as provideNgxTForms, a0 as returnDeepProperty, a1 as returnMappedPathValue, s as safeReturnDeepProperty, t as testAgainstItem, a2 as textIconsForUserHints, a3 as validateExpressionSyntax, a4 as validateObjectAgainstString } from './ngx-t-forms-ngx-t-forms-DP2koSL5.mjs';
2
2
  //# sourceMappingURL=ngx-t-forms.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-t-forms",
3
- "version": "2.0.29",
3
+ "version": "2.0.30",
4
4
  "description": "Angular forms module for creating dynamic forms through configuration. Supports form validation, custom controls, and complex form structures.",
5
5
  "license": "UNLICENSED",
6
6
  "author": {
@@ -40,7 +40,7 @@
40
40
  "html5-qrcode": "^2.3.8",
41
41
  "joi": "^17.13.3",
42
42
  "mathjs": "^14.2.0",
43
- "ngx-t-forms-types": "^0.0.17",
43
+ "ngx-t-forms-types": "^0.0.19",
44
44
  "ngx-ui-tour-md-menu": "^16.0.0",
45
45
  "qrcode": "^1.5.3",
46
46
  "rxjs": "~7.8.0",
@@ -94,6 +94,9 @@ declare abstract class FormTowerControllerService implements OnDestroy {
94
94
  protected _destroyed$: Subject<void>;
95
95
  protected _form: FormInterface | undefined;
96
96
  protected _mainForm: FormGroup | undefined;
97
+ private _activeStatusKeys;
98
+ private _busyState$;
99
+ private _syncBusyState;
97
100
  protected _formValue: Record<string, any>;
98
101
  protected _initialFormValue: Record<string, any>;
99
102
  protected _systemInputs: FormColumnInputs[];
@@ -102,7 +105,9 @@ declare abstract class FormTowerControllerService implements OnDestroy {
102
105
  protected _reverseDependencyMap: Record<string, DependentInput[]>;
103
106
  protected _changeHistory: IFormChangeHistory[];
104
107
  submittingStatus: FormSubmissionStatus | undefined;
105
- submittingForm: boolean;
108
+ private _submittingForm;
109
+ get submittingForm(): boolean;
110
+ set submittingForm(value: boolean);
106
111
  get form(): FormInterface | undefined;
107
112
  set form(value: FormInterface | undefined);
108
113
  set systemInputs(value: FormColumnInputs[]);
@@ -111,6 +116,29 @@ declare abstract class FormTowerControllerService implements OnDestroy {
111
116
  get changeHistory(): IFormChangeHistory[];
112
117
  set changeHistory(value: IFormChangeHistory[]);
113
118
  get inputFunctionsCollection(): Record<string, Partial<Record<FunctionTypes, Observable<void>>>>;
119
+ get isBusy(): boolean;
120
+ /**
121
+ * Reactive stream of the tower's busy state.
122
+ * Emits `true` whenever any calculation, API fetch, or validation is in flight,
123
+ * or while the form is submitting. Emits `false` when all operations have settled.
124
+ */
125
+ get isBusy$(): Observable<boolean>;
126
+ /**
127
+ * Resolves once the tower has finished all in-flight computations (calculations,
128
+ * API fetches, input-sourced values, validations).
129
+ *
130
+ * Safe to use in import workflows:
131
+ * ```ts
132
+ * await tower.initialize(form);
133
+ * tower.initializeFormValues(rowData);
134
+ * await tower.waitUntilSettled(); // changeMonitor debounce + all ops complete
135
+ * const value = tower.getFormValueNames();
136
+ * ```
137
+ *
138
+ * @param debounceMs Extra lead time matching the changeMonitor debounce (default 600ms).
139
+ * @param timeoutMs Hard timeout before the promise rejects (default 30s).
140
+ */
141
+ waitUntilSettled(debounceMs?: number, timeoutMs?: number): Promise<void>;
114
142
  ngOnDestroy(): void;
115
143
  initialize: (form: FormInterface) => Promise<void>;
116
144
  setFirstStepAsActive: () => void;
@@ -209,11 +237,127 @@ declare function getSectionElements(elements: ElementEditorInnerSectionElementIn
209
237
  max?: number;
210
238
  step?: number;
211
239
  format?: (value: any) => number;
240
+ multipleSelection?: boolean;
212
241
  })[];
213
242
 
214
243
  declare const returnMappedPathValue: (pathMap: TreeNode[], obj: any) => any;
215
244
  declare const getValueFromValueAccessor: (valueAccessRules: FormInputBasicOptionInterface | TreeNode[] | Record<string, TreeNode[]>, data: any) => any;
216
245
 
246
+ type ImportRowStatus = 'pending' | 'processing' | 'valid' | 'invalid' | 'error';
247
+ interface ImportRowState {
248
+ rowIndex: number;
249
+ originalData: Record<string, any>;
250
+ status: ImportRowStatus;
251
+ /** Flat formControlName-keyed values after the tower has settled */
252
+ settledValue?: Record<string, any>;
253
+ isValid?: boolean;
254
+ /** inputId → array of Angular validator error keys */
255
+ validationErrors?: Record<string, string[]>;
256
+ /** formControlName → error keys concatenated with '.' (e.g. `"required.minlength"`) */
257
+ colErrors?: Record<string, string>;
258
+ errorMessage?: string;
259
+ }
260
+ interface ImportProgress {
261
+ total: number;
262
+ pending: number;
263
+ processing: number;
264
+ complete: number;
265
+ valid: number;
266
+ invalid: number;
267
+ error: number;
268
+ rows: ImportRowState[];
269
+ }
270
+ declare class TFormImportController {
271
+ private readonly _injector;
272
+ private readonly _rows$;
273
+ /**
274
+ * Per-session HTTP caches.
275
+ * Key: serialized request identity → shared Observable (shareReplay).
276
+ * Populated at the start of runImport and cleared when it finishes,
277
+ * so every import session starts cold but identical in-flight requests
278
+ * across concurrent rows reuse a single HTTP call.
279
+ */
280
+ private _getCache;
281
+ private _postCache;
282
+ /**
283
+ * Shared financial-cycles observable for the current import session.
284
+ * loadSystemInputs calls getFinacialCycles() directly via NGX_T_FORMS_CONFIG
285
+ * (not through utils), so HTTP-function patching alone cannot deduplicate it.
286
+ * We intercept it at the config level by providing a wrapped token in each
287
+ * tower's child injector that returns this shared observable instead.
288
+ */
289
+ private _financialCycles$;
290
+ /**
291
+ * Reactive progress stream — subscribe to track each row in real time.
292
+ */
293
+ readonly progress$: Observable<ImportProgress>;
294
+ /**
295
+ * Snapshot of the current progress (non-reactive).
296
+ */
297
+ get currentProgress(): ImportProgress;
298
+ /**
299
+ * Runs an import session.
300
+ *
301
+ * For each row a fresh tower instance is spun up via a child injector,
302
+ * prepopulated, and left to settle (calculations + API fetches) before
303
+ * recording the final value and validation status.
304
+ * All rows are processed concurrently.
305
+ *
306
+ * Usage:
307
+ * ```ts
308
+ * const results = await importController.runImport(form, rows);
309
+ * const valid = results.filter(r => r.isValid);
310
+ * ```
311
+ *
312
+ * @param form The form definition every row is validated against.
313
+ * @param rows Raw data objects — one per import row.
314
+ */
315
+ runImport(form: FormInterface, rows: Record<string, any>[]): Promise<ImportRowState[]>;
316
+ /** Clears all row state. */
317
+ reset(): void;
318
+ /**
319
+ * Creates an isolated tower instance through a short-lived child injector.
320
+ *
321
+ * The child injector delegates all token resolution to the parent, so
322
+ * HttpClient, NGX_T_FORMS_CONFIG_TOKEN, and any other deps the tower needs
323
+ * are found automatically — no manual wiring required here.
324
+ *
325
+ * After creation the tower's HTTP functions are replaced with cache-aware
326
+ * wrappers so that identical requests fired by different rows share one
327
+ * in-flight Observable instead of each issuing their own HTTP call.
328
+ */
329
+ private _createTower;
330
+ /**
331
+ * Returns a shared Observable for a GET request.
332
+ * On cache miss the original function is called once and its result is
333
+ * multicasted via shareReplay(1) so every concurrent subscriber (row) that
334
+ * asks for the same URL+options receives the same response without an
335
+ * additional HTTP call.
336
+ */
337
+ private _cachedGet;
338
+ /**
339
+ * Returns a shared Observable for a POST request.
340
+ * Keyed by URL + serialised body + serialised options so only truly
341
+ * identical requests are deduplicated.
342
+ */
343
+ private _cachedPost;
344
+ private _processRow;
345
+ /**
346
+ * Walks `{ [sectionId]: FormGroup { [inputId]: FormControl } }` and
347
+ * collects every control that carries validation errors.
348
+ */
349
+ private _collectValidationErrors;
350
+ /**
351
+ * Builds a formControlName-keyed error map from the settled form.
352
+ * Multiple error keys on one control are joined with '.'.
353
+ */
354
+ private _collectColErrors;
355
+ private _patchRow;
356
+ private _toProgress;
357
+ static ɵfac: i0.ɵɵFactoryDeclaration<TFormImportController, never>;
358
+ static ɵprov: i0.ɵɵInjectableDeclaration<TFormImportController>;
359
+ }
360
+
217
361
  declare const FORM_ACTIONS_TOKEN: InjectionToken<IFormActions>;
218
362
  declare const FORM_CONFIG_TOKEN: InjectionToken<FormInterface>;
219
363
  declare const FORM_SLIDES_TOKEN: InjectionToken<FormSlideInterface>;
@@ -319,6 +463,7 @@ declare class FormsStoreService extends ComponentStore<IFormsInitStateInterface>
319
463
  httpGetDataFunction?: (url: string, options: any) => Observable<any>;
320
464
  getWorkflowOptions?: Observable<ngx_t_forms_types.IWorkflowOption[]> | undefined;
321
465
  getMscoaTree?: Observable<ngx_t_forms_types.IGetTreeResponse> | undefined;
466
+ multipleSelection?: boolean;
322
467
  }[];
323
468
  hasErrors: boolean;
324
469
  label: string;
@@ -502,7 +647,7 @@ declare class FormsComponent implements OnInit, OnDestroy {
502
647
  formControlName: string;
503
648
  }[];
504
649
  activeForm: string | null;
505
- getCols(): 1 | 4 | 2 | 3;
650
+ getCols(): 1 | 2 | 3 | 4;
506
651
  getFormAvatar(formTitle: string): string;
507
652
  archive(form: LocalFormStateSelectorInterface, event: Event): Promise<void>;
508
653
  unarchive(form: LocalFormStateSelectorInterface, event: Event): Promise<void>;
@@ -959,4 +1104,4 @@ declare function getUrl(url: string, variables: NgxTFormsConfig): string;
959
1104
  declare const validateObjectAgainstString: (expression: string, object: any) => boolean;
960
1105
  declare function validateExpressionSyntax(expression: string): string | null;
961
1106
 
962
- export { DialogTemplateComponent, FORM_ACTIONS_TOKEN, FORM_CONFIG_TOKEN, FORM_INPUTS_TOKEN, FORM_SLIDES_TOKEN, FormBuilderComponent, FormTowerControllerService, FormatDataPipe, FormsComponent, MSCOA_TREE_PROVIDER, MULTIPLE_FORM_INPUT_TOKEN, MscoaFormInputComponent, NGX_T_FORMS_CONFIG_TOKEN, NgxTFormsComponent, NgxTFormsService, PropertyAccessError, SignatureInputElementComponent, TDynamicDataEditComponent, TDynamicDataViewComponent, TFormInputComponent, UTILS_OBJECT_TOKEN, UserFormStepperComponent, ValidationExpressioCreatorComponent, assignDeepPropertyToObject, createFileFromBase64, formGenerator, getPipedValueFromDataType, getSampleValueForInput, getSectionElements, getSignatureImage, getUrl, getValueFromValueAccessor, initFormConfigToV2, provideNgxTForms, returnDeepProperty, returnMappedPathValue, safeReturnDeepProperty, testAgainstItem, textIconsForUserHints, validateExpressionSyntax, validateObjectAgainstString };
1107
+ export { DialogTemplateComponent, FORM_ACTIONS_TOKEN, FORM_CONFIG_TOKEN, FORM_INPUTS_TOKEN, FORM_SLIDES_TOKEN, FormBuilderComponent, FormTowerControllerService, FormatDataPipe, FormsComponent, MSCOA_TREE_PROVIDER, MULTIPLE_FORM_INPUT_TOKEN, MscoaFormInputComponent, NGX_T_FORMS_CONFIG_TOKEN, NgxTFormsComponent, NgxTFormsService, PropertyAccessError, SignatureInputElementComponent, TDynamicDataEditComponent, TDynamicDataViewComponent, TFormImportController, TFormInputComponent, UTILS_OBJECT_TOKEN, UserFormStepperComponent, ValidationExpressioCreatorComponent, assignDeepPropertyToObject, createFileFromBase64, formGenerator, getPipedValueFromDataType, getSampleValueForInput, getSectionElements, getSignatureImage, getUrl, getValueFromValueAccessor, initFormConfigToV2, provideNgxTForms, returnDeepProperty, returnMappedPathValue, safeReturnDeepProperty, testAgainstItem, textIconsForUserHints, validateExpressionSyntax, validateObjectAgainstString };