ngx-t-forms 2.0.29 → 2.0.31

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 (161) hide show
  1. package/fesm2022/ngx-t-forms-auto-complete-input-element.component-DCKuXHAW.mjs +104 -0
  2. package/fesm2022/ngx-t-forms-auto-complete-input-element.component-DCKuXHAW.mjs.map +1 -0
  3. package/fesm2022/ngx-t-forms-basic-input-input-element.component-Ce4ipSUc.mjs +85 -0
  4. package/fesm2022/ngx-t-forms-basic-input-input-element.component-Ce4ipSUc.mjs.map +1 -0
  5. package/fesm2022/ngx-t-forms-calculated-field-rules.component-C5TPddVe.mjs +643 -0
  6. package/fesm2022/ngx-t-forms-calculated-field-rules.component-C5TPddVe.mjs.map +1 -0
  7. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-CICQaqz6.mjs +97 -0
  8. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-CICQaqz6.mjs.map +1 -0
  9. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-CzisLSIP.mjs +195 -0
  10. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-CzisLSIP.mjs.map +1 -0
  11. package/fesm2022/ngx-t-forms-data-source-picker.component-Dzz_o6fJ.mjs +261 -0
  12. package/fesm2022/ngx-t-forms-data-source-picker.component-Dzz_o6fJ.mjs.map +1 -0
  13. package/fesm2022/ngx-t-forms-date-picker-input-element.component-CYUbVyzP.mjs +85 -0
  14. package/fesm2022/ngx-t-forms-date-picker-input-element.component-CYUbVyzP.mjs.map +1 -0
  15. package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-CmoquQGV.mjs +156 -0
  16. package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-CmoquQGV.mjs.map +1 -0
  17. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs +368 -0
  18. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs.map +1 -0
  19. package/fesm2022/ngx-t-forms-document-picker.component-qObjcqhE.mjs +704 -0
  20. package/fesm2022/ngx-t-forms-document-picker.component-qObjcqhE.mjs.map +1 -0
  21. package/fesm2022/ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs +294 -0
  22. package/fesm2022/ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs.map +1 -0
  23. package/fesm2022/ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs +240 -0
  24. package/fesm2022/ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs.map +1 -0
  25. package/fesm2022/ngx-t-forms-file-upload-input-element.component-C7mMeEjF.mjs +205 -0
  26. package/fesm2022/ngx-t-forms-file-upload-input-element.component-C7mMeEjF.mjs.map +1 -0
  27. package/fesm2022/ngx-t-forms-form-input-selector.component-C9u8zq9B.mjs +86 -0
  28. package/fesm2022/ngx-t-forms-form-input-selector.component-C9u8zq9B.mjs.map +1 -0
  29. package/fesm2022/ngx-t-forms-form-json-view.component-856Hx1Bg.mjs +22 -0
  30. package/fesm2022/ngx-t-forms-form-json-view.component-856Hx1Bg.mjs.map +1 -0
  31. package/fesm2022/ngx-t-forms-form-payload-projection.component-CDkTuX9S.mjs +179 -0
  32. package/fesm2022/ngx-t-forms-form-payload-projection.component-CDkTuX9S.mjs.map +1 -0
  33. package/fesm2022/ngx-t-forms-form-section-stepper.component-Bs50-nEB.mjs +319 -0
  34. package/fesm2022/ngx-t-forms-form-section-stepper.component-Bs50-nEB.mjs.map +1 -0
  35. package/fesm2022/ngx-t-forms-forms-builder-menu.component-qrhM0jGL.mjs +379 -0
  36. package/fesm2022/ngx-t-forms-forms-builder-menu.component-qrhM0jGL.mjs.map +1 -0
  37. package/fesm2022/ngx-t-forms-geo-location.component-Bosp1UzR.mjs +124 -0
  38. package/fesm2022/ngx-t-forms-geo-location.component-Bosp1UzR.mjs.map +1 -0
  39. package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs +31 -0
  40. package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs.map +1 -0
  41. package/fesm2022/ngx-t-forms-image-capture-input-element.component-C1g7Z0cK.mjs +180 -0
  42. package/fesm2022/ngx-t-forms-image-capture-input-element.component-C1g7Z0cK.mjs.map +1 -0
  43. package/fesm2022/ngx-t-forms-index-dDSobs6A.mjs +2 -0
  44. package/fesm2022/ngx-t-forms-index-dDSobs6A.mjs.map +1 -0
  45. package/fesm2022/ngx-t-forms-input-custom.component-BkbHFAyR.mjs +105 -0
  46. package/fesm2022/ngx-t-forms-input-custom.component-BkbHFAyR.mjs.map +1 -0
  47. package/fesm2022/ngx-t-forms-input-editor.component-BPUOM9kQ.mjs +181 -0
  48. package/fesm2022/ngx-t-forms-input-editor.component-BPUOM9kQ.mjs.map +1 -0
  49. package/fesm2022/{ngx-t-forms-map-mat-options-keys-CbdW82su.mjs → ngx-t-forms-map-mat-options-keys-B6hJ7Io5.mjs} +12 -14
  50. package/fesm2022/ngx-t-forms-map-mat-options-keys-B6hJ7Io5.mjs.map +1 -0
  51. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs +66 -0
  52. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs.map +1 -0
  53. package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs +211 -0
  54. package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs.map +1 -0
  55. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs +165 -0
  56. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs.map +1 -0
  57. package/fesm2022/ngx-t-forms-missing-form-configs.component-DrnH8qdG.mjs +38 -0
  58. package/fesm2022/ngx-t-forms-missing-form-configs.component-DrnH8qdG.mjs.map +1 -0
  59. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-C_abEBQ5.mjs +38 -0
  60. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-C_abEBQ5.mjs.map +1 -0
  61. package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs +126 -0
  62. package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs.map +1 -0
  63. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C0qsMfsq.mjs +336 -0
  64. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C0qsMfsq.mjs.map +1 -0
  65. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs +74 -0
  66. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs.map +1 -0
  67. package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C7y1OGPx.mjs +905 -0
  68. package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C7y1OGPx.mjs.map +1 -0
  69. package/fesm2022/ngx-t-forms-ngx-t-forms-u_kigDid.mjs +19461 -0
  70. package/fesm2022/ngx-t-forms-ngx-t-forms-u_kigDid.mjs.map +1 -0
  71. package/fesm2022/ngx-t-forms-paginated-selection-table-AQZSMmhr.mjs +555 -0
  72. package/fesm2022/ngx-t-forms-paginated-selection-table-AQZSMmhr.mjs.map +1 -0
  73. package/fesm2022/ngx-t-forms-pipeline-generator.component-DmNSc5aw.mjs +748 -0
  74. package/fesm2022/ngx-t-forms-pipeline-generator.component-DmNSc5aw.mjs.map +1 -0
  75. package/fesm2022/ngx-t-forms-record-list-manager.component-CUMMvMch.mjs +358 -0
  76. package/fesm2022/ngx-t-forms-record-list-manager.component-CUMMvMch.mjs.map +1 -0
  77. package/fesm2022/ngx-t-forms-required-inputs.component-Ch2yNcIS.mjs +272 -0
  78. package/fesm2022/ngx-t-forms-required-inputs.component-Ch2yNcIS.mjs.map +1 -0
  79. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-C_aFtdvW.mjs +398 -0
  80. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-C_aFtdvW.mjs.map +1 -0
  81. package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs +38 -0
  82. package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs.map +1 -0
  83. package/fesm2022/ngx-t-forms-section-report.component-BxOhR6C0.mjs +98 -0
  84. package/fesm2022/ngx-t-forms-section-report.component-BxOhR6C0.mjs.map +1 -0
  85. package/fesm2022/ngx-t-forms-select-input-element.component-DbgZdNoe.mjs +150 -0
  86. package/fesm2022/ngx-t-forms-select-input-element.component-DbgZdNoe.mjs.map +1 -0
  87. package/fesm2022/ngx-t-forms-selection-options-editor.component-Dhln81DL.mjs +169 -0
  88. package/fesm2022/ngx-t-forms-selection-options-editor.component-Dhln81DL.mjs.map +1 -0
  89. package/fesm2022/ngx-t-forms-t-workflow-picker.component-leBokXvM.mjs +204 -0
  90. package/fesm2022/ngx-t-forms-t-workflow-picker.component-leBokXvM.mjs.map +1 -0
  91. package/fesm2022/ngx-t-forms-textarea-input-element.component-BEbXJjFA.mjs +95 -0
  92. package/fesm2022/ngx-t-forms-textarea-input-element.component-BEbXJjFA.mjs.map +1 -0
  93. package/fesm2022/ngx-t-forms-toggle-input-element.component-DDErRUJd.mjs +82 -0
  94. package/fesm2022/ngx-t-forms-toggle-input-element.component-DDErRUJd.mjs.map +1 -0
  95. package/fesm2022/ngx-t-forms-validators-config.component-oGjQVGE2.mjs +733 -0
  96. package/fesm2022/ngx-t-forms-validators-config.component-oGjQVGE2.mjs.map +1 -0
  97. package/fesm2022/ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs +1303 -0
  98. package/fesm2022/ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs.map +1 -0
  99. package/fesm2022/ngx-t-forms.mjs +2 -1
  100. package/fesm2022/ngx-t-forms.mjs.map +1 -1
  101. package/package.json +20 -18
  102. package/styles/_editor-mixins.scss +62 -0
  103. package/styles/_json-editor-syntax.scss +26 -0
  104. package/styles/_signature-pad.scss +26 -0
  105. package/styles/_tokens.scss +148 -0
  106. package/types/ngx-t-forms.d.ts +1767 -621
  107. package/fesm2022/ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs +0 -313
  108. package/fesm2022/ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs.map +0 -1
  109. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs +0 -191
  110. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs.map +0 -1
  111. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs +0 -207
  112. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs.map +0 -1
  113. package/fesm2022/ngx-t-forms-data-source-picker.component-DxORinAD.mjs +0 -204
  114. package/fesm2022/ngx-t-forms-data-source-picker.component-DxORinAD.mjs.map +0 -1
  115. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs +0 -289
  116. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs.map +0 -1
  117. package/fesm2022/ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs +0 -134
  118. package/fesm2022/ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs.map +0 -1
  119. package/fesm2022/ngx-t-forms-form-json-view.component-DePf44w6.mjs +0 -22
  120. package/fesm2022/ngx-t-forms-form-json-view.component-DePf44w6.mjs.map +0 -1
  121. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs +0 -270
  122. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs.map +0 -1
  123. package/fesm2022/ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs +0 -345
  124. package/fesm2022/ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs.map +0 -1
  125. package/fesm2022/ngx-t-forms-input-editor.component-D4xHO76K.mjs +0 -147
  126. package/fesm2022/ngx-t-forms-input-editor.component-D4xHO76K.mjs.map +0 -1
  127. package/fesm2022/ngx-t-forms-map-mat-options-keys-CbdW82su.mjs.map +0 -1
  128. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs +0 -105
  129. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs.map +0 -1
  130. package/fesm2022/ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs +0 -109
  131. package/fesm2022/ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs.map +0 -1
  132. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs +0 -155
  133. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs.map +0 -1
  134. package/fesm2022/ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs +0 -28
  135. package/fesm2022/ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs.map +0 -1
  136. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs +0 -43
  137. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs.map +0 -1
  138. package/fesm2022/ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs +0 -116
  139. package/fesm2022/ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs.map +0 -1
  140. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs +0 -296
  141. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs.map +0 -1
  142. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs +0 -83
  143. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs.map +0 -1
  144. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs +0 -16844
  145. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs.map +0 -1
  146. package/fesm2022/ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs +0 -613
  147. package/fesm2022/ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs.map +0 -1
  148. package/fesm2022/ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs +0 -269
  149. package/fesm2022/ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs.map +0 -1
  150. package/fesm2022/ngx-t-forms-required-inputs.component-CSIJvSHq.mjs +0 -190
  151. package/fesm2022/ngx-t-forms-required-inputs.component-CSIJvSHq.mjs.map +0 -1
  152. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs +0 -291
  153. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs.map +0 -1
  154. package/fesm2022/ngx-t-forms-section-report.component-12-KdKT6.mjs +0 -156
  155. package/fesm2022/ngx-t-forms-section-report.component-12-KdKT6.mjs.map +0 -1
  156. package/fesm2022/ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs +0 -186
  157. package/fesm2022/ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs.map +0 -1
  158. package/fesm2022/ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs +0 -187
  159. package/fesm2022/ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs.map +0 -1
  160. package/fesm2022/ngx-t-forms-validators-config.component-B3j9Dmgu.mjs +0 -215
  161. package/fesm2022/ngx-t-forms-validators-config.component-B3j9Dmgu.mjs.map +0 -1
@@ -1,65 +1,420 @@
1
- import * as i0 from '@angular/core';
2
- import { EnvironmentProviders, OnDestroy, InjectionToken, OnInit, EventEmitter, ElementRef, NgZone, SimpleChanges, PipeTransform } from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
+ import { Provider, EnvironmentProviders, InjectionToken, OnInit, OnDestroy, Signal, PipeTransform, Type, ElementRef } from '@angular/core';
3
3
  import * as ngx_t_forms_types from 'ngx-t-forms-types';
4
- import { OLD_FormInterface, FormInterface, NgxTFormsConfig, FormColumnInputs, IFormChangeHistory, FormSubmissionStatus, ElementEditorInnerSectionElementInterface, InClassFormUtilsInterface, ValidationError, FormInputKeys, SpecialElementKeys, AllFormInputPrimaryKeys, ElementEditorTypes, FormInputBasicOptionInterface, TreeNode, IFormActions, IWorkflowDocumentPicker, IBasicFormInput, IFileUploadInput, IDateRangePickerInput, ITextareaProperties, IToggleInput, IMatrixInput, IMultiple, FormSlideInterface, IGetTreeResponse, DialogConfig, IFormsInitStateInterface, IStoreFunctions, FormsStoreSelectorsInterface, FormListSection, LocalFormStateSelectorInterface, ConfigurationValidTestInterface, IWorkflowOption, BlurHandleTypes, FlatNode, ITowerStepColumn, FormBuilderFunctions, ElementTypes, DocumentLitsLabelConfigInterfaceValueType, InputDataTypes, InputPipeTypes, FileUploadInputValueInterface, IArrayFunction } from 'ngx-t-forms-types';
5
- import { FormGroup, AbstractControl, FormControl } from '@angular/forms';
6
- import { IStepOption } from 'ngx-ui-tour-md-menu';
4
+ import { NgxTFormsConfig, IFormActions, FormInterface, FormSlideInterface, InClassFormUtilsInterface, IWorkflowDocumentPicker, IBasicFormInput, IFileUploadInput, IDateRangePickerInput, ITextareaProperties, IToggleInput, IMatrixInput, IMultiple, IGetTreeResponse, IRunPipelineResponse, IPipelineGenerationResponse, LocalFormStateSelectorInterface, FormsStoreSelectorsInterface, FormListSection, WorkflowFunctionTypes, FileData, FormSubmissionStatus, IFormValidationOverride, FormColumnInputs, IFormChangeHistory, FormBuilderFunctions, ITowerFormSteps, ElementEditorTypes, ElementEditorInnerSectionElementInterface, IWorkflowOption, BlurHandleTypes, ITowerStepColumn, TreeNode, FlatNode, IArrayFunction, DocumentLitsLabelConfigInterfaceValueType, InputDataTypes, InputPipeTypes, ImportProgress, ImportRowState, ValidationError, FormInputBasicOptionInterface, ElementTypes, DialogConfig, PropertyPath, DeepPropertyValue, FileUploadInputValueInterface, FormInterfaceMigration, ConfigurationValidTestInterface, EncryptedData } from 'ngx-t-forms-types';
5
+ export { BlurHandleTypes, ConfigurationValidTestInterface, DeepPropertyValue, DialogConfig, DocumentLitsLabelConfigInterfaceValueType, ElementEditorInnerSectionElementInterface, ElementEditorTypes, EncryptedData, FileUploadInputValueInterface, FormBuilderFunctions, FormColumnInputs, FormInterface, FormInterfaceMigration, FormListSection, FormSubmissionStatus, IArrayFunction, IFormActions, IFormChangeHistory, IFormTour, IFormValidationOverride, IGetTreeResponse, IScoaAccount, ITowerStepColumn, IWorkflowOption, ImportProgress, ImportRowState, ImportRowStatus, InClassFormUtilsInterface, InputDataTypes, InputPipeTypes, LocalFormStateSelectorInterface, NgxTFormsConfig, OLD_FormInterface, PropertyPath, TreeNode, ValidationError, WorkflowFunctionTypes } from 'ngx-t-forms-types';
7
6
  import * as rxjs from 'rxjs';
8
- import { Observable, Subject, Subscription, BehaviorSubject } from 'rxjs';
9
- import { HttpClient } from '@angular/common/http';
7
+ import { Observable, Subject } from 'rxjs';
8
+ import { PipelineStage } from 'mongoose';
9
+ import { Router, ActivatedRoute } from '@angular/router';
10
+ import { MatStepper } from '@angular/material/stepper';
10
11
  import { StepperSelectionEvent, StepState } from '@angular/cdk/stepper';
11
- import { MatDialogRef } from '@angular/material/dialog';
12
- import * as _angular_cdk_drag_drop from '@angular/cdk/drag-drop';
13
- import * as _angular_router from '@angular/router';
14
- import { ActivatedRoute, Router } from '@angular/router';
15
- import { ComponentStore } from '@ngrx/component-store';
16
- import { MatSnackBar } from '@angular/material/snack-bar';
12
+ import { HttpClient } from '@angular/common/http';
13
+ import { FormGroup, FormControl } from '@angular/forms';
14
+ import * as ngx_ui_tour_md_menu from 'ngx-ui-tour-md-menu';
15
+ import { IStepOption } from 'ngx-ui-tour-md-menu';
17
16
  import { FlatTreeControl } from '@angular/cdk/tree';
18
17
  import { MatTreeFlattener, MatTreeFlatDataSource } from '@angular/material/tree';
19
- import { MatStepper } from '@angular/material/stepper';
20
- import * as ngx_ui_tour_core from 'ngx-ui-tour-core';
18
+ import { MatDialogRef } from '@angular/material/dialog';
21
19
 
22
- declare class NgxTFormsService {
23
- constructor();
24
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxTFormsService, never>;
25
- static ɵprov: i0.ɵɵInjectableDeclaration<NgxTFormsService>;
20
+ /** @internal */
21
+ declare const enum NgxTFormsFeatureKind {
22
+ SilencedConsole = 0,
23
+ FormBuilder = 1,
24
+ ImportTower = 2,
25
+ HttpPipeline = 3,
26
+ InputSecret = 4,
27
+ RouterFormId = 5
26
28
  }
29
+ interface NgxTFormsFeature {
30
+ readonly kind: NgxTFormsFeatureKind;
31
+ readonly providers: Provider[];
32
+ }
33
+ /**
34
+ * Registers ngx-t-forms with the application injector.
35
+ *
36
+ * @param config Runtime configuration (form actions, builder, etc.).
37
+ * @param features Optional with*() extension features.
38
+ * @returns EnvironmentProviders ready to drop into `bootstrapApplication`.
39
+ *
40
+ * @example
41
+ * bootstrapApplication(AppComponent, {
42
+ * providers: [
43
+ * provideNgxTForms(myConfig, withSilencedConsole(), withFormBuilder()),
44
+ * ],
45
+ * });
46
+ */
47
+ declare function provideNgxTForms(config: NgxTFormsConfig, ...features: NgxTFormsFeature[]): EnvironmentProviders;
27
48
 
28
- declare class NgxTFormsComponent {
29
- static ɵfac: i0.ɵɵFactoryDeclaration<NgxTFormsComponent, never>;
30
- static ɵcmp: i0.ɵɵComponentDeclaration<NgxTFormsComponent, "lib-ngx-t-forms", never, {}, {}, never, never, true, never>;
49
+ /**
50
+ * @public
51
+ *
52
+ * Binds the default HTTP-backed {@link HttpPipelineRepository} to
53
+ * {@link PIPELINE_REPOSITORY}. Required when the consumer uses any
54
+ * pipeline-running feature (e.g. the pipeline-generator UI) and wants the
55
+ * built-in HTTP transport.
56
+ *
57
+ * Consumers that supply their own {@link PipelineRepository} implementation
58
+ * should bind it directly to {@link PIPELINE_REPOSITORY} instead of (or after)
59
+ * calling this — provider order resolution applies.
60
+ *
61
+ * @example
62
+ * bootstrapApplication(AppComponent, {
63
+ * providers: [
64
+ * provideHttpClient(),
65
+ * provideNgxTForms(config, withHttpPipeline()),
66
+ * ],
67
+ * });
68
+ */
69
+ declare function withHttpPipeline(): NgxTFormsFeature;
70
+
71
+ /**
72
+ * Registers the HMAC secret used to derive per-input encryption keys for the
73
+ * signature input. Required only when the signature input is in use — if the
74
+ * token is unbound at the point of encryption/decryption the library throws a
75
+ * clear error rather than silently falling back to a baked-in default.
76
+ *
77
+ * @param secret High-entropy string supplied by the consumer (e.g. read from
78
+ * their own `environment.ts` or a runtime config endpoint).
79
+ *
80
+ * @example
81
+ * provideNgxTForms(
82
+ * myConfig,
83
+ * withInputSecret(environment.ngxTFormsInputSecret),
84
+ * )
85
+ */
86
+ declare function withInputSecret(secret: string): NgxTFormsFeature;
87
+
88
+ /**
89
+ * Feeds {@link FormBuilderComponent} its `formId` from the activated route,
90
+ * preserving the historical route-driven form loading. Shipped by default in
91
+ * `provideNgxTForms`, so existing consumers see identical behaviour (D-B2 / §5.5);
92
+ * a router-free build resolves {@link FORM_ROUTE_SOURCE} to `EMPTY` and the
93
+ * builder loads from its `formId` input only.
94
+ *
95
+ * @example
96
+ * provideNgxTForms(config, withRouterFormId())
97
+ *
98
+ * @public
99
+ */
100
+ declare function withRouterFormId(): NgxTFormsFeature;
101
+
102
+ /**
103
+ * Provides the action handlers (submit, save, cancel, etc.) that the forms
104
+ * runtime invokes when the user interacts with form controls. Bound from the
105
+ * `formActions` field of `NgxTFormsConfig` when the consumer calls
106
+ * `provideNgxTForms`.
107
+ *
108
+ * @see provideNgxTForms
109
+ */
110
+ declare const FORM_ACTIONS_TOKEN: InjectionToken<IFormActions>;
111
+
112
+ /**
113
+ * Provides the active `FormInterface` definition rendered by the forms
114
+ * runtime. Components downstream of the form host inject this token to read
115
+ * the form configuration without coupling to the store.
116
+ *
117
+ * @see provideNgxTForms
118
+ */
119
+ declare const FORM_CONFIG_TOKEN: InjectionToken<FormInterface>;
120
+
121
+ /**
122
+ * Provides the active `FormSlideInterface` (the slide/step currently being
123
+ * rendered). Scoped per slide by the form host so individual inputs can read
124
+ * their slide context.
125
+ *
126
+ * @see provideNgxTForms
127
+ */
128
+ declare const FORM_SLIDES_TOKEN: InjectionToken<FormSlideInterface>;
129
+
130
+ /**
131
+ * Provides the in-class utility object (`InClassFormUtilsInterface`) that
132
+ * exposes shared helper functions to form input components — formatting,
133
+ * validation helpers, and cross-input lookups.
134
+ *
135
+ * @see provideNgxTForms
136
+ */
137
+ declare const UTILS_OBJECT_TOKEN: InjectionToken<InClassFormUtilsInterface>;
138
+
139
+ /**
140
+ * Provides the merged form-input descriptor injected into each individual
141
+ * input element. The descriptor is an intersection of every supported input
142
+ * shape (`IWorkflowDocumentPicker & IBasicFormInput & IFileUploadInput &
143
+ * IDateRangePickerInput & ITextareaProperties & IToggleInput & IMatrixInput
144
+ * & IMultiple`) so a single token can describe any rendered input.
145
+ *
146
+ * @see provideNgxTForms
147
+ */
148
+ declare const FORM_INPUTS_TOKEN: InjectionToken<IWorkflowDocumentPicker & IBasicFormInput & IFileUploadInput & IDateRangePickerInput & ITextareaProperties & IToggleInput & IMatrixInput & IMultiple>;
149
+
150
+ /**
151
+ * Provides the `IMultiple` configuration to "multiple"-type inputs (inputs
152
+ * that produce an array of values). Scoped per input instance.
153
+ *
154
+ * @see provideNgxTForms
155
+ */
156
+ declare const MULTIPLE_FORM_INPUT_TOKEN: InjectionToken<IMultiple>;
157
+
158
+ /**
159
+ * Provides a factory function that returns an `Observable<IGetTreeResponse>`
160
+ * representing the MSCOA chart-of-accounts tree. Consumers bind this token
161
+ * to their backend lookup so MSCOA-aware inputs can lazily fetch the tree
162
+ * without depending on a concrete HTTP client.
163
+ *
164
+ * @see provideNgxTForms
165
+ */
166
+ declare const MSCOA_TREE_PROVIDER: InjectionToken<() => Observable<IGetTreeResponse>>;
167
+
168
+ /**
169
+ * Provides the top-level `NgxTFormsConfig` supplied by the consumer when
170
+ * calling `provideNgxTForms`. This is the root configuration token from
171
+ * which `formActions`, `formBuilder`, and other runtime concerns are read.
172
+ *
173
+ * @see provideNgxTForms
174
+ */
175
+ declare const NGX_T_FORMS_CONFIG_TOKEN: InjectionToken<NgxTFormsConfig>;
176
+
177
+ /**
178
+ * @public
179
+ *
180
+ * Abstract repository for MongoDB-aggregation-pipeline operations used by the
181
+ * library's pipeline-generator UI. The default HTTP-backed implementation is
182
+ * {@link HttpPipelineRepository}, bound by {@link withHttpPipeline}.
183
+ *
184
+ * Consumers may bind a custom implementation against
185
+ * {@link PIPELINE_REPOSITORY} (e.g. for offline / mocked environments) by
186
+ * providing an alternative `useClass` against the same token instead of (or
187
+ * after) `withHttpPipeline()`.
188
+ *
189
+ * Only the methods that cross the HTTP boundary are abstracted here; pipeline
190
+ * orchestration state (`pipeline$`, `chatHistory$`, etc.) remains inside the
191
+ * adapter / generator UI per LP §9 (the repository owns I/O, not UI state).
192
+ */
193
+ declare abstract class PipelineRepository {
194
+ /**
195
+ * Execute the given aggregation pipeline against the configured backend for
196
+ * the supplied workflow.
197
+ *
198
+ * @param pipeline - Validated MongoDB aggregation stages to run.
199
+ * @param workflowId - Identifier of the workflow whose schema the pipeline
200
+ * targets.
201
+ * @returns An observable that emits exactly one {@link IRunPipelineResponse}
202
+ * then completes. Errors surface as a typed Error.
203
+ */
204
+ abstract runPipeline(pipeline: PipelineStage[], workflowId: string): Observable<IRunPipelineResponse>;
205
+ /**
206
+ * Ask the configured backend to generate (or refine) an aggregation pipeline
207
+ * from a natural-language query plus the workflow's document schema.
208
+ *
209
+ * @param query - The user's prompt.
210
+ * @param schema - Document schema the generator should target.
211
+ * @param threadId - Optional generator-session id (continues an in-flight
212
+ * chat).
213
+ * @param existingPipeline - The pipeline-so-far, for incremental refinement.
214
+ * @param previousError - The last execution error to feed back into the
215
+ * model, when applicable.
216
+ */
217
+ abstract generatePipeline(query: string, schema: object, threadId: string | undefined, existingPipeline: PipelineStage[], previousError: string): Observable<IPipelineGenerationResponse>;
218
+ /**
219
+ * Fetch the document schema for the supplied workflow.
220
+ *
221
+ * @param workflowId - Identifier of the workflow whose schema to load.
222
+ */
223
+ abstract getSchema(workflowId: string): Observable<{
224
+ schema: object;
225
+ }>;
31
226
  }
32
227
 
33
- declare const initFormConfigToV2: (formConfig: OLD_FormInterface) => FormInterface;
228
+ /**
229
+ * @public
230
+ *
231
+ * Token binding the {@link PipelineRepository} abstraction. The default
232
+ * HTTP-backed implementation is {@link HttpPipelineRepository}, registered by
233
+ * {@link withHttpPipeline}. Consumers may substitute their own implementation
234
+ * by binding `useClass` (or `useValue` for a mock) against this token.
235
+ */
236
+ declare const PIPELINE_REPOSITORY: InjectionToken<PipelineRepository>;
34
237
 
35
- declare function provideNgxTForms(config: NgxTFormsConfig): EnvironmentProviders;
238
+ /**
239
+ * Secret used to derive per-input HMAC keys for client-side encryption of
240
+ * sensitive form values (currently: signature input payloads).
241
+ *
242
+ * Consumers MUST configure this via {@link withInputSecret} when the
243
+ * signature input is in use. The library does not ship a default — hardcoding
244
+ * a secret inside a published library would render it public.
245
+ *
246
+ * Treat the value as opaque, high-entropy, and never derived from anything
247
+ * the browser can read (e.g. `environment.ts` baked into the bundle is
248
+ * acceptable for low-sensitivity rotation; HSM-backed values are better).
249
+ *
250
+ * @see withInputSecret
251
+ */
252
+ declare const INPUT_SECRET_TOKEN: InjectionToken<string>;
36
253
 
37
254
  /**
38
- * Generates a hierarchical form with nested FormGroups based on section IDs.
39
- * Parent form listens to all descendant changes, with validation cascading upward.
255
+ * Optional source of the form id to load into {@link FormBuilderComponent}.
40
256
  *
41
- * @param inputs Array of form inputs with their configurations
42
- * @param getFormValue Record of form values used for custom validation
43
- * @returns A FormGroup with nested FormGroups for each section
257
+ * Bound by `withRouterFormId()` (shipped by default in `provideNgxTForms`) to the
258
+ * activated route's `formId` param. When unbound e.g. a router-free build the
259
+ * builder loads from its `formId` input only. This decouples the builder from a
260
+ * direct `ActivatedRoute` dependency (plan D-B2 / §5.5).
261
+ *
262
+ * @public
44
263
  */
45
- declare function formGenerator(inputs: Array<FormColumnInputs>, getFormValue: () => Record<string, any>): FormGroup;
264
+ declare const FORM_ROUTE_SOURCE: InjectionToken<Observable<string | undefined>>;
46
265
 
47
- interface IFormTour extends IStepOption {
48
- sectionId: string;
266
+ /**
267
+ * @public
268
+ *
269
+ * Default HTTP-backed implementation of {@link PipelineRepository}. Bound by
270
+ * {@link withHttpPipeline}; consumers needing a different transport should
271
+ * provide their own implementation against {@link PIPELINE_REPOSITORY}.
272
+ *
273
+ * The endpoint host (`http://localhost:5000`) is preserved from the pre-Phase-2
274
+ * `PipelineService` for I-1 parity. Configurable endpoints are tracked for a
275
+ * later phase — do not widen this surface ad-hoc.
276
+ */
277
+ declare class HttpPipelineRepository implements PipelineRepository {
278
+ #private;
279
+ runPipeline(pipeline: PipelineStage[], workflowId: string): Observable<IRunPipelineResponse>;
280
+ generatePipeline(query: string, schema: object, threadId: string | undefined, existingPipeline: PipelineStage[], previousError: string): Observable<IPipelineGenerationResponse>;
281
+ getSchema(workflowId: string): Observable<{
282
+ schema: object;
283
+ }>;
284
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HttpPipelineRepository, never>;
285
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<HttpPipelineRepository>;
49
286
  }
50
287
 
51
- declare enum FunctionTypes {
52
- ValueCalculation = "ValueCalculation",
53
- ValuePostMethodAPI = "ValuePostMethodAPI",
54
- ValuePostMethodAPIWithAllDefaultParams = "ValuePostMethodAPIWithAllDefaultParams",
55
- OptionsPostMethodAPI = "OptionsPostMethodAPI",
56
- OptionsPostMethodAPIWithAllDefaultParams = "OptionsPostMethodAPIWithAllDefaultParams",
57
- ValueGetMethodAPI = "ValueGetMethodAPI",
58
- OptionsGetMethodAPI = "OptionsGetMethodAPI",
59
- InputSourcedValue = "InputSourcedValue",
60
- ManualValueValidation = "ManualValueValidation"
288
+ /**
289
+ * Renders the list of forms a user can open, edit, or build, with search,
290
+ * grouping (system vs custom), and section switching (active / archived /
291
+ * deleted) wired through the consumer-supplied `formBuilder` config.
292
+ *
293
+ * @remarks
294
+ * The component reads its data from `FormsStoreService` (provided locally)
295
+ * and reads the consumer's `NgxTFormsConfig` from {@link NGX_T_FORMS_CONFIG_TOKEN}
296
+ * to discover the close-button template and form CRUD callbacks
297
+ * (`editForm`, `addNewForm`).
298
+ *
299
+ * Inputs:
300
+ * - _None._ The component is driven entirely by the activated route and
301
+ * the injected forms store.
302
+ *
303
+ * Outputs:
304
+ * - _None._ User intents (archive / unarchive / delete / edit / add) are
305
+ * delegated to the store and to the consumer's `formBuilder` config.
306
+ */
307
+ declare class FormsComponent implements OnInit {
308
+ #private;
309
+ selectFormsList$: Observable<LocalFormStateSelectorInterface[]>;
310
+ selectGroupedForms$: Observable<Record<string, LocalFormStateSelectorInterface[]>>;
311
+ searchQuery$: Observable<string>;
312
+ selectHasActiveSearch$: Observable<boolean>;
313
+ selectFilteredGroupedForms$: Observable<Record<string, LocalFormStateSelectorInterface[]>>;
314
+ selectLoadingForms$: Observable<boolean>;
315
+ selectErrors$: FormsStoreSelectorsInterface['selectErrors$'];
316
+ selectFormListSection$: Observable<FormListSection>;
317
+ NGX_T_FORMS_CONFIG: ngx_t_forms_types.NgxTFormsConfig;
318
+ closeButton: ngx_t_forms_types.ActionButton;
319
+ get formListSections(): Array<{
320
+ value: FormListSection;
321
+ label: string;
322
+ }>;
323
+ viewportWidth: number;
324
+ ngOnInit(): void;
325
+ labels: {
326
+ label: string;
327
+ formControlName: string;
328
+ }[];
329
+ activeForm: string | null;
330
+ getCols(): number;
331
+ getFormAvatar(formTitle: string): string;
332
+ archive(form: LocalFormStateSelectorInterface, event: Event): Promise<void>;
333
+ unarchive(form: LocalFormStateSelectorInterface, event: Event): Promise<void>;
334
+ delete(form: LocalFormStateSelectorInterface, event: Event): Promise<void>;
335
+ loadForms(): void;
336
+ router: Router;
337
+ activatedRoute: ActivatedRoute;
338
+ setSection(value: FormListSection): void;
339
+ editForm(form: LocalFormStateSelectorInterface): void;
340
+ addNewForm(): void;
341
+ clearSearch(): void;
342
+ get searchQuery(): string;
343
+ set searchQuery(v: string);
344
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormsComponent, never>;
345
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormsComponent, "lib-forms, app-forms", never, {}, {}, never, never, true, never>;
61
346
  }
62
347
 
348
+ /**
349
+ * Editor surface for authoring a form definition — sections, steps, and
350
+ * the individual inputs in each step. Hosts the section stepper, input
351
+ * editor, builder menu, and missing-config diagnostics.
352
+ *
353
+ * @remarks
354
+ * The component reads its state and effects from a locally provided
355
+ * `FormsStoreService` and pulls the consumer-supplied close-button template
356
+ * from {@link NGX_T_FORMS_CONFIG_TOKEN}. Form loading is driven either by
357
+ * the `formId` input or by the activated route's `formId` param.
358
+ *
359
+ * Inputs:
360
+ * - `formId: string` (optional) — when set, triggers `loadForm$` on the store.
361
+ *
362
+ * Outputs:
363
+ * - _None._ All save/refresh intents are dispatched through the local store.
364
+ *
365
+ * @public
366
+ * @deprecated Migrating to the strict library mandates. Public surface is
367
+ * preserved verbatim; internal authoring is being refactored.
368
+ */
369
+ declare class FormBuilderComponent {
370
+ #private;
371
+ /** Form-load spinner. */
372
+ readonly selectLoadingForm: _angular_core.Signal<boolean>;
373
+ /** Builder busy (saving / mutating). */
374
+ readonly selectFormBuilderIsBusy: _angular_core.Signal<boolean>;
375
+ /** "Updated N days ago" label, or null. */
376
+ readonly selectFormUpdated: _angular_core.Signal<string | Date | null>;
377
+ /** Whether the current form passes validation and can be saved. */
378
+ readonly canSaveForm: _angular_core.Signal<boolean>;
379
+ /** Whether the form in edit is unsaved (no formId yet). */
380
+ readonly isNewForm: _angular_core.Signal<boolean>;
381
+ /** Optional form identifier. When set, triggers `loadForm$` on the local store. */
382
+ readonly formId: _angular_core.InputSignal<string | undefined>;
383
+ /** Whether a form id is present in the store. */
384
+ readonly selectHasFormId: _angular_core.Signal<boolean>;
385
+ /** Whether the form has missing/invalid configuration. */
386
+ readonly hasMissingConfigs: _angular_core.Signal<boolean>;
387
+ /** Whether an input editor panel is currently open. */
388
+ readonly elementEditorOpen: _angular_core.Signal<boolean>;
389
+ pendingExternalRefresh: _angular_core.Signal<{
390
+ form: ngx_t_forms_types.FormInterface;
391
+ timestamp: Date;
392
+ } | null>;
393
+ refreshCountdown: _angular_core.WritableSignal<number>;
394
+ constructor();
395
+ triggerRefreshNow(): void;
396
+ readonly NGX_T_FORMS_CONFIG: ngx_t_forms_types.NgxTFormsConfig;
397
+ readonly closeButton: ngx_t_forms_types.ActionButton;
398
+ saveForm: () => void;
399
+ /** Editable form title — seeded from the store, overridable by local edits. */
400
+ protected readonly titleValue: _angular_core.WritableSignal<string>;
401
+ /** Pushes a title edit to the store (schedule-only refresh, matching `setFormTitle`). */
402
+ protected setTitleValue(value: string): void;
403
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormBuilderComponent, never>;
404
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FormBuilderComponent, "lib-form-builder, app-form-builder", never, { "formId": { "alias": "formId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
405
+ }
406
+
407
+ /**
408
+ * Workflow function-type enum, upstreamed to `ngx-t-forms-types` as
409
+ * {@link WorkflowFunctionTypes} per DECISIONS.md D-016. Re-exported here under
410
+ * its historical name `FunctionTypes` to preserve every existing local import
411
+ * path (including the immutable `form-tower-controller.service.ts` per D-007).
412
+ *
413
+ * @public
414
+ */
415
+ declare const FunctionTypes: typeof WorkflowFunctionTypes;
416
+ type FunctionTypes = WorkflowFunctionTypes;
417
+
63
418
  declare enum HintType {
64
419
  WARNING = "warning",
65
420
  ERROR = "error",
@@ -80,54 +435,345 @@ declare enum HintType {
80
435
  DOCUMENT = "document",
81
436
  HISTORY = "history"
82
437
  }
438
+ /**
439
+ * @public
440
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
441
+ * barrel; remains functional. A renamed/improved replacement may be introduced
442
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
443
+ */
83
444
  declare function textIconsForUserHints(hint: string, type: HintType): string;
84
445
 
85
- interface DependentInput {
446
+ /**
447
+ * @file Pure helpers for the **overridable validation** submission gate.
448
+ *
449
+ * A custom validator declared with `canOverride === true` does not block
450
+ * submission outright. The gate distinguishes two error classes across the
451
+ * settled form:
452
+ *
453
+ * - **Blocking** — every error that is NOT an overridable custom-validator
454
+ * error: standard validators (`required`, `email`, `minlength`, …), MSCOA
455
+ * business-rule errors, and custom validators with `canOverride === false`.
456
+ * These MUST be resolved before the form can be submitted.
457
+ * - **Overridable** — a custom-validator error whose value object carries
458
+ * `canOverride === true`. The form may be submitted with these still failing
459
+ * **provided each one is motivated** with a non-empty comment.
460
+ *
461
+ * The error-record shape these helpers read is produced verbatim by the
462
+ * {@link FunctionTypes.ManualValueValidation} builder
463
+ * (`build-manual-validation.ts`): `{ [validatorId]: { message, canOverride } }`,
464
+ * merged onto `control.errors` by the W11 projection adapter. A validator id is
465
+ * a uuid unique per `(input, validator)`, so it uniquely keys an override
466
+ * reason.
467
+ *
468
+ * All functions here are pure reads over the projected `FormGroup` tree and the
469
+ * tower's `allFormInputs()` index — no signal writes, no Angular runtime
470
+ * primitives created. They are safe to call from template getters during change
471
+ * detection (mirrors `getSubmissionStatus.ts`).
472
+ */
473
+
474
+ /**
475
+ * A still-failing overridable custom validation surfaced to the override UI.
476
+ */
477
+ interface OverridableError {
478
+ /** The custom validator's id — the `control.errors` key and the reason key. */
479
+ validatorId: string;
480
+ /** The owning input's id (its control name within the section group). */
86
481
  inputId: string;
87
- functionType: FunctionTypes;
482
+ /** The owning input's `formControlName`, used to build the submission entry. */
483
+ formControlName: string;
484
+ /** The input's display label, for the override-reason prompt. */
485
+ label: string;
486
+ /** The validator's human-readable message. */
487
+ message: string;
488
+ }
489
+ /**
490
+ * A single captured override motivation, keyed in the engine by `validatorId`.
491
+ */
492
+ interface OverrideReason {
493
+ /** User-supplied motivation. Must be non-empty (trimmed) to unlock submission. */
494
+ comment: string;
495
+ /** Optional supporting file, carried as base64 {@link FileData}. */
496
+ attachment?: FileData;
88
497
  }
498
+ /** Map of `validatorId → captured reason`. The engine's override-reason state. */
499
+ type OverrideReasons = Record<string, OverrideReason>;
500
+
501
+ /**
502
+ * Core orchestrator for a runtime form (the "tower") — abstract because every
503
+ * concrete consumer (`TFormEngine`, the import row instance) extends it and
504
+ * Angular's DI provides {@link HttpClient} + {@link NGX_T_FORMS_CONFIG_TOKEN}.
505
+ *
506
+ * ### Lifecycle (Phase 1)
507
+ * 1. **{@link FormTowerControllerService.initialize}** — prepPopulate +
508
+ * loadSystemInputs + formGenerator + setFirstStepAsActive, then builds the
509
+ * per-input `#derived` signal graph (in injection context) and wires the
510
+ * FormGroup-projection + persist effects. There is NO `valueChanges`
511
+ * subscription and NO dependency-graph build.
512
+ * 2. **{@link FormTowerControllerService.initializeFormValues}** — writes
513
+ * user/import values into `#model` (tower-owned derived inputs are skipped
514
+ * structurally) and forces a liveness lead-read so lazy resources start.
515
+ * 3. User interaction / `updateValue` → writes `#model` (or a sourced
516
+ * `linkedSignal.set`) → derived signals + resources recompute automatically.
517
+ * 4. **{@link FormTowerControllerService.waitUntilSettled}** — used by headless
518
+ * consumers (import) to wait for all in-flight async work to drain.
519
+ * 5. **{@link FormTowerControllerService.ngOnDestroy}** — explicitly destroys
520
+ * every resource, the projection/persist effects, the `isBusy$`
521
+ * subscription, and clears hint/error timers.
522
+ *
523
+ * ### Why an abstract `@Directive()`?
524
+ * Angular requires the `@Directive()` decorator on classes that participate in
525
+ * DI inheritance + `OnDestroy`. Subclasses can be plain `@Injectable()` (see
526
+ * {@link TFormEngine}).
527
+ */
89
528
  declare abstract class FormTowerControllerService implements OnDestroy {
529
+ #private;
90
530
  private _http;
531
+ /** Resolved tower config (HTTP functions, file upload, getFinacialCycles, …). */
91
532
  readonly NGX_T_FORMS_CONFIG: ngx_t_forms_types.NgxTFormsConfig;
533
+ /** Convenience pass-through to the financial-cycles fetcher from config. */
92
534
  readonly getFinacialCycles: () => Observable<ngx_t_forms_types.IFinancialCycles>;
93
535
  constructor(_http: HttpClient);
536
+ /** Emits exactly once on tower destruction. `takeUntil` anchor for long-lived subscriptions. */
94
537
  protected _destroyed$: Subject<void>;
95
- protected _form: FormInterface | undefined;
538
+ /** Live root `FormGroup` — the Material carrier (Blueprint §2.7). Built by `formGenerator`. */
96
539
  protected _mainForm: FormGroup | undefined;
97
- protected _formValue: Record<string, any>;
540
+ /** The values record last passed to {@link FormTowerControllerService.initializeFormValues}. */
98
541
  protected _initialFormValue: Record<string, any>;
99
- protected _systemInputs: FormColumnInputs[];
100
- protected _inputFunctionsCollection: Record<string, Partial<Record<FunctionTypes, Observable<void>>>>;
101
- protected _inputChangeDependencyRecords: Partial<Record<string, Partial<Record<FunctionTypes, Record<string, boolean>>>>>;
102
- protected _reverseDependencyMap: Record<string, DependentInput[]>;
103
- protected _changeHistory: IFormChangeHistory[];
542
+ /** Last reported submission state — drives the toolbar/spinner UI. */
104
543
  submittingStatus: FormSubmissionStatus | undefined;
105
- submittingForm: boolean;
544
+ /** True while a form submission is in flight. Counts toward {@link FormTowerControllerService.isBusy}. */
545
+ get submittingForm(): boolean;
546
+ set submittingForm(value: boolean);
547
+ /**
548
+ * The still-failing overridable (`canOverride === true`) validations on the
549
+ * settled form, one per failing validator, each carrying the input's
550
+ * `formControlName` / `label` and the validator message — the data the
551
+ * override-reason UI renders a motivation prompt from.
552
+ *
553
+ * Reads the projected control tree, so it reflects the latest validity. When
554
+ * there are blocking errors as well, those still prevent submission — see
555
+ * {@link FormTowerControllerService.canSubmit}.
556
+ */
557
+ overridableErrors: () => OverridableError[];
558
+ /**
559
+ * `true` when at least one blocking (non-overridable) error remains on the
560
+ * form. While this holds, submission is impossible regardless of motivations.
561
+ */
562
+ hasBlockingErrors: () => boolean;
563
+ /**
564
+ * Whether the form may be submitted: no blocking errors AND every overridable
565
+ * error has a non-empty motivation. Replaces the blunt `mainForm.invalid`
566
+ * submit gate — an overridable error with a reason no longer blocks.
567
+ */
568
+ canSubmit: () => boolean;
569
+ /** The currently captured override motivations, keyed by validator id. */
570
+ get overrideReasons(): OverrideReasons;
571
+ /**
572
+ * Records (or updates) the motivation comment for one overridable validation.
573
+ *
574
+ * @param validatorId - The validator's id (the `control.errors` key).
575
+ * @param comment - The user's motivation; an empty/whitespace value
576
+ * re-locks submission for that error.
577
+ */
578
+ setOverrideComment: (validatorId: string, comment: string) => void;
579
+ /**
580
+ * Attaches (or clears) a supporting file for one overridable validation.
581
+ *
582
+ * @param validatorId - The validator's id (the `control.errors` key).
583
+ * @param attachment - The base64 {@link FileData}, or `undefined` to clear.
584
+ */
585
+ setOverrideAttachment: (validatorId: string, attachment: FileData | undefined) => void;
586
+ /**
587
+ * Drops the captured reasons for the given validator ids. Called once a
588
+ * MultipleInput sub-row is saved — its motivations move from the live
589
+ * reason map into {@link FormTowerControllerService.#rowOverrides}, and the
590
+ * transient controls (and thus the live overridable errors) are removed.
591
+ *
592
+ * @param validatorIds - The validator ids whose live reasons to drop.
593
+ */
594
+ clearOverrideReasons: (validatorIds: readonly string[]) => void;
595
+ /**
596
+ * Records (or clears) the captured override entries for one MultipleInput
597
+ * sub-row. Replacing on every save keeps a re-edited row's motivations
598
+ * current; passing an empty list removes the row's entry.
599
+ *
600
+ * @param inputId - The MultipleInput's id.
601
+ * @param rowId - The sub-row's id (`${inputId}.id` value).
602
+ * @param entries - The override entries captured for the row.
603
+ */
604
+ setRowOverrides: (inputId: string, rowId: string, entries: IFormValidationOverride[]) => void;
605
+ /**
606
+ * Builds the override entries for the currently-open inner inputs of a
607
+ * MultipleInput sub-row, pairing each overridable error with its captured
608
+ * motivation. Returns the entries plus the validator ids consumed (so the
609
+ * caller can move them out of the live reason map after the row is saved).
610
+ *
611
+ * @param inputId - The MultipleInput's id.
612
+ * @param innerInputs - The sub-row's inner inputs (composite-id form inputs).
613
+ * @returns The sub-row's override state: motivated `entries` ready to persist,
614
+ * the `validatorIds` consumed, and the inner input ids that are blocking or
615
+ * still unmotivated (for save-gate messaging).
616
+ */
617
+ collectRowOverrideState: (inputId: string, innerInputs: FormColumnInputs[]) => {
618
+ entries: IFormValidationOverride[];
619
+ validatorIds: string[];
620
+ blockingInputIds: string[];
621
+ unmotivatedInputIds: string[];
622
+ };
623
+ /** The current form definition (post-{@link prepPopulateForm}). */
106
624
  get form(): FormInterface | undefined;
107
625
  set form(value: FormInterface | undefined);
108
- set systemInputs(value: FormColumnInputs[]);
626
+ /** System inputs loaded by `loadSystemInputs`, prepended to {@link FormTowerControllerService.allFormInputs}. */
109
627
  get systemInputs(): FormColumnInputs[];
628
+ set systemInputs(value: FormColumnInputs[]);
629
+ /** Live root `FormGroup` — `undefined` before {@link FormTowerControllerService.initialize}. */
110
630
  get mainForm(): FormGroup | undefined;
631
+ /** Append-only change history; used by {@link FormTowerControllerService.revertBackHistory}. */
111
632
  get changeHistory(): IFormChangeHistory[];
112
633
  set changeHistory(value: IFormChangeHistory[]);
113
- get inputFunctionsCollection(): Record<string, Partial<Record<FunctionTypes, Observable<void>>>>;
634
+ /**
635
+ * Busy iff a submission is in flight OR any value/options resource is
636
+ * `'loading'`. Reading every resource's `status()` here is what ACTIVATES the
637
+ * lazy resources — workers MUST NOT short-circuit before iterating
638
+ * (resource-activation contract, Blueprint §2.4 / HAZARD 2).
639
+ */
640
+ protected readonly isBusyComputed: Signal<boolean>;
641
+ /** Strict complement of {@link FormTowerControllerService.isBusyComputed}. */
642
+ protected readonly settled: Signal<boolean>;
643
+ /** Synchronous snapshot of the busy state. */
644
+ get isBusy(): boolean;
645
+ /**
646
+ * Reactive stream of the tower's busy state. Emits `true` while any
647
+ * calculation/API/validation is in flight or the form is submitting, `false`
648
+ * once everything settles. Backed by `toObservable(isBusy)`.
649
+ */
650
+ get isBusy$(): Observable<boolean>;
651
+ /**
652
+ * Resolves once the tower has finished all in-flight async work (calculations,
653
+ * API fetches, sourced values). Used by headless consumers (import).
654
+ *
655
+ * **Contract (Blueprint §5 / §6, never changes):**
656
+ * - Performs a one-tick liveness lead-read FIRST (reads `value()` + every
657
+ * resource `status()` + flushes effects) so lazy resources start even when
658
+ * no template reads them (HAZARD 2).
659
+ * - Waits for the first `settled() === true` emission.
660
+ * - On `timeoutMs` it resolves with `undefined` — it NEVER rejects and NEVER
661
+ * hangs (`timeout` + `defaultIfEmpty`-equivalent via `catchError`).
662
+ *
663
+ * @param debounceMs - Accepted for signature parity; the signal graph needs no
664
+ * debounce, so it is treated as a no-op lead time.
665
+ * @param timeoutMs - Hard timeout before resolving with `undefined` (default 30s).
666
+ * @returns A promise that always resolves (with `void`).
667
+ */
668
+ waitUntilSettled(debounceMs?: number, timeoutMs?: number): Promise<void>;
669
+ /**
670
+ * Tears the tower down. Fires `_destroyed$`, runs
671
+ * {@link FormTowerControllerService.clearFormState} (which destroys resources
672
+ * + effects), completes the `isBusy$` subscription, and clears pending
673
+ * hint/error timers (HAZARD 7 / Blueprint §2.8).
674
+ */
114
675
  ngOnDestroy(): void;
115
- initialize: (form: FormInterface) => Promise<void>;
676
+ /**
677
+ * Boots the tower against a form definition.
678
+ *
679
+ * Performs, in order:
680
+ * 1. {@link FormTowerControllerService.clearFormState} — wipe prior state +
681
+ * destroy any prior resources/effects.
682
+ * 2. {@link prepPopulateForm} — merge `_initialFormValue` into the columns.
683
+ * 3. {@link loadSystemInputs} — load financial cycle, current user, etc.
684
+ * 4. {@link formGenerator} — build the nested `FormGroup` carrier.
685
+ * 5. Re-open any `MultipleInput` that was open before re-init.
686
+ * 6. Build the `#derived` signal graph + wire the projection/persist effects
687
+ * — ALL inside `runInInjectionContext(this.#injector, …)` (HAZARD 1).
688
+ *
689
+ * @param form - The form definition to drive.
690
+ * @param options - Optional behaviour flags.
691
+ * @param options.skipInitialFunctions - **Documented no-op (parity).** The
692
+ * old engine used this to suppress a premature change-monitor cycle in the
693
+ * headless import path. The signal graph has no such race (resources fire
694
+ * lazily once read; the liveness lead-read in
695
+ * {@link FormTowerControllerService.initializeFormValues} +
696
+ * {@link FormTowerControllerService.waitUntilSettled} activates them), so
697
+ * the flag is accepted for signature parity and otherwise ignored.
698
+ */
699
+ initialize: (form: FormInterface, options?: {
700
+ skipInitialFunctions?: boolean;
701
+ }) => Promise<void>;
702
+ /**
703
+ * Marks the form's first slide as active. Called during
704
+ * {@link FormTowerControllerService.initialize}.
705
+ */
116
706
  setFirstStepAsActive: () => void;
707
+ /**
708
+ * Returns the form's settled values keyed by **formControlName** (the
709
+ * canonical external shape). Reads {@link FormTowerControllerService.value}.
710
+ */
117
711
  getFormValueNames: () => Record<string, any>;
712
+ /**
713
+ * All form inputs that participate in the form, including system inputs.
714
+ * Returns a fresh outer array each call (preserves the prior contract that
715
+ * callers may mutate the returned array), but the expensive flatten beneath it
716
+ * is memoized by {@link FormTowerControllerService.#allInputsMemo}.
717
+ */
118
718
  readonly allFormInputs: () => FormColumnInputs[];
719
+ /** @deprecated unused field, kept for backwards compatibility. */
119
720
  prevValue: any;
120
- protected changeMonitor: (newFormValue: any) => Observable<any>;
121
- createInputFunctionsCollection: () => void;
122
- private buildReverseDependencyMap;
123
- createAllInputDependencies: () => void;
721
+ /**
722
+ * Mark a logical operation in flight for DOM badge rendering. Phase 1: no
723
+ * longer affects {@link FormTowerControllerService.isBusy} (busy is
724
+ * resource-derived) forwards to the DOM-status helper only.
725
+ */
124
726
  setInputStatus: (inputId: string, statusId: string, status: string) => void;
727
+ /** Companion to {@link FormTowerControllerService.setInputStatus} — clears the DOM badge. */
125
728
  removeInputStatus: (inputId: string, statusId: string) => void;
729
+ /**
730
+ * Programmatic write to a form input.
731
+ *
732
+ * - **Sourced inputs** (InputSourcedValue) → routes to the entry's writable
733
+ * `linkedSignal.set(value)` (transient override; reset on next source change).
734
+ * - **All other inputs** → writes `#model[inputId]`.
735
+ *
736
+ * Appends the change to history IMPERATIVELY (HAZARD 4). The projection effect
737
+ * patches the FormControl from the signal graph — this does NOT touch the
738
+ * FormGroup directly (no `valueChanges` feedback loop).
739
+ *
740
+ * @param inputId - The input to write.
741
+ * @param value - The new value.
742
+ */
126
743
  updateValue: (inputId: string, value: any) => void;
127
- getFunctionByType(fn: FunctionTypes, input: FormColumnInputs): Observable<void>;
744
+ /**
745
+ * Apply an external values record onto the form (user prefill / import row).
746
+ *
747
+ * Per input:
748
+ * - **Tower-owned non-MultipleInput** (calc/API/sourced) → SKIP structurally
749
+ * (it never enters `#model`; the derived signal/resource owns the value).
750
+ * - **MultipleInput** → ALWAYS apply the row array (its rows are user-authored
751
+ * source data). The array-remap branch is UNCHANGED (Phase 2 fence).
752
+ * - **Everything else** → write `#model` from the dotted-path or top-level value.
753
+ *
754
+ * Ends with a liveness lead-read so lazy resources start even in the headless
755
+ * import path (no template reader) — HAZARD 2 / Blueprint §2.7.
756
+ *
757
+ * @param initialValues - The external values record (formControlName-keyed).
758
+ */
759
+ initializeFormValues: (initialValues: Record<string, any>) => void;
760
+ /**
761
+ * Snapshot of the inputId-keyed flat form value. Re-points to the merged
762
+ * {@link FormTowerControllerService.value} computed (was the old `_formValue`).
763
+ * Passed to legacy helpers (refresh) that expect a `() => Record` accessor.
764
+ */
128
765
  getFormValue: () => Record<string, any>;
766
+ /**
767
+ * Resets all internal state — definition, FormGroup, signal graph (resources +
768
+ * effects destroyed), busy/model/history — so the tower can be re-initialized.
769
+ * Called at the start of {@link FormTowerControllerService.initialize} and from
770
+ * {@link FormTowerControllerService.ngOnDestroy}.
771
+ *
772
+ * Explicitly `.destroy()`s every `ResourceRef` and the projection/persist
773
+ * effects (HAZARD 7 / Blueprint §2.8 — per-row import towers are torn down by
774
+ * manual `ngOnDestroy`, not injector destruction).
775
+ */
129
776
  clearFormState: () => void;
130
- executeInputFunctionsWithoutDependencies: () => void;
131
777
  _hintTimeoutIds: Record<string, any>;
132
778
  setTemporaryHint: (inputId: string, hint: string, type: HintType) => void;
133
779
  _onFormInputConfigChange?: (inputId: string, config: FormColumnInputs) => void;
@@ -140,489 +786,362 @@ declare abstract class FormTowerControllerService implements OnDestroy {
140
786
  updateFormInputConfig: (inputId: string, config: FormColumnInputs) => void;
141
787
  handleStepChange: (event: StepperSelectionEvent) => void;
142
788
  selectFormSteps: () => ngx_t_forms_types.ITowerFormSteps[];
143
- selectAllFormTours: () => IFormTour[];
789
+ selectAllFormTours: () => ngx_t_forms_types.IFormTour[];
144
790
  setSectionAsSeen: (sectionId: string) => void;
145
791
  setSectionAsActive: (sectionId: string) => void;
146
792
  setInputAsTouchedAndDirty: (inputId: string) => void;
147
793
  formProgress: () => number;
148
794
  formSubmissionMessage: () => string;
149
795
  setSubmissionStatusValue: (status: FormSubmissionStatus) => FormSubmissionStatus;
150
- initializeFormValues: (initialValues: Record<string, any>) => void;
151
- reset(): void;
152
- revertBackHistory: () => void;
153
796
  /**
154
- * Form Submissions
797
+ * Legacy-shaped per-input function registry, reconstructed from `#derived`
798
+ * (Decision D3). Each present `(inputId, functionType)` maps to an
799
+ * `Observable<void>` that, on subscription, drives the underlying primitive:
800
+ * - resource/options entries → `.reload()` then complete when status leaves
801
+ * `'loading'`;
802
+ * - value/sourced/validation entries → a synchronous read then complete.
803
+ *
804
+ * Kept so `refreshInputWithDependencies` / `refreshInput` /
805
+ * `runMultipleInputPrepopulationFunctions` / `getTopologicalExecutionOrder`
806
+ * compile + behave unchanged. The return TYPE is unchanged (api:check parity).
155
807
  */
156
- submitForm: (passData: Record<string, any>) => void;
808
+ get inputFunctionsCollection(): Record<string, Partial<Record<FunctionTypes, Observable<void>>>>;
157
809
  /**
158
- * Toggles a multiple input element and its associated form controls.
159
- * When toggled on, adds controls to the form. When toggled off, removes them.
810
+ * Submits the form to the configured backend pipeline. Builds a payload by
811
+ * un-flattening the settled values, delegates to {@link formHttpSubmissions},
812
+ * and reports status. Errors surface as `FormSubmissionStatus.FAILED` — they
813
+ * do not throw to the caller.
160
814
  *
161
- * @param inputId The ID of the multiple input to toggle
162
- * @returns boolean indicating success or failure
815
+ * @param passData - Extra context handed through to the submission pipeline.
163
816
  */
817
+ submitForm: (passData: Record<string, any>) => void;
818
+ /** Toggle a MultipleInput element + its associated form controls. */
164
819
  toggleMultipleInput: (inputId: string, open: boolean, rowInEditId?: string) => boolean;
820
+ /** Persist the open MultipleInput sub-form back into the parent control's array value. */
165
821
  saveMultipleInputForm: (inputId: string) => boolean;
822
+ /** Open the MultipleInput sub-form prepopulated with `rowId`'s values. */
166
823
  multipleInputEditRow: (inputId: string, rowId: string) => boolean;
824
+ /** Duplicate `rowId` and open the sub-form on the new row. */
167
825
  multipleInputDuplicateRow: (inputId: string, rowId: string) => boolean;
168
- refreshSection: (sectionId: string) => Observable<void>;
826
+ /**
827
+ * Bridges live edits of an OPEN MultipleInput sub-row into the signal graph.
828
+ *
829
+ * Subscribes every sub-row control (`${inputId}.${childId}`) — except the
830
+ * `${inputId}.id` row-bookkeeping control — to `updateValue(controlName, …)`,
831
+ * so a sub-row field behaves exactly like a primary-form input: dependent
832
+ * calculations / value-fetches / validators (whether they live in the same
833
+ * row or in the primary form) re-fire the moment a dependency changes.
834
+ *
835
+ * Idempotent per `inputId` (re-binding tears down the prior subscription
836
+ * first). Each inner subscription is `takeUntil(this._destroyed$)`-anchored so
837
+ * a re-init also drops it. Called by `toggleMultipleInput` on open; mirrored
838
+ * by {@link FormTowerControllerService.unbindMultipleInputRowControls} on close.
839
+ *
840
+ * @param inputId - The MultipleInput whose open sub-row controls to bridge.
841
+ */
842
+ bindMultipleInputRowControls: (inputId: string) => void;
843
+ /**
844
+ * Tears down the live sub-row `valueChanges` bridge wired by
845
+ * {@link FormTowerControllerService.bindMultipleInputRowControls}. Called by
846
+ * `toggleMultipleInput` on close (and implicitly on re-open / re-init).
847
+ *
848
+ * @param inputId - The MultipleInput whose sub-row bridge to drop.
849
+ */
850
+ unbindMultipleInputRowControls: (inputId: string) => void;
851
+ /**
852
+ * Re-runs every refreshable function for inputs in `sectionId` (resource
853
+ * `.reload()` + dependency order). Returns an Observable that completes when
854
+ * the section's refresh chain drains.
855
+ *
856
+ * @param sectionId - The section to refresh.
857
+ * @returns An Observable completing when the section is refreshed.
858
+ */
859
+ refreshSection: (sectionId: string) => Observable<any>;
860
+ /**
861
+ * Fire-and-forget refresh of whichever slide is currently active. Returns
862
+ * `void` (parity — the consumer-map row claiming `Observable<any>` is wrong).
863
+ */
169
864
  refreshActiveSection: () => void;
170
- refreshInput: (inputId: string) => Observable<undefined>;
865
+ /**
866
+ * Refresh a single input plus everything it transitively depends on.
867
+ *
868
+ * @param inputId - The input to refresh.
869
+ * @returns An Observable completing when the refresh drains.
870
+ */
871
+ refreshInput: (inputId: string) => Observable<void>;
872
+ /** True iff the input has at least one refreshable `#derived` entry. */
171
873
  canRefreshFn: (inputId: string) => boolean;
874
+ /**
875
+ * True iff any input in the section is refreshable. The HTML refresh-button
876
+ * gate (`user-form-stepper.component.html`) depends on this exact truth value
877
+ * (Blueprint §4 / W13).
878
+ */
172
879
  canRefreshSection: (sectionId: string) => boolean;
173
- static ɵfac: i0.ɵɵFactoryDeclaration<FormTowerControllerService, never>;
174
- static ɵdir: i0.ɵɵDirectiveDeclaration<FormTowerControllerService, never, never, {}, {}, never, never, true, never>;
175
- }
176
-
177
- declare function getSectionElements(elements: ElementEditorInnerSectionElementInterface[], inputInEdit: (FormColumnInputs) | undefined, NGX_T_FORMS_CONFIG: NgxTFormsConfig, utils: InClassFormUtilsInterface, errors?: ValidationError[]): (never[] | {
178
- computedErrors: ValidationError[];
179
- required: boolean;
180
- postmanCollectionConfig: {
181
- collectionUrl: string;
182
- collectionKey: string;
183
- } | undefined;
184
- httpGetDataFunction: (url: string, options: any) => rxjs.Observable<any>;
185
- getWorkflowOptions: rxjs.Observable<ngx_t_forms_types.IWorkflowOption[]>;
186
- getMscoaTree: rxjs.Observable<ngx_t_forms_types.IGetTreeResponse> | undefined;
187
- id: string;
188
- name: FormInputKeys | SpecialElementKeys | AllFormInputPrimaryKeys;
189
- hint?: string;
190
- editType: ElementEditorTypes;
191
- deepBind: Array<string>;
192
- defaultValue?: any;
193
- limitTo?: number;
194
- additionalTest?: ngx_t_forms_types.ConfigurationValidTestInterface[];
195
- disabled?: ngx_t_forms_types.ConfigurationValidTestInterface[];
196
- fetchOptions?: string[];
197
- secondaryElementEditorConfig?: Array<ngx_t_forms_types.ElementEditorConfigSectionInterface>;
198
- clearOnChange?: string[][];
199
- blurHandle?: ngx_t_forms_types.BlurHandleTypes;
200
- label: string;
201
- readonly?: boolean;
202
- templateOptions?: Array<any>;
203
- placeholder?: string;
204
- options?: Array<{
205
- label: string;
206
- value: any;
207
- }>;
208
- min?: number;
209
- max?: number;
210
- step?: number;
211
- format?: (value: any) => number;
212
- })[];
213
-
214
- declare const returnMappedPathValue: (pathMap: TreeNode[], obj: any) => any;
215
- declare const getValueFromValueAccessor: (valueAccessRules: FormInputBasicOptionInterface | TreeNode[] | Record<string, TreeNode[]>, data: any) => any;
216
-
217
- declare const FORM_ACTIONS_TOKEN: InjectionToken<IFormActions>;
218
- declare const FORM_CONFIG_TOKEN: InjectionToken<FormInterface>;
219
- declare const FORM_SLIDES_TOKEN: InjectionToken<FormSlideInterface>;
220
- declare const UTILS_OBJECT_TOKEN: InjectionToken<InClassFormUtilsInterface>;
221
- declare const FORM_INPUTS_TOKEN: InjectionToken<IWorkflowDocumentPicker & IBasicFormInput & IFileUploadInput & IDateRangePickerInput & ITextareaProperties & IToggleInput & IMatrixInput & IMultiple>;
222
- declare const MULTIPLE_FORM_INPUT_TOKEN: InjectionToken<IMultiple>;
223
- declare const MSCOA_TREE_PROVIDER: InjectionToken<() => Observable<IGetTreeResponse>>;
224
- declare const NGX_T_FORMS_CONFIG_TOKEN: InjectionToken<NgxTFormsConfig>;
225
-
226
- declare class DialogTemplateComponent {
227
- readonly dialogRef: MatDialogRef<any, any>;
228
- readonly data: DialogConfig;
229
- proceed(): void;
230
- static ɵfac: i0.ɵɵFactoryDeclaration<DialogTemplateComponent, never>;
231
- static ɵcmp: i0.ɵɵComponentDeclaration<DialogTemplateComponent, "lib-dialog-template", never, {}, {}, never, never, true, never>;
880
+ /**
881
+ * Pop the last change-history entry and re-apply the PRIOR snapshot via
882
+ * {@link FormTowerControllerService.updateValue} (restores to second-to-last,
883
+ * matching the old semantics exactly). Decorates each restored input with a
884
+ * transient hint. History append stays imperative (HAZARD 4).
885
+ */
886
+ revertBackHistory: () => void;
887
+ /**
888
+ * Hard reset: tear down current state and re-initialize from the same form
889
+ * definition + originally supplied values.
890
+ *
891
+ * **D4 (deliberate, signed-off):** AWAITS `initialize(form)` BEFORE calling
892
+ * `initializeFormValues(...)`, fixing the old unawaited mis-ordering where
893
+ * `initializeFormValues` could run before `_mainForm` was rebuilt. The public
894
+ * signature is unchanged.
895
+ */
896
+ reset(): void;
897
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormTowerControllerService, never>;
898
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FormTowerControllerService, never, never, {}, {}, never, never, true, never>;
232
899
  }
233
900
 
234
- declare class FormBuilderComponent implements OnDestroy, OnInit {
235
- subscription$: Subscription;
236
- private store;
237
- private route;
238
- selectLoadingForm: i0.Signal<boolean>;
239
- selectFormBuilderIsBusy: i0.Signal<boolean>;
240
- selectFormUpdated: i0.Signal<string | Date | null>;
241
- canSaveForm: i0.Signal<boolean>;
242
- isNewForm: i0.Signal<boolean>;
243
- set formId(value: string);
244
- selectHasFormId: i0.Signal<boolean>;
245
- hasMissingConfigs: i0.Signal<boolean>;
246
- elementEditorOpen: i0.Signal<boolean | null>;
247
- constructor();
248
- readonly NGX_T_FORMS_CONFIG: ngx_t_forms_types.NgxTFormsConfig;
249
- readonly closeButton: ngx_t_forms_types.ActionButton;
250
- ngOnInit(): void;
251
- ngOnDestroy(): void;
252
- saveForm: () => void;
253
- _title: string;
254
- set titleValue(value: string);
255
- initiatedTitle: boolean;
256
- get titleValue(): string | undefined;
257
- static ɵfac: i0.ɵɵFactoryDeclaration<FormBuilderComponent, never>;
258
- static ɵcmp: i0.ɵɵComponentDeclaration<FormBuilderComponent, "app-form-builder", never, { "formId": { "alias": "formId"; "required": false; }; }, {}, never, never, true, never>;
901
+ /**
902
+ * Per-component runtime form engine.
903
+ *
904
+ * `TFormEngine` is the **composition seam** introduced by SIGNAL_FORMS migration
905
+ * Phase 0 (see `docs/migration/SIGNAL_FORMS_MIGRATION_PLAN.md` §5.1/§6.0 and
906
+ * DECISIONS.md D-023/D-025). Consumers previously **extended**
907
+ * {@link FormTowerControllerService} directly; they now **hold** a `TFormEngine`
908
+ * instance via `inject(TFormEngine)` (provided per-component, not
909
+ * `providedIn: 'root'`) and reach the tower's surface through it.
910
+ *
911
+ * Phase 0 moves **no logic**: this façade is a thin subclass of the existing
912
+ * tower so the full member surface is preserved verbatim and consumer behaviour
913
+ * stays under the I-1 Parity invariant. Phase 1 will rewrite the tower internals
914
+ * behind this same façade without touching the three consumers again.
915
+ *
916
+ * Internal to the library — not part of the public API. Provide it on the
917
+ * component that needs it:
918
+ *
919
+ * @example
920
+ * @Component({
921
+ * //
922
+ * providers: [TFormEngine],
923
+ * })
924
+ * export class UserFormStepperComponent {
925
+ * protected readonly engine = inject(TFormEngine);
926
+ * }
927
+ */
928
+ declare class TFormEngine extends FormTowerControllerService {
929
+ constructor(http: HttpClient);
930
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TFormEngine, never>;
931
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<TFormEngine>;
259
932
  }
260
933
 
261
- declare class FormsStoreService extends ComponentStore<IFormsInitStateInterface> {
262
- httpClient: HttpClient;
263
- snackBar: MatSnackBar;
264
- sectionPlaceholder: Record<string, AbstractControl>;
265
- readonly NGX_T_FORMS_CONFIG: NgxTFormsConfig;
934
+ declare class TourManagerService {
935
+ private readonly tourService;
936
+ userProfile: this;
266
937
  constructor();
267
- utils: InClassFormUtilsInterface;
268
- showMessage(message: string, type: HintType): void;
269
- private setupDevTools;
270
- get resourceFunctions(): IStoreFunctions | null;
271
- readonly selectors: FormsStoreSelectorsInterface;
272
- readonly formBuilderSelectors: {
273
- selectFormSlides$: Observable<ngx_t_forms_types.FormSlideInterface[]>;
274
- missingConfig$: Observable<string[]>;
275
- canSaveForm$: Observable<boolean>;
276
- isNewForm$: Observable<boolean>;
277
- hasMissingConfigs$: Observable<boolean>;
278
- formErrors$: Observable<{
279
- key: string;
280
- message: string;
281
- }[]>;
282
- formValidationErrorsMessages$: Observable<string[]>;
283
- inputInEdit$: Observable<ngx_t_forms_types.FormColumnInputs | undefined>;
284
- defaultInputInEdit$: Observable<any>;
285
- inputInEditValidationErrors$: Observable<ngx_t_forms_types.ValidationError[]>;
286
- selectFormTitle$: Observable<string | undefined>;
287
- getAllFormInputs$: Observable<never[] | ngx_t_forms_types.FormColumnInputs[]>;
288
- inputElementEditorConfigs$: Observable<{
289
- editorSections: {
290
- elements: {
291
- editType: ngx_t_forms_types.ElementEditorTypes;
292
- id: string;
293
- name: ngx_t_forms_types.FormInputKeys | ngx_t_forms_types.SpecialElementKeys | ngx_t_forms_types.AllFormInputPrimaryKeys;
294
- hint?: string;
295
- deepBind: Array<string>;
296
- defaultValue?: any;
297
- limitTo?: number;
298
- additionalTest?: ngx_t_forms_types.ConfigurationValidTestInterface[];
299
- disabled?: ngx_t_forms_types.ConfigurationValidTestInterface[];
300
- fetchOptions?: string[];
301
- secondaryElementEditorConfig?: Array<ngx_t_forms_types.ElementEditorConfigSectionInterface>;
302
- clearOnChange?: string[][];
303
- blurHandle?: ngx_t_forms_types.BlurHandleTypes;
304
- label: string;
305
- required?: boolean;
306
- readonly?: boolean;
307
- templateOptions?: Array<any>;
308
- placeholder?: string;
309
- options?: Array<{
310
- label: string;
311
- value: any;
312
- }>;
313
- computedErrors?: ngx_t_forms_types.ValidationError[];
314
- min?: number;
315
- max?: number;
316
- step?: number;
317
- format?: (value: any) => number;
318
- postmanCollectionConfig?: ngx_t_forms_types.IPostmanCollectionConfig;
319
- httpGetDataFunction?: (url: string, options: any) => Observable<any>;
320
- getWorkflowOptions?: Observable<ngx_t_forms_types.IWorkflowOption[]> | undefined;
321
- getMscoaTree?: Observable<ngx_t_forms_types.IGetTreeResponse> | undefined;
322
- }[];
323
- hasErrors: boolean;
324
- label: string;
325
- showItemValue?: keyof ngx_t_forms_types.FormColumnInputs;
326
- id: string;
327
- additionalTest?: ngx_t_forms_types.ConfigurationValidTestInterface[];
328
- }[];
329
- title?: string;
330
- description?: string;
331
- }>;
332
- selectFormSlideSections$: Observable<{
333
- inputConfigErrors: {
334
- key: string;
335
- message: string;
336
- }[];
337
- sectionId: string;
338
- label: string;
339
- columns: Array<ngx_t_forms_types.FormColumnInputs>;
340
- inEdit?: boolean;
341
- sectionIsSeen?: boolean;
342
- isActive?: boolean;
343
- }[]>;
344
- };
345
- readonly actions: {
346
- loadFormListSuccess: (observableOrValue: {
347
- forms: ngx_t_forms_types.DatabaseFormInterface[];
348
- } | Observable<{
349
- forms: ngx_t_forms_types.DatabaseFormInterface[];
350
- }>) => rxjs.Subscription;
351
- toggleFormBuilderBusy: () => void;
352
- toggleLoadingForm: () => void;
353
- toggleLoadingForms: (observableOrValue: {
354
- loadingForms: boolean;
355
- } | Observable<{
356
- loadingForms: boolean;
357
- }>) => rxjs.Subscription;
358
- loadFormSuccess: (observableOrValue: {
359
- form: ngx_t_forms_types.DatabaseFormInterface;
360
- } | Observable<{
361
- form: ngx_t_forms_types.DatabaseFormInterface;
362
- }>) => rxjs.Subscription;
363
- toggleFormBusy: (observableOrValue: {
364
- formId: string;
365
- } | Observable<{
366
- formId: string;
367
- }>) => rxjs.Subscription;
368
- archivedSuccess: (observableOrValue: {
369
- formId: string;
370
- } | Observable<{
371
- formId: string;
372
- }>) => rxjs.Subscription;
373
- setFormId: (observableOrValue: {
374
- formId: string;
375
- } | Observable<{
376
- formId: string;
377
- }>) => rxjs.Subscription;
378
- setError: (observableOrValue: {
379
- error: string | undefined;
380
- type: ngx_t_forms_types.FormStateErrors;
381
- } | Observable<{
382
- error: string | undefined;
383
- type: ngx_t_forms_types.FormStateErrors;
384
- }>) => rxjs.Subscription;
385
- handleListSectionChange: (observableOrValue: {
386
- listSection: FormListSection;
387
- } | Observable<{
388
- listSection: FormListSection;
389
- }>) => rxjs.Subscription;
390
- handleRouterStateChange: (observableOrValue: {
391
- routerState: _angular_router.ActivatedRouteSnapshot | null;
392
- } | Observable<{
393
- routerState: _angular_router.ActivatedRouteSnapshot | null;
394
- }>) => rxjs.Subscription;
395
- handleSetSubmittingForm: (observableOrValue: {
396
- submittingForm: boolean;
397
- } | Observable<{
398
- submittingForm: boolean;
399
- }>) => rxjs.Subscription;
400
- setFormInitialValues: (observableOrValue: {
401
- initialFormValues: Record<string, any>;
402
- } | Observable<{
403
- initialFormValues: Record<string, any>;
404
- }>) => rxjs.Subscription;
405
- handleEditorUpdateFormInEdit: (observableOrValue: {
406
- form: FormInterface;
407
- } | Observable<{
408
- form: FormInterface;
409
- }>) => rxjs.Subscription;
410
- updateFormInputConfigFromTower: (observableOrValue: {
411
- inputId: string;
412
- config: ngx_t_forms_types.FormColumnInputs;
413
- } | Observable<{
414
- inputId: string;
415
- config: ngx_t_forms_types.FormColumnInputs;
416
- }>) => rxjs.Subscription;
417
- setInputInEditId: (observableOrValue: {
418
- inputInEdit: string | null;
419
- } | Observable<{
420
- inputInEdit: string | null;
421
- }>) => rxjs.Subscription;
422
- };
423
- readonly actionsFormBuilder: {
424
- handelSaveForm: () => void;
425
- setFormTitle: (title: string) => void;
426
- handleSectionDragDrop: (event: _angular_cdk_drag_drop.CdkDragDrop<any, any, any>) => void;
427
- handleInputDragDrop: (event: _angular_cdk_drag_drop.CdkDragDrop<any, any, any>, sectionId: string) => void;
428
- handleAddSection: () => void;
429
- stepTitleChangeStep: (sectionId: string, title: string) => void;
430
- formDeleteInput: (item: ngx_t_forms_types.FormColumnInputs) => void;
431
- multipleInputToggleLabel: (item: ngx_t_forms_types.FormColumnInputs) => void;
432
- editInput: (item: ngx_t_forms_types.FormColumnInputs) => void;
433
- addMultipleInputValueCalculationFunction: (item: ngx_t_forms_types.IMultipleInputCal, multipleInputId: string | undefined) => void;
434
- formDeleteSection: (sectionId: string) => void;
435
- formDeleteSectionInputs: (sectionId: string) => void;
436
- moveInputToSection: (inputId: string, targetSectionId: string) => void;
437
- reorderMultipleInputItems: (event: _angular_cdk_drag_drop.CdkDragDrop<ngx_t_forms_types.FormColumnInputs[], any, any>, multipleInputId: string) => void;
438
- cloneCopyFormInput: (inputId: string) => void;
439
- saveInput: (sectionId: string) => void;
440
- applyFormTemplate: (form: FormInterface) => void;
441
- selectInputTemplate: (inputId: string, element: ngx_t_forms_types.ElementTypes) => void;
442
- formInputChange: (ele: ngx_t_forms_types.ElementEditorInnerSectionElementInterface, value: any) => void;
443
- saveSubmitApi: (dataPlaceholder: undefined | {
444
- data: ngx_t_forms_types.APIDataFetchingConfigurationInterface;
445
- }, keyInEdit: "submissionAPI" | "canSubmitAPI" | undefined) => void;
446
- removeSubmissionApi: (api: ngx_t_forms_types.APIDataFetchingConfigurationInterface, keyInEdit: "submissionAPI" | "canSubmitAPI" | undefined) => void;
447
- elementConfigurationChanged: (inputId: string, value: any, ele: ngx_t_forms_types.ElementEditorInnerSectionElementInterface) => void;
448
- elementBlur: (inputId: string, event: any, element: ngx_t_forms_types.ElementEditorInnerSectionElementInterface) => void;
449
- addMultipleFormInput: (sectionId: string, multipleInputInEditId: string) => void;
450
- clearInputInEdit: (inputId: string) => void;
451
- addInputToScoaSelection: (sectionId: string, scoaInputId: string) => void;
452
- };
453
- readonly effects: {
454
- createForm$: (observableOrValue: FormInterface | Observable<FormInterface>) => rxjs.Subscription;
455
- loadForms$: (observableOrValue?: void | Observable<void> | undefined) => rxjs.Subscription;
456
- loadForm$: (observableOrValue: string | Observable<string>) => rxjs.Subscription;
457
- updateForm$: (observableOrValue: {
458
- form: FormInterface;
459
- versionNumber: number;
460
- } | Observable<{
461
- form: FormInterface;
462
- versionNumber: number;
463
- }>) => rxjs.Subscription;
464
- archiveForm$: (observableOrValue: string | Observable<string>) => rxjs.Subscription;
465
- setListSection$: (observableOrValue: FormListSection | Observable<FormListSection>) => rxjs.Subscription;
466
- unArchiveForm$: (observableOrValue: string | Observable<string>) => rxjs.Subscription;
467
- deleteForm$: (observableOrValue: string | Observable<string>) => rxjs.Subscription;
938
+ startTourByOption(steps: IStepOption[]): {
939
+ stepShow$: rxjs.Subject<ngx_ui_tour_md_menu.StepChangeParams<IStepOption>>;
940
+ stepHide$: rxjs.Subject<ngx_ui_tour_md_menu.StepChangeParams<IStepOption>>;
941
+ initialize$: rxjs.Subject<IStepOption[]>;
942
+ start$: rxjs.Subject<void>;
943
+ end$: rxjs.Subject<void>;
944
+ pause$: rxjs.Subject<void>;
945
+ resume$: rxjs.Subject<void>;
468
946
  };
469
- refreshExternalFormStates?: (form: FormInterface) => void;
470
- registerFormChangeFn(fn: (form: FormInterface) => void): void;
471
- createFormPlaceHolderFormGroups(form: FormInterface): void;
472
- static ɵfac: i0.ɵɵFactoryDeclaration<FormsStoreService, never>;
473
- static ɵprov: i0.ɵɵInjectableDeclaration<FormsStoreService>;
947
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TourManagerService, never>;
948
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<TourManagerService>;
474
949
  }
475
950
 
476
- declare class FormsComponent implements OnInit, OnDestroy {
477
- private route;
478
- private store;
479
- private document;
480
- subscription$: Subscription;
481
- selectFormsList$: Observable<LocalFormStateSelectorInterface[]>;
482
- selectGroupedForms$: Observable<Record<string, any[]>>;
483
- private searchQuerySubject;
484
- searchQuery$: Observable<string>;
485
- selectHasActiveSearch$: Observable<boolean>;
486
- selectFilteredGroupedForms$: Observable<Record<string, any[]>>;
487
- selectLoadingForms$: Observable<boolean>;
488
- selectErrors$: Observable<any>;
489
- selectFormListSection$: Observable<FormListSection>;
490
- NGX_T_FORMS_CONFIG: ngx_t_forms_types.NgxTFormsConfig;
491
- closeButton: ngx_t_forms_types.ActionButton;
492
- constructor(route: ActivatedRoute, store: FormsStoreService, document: Document);
493
- ngOnDestroy(): void;
494
- get formListSections(): {
495
- value: FormListSection;
496
- label: string;
497
- }[];
498
- viewportWidth: number;
499
- ngOnInit(): void;
500
- labels: {
501
- label: string;
502
- formControlName: string;
503
- }[];
504
- activeForm: string | null;
505
- getCols(): 1 | 4 | 2 | 3;
506
- getFormAvatar(formTitle: string): string;
507
- archive(form: LocalFormStateSelectorInterface, event: Event): Promise<void>;
508
- unarchive(form: LocalFormStateSelectorInterface, event: Event): Promise<void>;
509
- delete(form: LocalFormStateSelectorInterface, event: Event): Promise<void>;
510
- loadForms(): void;
511
- router: Router;
512
- activatedRoute: ActivatedRoute;
513
- setSection(value: FormListSection): void;
514
- editForm(form: LocalFormStateSelectorInterface): void;
515
- addNewForm(): void;
516
- clearSearch(): void;
517
- get searchQuery(): string;
518
- set searchQuery(v: string);
519
- static ɵfac: i0.ɵɵFactoryDeclaration<FormsComponent, never>;
520
- static ɵcmp: i0.ɵɵComponentDeclaration<FormsComponent, "app-forms", never, {}, {}, never, never, true, never>;
521
- }
522
-
523
- declare class ValidationExpressioCreatorComponent implements OnDestroy, OnInit {
524
- hint: string;
525
- label: string;
526
- formInputs: FormColumnInputs[];
527
- _data: any;
528
- set data(value: any);
529
- get data(): any;
530
- set expression(value: string);
531
- _valueAccessRules: Record<string, TreeNode[]>;
532
- set valueAccessRules(value: Record<string, TreeNode[]>);
533
- get valueAccessRules(): Record<string, TreeNode[]>;
534
- subscription$: Subscription;
535
- ngOnDestroy(): void;
536
- expressionChange: EventEmitter<{
537
- expression: string | null;
538
- valueAccessRules: Record<string, TreeNode[]>;
539
- }>;
540
- ngOnInit(): void;
541
- textareaElementRef: ElementRef;
542
- expressionControl: FormControl<string | null>;
543
- cursorPosition: number;
544
- showSuggestions: boolean;
545
- optionsSearch: string;
546
- onTextChange(expression: string): Promise<void>;
547
- cleanValueAccessRules(): void;
548
- selectSuggestionInput(suggestion: string): void;
549
- get getAllInputs(): FormColumnInputs[];
550
- onFocus(event: FocusEvent): void;
551
- methods: {
552
- label: string;
553
- hint: string;
554
- value: string;
555
- }[];
556
- getMethods(): {
557
- label: string;
558
- hint: string;
559
- value: string;
560
- }[];
561
- variableInEdit: string | null;
562
- get errorMessage(): string | null;
563
- get valueAccessOptions(): string[];
564
- activeVariableChanged(value: TreeNode[] | string): void;
565
- static ɵfac: i0.ɵɵFactoryDeclaration<ValidationExpressioCreatorComponent, never>;
566
- static ɵcmp: i0.ɵɵComponentDeclaration<ValidationExpressioCreatorComponent, "lib-validation-expressio-creator", never, { "hint": { "alias": "hint"; "required": false; }; "label": { "alias": "label"; "required": false; }; "formInputs": { "alias": "formInputs"; "required": false; }; "data": { "alias": "data"; "required": false; }; "expression": { "alias": "expression"; "required": false; }; "valueAccessRules": { "alias": "valueAccessRules"; "required": false; }; }, { "expressionChange": "expressionChange"; }, never, never, true, never>;
951
+ /**
952
+ * End-user surface for filling out a form. Extends `FormTowerControllerService`
953
+ * to drive a `MatStepper` of form sections and renders each section's inputs
954
+ * via `TFormInputComponent`. Loads the form definition through the consumer's
955
+ * `formBuilder.getForm` hook on `NgxTFormsConfig`, supports undo (Ctrl+Z),
956
+ * initial values, and per-instance global system inputs.
957
+ *
958
+ * Inputs:
959
+ * - `formId: string | undefined` — when set, fetches the form
960
+ * definition and initialises the tower controller.
961
+ * - `initialValues: Record<string, unknown> | undefined` — seed the form
962
+ * with previously captured values; only re-initialises when the value
963
+ * actually changes.
964
+ * - `globalSystemInputs: FormColumnInputs[]` — system-level inputs
965
+ * merged into every step of the form; re-initialises the form when set.
966
+ * - `passParamsOnSubmit: Record<string, unknown> | undefined` — extra params
967
+ * passed through to the consumer's submit handler.
968
+ *
969
+ * Outputs:
970
+ * - _None._ Submission and lifecycle events are dispatched through the
971
+ * inherited `FormTowerControllerService` and the consumer's
972
+ * `formActions` / `formBuilder` callbacks.
973
+ */
974
+ declare class UserFormStepperComponent {
975
+ #private;
976
+ /**
977
+ * Runtime form engine, held by composition (SIGNAL_FORMS Phase 0, D-025).
978
+ * Provided per-component instance; the component reaches the former
979
+ * inherited tower surface through this façade.
980
+ */
981
+ protected readonly engine: TFormEngine;
982
+ /** Form definition id; when set, the component fetches and initialises the form. */
983
+ readonly formId: _angular_core.InputSignal<string | undefined>;
984
+ /**
985
+ * Seed values applied to the form once it is initialised.
986
+ *
987
+ * A keyed record of previously captured values (raw API payloads, partial
988
+ * form values, nested objects). The downstream `initializeFormValues`
989
+ * consumes the entries defensively; callers narrow specific value shapes.
990
+ */
991
+ readonly initialValues: _angular_core.InputSignal<Record<string, unknown> | undefined>;
992
+ /** System-level inputs merged into every step of the form. */
993
+ readonly globalSystemInputs: _angular_core.InputSignal<FormColumnInputs[]>;
994
+ /**
995
+ * Extra params forwarded to the consumer's submit handler.
996
+ *
997
+ * A keyed record merged into the submission payload; only meaningful to the
998
+ * consumer's own submit handler, which narrows the individual values.
999
+ */
1000
+ readonly passParamsOnSubmit: _angular_core.InputSignal<Record<string, unknown> | undefined>;
1001
+ /** Underlying Material stepper instance (may be undefined before first CD pass). */
1002
+ readonly stepper: _angular_core.Signal<MatStepper | undefined>;
1003
+ /** Whether the form is editable / can be navigated freely. */
1004
+ isEditable: boolean;
1005
+ /** True while the form definition is being fetched. */
1006
+ readonly loading: _angular_core.WritableSignal<boolean>;
1007
+ protected readonly tourManagerService: TourManagerService;
1008
+ protected readonly formIdBridge: _angular_core.EffectRef;
1009
+ protected readonly initialValuesBridge: _angular_core.EffectRef;
1010
+ protected readonly globalSystemInputsBridge: _angular_core.EffectRef;
1011
+ /**
1012
+ * Handles the key down event and reverts the form's last history entry on Ctrl+Z.
1013
+ * @param event The keyboard event object.
1014
+ */
1015
+ onKeyDown(event: KeyboardEvent): void;
1016
+ loadForm(formId: string | undefined): void;
1017
+ /**
1018
+ * Builder-function shim passed to inputs that need callbacks (e.g.
1019
+ * MultipleInput, MSCOA). The user form surface only implements the subset
1020
+ * relevant to runtime input editing; builder-only members (`editInput`,
1021
+ * `deleteInput`, `addFunction`, `reorderItems`, `multipleInputToggleLabel`)
1022
+ * are stubbed because they have no meaning outside the form builder.
1023
+ */
1024
+ get formBuilderFunctions(): FormBuilderFunctions;
1025
+ getStepState(step: ITowerFormSteps, index: number): StepState;
1026
+ getPreviousStepLabel(): string | undefined;
1027
+ getNextStepLabel(): string | undefined;
1028
+ canProceedToNextStep(step: ITowerFormSteps): boolean;
1029
+ get getSubmissionStatus(): string;
1030
+ handleSubmit(): void;
1031
+ /** Still-failing overridable validations the user may motivate to submit. */
1032
+ get overridableErrors(): OverridableError[];
1033
+ /** True while a blocking (non-overridable) error keeps submission impossible. */
1034
+ get hasBlockingErrors(): boolean;
1035
+ /** True once every blocking error is resolved and every override is motivated. */
1036
+ get canSubmit(): boolean;
1037
+ /** Current motivation text for one overridable validation (for two-way display). */
1038
+ overrideComment(validatorId: string): string;
1039
+ /** File name of the attachment captured for one overridable validation, if any. */
1040
+ overrideAttachmentName(validatorId: string): string | undefined;
1041
+ /** Records the motivation comment as the user types. */
1042
+ onOverrideComment(validatorId: string, event: Event): void;
1043
+ /**
1044
+ * Reads the chosen supporting file into a base64 {@link FileData} and attaches
1045
+ * it to the override; clearing the picker removes the attachment. Browser-only
1046
+ * (FileReader) — a no-op under SSR.
1047
+ */
1048
+ onOverrideAttachment(validatorId: string, event: Event): Promise<void>;
1049
+ get hasTour(): boolean;
1050
+ /**
1051
+ * Initiates and configures a dynamic, multi-step tutorial tour for the form.
1052
+ * The tour guides the user through the form's title, sections, and individual fields.
1053
+ */
1054
+ startTour(): void;
1055
+ refreshASection(sectionId: string): void;
1056
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UserFormStepperComponent, never>;
1057
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UserFormStepperComponent, "lib-user-form-stepper", never, { "formId": { "alias": "formId"; "required": false; "isSignal": true; }; "initialValues": { "alias": "initialValues"; "required": false; "isSignal": true; }; "globalSystemInputs": { "alias": "globalSystemInputs"; "required": false; "isSignal": true; }; "passParamsOnSubmit": { "alias": "passParamsOnSubmit"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
567
1058
  }
568
1059
 
569
- declare function testAgainstItem(test: ConfigurationValidTestInterface, item: any): boolean;
570
-
571
1060
  interface IConfigElementError {
572
1061
  key: string;
573
1062
  message: string;
574
1063
  }
575
- declare class TDynamicDataEditComponent implements OnDestroy {
576
- private ngZone;
577
- private editorInitiated;
578
- constructor(ngZone: NgZone);
579
- ngOnDestroy(): void;
580
- private valueChanges;
581
- private subscription;
582
- elementEditorTypes: typeof ElementEditorTypes;
583
- private _editorConfig;
584
- private _data;
585
- set editorConfig(config: ElementEditorInnerSectionElementInterface | undefined);
586
- _formInputs$: BehaviorSubject<FormColumnInputs[]>;
587
- _formInputs: FormColumnInputs[];
588
- set formInputs(inputs: Array<FormColumnInputs>);
589
- get formInputs(): Array<FormColumnInputs>;
590
- set data(data: any);
591
- get data(): any;
592
- validationErrors: IConfigElementError[] | null;
593
- valueChange: EventEmitter<unknown>;
594
- blur: EventEmitter<any>;
595
- editorConfigValue$: Observable<ElementEditorInnerSectionElementInterface | undefined>;
596
- dataValue$: Observable<any>;
597
- get getMscoaTree$(): Observable<IGetTreeResponse | undefined>;
598
- get getWorkflowOptions$(): Observable<IWorkflowOption[] | undefined>;
599
- get value$(): Observable<any>;
600
- get dataOptions$(): Observable<any>;
601
- get disabled$(): Observable<boolean | undefined>;
602
- private initializeValueChanges;
603
- private computeValueChange;
604
- inputChange(event: any): void;
1064
+ /**
1065
+ * Builder-side editor for a single configurable property on a form input —
1066
+ * dispatches to the correct editor (selection options, REST API setup,
1067
+ * value-access rules, pipeline, validators, MSCOA segment config, slider,
1068
+ * chip list, data source picker, document list label config, workflow
1069
+ * picker, EditorJS, record list manager, etc.) based on the supplied
1070
+ * `ElementEditorInnerSectionElementInterface`.
1071
+ *
1072
+ * @remarks
1073
+ * Emits debounced value changes (and a separate `blur` event when the
1074
+ * editor is a free-text expression) so the form builder can persist edits
1075
+ * without re-reading the underlying form on every keystroke.
1076
+ *
1077
+ * Inputs:
1078
+ * - `editorConfig: ElementEditorInnerSectionElementInterface | undefined`
1079
+ * descriptor of the editor to render.
1080
+ * - `formInputs: FormColumnInputs[]` — the set of inputs the
1081
+ * editor can reference (used by expression / value-access editors).
1082
+ * - `data: unknown` — current value being edited; resets the value
1083
+ * pipeline when changed by reference.
1084
+ * - `validationErrors: IConfigElementError[] | null` — validation errors
1085
+ * surfaced by the parent for display.
1086
+ *
1087
+ * Outputs:
1088
+ * - `valueChange` — fires when the edited value changes (debounced).
1089
+ * - `blur` — fires when an inner editor loses focus
1090
+ * (used for expression-style editors).
1091
+ */
1092
+ declare class TDynamicDataEditComponent {
1093
+ #private;
1094
+ protected readonly elementEditorTypes: typeof ElementEditorTypes;
1095
+ /** Descriptor of the editor to render. */
1096
+ readonly editorConfig: _angular_core.InputSignal<ElementEditorInnerSectionElementInterface | undefined>;
1097
+ /** The set of inputs the editor can reference (used by expression / value-access editors). */
1098
+ readonly formInputs: _angular_core.InputSignal<FormColumnInputs[]>;
1099
+ /**
1100
+ * Current value being edited; resets the value pipeline when changed by reference.
1101
+ * @remarks Heterogeneous across consumers (ITowerStepColumn, plain records, etc.),
1102
+ * so it is typed as a keyed record; the editor pipeline reads individual fields
1103
+ * via `deepBind` paths and callers narrow specific value shapes.
1104
+ */
1105
+ readonly data: _angular_core.InputSignal<unknown>;
1106
+ /** Validation errors surfaced by the parent for display. */
1107
+ readonly validationErrors: _angular_core.InputSignal<IConfigElementError[] | null>;
1108
+ /** Fires when the edited value changes (debounced). */
1109
+ readonly valueChange: _angular_core.OutputEmitterRef<unknown>;
1110
+ /** Fires when an inner editor loses focus (used for expression-style editors). */
1111
+ readonly blur: _angular_core.OutputEmitterRef<unknown>;
1112
+ protected readonly editorConfigBridge: _angular_core.EffectRef;
1113
+ protected readonly dataBridge: _angular_core.EffectRef;
1114
+ protected readonly editorConfigValue$: Observable<ElementEditorInnerSectionElementInterface | undefined>;
1115
+ protected readonly dataValue$: Observable<Record<string, unknown> | undefined>;
1116
+ protected get getMscoaTree$(): Observable<IGetTreeResponse | undefined>;
1117
+ protected get getWorkflowOptions$(): Observable<IWorkflowOption[] | undefined>;
1118
+ protected get value$(): Observable<{} | null>;
1119
+ protected get dataOptions$(): Observable<unknown>;
1120
+ protected get disabled$(): Observable<boolean | undefined>;
1121
+ inputChange(event: unknown): void;
605
1122
  valueChanged(value: unknown): void;
606
1123
  manualValueChange(event: {
607
1124
  value: unknown;
608
1125
  deepBind: Array<string>;
609
1126
  }): void;
610
1127
  blurOff: boolean;
611
- elementBlur(event: any): void;
612
- get inputHasBlurFunction$(): Observable<BlurHandleTypes | undefined>;
613
- blurFunctionTooltip(blurHandle: BlurHandleTypes | undefined): "Enable/disable pre-populating of the form control name from the label" | "Enable/disable auto conversion of control name to camel case" | "Toggle blur function";
614
- formatLabel: (value: number) => any;
615
- vm$: Observable<{
1128
+ elementBlur(event: unknown): void;
1129
+ protected get inputHasBlurFunction$(): Observable<BlurHandleTypes | undefined>;
1130
+ blurFunctionTooltip(blurHandle: BlurHandleTypes | undefined): string;
1131
+ /** Slider label formatter — Mat slider's `displayWith` accepts `string | number`. */
1132
+ formatLabel: (value: number) => string | number;
1133
+ protected vm$: Observable<{
616
1134
  editorConfigValue: ElementEditorInnerSectionElementInterface | undefined;
617
- value: any;
1135
+ isFormFieldControl: boolean;
1136
+ value: {} | null;
618
1137
  dataOptions: any;
619
1138
  disabled: boolean | undefined;
620
1139
  inputHasBlurFunction: BlurHandleTypes | undefined;
621
- dataValue: any;
622
- inputConfig: any;
1140
+ dataValue: Record<string, unknown> | undefined;
1141
+ inputConfig: Partial<ITowerStepColumn>;
623
1142
  }>;
624
- static ɵfac: i0.ɵɵFactoryDeclaration<TDynamicDataEditComponent, never>;
625
- static ɵcmp: i0.ɵɵComponentDeclaration<TDynamicDataEditComponent, "lib-t-dynamic-data-edit", never, { "editorConfig": { "alias": "editorConfig"; "required": false; }; "formInputs": { "alias": "formInputs"; "required": false; }; "data": { "alias": "data"; "required": false; }; "validationErrors": { "alias": "validationErrors"; "required": false; }; }, { "valueChange": "valueChange"; "blur": "blur"; }, never, never, true, never>;
1143
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TDynamicDataEditComponent, never>;
1144
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TDynamicDataEditComponent, "lib-t-dynamic-data-edit", never, { "editorConfig": { "alias": "editorConfig"; "required": false; "isSignal": true; }; "formInputs": { "alias": "formInputs"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "validationErrors": { "alias": "validationErrors"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "blur": "blur"; }, never, never, true, never>;
626
1145
  }
627
1146
 
628
1147
  declare class TreeComponent {
@@ -641,7 +1160,7 @@ declare class TreeComponent {
641
1160
  inEdit?: boolean;
642
1161
  path: string[];
643
1162
  keyIsArrayIndex?: boolean;
644
- functions: ngx_t_forms_types.IArrayFunction[];
1163
+ functions: IArrayFunction[];
645
1164
  }[] | undefined;
646
1165
  resetNode(): void;
647
1166
  removeFunction(id: string): void;
@@ -655,145 +1174,662 @@ declare class TreeComponent {
655
1174
  dataSource: MatTreeFlatDataSource<TreeNode, FlatNode, FlatNode>;
656
1175
  private dynamicObject;
657
1176
  constructor();
658
- computeTreeData(dynamicObject: any): void;
1177
+ computeTreeData(dynamicObject: unknown): void;
659
1178
  assignDataSourceData(tree: TreeNode[]): void;
660
1179
  hasChild: (_: number, node: FlatNode) => boolean;
661
- getValue(): any;
1180
+ getValue(): unknown;
662
1181
  addNewFunction(): void;
663
1182
  functionChanged(value: string): void;
664
1183
  }
665
1184
 
1185
+ /**
1186
+ * Read-only tree view for an arbitrary JSON-shaped value. Converts the input
1187
+ * into a flat tree (via `TreeComponent`) and renders each leaf with a typed
1188
+ * style class (`value-string`, `value-number`, `value-boolean`, `value-null`).
1189
+ */
666
1190
  declare class TDynamicDataViewComponent {
667
- treeClass: TreeComponent;
668
- data: any;
1191
+ /** Arbitrary JSON-shaped value to render. Recomputes the tree on structural change. */
1192
+ readonly data: _angular_core.InputSignal<unknown>;
1193
+ protected readonly treeClass: TreeComponent;
669
1194
  constructor();
670
- _data: any;
671
- ngOnInit(): void;
672
- ngOnChanges(changes: SimpleChanges): void;
673
- getNodeValueColor(value: any): "green" | "blue" | "purple" | "black";
674
- static ɵfac: i0.ɵɵFactoryDeclaration<TDynamicDataViewComponent, never>;
675
- static ɵcmp: i0.ɵɵComponentDeclaration<TDynamicDataViewComponent, "lib-t-dynamic-data-view", never, { "data": { "alias": "data"; "required": false; }; }, {}, never, never, true, never>;
1195
+ protected formatKey(key: string): string;
1196
+ protected getDisplayValue(value: unknown): string;
1197
+ protected getValueClass(value: unknown): string;
1198
+ protected getLevelArray(node: unknown): readonly number[];
1199
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TDynamicDataViewComponent, never>;
1200
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TDynamicDataViewComponent, "lib-t-dynamic-data-view", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
676
1201
  }
677
1202
 
678
- declare class MscoaFormInputComponent {
679
- inputConfig: ITowerStepColumn;
680
- editorMode: boolean;
681
- formGroup: FormGroup;
682
- formBuilderFunctions: FormBuilderFunctions | undefined;
683
- reload: EventEmitter<void>;
684
- get errorMessage(): string | string[] | undefined;
685
- static ɵfac: i0.ɵɵFactoryDeclaration<MscoaFormInputComponent, never>;
686
- static ɵcmp: i0.ɵɵComponentDeclaration<MscoaFormInputComponent, "lib-mscoa-form-input", never, { "inputConfig": { "alias": "inputConfig"; "required": false; }; "editorMode": { "alias": "editorMode"; "required": false; }; "formGroup": { "alias": "formGroup"; "required": false; }; "formBuilderFunctions": { "alias": "formBuilderFunctions"; "required": false; }; }, { "reload": "reload"; }, never, never, true, never>;
1203
+ declare class FormatDataPipe implements PipeTransform {
1204
+ /**
1205
+ * Formats an arbitrary input value for display according to `dataType`.
1206
+ *
1207
+ * `value` is typed `unknown` (a pipe can be handed any binding) and each
1208
+ * branch narrows it to the shape it needs. The return is the set of
1209
+ * display-primitive types (`string | number | null | undefined`) so it
1210
+ * binds cleanly to interpolation and `matTooltip`; "passthrough" branches
1211
+ * return the original value (asserted to the display-primitive union its
1212
+ * runtime value is unchanged and Angular string-coerces it for display).
1213
+ *
1214
+ * @param value - The raw value to format.
1215
+ * @param dataType - Which formatting branch to apply.
1216
+ * @param pipeConfig - Optional pipe configuration (currency code, nested pipe type).
1217
+ * @returns The formatted representation, or the original value when no formatting applies.
1218
+ */
1219
+ transform(value: unknown, dataType: DocumentLitsLabelConfigInterfaceValueType | InputDataTypes | undefined | InputPipeTypes, pipeConfig?: FormColumnInputs['pipe'] | undefined): string | number | null | undefined;
1220
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormatDataPipe, never>;
1221
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<FormatDataPipe, "formatData", true>;
687
1222
  }
688
1223
 
689
- interface EncryptedData {
690
- ciphertext: string;
691
- salt: string;
692
- iv: string;
693
- hmac: string;
1224
+ /**
1225
+ * @public
1226
+ * @deprecated Reachable for one minor cycle only as part of the Phase 1 public-surface
1227
+ * lockdown. Target removal: v3.0.0. No replacement — this is the empty
1228
+ * `ng generate library` stub and will be deleted in Phase 2.
1229
+ */
1230
+ declare class NgxTFormsService {
1231
+ constructor();
1232
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxTFormsService, never>;
1233
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<NgxTFormsService>;
694
1234
  }
695
1235
 
696
- declare const getSignatureImage: (inputConfig: FormColumnInputs, value: EncryptedData | undefined) => Promise<string | undefined>;
697
-
698
- declare class SignatureInputElementComponent {
699
- inputConfig: ITowerStepColumn;
700
- formGroup: FormGroup;
701
- reload: EventEmitter<void>;
702
- get errorMessage(): string | string[] | undefined;
703
- static ɵfac: i0.ɵɵFactoryDeclaration<SignatureInputElementComponent, never>;
704
- static ɵcmp: i0.ɵɵComponentDeclaration<SignatureInputElementComponent, "lib-signature-input-element", never, { "inputConfig": { "alias": "inputConfig"; "required": false; }; "formGroup": { "alias": "formGroup"; "required": false; }; }, { "reload": "reload"; }, never, never, true, never>;
1236
+ /**
1237
+ * @public
1238
+ * @deprecated Reachable for one minor cycle only as part of the Phase 1 public-surface
1239
+ * lockdown. Target removal: v3.0.0. No replacement — this is the empty
1240
+ * `ng generate library` stub and will be deleted in Phase 2.
1241
+ */
1242
+ declare class NgxTFormsComponent {
1243
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxTFormsComponent, never>;
1244
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxTFormsComponent, "lib-ngx-t-forms", never, {}, {}, never, never, true, never>;
705
1245
  }
706
1246
 
707
- declare class TFormInputComponent {
708
- private props;
709
- inputConfig: ITowerStepColumn | undefined;
710
- formGroup: FormGroup<{
711
- [sectionId: string]: FormGroup<{
712
- [inputId: string]: FormControl<string | null>;
713
- }>;
714
- }> | undefined | null;
715
- editorMode: boolean;
716
- formBuilderFunctions: FormBuilderFunctions | undefined;
717
- optionsSearchWordKeyWord: string;
718
- elementTypes: typeof ElementTypes;
719
- constructor(props: any);
720
- get hasFormControlInstance(): boolean;
721
- static ɵfac: i0.ɵɵFactoryDeclaration<TFormInputComponent, [{ optional: true; }]>;
722
- static ɵcmp: i0.ɵɵComponentDeclaration<TFormInputComponent, "lib-t-form-input", never, { "inputConfig": { "alias": "inputConfig"; "required": false; }; "formGroup": { "alias": "formGroup"; "required": false; }; "editorMode": { "alias": "editorMode"; "required": false; }; "formBuilderFunctions": { "alias": "formBuilderFunctions"; "required": false; }; }, {}, never, never, true, never>;
1247
+ /**
1248
+ * Public entry-point for bulk imports.
1249
+ *
1250
+ * Typical usage:
1251
+ * ```ts
1252
+ * const importController = inject(TFormImportController);
1253
+ * importController.progress$.subscribe(p => render(p)); // optional reactive UI
1254
+ * const results = await importController.runImport(form, rows);
1255
+ * const validRows = results.filter(r => r.isValid);
1256
+ * ```
1257
+ *
1258
+ * Singleton (`providedIn: 'root'`) because all import sessions share the same
1259
+ * caches/injector wiring. Call {@link TFormImportController.reset} between
1260
+ * runs only if you want to force consumers of `progress$` to see an empty
1261
+ * baseline; `runImport` already clears caches on entry and exit.
1262
+ *
1263
+ * @public
1264
+ * @deprecated Reachable for one minor cycle only as part of the Phase 1 public-surface
1265
+ * lockdown. Target removal: v3.0.0. Consumers should switch to wiring an import flow
1266
+ * through the `withImportTower()` feature; the controller will move under that
1267
+ * feature tree in Phase 2.
1268
+ */
1269
+ declare class TFormImportController {
1270
+ private readonly _injector;
1271
+ private readonly _rows$;
1272
+ /**
1273
+ * Per-session HTTP caches.
1274
+ * Key: serialized request identity → shared Observable (shareReplay).
1275
+ * Populated at the start of runImport and cleared when it finishes,
1276
+ * so every import session starts cold but identical in-flight requests
1277
+ * across concurrent rows reuse a single HTTP call.
1278
+ */
1279
+ private _getCache;
1280
+ private _postCache;
1281
+ /**
1282
+ * Registry of pre-processors keyed by ElementType.
1283
+ * Add an entry here to handle a new input type in _preProcessRow — no other
1284
+ * changes needed. Each processor receives the column definition and the raw
1285
+ * row and must return `{ value?, errors[] }`.
1286
+ * `value` is written to processedRow[formControlName] when defined;
1287
+ * `errors` accumulates in colErrors[formControlName].
1288
+ */
1289
+ private readonly _inputPreProcessors;
1290
+ /**
1291
+ * Shared financial-cycles observable for the current import session.
1292
+ * loadSystemInputs calls getFinacialCycles() directly via NGX_T_FORMS_CONFIG
1293
+ * (not through utils), so HTTP-function patching alone cannot deduplicate it.
1294
+ * We intercept it at the config level by providing a wrapped token in each
1295
+ * tower's child injector that returns this shared observable instead.
1296
+ */
1297
+ private _financialCycles$;
1298
+ /**
1299
+ * Reactive progress stream — subscribe to track each row in real time.
1300
+ */
1301
+ readonly progress$: Observable<ImportProgress>;
1302
+ /**
1303
+ * Snapshot of the current progress (non-reactive).
1304
+ */
1305
+ get currentProgress(): ImportProgress;
1306
+ /**
1307
+ * Runs an import session.
1308
+ *
1309
+ * For each row a fresh tower instance is spun up via a child injector,
1310
+ * prepopulated, and left to settle (calculations + API fetches) before
1311
+ * recording the final value and validation status.
1312
+ * All rows are processed concurrently.
1313
+ *
1314
+ * Usage:
1315
+ * ```ts
1316
+ * const results = await importController.runImport(form, rows);
1317
+ * const valid = results.filter(r => r.isValid);
1318
+ * ```
1319
+ *
1320
+ * @param form The form definition every row is validated against.
1321
+ * @param rows Raw data objects — one per import row.
1322
+ */
1323
+ runImport(form: FormInterface, rows: Record<string, unknown>[]): Promise<ImportRowState[]>;
1324
+ /** Clears all row state. */
1325
+ reset(): void;
1326
+ /**
1327
+ * Creates an isolated tower instance through a short-lived child injector.
1328
+ *
1329
+ * The child injector delegates all token resolution to the parent, so
1330
+ * HttpClient, NGX_T_FORMS_CONFIG_TOKEN, and any other deps the tower needs
1331
+ * are found automatically — no manual wiring required here.
1332
+ *
1333
+ * After creation the tower's HTTP functions are replaced with cache-aware
1334
+ * wrappers so that identical requests fired by different rows share one
1335
+ * in-flight Observable instead of each issuing their own HTTP call.
1336
+ */
1337
+ private _createTower;
1338
+ /**
1339
+ * Returns a shared Observable for a GET request.
1340
+ * On cache miss the original function is called once and its result is
1341
+ * multicasted via shareReplay(1) so every concurrent subscriber (row) that
1342
+ * asks for the same URL+options receives the same response without an
1343
+ * additional HTTP call.
1344
+ */
1345
+ private _cachedGet;
1346
+ /**
1347
+ * Returns a shared Observable for a POST request.
1348
+ * Keyed by URL + serialised body + serialised options so only truly
1349
+ * identical requests are deduplicated.
1350
+ */
1351
+ private _cachedPost;
1352
+ /**
1353
+ * End-to-end pipeline for a single import row. Runs concurrently with every
1354
+ * other row in the session.
1355
+ *
1356
+ * Steps (any thrown error short-circuits to `status: 'error'`):
1357
+ * 1. Mark the row `processing`.
1358
+ * 2. Spin up an isolated tower via {@link TFormImportController._createTower}.
1359
+ * 3. `initialize(form, { skipInitialFunctions: true })` — see the flag's
1360
+ * docs; this avoids the timing race between the tower's initial async
1361
+ * work and our synchronous `initializeFormValues`.
1362
+ * 4. `_preProcessRow` resolves nested formats (SCOA codes, multi-select
1363
+ * strings, MultipleInput sub-rows) into the shape `initializeFormValues`
1364
+ * expects.
1365
+ * 5. Apply the resolved row → tower's changeMonitor cycle fires dependent
1366
+ * functions → busy=true.
1367
+ * 6. `waitUntilSettled()` blocks until every async op drains.
1368
+ * 7. `markAllAsTouched()` so required-field validators surface even on
1369
+ * untouched controls.
1370
+ * 8. {@link TFormImportController._recomputeAllValidationErrors} re-runs
1371
+ * sync validators across the whole tree (matches what
1372
+ * `getInputErrorMessage` reports in the interactive UI).
1373
+ * 9. Collect settled values + per-input + per-column errors and update the
1374
+ * row's state.
1375
+ *
1376
+ * `finally` always destroys the tower so child injectors / valueChanges
1377
+ * subscriptions don't leak across rows.
1378
+ */
1379
+ private _processRow;
1380
+ /**
1381
+ * Dispatches each column that has a registered pre-processor, collects
1382
+ * resolved values and errors, then returns the enriched row.
1383
+ *
1384
+ * To support a new input type add an entry to `_inputPreProcessors` —
1385
+ * nothing else needs to change here.
1386
+ */
1387
+ private _preProcessRow;
1388
+ /**
1389
+ * Pre-processor for MscoaSelection inputs.
1390
+ *
1391
+ * Resolves flat account codes into full IScoaAccount objects.
1392
+ * Column naming convention expected in the raw row:
1393
+ * {formControlName}.{basisKey}.{SEGMENT}.debit e.g. "glAccount.accrual.FUND.debit"
1394
+ * {formControlName}.{basisKey}.{SEGMENT}.credit e.g. "glAccount.cash.COSTING.credit"
1395
+ *
1396
+ * Returns the nested structure that `initializeFormValues` / the mscoa
1397
+ * component store expect:
1398
+ * { accrual: { FUND: { debit: IScoaAccount, credit: IScoaAccount } }, cash: { ... } }
1399
+ */
1400
+ private _processMscoaInput;
1401
+ /**
1402
+ * Pre-processor for MultipleInput inputs.
1403
+ *
1404
+ * Expects `row[input.formControlName]` to be an array of objects where each
1405
+ * object's keys are the formControlNames declared in `input.formInputs`.
1406
+ *
1407
+ * For each item the full tower lifecycle is run against a one-slide mock form
1408
+ * (the same sequence as _processRow on the main form), so Angular validators,
1409
+ * async validators, API calls, and calculated fields all fire and settle before
1410
+ * errors are collected. Pre-processors (e.g. MscoaSelection) are applied first
1411
+ * so resolved objects are in place when the tower initializes.
1412
+ *
1413
+ * Errors are prefixed with the item index: "[0].subField.errorCode".
1414
+ */
1415
+ private _processMultipleFormInput;
1416
+ /**
1417
+ * Resolves a single account code to an IScoaAccount.
1418
+ * Routed through `_cachedGet` so identical codes across concurrent rows share
1419
+ * one in-flight Observable (shareReplay) — the same mechanism used for all
1420
+ * other HTTP calls in this class.
1421
+ */
1422
+ private _lookupScoaAccount;
1423
+ /**
1424
+ * Pre-processor for `Select` and `PaginatedSelectionTable` inputs.
1425
+ *
1426
+ * Single-select inputs pass through unchanged.
1427
+ *
1428
+ * Multi-select inputs accept the value in any of:
1429
+ * - `string[]` — taken as-is, each entry trimmed.
1430
+ * - `'["a","b"]'` — JSON-stringified array.
1431
+ * - `'a, b, c'` — comma-separated string.
1432
+ * - `'[a, b]'` (malformed JSON) — fallback: strip brackets, split, strip quotes.
1433
+ *
1434
+ * If the input declares custom (in-config) options, every parsed value is
1435
+ * checked against the option set. Any mismatches are returned as errors of
1436
+ * the form `'invalidOption:<value>'` and `value` is omitted (so the parent
1437
+ * form control keeps its original/empty state and the row is flagged
1438
+ * invalid). API-fetched options are NOT validated here — see the comments
1439
+ * in {@link FormTowerControllerService.initialize} on why deferring those
1440
+ * lookups is safe in import mode.
1441
+ */
1442
+ private _processSelectInput;
1443
+ /**
1444
+ * Re-runs sync validation across the WHOLE form tree against the settled values.
1445
+ *
1446
+ * **Why this is still required after the signal-forms migration (Phase 1.5 finding;
1447
+ * kept until Phase 3):** it is NOT a settle-timing workaround — Phase 1 already made
1448
+ * `waitUntilSettled` deterministic. It compensates for two reactive-forms semantics
1449
+ * the signal-graph engine does not change:
1450
+ *
1451
+ * 1. **Cross-field validators.** Custom validators (commonFormOperations
1452
+ * `createCustomValidator`) read OTHER fields via `getFormValue()`. Angular only
1453
+ * re-runs a control's validators when ITS OWN value changes, and the engine's
1454
+ * projection effect likewise only `setValue`s controls whose value actually
1455
+ * changed — so a control whose value is unchanged keeps STALE cross-field errors
1456
+ * until a whole-tree `updateValueAndValidity` forces re-evaluation.
1457
+ * 2. **Disabled controls.** Angular never validates disabled controls (formGenerator
1458
+ * disables them from `input.disabled`); import temporarily enables the tree,
1459
+ * validates, then restores the disabled flags.
1460
+ *
1461
+ * Phase 3 (`@angular/forms/signals` `validate()`/`validateAsync()`) makes validation
1462
+ * reactive over observed fields and disabled-aware — at which point this method, its
1463
+ * enable/disable dance, and this call site can be deleted.
1464
+ */
1465
+ private _recomputeAllValidationErrors;
1466
+ /**
1467
+ * Walks `{ [sectionId]: FormGroup { [inputId]: FormControl } }` and
1468
+ * collects every control that has validation errors (from `control.errors`).
1469
+ */
1470
+ private _collectValidationErrors;
1471
+ /**
1472
+ * Groups the flat overridable-error list from {@link partitionFormErrors} into
1473
+ * an `inputId → messages[]` map for {@link ImportRowState.overridableErrors}.
1474
+ */
1475
+ private _groupOverridableByInput;
1476
+ /**
1477
+ * Builds a formControlName-keyed error map from the settled form.
1478
+ * Multiple error keys on one control are joined with '.'.
1479
+ */
1480
+ private _collectColErrors;
1481
+ /**
1482
+ * Immutable row update — clones the rows array and the targeted row before
1483
+ * pushing through `_rows$` so subscribers downstream of `progress$` always
1484
+ * receive a fresh reference (cheap change detection in components).
1485
+ */
1486
+ private _patchRow;
1487
+ /**
1488
+ * Compute the {@link ImportProgress} aggregate from the row array. Pure —
1489
+ * driven by `progress$` and `currentProgress`.
1490
+ */
1491
+ private _toProgress;
1492
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TFormImportController, never>;
1493
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<TFormImportController>;
723
1494
  }
724
1495
 
725
- declare class TourManagerService {
726
- private readonly tourService;
727
- userProfile: this;
728
- constructor();
729
- startTourByOption(steps: IStepOption[]): {
730
- stepShow$: rxjs.Subject<ngx_ui_tour_core.StepChangeParams<IStepOption>>;
731
- stepHide$: rxjs.Subject<ngx_ui_tour_core.StepChangeParams<IStepOption>>;
732
- initialize$: rxjs.Subject<IStepOption[]>;
733
- start$: rxjs.Subject<void>;
734
- end$: rxjs.Subject<void>;
735
- pause$: rxjs.Subject<void>;
736
- resume$: rxjs.Subject<void>;
737
- };
738
- static ɵfac: i0.ɵɵFactoryDeclaration<TourManagerService, never>;
739
- static ɵprov: i0.ɵɵInjectableDeclaration<TourManagerService>;
1496
+ /**
1497
+ * Provides a unique identifier for each tower instance created during an
1498
+ * import run — one id per imported row. The form import controller uses this
1499
+ * to disambiguate concurrent tower contexts when materialising rows into
1500
+ * form submissions.
1501
+ *
1502
+ * @see provideNgxTForms
1503
+ *
1504
+ * @public
1505
+ * @deprecated Internal token used by `TFormImportController`. Will be relocated
1506
+ * under the `withImportTower()` feature tree in Phase 2; the token (or its
1507
+ * renamed/improved successor) will remain callable. See DECISIONS.md D-014.
1508
+ */
1509
+ declare const IMPORT_TOWER_INSTANCE_ID: InjectionToken<string>;
1510
+
1511
+ /**
1512
+ * Generates a hierarchical form with nested FormGroups based on section IDs.
1513
+ * Parent form listens to all descendant changes, with validation cascading upward.
1514
+ *
1515
+ * @param inputs Array of form inputs with their configurations
1516
+ * @param getFormValue Record of form values used for custom validation
1517
+ * @returns A FormGroup with nested FormGroups for each section
1518
+ *
1519
+ * @public
1520
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
1521
+ * barrel; remains functional. A renamed/improved replacement may be introduced
1522
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
1523
+ */
1524
+ declare function formGenerator(inputs: Array<FormColumnInputs>, getFormValue: () => Record<string, any>): FormGroup;
1525
+
1526
+ /**
1527
+ * @public
1528
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
1529
+ * barrel; remains functional. A renamed/improved replacement may be introduced
1530
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
1531
+ */
1532
+ declare function getSectionElements(elements: ElementEditorInnerSectionElementInterface[], inputInEdit: (FormColumnInputs) | undefined, NGX_T_FORMS_CONFIG: NgxTFormsConfig, utils: InClassFormUtilsInterface, errors?: ValidationError[]): ElementEditorInnerSectionElementInterface[];
1533
+
1534
+ /**
1535
+ * @public
1536
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
1537
+ * barrel; remains functional. A renamed/improved replacement may be introduced
1538
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
1539
+ */
1540
+ declare const returnMappedPathValue: (pathMap: TreeNode[], obj: unknown) => unknown;
1541
+ /**
1542
+ * @public
1543
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
1544
+ * barrel; remains functional. A renamed/improved replacement may be introduced
1545
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
1546
+ */
1547
+ declare const getValueFromValueAccessor: (valueAccessRules: FormInputBasicOptionInterface | TreeNode[] | Record<string, TreeNode[]>, data: unknown) => unknown;
1548
+
1549
+ /**
1550
+ * One entry in the polymorphic-input registry. Maps an `ElementTypes` value to
1551
+ * a lazily-loaded renderer plus the metadata the host needs to wire it.
1552
+ *
1553
+ * Each `load()` is a dynamic `import()`, so every renderer is code-split out of
1554
+ * the host bundle — a form with only text fields never downloads the editor,
1555
+ * camera, signature pad, MSCOA charts, etc. The dynamic boundary also breaks
1556
+ * the otherwise-circular import between the host and `ImageCapture`.
1557
+ */
1558
+ interface ElementEntry {
1559
+ /** Lazy loader for the concrete renderer component. */
1560
+ readonly load: () => Promise<Type<unknown>>;
1561
+ /**
1562
+ * `true` when the renderer also accepts `editorMode` and
1563
+ * `formBuilderFunctions` inputs. The host only forwards those two inputs to
1564
+ * builder-aware entries, so `NgComponentOutlet` never tries to set an input
1565
+ * the target component does not declare.
1566
+ */
1567
+ readonly builderAware?: boolean;
740
1568
  }
741
1569
 
742
- declare class UserFormStepperComponent extends FormTowerControllerService {
1570
+ type TFormInputFormGroup = FormGroup<{
1571
+ [sectionId: string]: FormGroup<{
1572
+ [inputId: string]: FormControl<string | null>;
1573
+ }>;
1574
+ }> | undefined | null;
1575
+ /**
1576
+ * Polymorphic input host — given an `ITowerStepColumn` descriptor, selects
1577
+ * and renders the correct concrete input component (text, select, date,
1578
+ * file upload, signature, geo-location, MSCOA, document picker, workflow
1579
+ * adjudication, etc.) and wires it to the parent reactive `FormGroup`.
1580
+ *
1581
+ * @remarks
1582
+ * Accepts portal-style prop injection via the optional `'COMPONENT_PROPS'`
1583
+ * token so it can be rendered through `ComponentPortal` with inputs supplied
1584
+ * dynamically.
1585
+ *
1586
+ * Inputs:
1587
+ * - `inputConfig: ITowerStepColumn | undefined` — descriptor of the input
1588
+ * to render; the `element` field selects the concrete renderer.
1589
+ * - `formGroup: FormGroup<{...}> | undefined | null` — the parent reactive
1590
+ * form group keyed by section id then input id.
1591
+ * - `editorMode: boolean` — default `false`; when `true`, renders the
1592
+ * builder-side variant.
1593
+ * - `formBuilderFunctions: FormBuilderFunctions | undefined` — builder
1594
+ * hooks passed through to inputs that need them (e.g., MSCOA).
1595
+ *
1596
+ * Outputs:
1597
+ * - `valueChange: unknown` — emits the input's new value whenever the user
1598
+ * edits the bound `FormControl`. Concrete child inputs are rendered through
1599
+ * `NgComponentOutlet` (which forwards inputs only, never outputs) and write
1600
+ * their value through the shared `FormGroup` via `ControlValueAccessor`, so
1601
+ * this host bridges those control edits into a single output the tower wires
1602
+ * to `engine.updateValue(col.id, $event)`. Without this bridge user edits
1603
+ * reach the projected `FormGroup` (so submission works) but never reach the
1604
+ * engine's `#model`, leaving the signal graph blind to user input — no
1605
+ * dependent calculation, value-fetch, or options-fetch ever re-fires.
1606
+ *
1607
+ * @public
1608
+ */
1609
+ declare class TFormInputComponent {
1610
+ #private;
743
1611
  /**
744
- * Handles the key down event and opens the application log if the key combination is pressed.
745
- * @param event The keyboard event object.
1612
+ * Descriptor of the input to render. `element` selects the concrete renderer.
1613
+ *
1614
+ * Modeled as a `model()` (not `input()`) so that portal-style injection via
1615
+ * `'COMPONENT_PROPS'` can write into the signal at construction time — signal
1616
+ * inputs are read-only at runtime, but model signals are writable via `.set()`.
746
1617
  */
747
- onKeyDown(event: KeyboardEvent): void;
748
- _formId: string | undefined;
749
- set formId(value: string | undefined);
750
- loading: boolean;
751
- loadForm(formId: string | undefined): void;
752
- _initialFormValuesLocal: any;
753
- set initialValues(initialFormValues: any);
754
- set globalSystemInputs(inputs: FormColumnInputs[]);
755
- passParamsOnSubmit: any;
756
- get formBuilderFunctions(): FormBuilderFunctions;
757
- stepper: MatStepper | undefined;
758
- isEditable: boolean;
759
- getStepState(step: any, index: number): StepState;
760
- getPreviousStepLabel(): string | undefined;
761
- getNextStepLabel(): string | undefined;
762
- canProceedToNextStep(step: any): boolean;
763
- get getSubmissionStatus(): string;
764
- handleSubmit(): void;
765
- tourManagerService: TourManagerService;
766
- get hasTour(): boolean;
1618
+ readonly inputConfig: _angular_core.ModelSignal<ITowerStepColumn | undefined>;
1619
+ /** Parent reactive `FormGroup` keyed by section id then input id. */
1620
+ readonly formGroup: _angular_core.ModelSignal<TFormInputFormGroup>;
1621
+ /** When `true`, renders the builder-side variant. */
1622
+ readonly editorMode: _angular_core.ModelSignal<boolean>;
1623
+ /** Builder hooks passed through to inputs that need them (e.g., MSCOA). */
1624
+ readonly formBuilderFunctions: _angular_core.ModelSignal<FormBuilderFunctions | undefined>;
767
1625
  /**
768
- * Initiates and configures a dynamic, multi-step tutorial tour for the form.
769
- * The tour guides the user through the form's title, sections, and individual fields.
1626
+ * Emits the input's new value on every user-originated edit of the bound
1627
+ * control. The tower binds this to `engine.updateValue(col.id, $event)`,
1628
+ * which is the ONLY path user input takes into the engine's `#model` (and
1629
+ * therefore the signal-graph dependency reactivity). The projection effect
1630
+ * patches controls with `{ emitEvent: false }`, so signal→control writes do
1631
+ * NOT echo back here — only genuine user edits emit.
770
1632
  */
771
- startTour(): void;
772
- refreshASection(sectionId: string): void;
773
- static ɵfac: i0.ɵɵFactoryDeclaration<UserFormStepperComponent, never>;
774
- static ɵcmp: i0.ɵɵComponentDeclaration<UserFormStepperComponent, "lib-user-form-stepper", never, { "formId": { "alias": "formId"; "required": false; }; "initialValues": { "alias": "initialValues"; "required": false; }; "globalSystemInputs": { "alias": "globalSystemInputs"; "required": false; }; "passParamsOnSubmit": { "alias": "passParamsOnSubmit"; "required": false; }; }, {}, never, never, true, never>;
1633
+ readonly valueChange: _angular_core.OutputEmitterRef<unknown>;
1634
+ protected readonly elementTypes: typeof ElementTypes;
1635
+ /**
1636
+ * Polymorphic-host control flag true when the bound `FormGroup` already
1637
+ * has a `FormControl` (or, for `DateRangePicker`, both start/end controls)
1638
+ * matching the descriptor's `id`.
1639
+ */
1640
+ protected readonly hasFormControlInstance: _angular_core.Signal<boolean>;
1641
+ /**
1642
+ * Registry entry for the current descriptor's element type. Resolves to the
1643
+ * basic-input fallback for unknown types, mirroring the former `@default`
1644
+ * switch branch. `undefined` only while no descriptor is bound.
1645
+ */
1646
+ protected readonly elementEntry: _angular_core.Signal<ElementEntry | undefined>;
1647
+ /**
1648
+ * Lazily-loaded renderer component for the current element type, unwrapped in
1649
+ * the template via the `async` pipe. The promise is re-created only when the
1650
+ * resolved entry changes, so editing other descriptor fields does not reload
1651
+ * the component.
1652
+ */
1653
+ protected readonly elementComponent: _angular_core.Signal<Promise<Type<unknown>> | null>;
1654
+ /**
1655
+ * Inputs forwarded to the resolved renderer. Builder-aware renderers also
1656
+ * receive `editorMode` and `formBuilderFunctions`; every other renderer gets
1657
+ * only `inputConfig` and `formGroup`, so `NgComponentOutlet` never sets an
1658
+ * input the target component does not declare.
1659
+ */
1660
+ protected readonly elementInputs: _angular_core.Signal<Record<string, unknown>>;
1661
+ constructor(props: Record<string, unknown> | null);
1662
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TFormInputComponent, [{ optional: true; }]>;
1663
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TFormInputComponent, "lib-t-form-input", never, { "inputConfig": { "alias": "inputConfig"; "required": false; "isSignal": true; }; "formGroup": { "alias": "formGroup"; "required": false; "isSignal": true; }; "editorMode": { "alias": "editorMode"; "required": false; "isSignal": true; }; "formBuilderFunctions": { "alias": "formBuilderFunctions"; "required": false; "isSignal": true; }; }, { "inputConfig": "inputConfigChange"; "formGroup": "formGroupChange"; "editorMode": "editorModeChange"; "formBuilderFunctions": "formBuilderFunctionsChange"; "valueChange": "valueChange"; }, never, never, true, never>;
775
1664
  }
776
1665
 
777
- declare class FormatDataPipe implements PipeTransform {
778
- transform(value: any, dataType: DocumentLitsLabelConfigInterfaceValueType | InputDataTypes | undefined | InputPipeTypes, pipeConfig?: FormColumnInputs['pipe'] | undefined): any;
779
- static ɵfac: i0.ɵɵFactoryDeclaration<FormatDataPipe, never>;
780
- static ɵpipe: i0.ɵɵPipeDeclaration<FormatDataPipe, "formatData", true>;
1666
+ /**
1667
+ * Renders an MSCOA (Municipal Standard Chart of Accounts) form input a
1668
+ * segmented reactive form field that lets the user pick an account by
1669
+ * walking the MSCOA tree. Surfaces validation status via
1670
+ * `TFormInputStatusComponent`.
1671
+ *
1672
+ * Inputs:
1673
+ * - `inputConfig: ITowerStepColumn` — required, descriptor for this MSCOA input.
1674
+ * - `editorMode: boolean` — default `false`; when `true`, renders in
1675
+ * builder-editor mode rather than user-facing mode.
1676
+ * - `formGroup: FormGroup` — required, the parent reactive form group that
1677
+ * owns this input's controls.
1678
+ * - `formBuilderFunctions: FormBuilderFunctions | undefined` — optional
1679
+ * builder hooks supplied when used inside the form builder.
1680
+ *
1681
+ * Outputs:
1682
+ * - `reload: void` — fires when the input requests its
1683
+ * container reload the underlying data (e.g., after a tree refresh).
1684
+ */
1685
+ declare class MscoaFormInputComponent {
1686
+ /** Descriptor for this MSCOA input. */
1687
+ readonly inputConfig: _angular_core.InputSignal<ITowerStepColumn>;
1688
+ /** When `true`, renders in builder-editor mode rather than user-facing mode. */
1689
+ readonly editorMode: _angular_core.InputSignal<boolean>;
1690
+ /** Parent reactive form group that owns this input's controls. */
1691
+ readonly formGroup: _angular_core.InputSignal<FormGroup<any>>;
1692
+ /** Optional builder hooks supplied when used inside the form builder. */
1693
+ readonly formBuilderFunctions: _angular_core.InputSignal<FormBuilderFunctions | undefined>;
1694
+ /** Fires when the input requests its container reload the underlying data. */
1695
+ readonly reload: _angular_core.OutputEmitterRef<void>;
1696
+ protected get errorMessage(): string | string[] | undefined;
1697
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MscoaFormInputComponent, never>;
1698
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MscoaFormInputComponent, "lib-mscoa-form-input", never, { "inputConfig": { "alias": "inputConfig"; "required": true; "isSignal": true; }; "editorMode": { "alias": "editorMode"; "required": false; "isSignal": true; }; "formGroup": { "alias": "formGroup"; "required": true; "isSignal": true; }; "formBuilderFunctions": { "alias": "formBuilderFunctions"; "required": false; "isSignal": true; }; }, { "reload": "reload"; }, never, never, true, never>;
781
1699
  }
782
1700
 
783
- declare function assignDeepPropertyToObject(item: any, path: Array<string>, value: any): any;
1701
+ /**
1702
+ * Form input that captures a hand-drawn signature via `SignaturePadInputComponent`
1703
+ * and writes the resulting image to the bound `FormGroup` control. Surfaces
1704
+ * validation state through `TFormInputStatusComponent`.
1705
+ *
1706
+ * Inputs:
1707
+ * - `inputConfig: ITowerStepColumn` — required, descriptor for this input.
1708
+ * - `formGroup: FormGroup` — required, the parent reactive form group.
1709
+ *
1710
+ * Outputs:
1711
+ * - `reload: void` — fires when the input requests its container reload
1712
+ * (e.g., after clearing the pad).
1713
+ *
1714
+ * @public
1715
+ */
1716
+ declare class SignatureInputElementComponent {
1717
+ readonly inputConfig: _angular_core.InputSignal<ITowerStepColumn>;
1718
+ readonly formGroup: _angular_core.InputSignal<FormGroup<any>>;
1719
+ readonly reload: _angular_core.OutputEmitterRef<void>;
1720
+ protected readonly errorMessage: _angular_core.Signal<string | string[] | undefined>;
1721
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SignatureInputElementComponent, never>;
1722
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SignatureInputElementComponent, "lib-signature-input-element", never, { "inputConfig": { "alias": "inputConfig"; "required": true; "isSignal": true; }; "formGroup": { "alias": "formGroup"; "required": true; "isSignal": true; }; }, { "reload": "reload"; }, never, never, true, never>;
1723
+ }
784
1724
 
785
1725
  /**
786
- * Creates a file upload data object from a Base64 string.
1726
+ * Builder-side editor for authoring a boolean expression (used for guarded
1727
+ * navigation, conditional validation, and API path-selection rules). Validates
1728
+ * the expression's syntax in real time and exposes the typed tree of value-
1729
+ * access references the expression depends on.
787
1730
  *
788
- * @param fileName The desired name for the file (e.g., 'my-image.png').
789
- * @param contentType The MIME type of the file (e.g., 'image/png').
790
- * @param base64Content The raw Base64 encoded content of the file.
791
- * @returns A populated FileUploadInputValueInterface object.
1731
+ * Inputs:
1732
+ * - `hint: string` helper text shown beneath the expression field.
1733
+ * - `label: string` label for the expression field (default
1734
+ * `'Validation Expression'`).
1735
+ * - `formInputs: FormColumnInputs[]` — inputs the expression may reference.
1736
+ * - `data: unknown` — sample data used to test the expression.
1737
+ * - `expression: string` — initial expression string written into the editor
1738
+ * control.
1739
+ * - `valueAccessRules: Record<string, TreeNode[]>` — current value-access
1740
+ * tree for variables referenced by the expression.
1741
+ *
1742
+ * Outputs:
1743
+ * - `expressionChange` — fires when either the expression text or its derived
1744
+ * value-access tree changes.
1745
+ *
1746
+ * @public
1747
+ * @deprecated Internal builder UI re-exported via the `_deprecated/` compatibility
1748
+ * barrel; remains functional. A renamed/improved replacement may be introduced
1749
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
792
1750
  */
793
- declare const createFileFromBase64: (fileName: string, contentType: string, base64Content: string) => FileUploadInputValueInterface;
1751
+ declare class ValidationExpressioCreatorComponent {
1752
+ #private;
1753
+ /** Helper text shown beneath the expression field. */
1754
+ readonly hint: _angular_core.InputSignal<string>;
1755
+ /** Label for the expression field. */
1756
+ readonly label: _angular_core.InputSignal<string>;
1757
+ /** Inputs the expression may reference. */
1758
+ readonly formInputs: _angular_core.InputSignal<FormColumnInputs[]>;
1759
+ /** Sample data used to test the expression. Heterogeneous shape from parent template binding. */
1760
+ readonly data: _angular_core.InputSignal<any>;
1761
+ /** Initial expression string written into the editor control. */
1762
+ readonly expression: _angular_core.InputSignal<string>;
1763
+ /** Current value-access tree for variables referenced by the expression. */
1764
+ readonly valueAccessRules: _angular_core.InputSignal<Record<string, TreeNode[]>>;
1765
+ /** Fires when either the expression text or its derived value-access tree changes. */
1766
+ readonly expressionChange: _angular_core.OutputEmitterRef<{
1767
+ expression: string | null;
1768
+ valueAccessRules: Record<string, TreeNode[]>;
1769
+ }>;
1770
+ protected readonly textareaElementRef: _angular_core.Signal<ElementRef<HTMLTextAreaElement>>;
1771
+ protected readonly expressionControl: FormControl<string | null>;
1772
+ protected readonly showSuggestions: _angular_core.WritableSignal<boolean>;
1773
+ protected readonly optionsSearch: _angular_core.WritableSignal<string | undefined>;
1774
+ protected readonly variableInEdit: _angular_core.WritableSignal<string | null>;
1775
+ protected readonly methods: {
1776
+ label: string;
1777
+ hint: string;
1778
+ value: string;
1779
+ }[];
1780
+ /** Bridge the `expression` input into the FormControl. */
1781
+ protected readonly expressionBridge: _angular_core.EffectRef;
1782
+ /** Mirror the `valueAccessRules` input into the local mutable copy. */
1783
+ protected readonly valueAccessRulesBridge: _angular_core.EffectRef;
1784
+ protected readonly valueAccessOptions: _angular_core.Signal<string[]>;
1785
+ protected readonly allInputs: _angular_core.Signal<FormColumnInputs[]>;
1786
+ constructor();
1787
+ protected getMethods(): {
1788
+ label: string;
1789
+ hint: string;
1790
+ value: string;
1791
+ }[];
1792
+ protected get errorMessage(): string | null;
1793
+ protected getValueAccessRule(key: string): TreeNode[];
1794
+ protected onTextChange(expression: string): Promise<void>;
1795
+ protected cleanValueAccessRules(): void;
1796
+ protected selectSuggestionInput(suggestion: string): void;
1797
+ protected onFocus(): void;
1798
+ protected toggleVariableInEdit(variable: string): void;
1799
+ protected activeVariableChanged(value: TreeNode[] | string | {
1800
+ [key: string]: TreeNode[] | string;
1801
+ }): void;
1802
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ValidationExpressioCreatorComponent, never>;
1803
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ValidationExpressioCreatorComponent, "lib-validation-expressio-creator", never, { "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "formInputs": { "alias": "formInputs"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "expression": { "alias": "expression"; "required": false; "isSignal": true; }; "valueAccessRules": { "alias": "valueAccessRules"; "required": false; "isSignal": true; }; }, { "expressionChange": "expressionChange"; }, never, never, true, never>;
1804
+ }
1805
+
1806
+ /**
1807
+ * Generic Material dialog shell used by the forms runtime to surface
1808
+ * confirmation prompts and short-lived informational dialogs. Reads its
1809
+ * configuration (title, body, button labels) from `MAT_DIALOG_DATA` as a
1810
+ * `DialogConfig` and resolves its `MatDialogRef` with `true` when the user
1811
+ * proceeds.
1812
+ *
1813
+ * Inputs:
1814
+ * - _None._ Configuration arrives through `MAT_DIALOG_DATA` (`DialogConfig`).
1815
+ *
1816
+ * Outputs:
1817
+ * - _None._ Result is delivered via `MatDialogRef.close(true)`.
1818
+ *
1819
+ * @public
1820
+ * @deprecated Internal Material dialog template re-exported via the `_deprecated/`
1821
+ * compatibility barrel; remains functional. A renamed/improved replacement may be
1822
+ * introduced in a future minor; the original symbol stays callable. See
1823
+ * DECISIONS.md D-014.
1824
+ */
1825
+ declare class DialogTemplateComponent {
1826
+ readonly dialogRef: MatDialogRef<any, any>;
1827
+ readonly data: DialogConfig;
1828
+ proceed(): void;
1829
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DialogTemplateComponent, never>;
1830
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogTemplateComponent, "lib-dialog-template", never, {}, {}, never, never, true, never>;
1831
+ }
794
1832
 
795
- type DeepPropertyValue = any;
796
- type PropertyPath = (string | number | IArrayFunction[])[];
797
1833
  /**
798
1834
  * Custom error class for property access errors in deep object traversal.
799
1835
  *
@@ -817,6 +1853,11 @@ type PropertyPath = (string | number | IArrayFunction[])[];
817
1853
  * console.log(`Error message: ${error.message}`);
818
1854
  * }
819
1855
  * }
1856
+ *
1857
+ * @public
1858
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
1859
+ * barrel; remains functional. A renamed/improved replacement may be introduced
1860
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
820
1861
  */
821
1862
  declare class PropertyAccessError extends Error {
822
1863
  path: PropertyPath;
@@ -828,12 +1869,12 @@ declare class PropertyAccessError extends Error {
828
1869
  *
829
1870
  * @function returnDeepProperty
830
1871
  *
831
- * @param {any} item - The object to traverse.
1872
+ * @param {unknown} item - The object to traverse.
832
1873
  * @param {(string|number|symbol)[]} path - An array representing the path to the desired property.
833
1874
  * Each element in the array can be a string (for object properties),
834
1875
  * a number (for array indices), or a symbol.
835
1876
  *
836
- * @returns {any} The value of the deep property if it exists, otherwise undefined.
1877
+ * @returns {DeepPropertyValue} The value of the deep property if it exists, otherwise undefined.
837
1878
  *
838
1879
  * @throws {Error} If the input item is null or undefined, or if the path is not a non-empty array.
839
1880
  *
@@ -871,19 +1912,24 @@ declare class PropertyAccessError extends Error {
871
1912
  * - Throws an error if the input item is null/undefined or if the path is invalid
872
1913
  *
873
1914
  * @see safeReturnDeepProperty for a version that never throws and returns an object with value and error properties
1915
+ *
1916
+ * @public
1917
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
1918
+ * barrel; remains functional. A renamed/improved replacement may be introduced
1919
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
874
1920
  */
875
- declare const returnDeepProperty: (item: any, path: PropertyPath) => DeepPropertyValue;
1921
+ declare const returnDeepProperty: (item: unknown, path: PropertyPath) => DeepPropertyValue;
876
1922
  /**
877
1923
  * Safely retrieves a deeply nested property from an object using a path array.
878
1924
  *
879
1925
  * @function safeReturnDeepProperty
880
1926
  *
881
- * @param {any} item - The object to traverse.
1927
+ * @param {unknown} item - The object to traverse.
882
1928
  * @param {(string|number|symbol)[]} path - An array representing the path to the desired property.
883
1929
  * Each element in the array can be a string (for object properties),
884
1930
  * a number (for array indices), or a symbol.
885
1931
  *
886
- * @returns {{value: any, error: string|null}} An object containing:
1932
+ * @returns {{value: DeepPropertyValue, error: string|null}} An object containing:
887
1933
  * - value: The value of the deep property if found, otherwise undefined.
888
1934
  * - error: A string describing the error if one occurred, otherwise null.
889
1935
  *
@@ -923,12 +1969,40 @@ declare const returnDeepProperty: (item: any, path: PropertyPath) => DeepPropert
923
1969
  * - Implement error handling in a functional programming style
924
1970
  *
925
1971
  * @see returnDeepProperty for the core implementation that this function wraps
1972
+ *
1973
+ * @public
1974
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
1975
+ * barrel; remains functional. A renamed/improved replacement may be introduced
1976
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
926
1977
  */
927
- declare const safeReturnDeepProperty: (item: any, path: PropertyPath) => {
1978
+ declare const safeReturnDeepProperty: (item: unknown, path: PropertyPath) => {
928
1979
  value: DeepPropertyValue;
929
1980
  error: string | null;
930
1981
  };
931
1982
 
1983
+ /**
1984
+ * @public
1985
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
1986
+ * barrel; remains functional. A renamed/improved replacement may be introduced
1987
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
1988
+ */
1989
+ declare function assignDeepPropertyToObject(item: any, path: Array<string>, value: any): any;
1990
+
1991
+ /**
1992
+ * Creates a file upload data object from a Base64 string.
1993
+ *
1994
+ * @param fileName The desired name for the file (e.g., 'my-image.png').
1995
+ * @param contentType The MIME type of the file (e.g., 'image/png').
1996
+ * @param base64Content The raw Base64 encoded content of the file.
1997
+ * @returns A populated FileUploadInputValueInterface object.
1998
+ *
1999
+ * @public
2000
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
2001
+ * barrel; remains functional. A renamed/improved replacement may be introduced
2002
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
2003
+ */
2004
+ declare const createFileFromBase64: (fileName: string, contentType: string, base64Content: string) => FileUploadInputValueInterface;
2005
+
932
2006
  /**
933
2007
  * Creates a sample value for a given form input configuration.
934
2008
  * It determines the value based on the input's element type, specific input type (e.g., email, number),
@@ -936,13 +2010,46 @@ declare const safeReturnDeepProperty: (item: any, path: PropertyPath) => {
936
2010
  *
937
2011
  * @param {FormColumnInputs} input - The configuration object for the form input.
938
2012
  * @returns {any} A sample value appropriate for the input type.
2013
+ *
2014
+ * @public
2015
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
2016
+ * barrel; remains functional. A renamed/improved replacement may be introduced
2017
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
939
2018
  */
940
2019
  declare function getSampleValueForInput(input: FormColumnInputs): any;
941
2020
 
2021
+ /**
2022
+ * @public
2023
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
2024
+ * barrel; remains functional. A renamed/improved replacement may be introduced
2025
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
2026
+ */
942
2027
  declare function getPipedValueFromDataType(dataType: InputDataTypes | undefined | DocumentLitsLabelConfigInterfaceValueType, value: any, pipe: FormColumnInputs['pipe'] | undefined): any;
943
2028
 
2029
+ /**
2030
+ * @public
2031
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
2032
+ * barrel; remains functional. A renamed/improved replacement may be introduced
2033
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
2034
+ */
2035
+ declare const initFormConfigToV2: (formConfig: FormInterfaceMigration) => FormInterface;
2036
+
2037
+ /**
2038
+ * @public
2039
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
2040
+ * barrel; remains functional. A renamed/improved replacement may be introduced
2041
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
2042
+ */
944
2043
  declare function getUrl(url: string, variables: NgxTFormsConfig): string;
945
2044
 
2045
+ /**
2046
+ * @public
2047
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
2048
+ * barrel; remains functional. A renamed/improved replacement may be introduced
2049
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
2050
+ */
2051
+ declare const sheetConsolodation: (allSheets: Record<string, Record<string, any>[]>) => Record<string, any>[];
2052
+
946
2053
  /**
947
2054
  * Validates an object against a validation expression.
948
2055
  *
@@ -950,13 +2057,52 @@ declare function getUrl(url: string, variables: NgxTFormsConfig): string;
950
2057
  * @param {object} object - The object to validate.
951
2058
  * @returns {boolean} - A boolean indicating whether the object is valid according to the expression.
952
2059
  *
953
- * This function is designed to handle a variety of cases for validating objects based on a given expression. It can:
954
- * 1. Evaluate an expression part with a single comparison operator, for example: 'a === 1' or '(a === 1)'.
955
- * 2. Evaluate an expression with multiple comparison operators, including: '===', '==', '!==', '!=', '>', '<', '>=', and '<='.
956
- * 3. Group expression parts considering bracket enclosures and logical operators.
957
- * 4. Evaluate an expression with multiple logical operators, such as 'a === 1 && b === 2 || c === 3'.
2060
+ * Backed by the shared predicate evaluator ({@link evaluatePredicate}), a
2061
+ * paren-aware, backward-compatible superset of the original space-split DSL. It
2062
+ * supports `===`/`==`/`!==`/`!=`/`>`/`<`/`>=`/`<=`, `&&`/`||` with correct
2063
+ * precedence and grouping, unary `!`, deep-path operands, multi-word quoted
2064
+ * strings, the keyword operators `includes`/`in`/`startsWith`/`endsWith`/`matches`,
2065
+ * and bare-operand truthiness.
2066
+ */
2067
+ /**
2068
+ * Public callers pass either a plain object (e.g. `{ age: 1 }`) or an array
2069
+ * value (`item as T[]` from {@link evaluateArrayAccessRules}). Both are valid
2070
+ * index containers for the DSL (arrays support `length`, numeric indices, and
2071
+ * the `in` operator on string keys), so accept `object` and narrow internally.
2072
+ */
2073
+ type ValidationTarget = object;
2074
+ /**
2075
+ * Validates an object against a predicate expression. Delegates to the shared,
2076
+ * paren-aware predicate evaluator (a backward-compatible superset of the
2077
+ * original space-split DSL). Throws on a structurally invalid expression.
2078
+ */
2079
+ declare const validateObjectAgainstString: (expression: string, object: ValidationTarget) => boolean;
2080
+ /**
2081
+ * @public
2082
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
2083
+ * barrel; remains functional. A renamed/improved replacement may be introduced
2084
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
958
2085
  */
959
- declare const validateObjectAgainstString: (expression: string, object: any) => boolean;
960
2086
  declare function validateExpressionSyntax(expression: string): string | null;
961
2087
 
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 };
2088
+ /**
2089
+ * @public
2090
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
2091
+ * barrel; remains functional. A renamed/improved replacement may be introduced
2092
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
2093
+ */
2094
+ declare function testAgainstItem(test: ConfigurationValidTestInterface, item: unknown): boolean;
2095
+
2096
+ /**
2097
+ * @public
2098
+ * @deprecated Internal helper re-exported via the `_deprecated/` compatibility
2099
+ * barrel; remains functional. A renamed/improved replacement may be introduced
2100
+ * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.
2101
+ *
2102
+ * **Breaking (v2.x):** now requires `secret` as a third argument — the
2103
+ * hardcoded library secret was removed (LIB-05). Read it from
2104
+ * `INPUT_SECRET_TOKEN` in your component / service before calling.
2105
+ */
2106
+ declare const getSignatureImage: (inputConfig: FormColumnInputs, value: EncryptedData | undefined, secret: string) => Promise<string | undefined>;
2107
+
2108
+ export { DialogTemplateComponent, FORM_ACTIONS_TOKEN, FORM_CONFIG_TOKEN, FORM_INPUTS_TOKEN, FORM_ROUTE_SOURCE, FORM_SLIDES_TOKEN, FormBuilderComponent, FormTowerControllerService, FormatDataPipe, FormsComponent, HttpPipelineRepository, IMPORT_TOWER_INSTANCE_ID, INPUT_SECRET_TOKEN, MSCOA_TREE_PROVIDER, MULTIPLE_FORM_INPUT_TOKEN, MscoaFormInputComponent, NGX_T_FORMS_CONFIG_TOKEN, NgxTFormsComponent, NgxTFormsService, PIPELINE_REPOSITORY, PipelineRepository, 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, sheetConsolodation, testAgainstItem, textIconsForUserHints, validateExpressionSyntax, validateObjectAgainstString, withHttpPipeline, withInputSecret, withRouterFormId };