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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-t-forms-ngx-t-forms-u_kigDid.mjs","sources":["../../../projects/ngx-t-forms/src/lib/tokens/form-actions.token.ts","../../../projects/ngx-t-forms/src/lib/tokens/form-config.token.ts","../../../projects/ngx-t-forms/src/lib/tokens/form-slides.token.ts","../../../projects/ngx-t-forms/src/lib/tokens/utils-object.token.ts","../../../projects/ngx-t-forms/src/lib/tokens/form-inputs.token.ts","../../../projects/ngx-t-forms/src/lib/tokens/multiple-form-input.token.ts","../../../projects/ngx-t-forms/src/lib/tokens/mscoa-tree-provider.token.ts","../../../projects/ngx-t-forms/src/lib/tokens/ngx-t-forms-config.token.ts","../../../projects/ngx-t-forms/src/lib/tokens/pipeline-repository.token.ts","../../../projects/ngx-t-forms/src/lib/tokens/input-secret.token.ts","../../../projects/ngx-t-forms/src/lib/tokens/form-route-source.token.ts","../../../projects/ngx-t-forms/src/lib/injection-tokens/index.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/daysAgoTransform.ts","../../../projects/ngx-t-forms/src/lib/components/forms/store/Forms-selectors.ts","../../../projects/ngx-t-forms/src/lib/components/forms/store/Forms-signal-selectors.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/formCanSave.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/array-access/predicate-dsl.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/array-access/projection-dsl.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/array-access/operations.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/array-access/pipeline.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/evaluateArrayAccessRules.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/getDeepObject.ts","../../../projects/ngx-t-forms/src/lib/shared/modules/stringJsonValidator/getObjectValidations.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/functions/testData.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/inputElementEditorConfigs.ts","../../../projects/ngx-t-forms/src/lib/components/forms/functions/findFormInput.ts","../../../projects/ngx-t-forms/src/lib/components/forms/store/Form-signal-selectors-FormBuilder.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/updateFormInputConfig.ts","../../../projects/ngx-t-forms/src/lib/components/forms/store/Forms-Actions.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/migrationCheck.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/textIconsForUserHints.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-controller/function/calculateInputValue.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-section-controller/Functions/commonFormOperations.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-section-controller/Functions/formGenerator.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/getAllFunctionTypes.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/selectFormSteps.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/allFormInputs.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/getSubmissionStatus.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/overrideValidation.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/setControlTempErrors.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/setInputError.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/setInputAsTouchedAndDirty.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/setSectionAsSeen.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/assignDeepPropertyToObject.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/getFormValue.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/setInputStatus.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/multipleInputRowIDControllInput.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/runMultipleInputPrepopulationFunctions.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/toggleMultipleInput.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/handleStepChange.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/saveMultipleInputForm.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/createEmptyForm.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/prePoPulateForm.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/createFileUploadSample.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/getformInputsSampleValue.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/getPipedValueFromDataType.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/replaceUrlVariables.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/sheetConsolodator.ts","../../../projects/ngx-t-forms/src/lib/components/forms/functions/formHttpSubmissions.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/isEqual.ts","../../../projects/ngx-t-forms/src/lib/components/forms/functions/generateSystemInputs.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/loadSystemInputs.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/getTopologicalExecutionOrder.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/refreshInputWithDependencies.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/builders/missing-dependency-hint.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/builders/build-value-calculation.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/builders/build-input-sourced-value.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-section-controller/Functions/getValueFromPathMap.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-controller/function/multipleFormInputsMapValueToFormInputId.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-controller/function/validateMinInputForPostRequest.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-section-controller/Functions/errorResolver.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-controller/function/postApiDataFetching.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/builders/build-value-api-resource.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/builders/build-options-api-resource.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/builders/build-manual-validation.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/form-tower-controller.service.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-engine/t-form-engine.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-import-controller/t-form-import-controller.ts","../../../projects/ngx-t-forms/src/lib/components/forms/store/Forms-Effects.ts","../../../projects/ngx-t-forms/src/lib/components/forms/store/share-latest.ts","../../../projects/ngx-t-forms/src/lib/components/forms/store/Form-selectors-FormBuilder.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/sectionDrop.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/moveFormInput.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/addNewSection.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/stepTitleChangeStep.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/removeItem.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/multipleInputToggleLabel.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/addMultipleInputFunction.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/deleteSection.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/moveInputToDiffSection.ts","../../../projects/ngx-t-forms/src/lib/components/forms/functions/cloneCopyFormInput.ts","../../../projects/ngx-t-forms/src/lib/components/forms/functions/cleanFormForSave.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/addFormInputToForm.ts","../../../projects/ngx-t-forms/src/lib/components/forms/functions/selectInputTemplate.ts","../../../projects/ngx-t-forms/src/lib/components/forms/functions/elementConfigurationChanged.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/camelize.ts","../../../projects/ngx-t-forms/src/lib/components/forms/functions/elementBlur.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/addScoaExtensionInput.ts","../../../projects/ngx-t-forms/src/lib/components/forms/store/Form-actions-formBuilder.ts","../../../projects/ngx-t-forms/src/lib/components/forms/store/forms-store.service.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-environment-injection/t-form-environment-injection.service.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/store/mscoa-selectors.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/store/mscoa-actions.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/store/mscoa-effects.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/store/mscoa-component-store.service.ts","../../../projects/ngx-t-forms/src/lib/config/with-router-form-id.ts","../../../projects/ngx-t-forms/src/lib/config/provide-ngx-t-forms.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-environment-injection/functions/provideNgxTforms.ts","../../../projects/ngx-t-forms/src/lib/infrastructure/http-pipeline.repository.ts","../../../projects/ngx-t-forms/src/lib/config/with-http-pipeline.ts","../../../projects/ngx-t-forms/src/lib/config/with-input-secret.ts","../../../projects/ngx-t-forms/src/lib/domain/pipeline.repository.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/getAvatar.ts","../../../projects/ngx-t-forms/src/lib/shared/pipes/date/days-ago.pipe.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/fuzzyTextSearch.ts","../../../projects/ngx-t-forms/src/lib/components/forms/forms.component.ts","../../../projects/ngx-t-forms/src/lib/components/forms/forms.component.html","../../../projects/ngx-t-forms/src/lib/components/form-builder/form-builder.component.ts","../../../projects/ngx-t-forms/src/lib/components/form-builder/form-builder.component.html","../../../projects/ngx-t-forms/src/lib/services/core/tour/tour-manager.service.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/onFileSelectEventInput.ts","../../../projects/ngx-t-forms/src/lib/components/user-form-stepper/user-form-stepper.component.ts","../../../projects/ngx-t-forms/src/lib/components/user-form-stepper/user-form-stepper.component.html","../../../projects/ngx-t-forms/src/lib/shared/functions/convertElementEditorTypesToInputType.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/nested-editor.token.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/t-dynamic-data-edit.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/t-dynamic-data-edit.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/functions/extractNodeFromTree.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/functions/convertDataToTree.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-view/t-dynamic-data-view.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-view/t-dynamic-data-view.component.html","../../../projects/ngx-t-forms/src/lib/shared/pipes/format-Data.pipe.ts","../../../projects/ngx-t-forms/src/lib/ngx-t-forms.service.ts","../../../projects/ngx-t-forms/src/lib/ngx-t-forms.component.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-import-controller/import-tokens.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/section-title/section-title.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/section-title/section-title.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/element-registry.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/t-form-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/t-form-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input-status/t-form-input-status.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input-status/t-form-input-status.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/store/accountConstants.ts","../../../projects/ngx-t-forms/src/lib/shared/modules/mat-modules.module.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/scoa-input/scoa-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/scoa-input/scoa-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/account-value/account-value.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/account-value/account-value.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/scoa-account-table/scoa-account-table.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/scoa-account-table/scoa-account-table.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-computation/mscoa-computation.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-computation/mscoa-computation.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/extractCols.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/utils/mscoa-chart.constants.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/utils/mscoa-chart.helpers.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/components/mscoa-chart-input-menu/mscoa-chart-input-menu.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/components/mscoa-chart-input-menu/mscoa-chart-input-menu.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/utils/mscoa-message-formatter.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/mscoa-chart.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-chart/mscoa-chart.component.html","../../../projects/ngx-t-forms/src/lib/services/core/t-input-controller/functions/baseCustomInput.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-reactive-form-field/mscoa-reactive-form-field.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/elements/mscoa-reactive-form-field/mscoa-reactive-form-field.component.html","../../../projects/ngx-t-forms/src/lib/services/core/t-input-controller/functions/inputErrorMessage.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/mscoa-form-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/mscoa-form-input/mscoa-form-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/signature-input-element/config/signature.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/enryption.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-input-controller/functions/generateInputSecret.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/signature-input-element/core/signature-pad-input/signature-pad-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/signature-input-element/core/signature-pad-input/signature-pad-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/signature-input-element/signature-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/signature-input-element/signature-input-element.component.html","../../../projects/ngx-t-forms/src/lib/shared/pipes/list-search.pipe.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/functions/validateExpression.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/searchArray.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/functions/pipeline-expression.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/elements/data-tree/data-tree.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/elements/data-tree/data-tree.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/json-editor/json-editor.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/json-editor/json-editor.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/_shared/empty-state/empty-state.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/_shared/empty-state/empty-state.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/_shared/error-list/error-list.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/_shared/error-list/error-list.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/postman-collections/functions/convertPostmanCollectionToTree.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/api-value-access-rules.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/api-value-access-rules.component.html","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/elements/validation-expressio-creator/validation-expressio-creator.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-dynamic-data-edit/elements/api-value-access-rules/elements/validation-expressio-creator/validation-expressio-creator.component.html","../../../projects/ngx-t-forms/src/lib/components/dialog-template/dialog-template.component.ts","../../../projects/ngx-t-forms/src/lib/components/dialog-template/dialog-template.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/signature-input-element/core/signature-pad-input/functions/getSignatureImage.ts","../../../projects/ngx-t-forms/src/lib/_deprecated/index.ts","../../../projects/ngx-t-forms/src/public-api.ts","../../../projects/ngx-t-forms/src/ngx-t-forms.ts"],"sourcesContent":["import { InjectionToken } from \"@angular/core\";\r\nimport { IFormActions } from \"ngx-t-forms-types\";\r\n\r\n/**\r\n * Provides the action handlers (submit, save, cancel, etc.) that the forms\r\n * runtime invokes when the user interacts with form controls. Bound from the\r\n * `formActions` field of `NgxTFormsConfig` when the consumer calls\r\n * `provideNgxTForms`.\r\n *\r\n * @see provideNgxTForms\r\n */\r\nexport const FORM_ACTIONS_TOKEN = new InjectionToken<IFormActions>('FORM_ACTIONS');\r\n","import { InjectionToken } from \"@angular/core\";\r\nimport { FormInterface } from \"ngx-t-forms-types\";\r\n\r\n/**\r\n * Provides the active `FormInterface` definition rendered by the forms\r\n * runtime. Components downstream of the form host inject this token to read\r\n * the form configuration without coupling to the store.\r\n *\r\n * @see provideNgxTForms\r\n */\r\nexport const FORM_CONFIG_TOKEN = new InjectionToken<FormInterface>('FORM_CONFIG');\r\n","import { InjectionToken } from \"@angular/core\";\r\nimport { FormSlideInterface } from \"ngx-t-forms-types\";\r\n\r\n/**\r\n * Provides the active `FormSlideInterface` (the slide/step currently being\r\n * rendered). Scoped per slide by the form host so individual inputs can read\r\n * their slide context.\r\n *\r\n * @see provideNgxTForms\r\n */\r\nexport const FORM_SLIDES_TOKEN = new InjectionToken<FormSlideInterface>('FORM_SLIDES');\r\n","import { InjectionToken } from \"@angular/core\";\r\nimport { InClassFormUtilsInterface } from \"ngx-t-forms-types\";\r\n\r\n/**\r\n * Provides the in-class utility object (`InClassFormUtilsInterface`) that\r\n * exposes shared helper functions to form input components — formatting,\r\n * validation helpers, and cross-input lookups.\r\n *\r\n * @see provideNgxTForms\r\n */\r\nexport const UTILS_OBJECT_TOKEN = new InjectionToken<InClassFormUtilsInterface>('UTILS_OBJECT_TOKEN');\r\n","import { InjectionToken } from \"@angular/core\";\r\nimport {\r\n IFileUploadInput,\r\n IDateRangePickerInput,\r\n ITextareaProperties,\r\n IToggleInput,\r\n IMatrixInput,\r\n IMultiple,\r\n IBasicFormInput,\r\n IWorkflowDocumentPicker,\r\n} from \"ngx-t-forms-types\";\r\n\r\n/**\r\n * Provides the merged form-input descriptor injected into each individual\r\n * input element. The descriptor is an intersection of every supported input\r\n * shape (`IWorkflowDocumentPicker & IBasicFormInput & IFileUploadInput &\r\n * IDateRangePickerInput & ITextareaProperties & IToggleInput & IMatrixInput\r\n * & IMultiple`) so a single token can describe any rendered input.\r\n *\r\n * @see provideNgxTForms\r\n */\r\nexport const FORM_INPUTS_TOKEN = new InjectionToken<IWorkflowDocumentPicker & IBasicFormInput& IFileUploadInput & IDateRangePickerInput\r\n& ITextareaProperties & IToggleInput & IMatrixInput & IMultiple>('FORM_INPUTS_TOKEN');\r\n","import { InjectionToken } from \"@angular/core\";\r\nimport { IMultiple } from \"ngx-t-forms-types\";\r\n\r\n/**\r\n * Provides the `IMultiple` configuration to \"multiple\"-type inputs (inputs\r\n * that produce an array of values). Scoped per input instance.\r\n *\r\n * @see provideNgxTForms\r\n */\r\nexport const MULTIPLE_FORM_INPUT_TOKEN = new InjectionToken<IMultiple>('MULTIPLE_FORM_INPUT_TOKEN');\r\n","import { InjectionToken } from \"@angular/core\";\r\nimport { IGetTreeResponse } from \"ngx-t-forms-types\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n/**\r\n * Provides a factory function that returns an `Observable<IGetTreeResponse>`\r\n * representing the MSCOA chart-of-accounts tree. Consumers bind this token\r\n * to their backend lookup so MSCOA-aware inputs can lazily fetch the tree\r\n * without depending on a concrete HTTP client.\r\n *\r\n * @see provideNgxTForms\r\n */\r\nexport const MSCOA_TREE_PROVIDER = new InjectionToken<() => Observable<IGetTreeResponse>>(\r\n 'MSCOA_TREE_PROVIDER'\r\n );\r\n","import { InjectionToken } from \"@angular/core\";\r\nimport { NgxTFormsConfig } from \"ngx-t-forms-types\";\r\n\r\n/**\r\n * Provides the top-level `NgxTFormsConfig` supplied by the consumer when\r\n * calling `provideNgxTForms`. This is the root configuration token from\r\n * which `formActions`, `formBuilder`, and other runtime concerns are read.\r\n *\r\n * @see provideNgxTForms\r\n */\r\nexport const NGX_T_FORMS_CONFIG_TOKEN = new InjectionToken<NgxTFormsConfig>('NGX_T_FORMS_CONFIG');\r\n","import { InjectionToken } from '@angular/core';\r\nimport type { PipelineRepository } from '../domain/pipeline.repository';\r\n\r\n/**\r\n * @public\r\n *\r\n * Token binding the {@link PipelineRepository} abstraction. The default\r\n * HTTP-backed implementation is {@link HttpPipelineRepository}, registered by\r\n * {@link withHttpPipeline}. Consumers may substitute their own implementation\r\n * by binding `useClass` (or `useValue` for a mock) against this token.\r\n */\r\nexport const PIPELINE_REPOSITORY = new InjectionToken<PipelineRepository>(\r\n 'PIPELINE_REPOSITORY',\r\n);\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Secret used to derive per-input HMAC keys for client-side encryption of\r\n * sensitive form values (currently: signature input payloads).\r\n *\r\n * Consumers MUST configure this via {@link withInputSecret} when the\r\n * signature input is in use. The library does not ship a default — hardcoding\r\n * a secret inside a published library would render it public.\r\n *\r\n * Treat the value as opaque, high-entropy, and never derived from anything\r\n * the browser can read (e.g. `environment.ts` baked into the bundle is\r\n * acceptable for low-sensitivity rotation; HSM-backed values are better).\r\n *\r\n * @see withInputSecret\r\n */\r\nexport const INPUT_SECRET_TOKEN = new InjectionToken<string>('NGX_T_FORMS_INPUT_SECRET');\r\n","import { InjectionToken } from '@angular/core';\nimport type { Observable } from 'rxjs';\n\n/**\n * Optional source of the form id to load into {@link FormBuilderComponent}.\n *\n * Bound by `withRouterFormId()` (shipped by default in `provideNgxTForms`) to the\n * activated route's `formId` param. When unbound — e.g. a router-free build — the\n * builder loads from its `formId` input only. This decouples the builder from a\n * direct `ActivatedRoute` dependency (plan D-B2 / §5.5).\n *\n * @public\n */\nexport const FORM_ROUTE_SOURCE = new InjectionToken<Observable<string | undefined>>(\n 'FORM_ROUTE_SOURCE',\n);\n","// Phase 2 — Step 2.1: tokens moved to src/lib/tokens/. This shim preserves\r\n// the old import path for internal callers; scheduled for deletion when the\r\n// next consumer-breaking change naturally lands.\r\nexport * from '../tokens';\r\n","export function daysAgoTransformDate(value: Date): string | Date | undefined {\r\n if (value) {\r\n const seconds = Math.floor((+new Date() - +new Date(value)) / 1000);\r\n if (seconds < 15)\r\n // less than 30 seconds ago will show as 'Just now'\r\n return 'Just now';\r\n const intervals: Readonly<Record<string, number>> = {\r\n year: 31536000,\r\n month: 2592000,\r\n week: 604800,\r\n day: 86400,\r\n hr: 3600,\r\n min: 60,\r\n sec: 1,\r\n };\r\n let counter: number;\r\n for (const i in intervals) {\r\n const divisor = intervals[i] ?? 1;\r\n counter = Math.floor(seconds / divisor);\r\n if (counter > 0)\r\n if (counter === 1) {\r\n return counter + ' ' + i + ' ago'; // singular (1 day ago)\r\n } else {\r\n return counter + ' ' + i + 's ago'; // plural (2 days ago)\r\n }\r\n }\r\n }\r\n return value;\r\n}\r\n","\r\nimport {LocalFormStateSelectorInterface } from \"ngx-t-forms-types\";\r\nimport { daysAgoTransformDate } from \"../../../shared/functions/daysAgoTransform\"\r\nimport { FormsStoreService } from \"./forms-store.service\"\r\nimport { FormsStoreSelectorsInterface } from \"ngx-t-forms-types\";\r\n\r\n\r\n\r\nexport function formsStoreSelectors(store: FormsStoreService):FormsStoreSelectorsInterface {\r\n const state$ = store.select(state => state)\r\n const selectForms$ = store.select(state => (state.forms || []).map(\r\n form => {\r\n const f: LocalFormStateSelectorInterface = {\r\n _id: form._id,\r\n createdAt: form.createdAt,\r\n errors: form.errors,\r\n updatedAt: form.updatedAt,\r\n archived: form.archive,\r\n busy: form.busy,\r\n ...form.form,\r\n systemDefault: form.systemDefault\r\n }\r\n return f\r\n }\r\n ))\r\n\r\n const selectFormInEdit$ = store.select(state => state.editForm)\r\n const selectInputInEditId$ = store.select(state => state.inputInEdit)\r\n const selectFormBuilderIsBusy$ = store.select(state => state.formBuilderBusy)\r\n const selectSubmittingForm$ = store.select(state => state.submittingForm) \r\n const selectLoadingForm$ = store.select(state => state.loadingForm)\r\n const selectLoadingForms$ = store.select(state => state.loadingForms)\r\n const selectFormId$ = store.select(state => state.formId)\r\n const selectErrors$ = store.select(state => state.errors)\r\n const selectFormListSection$ = store.select(state => state.listSection)\r\n const selectFormUpdated$ = store.select(state => (state.editForm?.updatedAt && daysAgoTransformDate(state.editForm.updatedAt)) || null)\r\n const selectRouterState$ = store.select(state => state.routerState)\r\n const selectFormInitialValues$ = store.select(state => state.initialFormValues)\r\n\r\n \r\n //Form Builder\r\n \r\n\r\n return {\r\n state$,\r\n selectForms$,\r\n selectFormInEdit$,\r\n selectFormBuilderIsBusy$,\r\n selectLoadingForm$,\r\n selectLoadingForms$,\r\n selectFormId$,\r\n selectErrors$,\r\n selectFormListSection$,\r\n selectFormUpdated$,\r\n selectRouterState$,\r\n selectSubmittingForm$,\r\n selectFormInitialValues$,\r\n selectInputInEditId$\r\n\r\n\r\n }\r\n\r\n}","import { computed, Signal } from '@angular/core';\nimport { LocalFormStateSelectorInterface } from 'ngx-t-forms-types';\nimport { daysAgoTransformDate } from '../../../shared/functions/daysAgoTransform';\nimport { FormsStoreService } from './forms-store.service';\n\n/**\n * Signal-native mirror of {@link formsStoreSelectors}. Every base slice is a\n * synchronous projection of state, so each becomes a memoised `computed()` read\n * straight off `store.state` — no `select()`/`toObservable` round-trip. Consumers\n * read these directly (`store.signalSelectors.selectLoadingForm()`), replacing\n * the per-component `toSignal` re-wraps (plan P4).\n *\n * The projection bodies are identical to the Observable selectors so behaviour\n * is unchanged; only the reactive wrapper differs.\n *\n * @internal\n */\nexport function formsStoreSignalSelectors(store: FormsStoreService) {\n const state = store.state;\n\n const selectForms: Signal<LocalFormStateSelectorInterface[]> = computed(() =>\n (state().forms || []).map((form) => {\n const f: LocalFormStateSelectorInterface = {\n _id: form._id,\n createdAt: form.createdAt,\n errors: form.errors,\n updatedAt: form.updatedAt,\n archived: form.archive,\n busy: form.busy,\n ...form.form,\n systemDefault: form.systemDefault,\n };\n return f;\n }),\n );\n\n const selectFormInEdit = computed(() => state().editForm);\n const selectInputInEditId = computed(() => state().inputInEdit);\n const selectFormBuilderIsBusy = computed(() => state().formBuilderBusy);\n const selectSubmittingForm = computed(() => state().submittingForm);\n const selectLoadingForm = computed(() => state().loadingForm);\n const selectLoadingForms = computed(() => state().loadingForms);\n const selectFormId = computed(() => state().formId);\n const selectErrors = computed(() => state().errors);\n const selectFormListSection = computed(() => state().listSection);\n const selectFormUpdated = computed(() => {\n const updatedAt = state().editForm?.updatedAt;\n return (updatedAt && daysAgoTransformDate(updatedAt)) || null;\n });\n const selectRouterState = computed(() => state().routerState);\n const selectFormInitialValues = computed(() => state().initialFormValues);\n\n return {\n selectForms,\n selectFormInEdit,\n selectInputInEditId,\n selectFormBuilderIsBusy,\n selectSubmittingForm,\n selectLoadingForm,\n selectLoadingForms,\n selectFormId,\n selectErrors,\n selectFormListSection,\n selectFormUpdated,\n selectRouterState,\n selectFormInitialValues,\n };\n}\n","import { FormColumnInputs, FormInterface, validateForm } from \"ngx-t-forms-types\";\r\n\r\n\r\n\r\nexport function canSaveNewForm(form:FormInterface): boolean {\r\ntry {\r\n const errors = validateForm(form)\r\n\r\n return errors.length === 0\r\n} catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to check if form can be saved';\r\n throw new Error(message);\r\n}\r\n}\r\nexport function missingConfig(form: FormInterface | undefined): string[] {\r\ntry {\r\n if(!form) return ['Form is missing'];\r\n const inputs = form?.slides.flatMap(slide => slide.columns)||[];\r\n\r\n const findDuplicateControlNames = (inputs: FormColumnInputs[]): string[] => {\r\n const controlNames = new Set<string>();\r\n const duplicates: string[] = [];\r\n\r\n inputs.forEach(input => {\r\n if (controlNames.has(input.formControlName)) {\r\n duplicates.push(input.formControlName);\r\n } else {\r\n controlNames.add(input.formControlName);\r\n }\r\n });\r\n\r\n return duplicates;\r\n };\r\n\r\n const findMissingDataTypes = (inputs: FormColumnInputs[]): string[] =>\r\n inputs.filter(input => !input.dataType).map(input => `${input.label} is missing dataType`);\r\n\r\n const checkFormTitle = (form:FormInterface): string | null => \r\n !form.formTitle ? 'A Form title is required' : null;\r\n\r\n const checkFormSections = (form: FormInterface): string | null => \r\n form.slides.length === 0 ? 'At least one section in a form is required' : null;\r\n\r\n const checkSectionLabels = (form: FormInterface): string | null => \r\n form.slides.some(slide => !slide.label) ? 'All sections must have a title' : null;\r\n\r\n const checkSubmissionHandle = (form: FormInterface): string | null => \r\n !form.submissionHandle?.submissionAPI ? 'Setup form Submission API. header > config > Submission Config' : null;\r\n\r\n const checkSlidesElements = (form: FormInterface): string | null => \r\n form.slides.some(slide => slide.columns.length === 0) ? 'All sections must have at least one element' : null;\r\n\r\n const duplicateErrors = findDuplicateControlNames(inputs).map(name => {\r\n const duplicates = inputs.filter(input => input.formControlName === name);\r\n return `Error: ${duplicates.map(d => d.label).join(' and ')} have the same control name`;\r\n });\r\n\r\n const missingDataTypeErrors = findMissingDataTypes(inputs);\r\n\r\n const errors = [\r\n checkFormTitle(form),\r\n checkFormSections(form),\r\n checkSectionLabels(form),\r\n checkSubmissionHandle(form),\r\n checkSlidesElements(form),\r\n ...duplicateErrors,\r\n ...missingDataTypeErrors,\r\n ].filter(error => error !== null);\r\n\r\n return errors as string[];\r\n} catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Failed to check form config';\r\n throw new Error(msg);\r\n\r\n}\r\n}\r\n","import { getValueByPath } from '../getDeepObject';\n\n/**\n * Robust predicate evaluator for the array-access `filter` / `find` operations\n * (and the semi-public {@link validateObjectAgainstString}).\n *\n * It is a backward-compatible **superset** of the original space-split DSL:\n *\n * - `field OP value` comparisons with `===`, `==`, `!==`, `!=`, `>`, `<`, `>=`, `<=`\n * (`==` / `!=` remain deliberately loose, matching the legacy behaviour).\n * - Logical composition with `&&` / `||` and grouping with `(` `)`, evaluated\n * with correct precedence — **paren-aware**, fixing the legacy bug where a\n * parenthesised `||` on the right of `&&` was split incorrectly.\n * - Unary negation: `!(expr)` / `!field`.\n * - Quoted string literals may contain spaces and escapes (`name === \"John Doe\"`).\n * - Operands may be **deep paths** (`user.profile.age > 18`).\n * - Keyword operators: `includes`, `in`, `startsWith`, `endsWith`, `matches`\n * (regex). Case-insensitive on the keyword itself.\n * - A bare operand is evaluated for truthiness (`isActive`, `!isActive`).\n *\n * Legacy semantics preserved: a bare word that does not resolve to a field is\n * treated as a string literal; numeric/boolean/null words coerce to their\n * primitive; quotes are stripped from string literals.\n *\n * Throws on a structurally invalid expression (the caller decides whether to\n * swallow it — `filter` does, `find` does, the validator re-throws).\n *\n * @internal\n */\n\ntype Comparable = number | string;\n\nconst COMPARISON_OPERATORS = ['===', '!==', '==', '!=', '>=', '<=', '>', '<'] as const;\nconst KEYWORD_OPERATORS = new Set(['includes', 'in', 'startswith', 'endswith', 'matches']);\n\ntype TokenType = 'string' | 'word' | 'op' | 'and' | 'or' | 'not' | 'lparen' | 'rparen';\n\ninterface Token {\n readonly type: TokenType;\n readonly value: string;\n}\n\nconst isWhitespace = (c: string): boolean => c === ' ' || c === '\\t' || c === '\\n' || c === '\\r';\n\nconst isBreakChar = (c: string): boolean =>\n isWhitespace(c) || c === '(' || c === ')' || c === '\"' || c === \"'\" ||\n c === '&' || c === '|' || c === '!' || c === '=' || c === '>' || c === '<';\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null;\n\n/** Lexes the expression into a flat token stream. */\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n const n = input.length;\n let i = 0;\n\n while (i < n) {\n const ch = input[i] as string;\n\n if (isWhitespace(ch)) { i++; continue; }\n\n // Quoted string literal (single or double), spaces & escapes preserved.\n if (ch === '\"' || ch === \"'\") {\n const quote = ch;\n i++;\n let str = '';\n while (i < n && input[i] !== quote) {\n if (input[i] === '\\\\' && i + 1 < n) { str += input[i + 1] as string; i += 2; continue; }\n str += input[i] as string;\n i++;\n }\n i++; // consume closing quote (tolerant if missing)\n tokens.push({ type: 'string', value: str });\n continue;\n }\n\n if (ch === '(') { tokens.push({ type: 'lparen', value: '(' }); i++; continue; }\n if (ch === ')') { tokens.push({ type: 'rparen', value: ')' }); i++; continue; }\n if (ch === '&' && input[i + 1] === '&') { tokens.push({ type: 'and', value: '&&' }); i += 2; continue; }\n if (ch === '|' && input[i + 1] === '|') { tokens.push({ type: 'or', value: '||' }); i += 2; continue; }\n\n // Comparison operators, longest match first ( !== / != / === / == ... ).\n let matched = false;\n for (const op of COMPARISON_OPERATORS) {\n if (input.startsWith(op, i)) {\n tokens.push({ type: 'op', value: op });\n i += op.length;\n matched = true;\n break;\n }\n }\n if (matched) continue;\n\n // A lone `!` is logical negation ( `!=` / `!==` were caught above ).\n if (ch === '!') { tokens.push({ type: 'not', value: '!' }); i++; continue; }\n\n // Otherwise a word: path segment, number, boolean, null, or keyword op.\n let word = '';\n while (i < n && !isBreakChar(input[i] as string)) {\n word += input[i] as string;\n i++;\n }\n if (word.length > 0) tokens.push({ type: 'word', value: word });\n else i++; // defensive: skip an unexpected character\n }\n\n return tokens;\n}\n\n/** Resolves a single operand token to a runtime value against `item`. */\nfunction resolveOperand(tok: Token, item: unknown): unknown {\n if (tok.type === 'string') return tok.value;\n\n const w = tok.value;\n\n // Field / deep-path lookup takes precedence (legacy: `operand in data` first).\n const segs = w.split('.').filter(s => s.length > 0);\n const head = segs[0];\n if (head !== undefined && isRecord(item) && head in item) {\n return getValueByPath(item, segs);\n }\n\n if (w === 'true') return true;\n if (w === 'false') return false;\n if (w === 'null') return null;\n if (w === 'undefined') return undefined;\n if (w !== '' && !Number.isNaN(Number(w))) return Number(w);\n\n // Legacy fallback: an unresolved bare word is a string literal.\n return w;\n}\n\nconst asComparable = (v: unknown): Comparable => v as Comparable;\n\nfunction applySymbolic(op: string, left: unknown, right: unknown): boolean {\n switch (op) {\n case '===': return left === right;\n // eslint-disable-next-line eqeqeq -- loose equality is the documented DSL behaviour\n case '==': return left == right;\n case '!==': return left !== right;\n // eslint-disable-next-line eqeqeq -- loose inequality is the documented DSL behaviour\n case '!=': return left != right;\n case '>': return asComparable(left) > asComparable(right);\n case '<': return asComparable(left) < asComparable(right);\n case '>=': return asComparable(left) >= asComparable(right);\n case '<=': return asComparable(left) <= asComparable(right);\n default: throw new Error(`Invalid operator: ${op}`);\n }\n}\n\nfunction applyKeyword(kw: string, left: unknown, right: unknown): boolean {\n switch (kw) {\n case 'includes':\n if (typeof left === 'string') return left.includes(String(right));\n if (Array.isArray(left)) return left.includes(right) || left.map(String).includes(String(right));\n return false;\n case 'in':\n if (Array.isArray(right)) return right.includes(left) || right.map(String).includes(String(left));\n if (isRecord(right)) return String(left) in right;\n if (typeof right === 'string') return right.includes(String(left));\n return false;\n case 'startswith': return String(left).startsWith(String(right));\n case 'endswith': return String(left).endsWith(String(right));\n case 'matches':\n try { return new RegExp(String(right)).test(String(left)); }\n catch { return false; }\n default: throw new Error(`Invalid operator: ${kw}`);\n }\n}\n\n/** Recursive-descent parser/evaluator over the token stream. */\nclass PredicateEvaluator {\n readonly #tokens: Token[];\n readonly #item: unknown;\n #pos = 0;\n\n constructor(tokens: Token[], item: unknown) {\n this.#tokens = tokens;\n this.#item = item;\n }\n\n evaluate(): boolean {\n if (this.#tokens.length === 0) {\n throw new Error('Empty expression');\n }\n const result = this.#parseOr();\n if (this.#pos < this.#tokens.length) {\n throw new Error(`Unexpected token: ${this.#peek()?.value ?? ''}`);\n }\n return result;\n }\n\n #peek(): Token | undefined { return this.#tokens[this.#pos]; }\n #next(): Token | undefined { return this.#tokens[this.#pos++]; }\n\n #parseOr(): boolean {\n let result = this.#parseAnd();\n while (this.#peek()?.type === 'or') {\n this.#next();\n const right = this.#parseAnd();\n result = result || right;\n }\n return result;\n }\n\n #parseAnd(): boolean {\n let result = this.#parseNot();\n while (this.#peek()?.type === 'and') {\n this.#next();\n const right = this.#parseNot();\n result = result && right;\n }\n return result;\n }\n\n #parseNot(): boolean {\n if (this.#peek()?.type === 'not') {\n this.#next();\n return !this.#parseNot();\n }\n return this.#parsePrimary();\n }\n\n #parsePrimary(): boolean {\n const tok = this.#peek();\n if (tok === undefined) throw new Error('Unexpected end of expression');\n\n if (tok.type === 'lparen') {\n this.#next();\n const inner = this.#parseOr();\n if (this.#peek()?.type !== 'rparen') throw new Error('Missing closing parenthesis');\n this.#next();\n return inner;\n }\n\n return this.#parseComparison();\n }\n\n #parseComparison(): boolean {\n const leftTok = this.#next();\n if (leftTok === undefined || (leftTok.type !== 'word' && leftTok.type !== 'string')) {\n throw new Error(`Invalid operand: ${leftTok?.value ?? ''}`);\n }\n\n const opTok = this.#peek();\n\n // Symbolic comparison.\n if (opTok?.type === 'op') {\n this.#next();\n const rightTok = this.#next();\n if (rightTok === undefined || (rightTok.type !== 'word' && rightTok.type !== 'string')) {\n throw new Error(`Invalid operand: ${rightTok?.value ?? ''}`);\n }\n return applySymbolic(\n opTok.value,\n resolveOperand(leftTok, this.#item),\n resolveOperand(rightTok, this.#item),\n );\n }\n\n // Keyword comparison (includes / in / startsWith / endsWith / matches).\n if (opTok?.type === 'word' && KEYWORD_OPERATORS.has(opTok.value.toLowerCase())) {\n this.#next();\n const rightTok = this.#next();\n if (rightTok === undefined || (rightTok.type !== 'word' && rightTok.type !== 'string')) {\n throw new Error(`Invalid operand: ${rightTok?.value ?? ''}`);\n }\n return applyKeyword(\n opTok.value.toLowerCase(),\n resolveOperand(leftTok, this.#item),\n resolveOperand(rightTok, this.#item),\n );\n }\n\n // A trailing word that is not a keyword operator is malformed.\n if (opTok?.type === 'word') {\n throw new Error(`Unexpected token: ${opTok.value}`);\n }\n\n // Bare operand → truthiness.\n return Boolean(resolveOperand(leftTok, this.#item));\n }\n}\n\n/**\n * Evaluates a predicate expression against a single item.\n *\n * @throws Error when the expression is structurally invalid.\n * @internal\n */\nexport function evaluatePredicate(expression: string, item: unknown): boolean {\n if (typeof expression !== 'string') throw new Error('Expression must be a string');\n return new PredicateEvaluator(tokenize(expression), item).evaluate();\n}\n","import { getValueByPath } from '../getDeepObject';\n\n/**\n * Projection evaluator for the array-access `map` operation. A\n * backward-compatible **superset** of the original comma-separated key DSL.\n *\n * Each comma-separated token is one of:\n *\n * - `key` — shallow pick: copies `source[key]` when the key exists (legacy).\n * - `alias:{deep.path}` — deep bind & rename: `result[alias] = value at path`\n * (legacy). The alias is always a flat key (legacy parity).\n * - `{deep.path}` — deep pick with the **last path segment** as the key\n * (additive).\n * - `alias:\"text\"` / `alias:42` / `alias:true` / `alias:null` — literal\n * assignment, for injecting constant fields (additive).\n * - `*` — spread every source key into the result first, so later tokens can\n * rename or add alongside the originals (additive).\n *\n * Tokens are applied left-to-right, so a later token overrides an earlier key\n * of the same name. Missing plain keys are skipped; missing deep paths yield\n * `undefined`.\n *\n * @internal\n */\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null;\n\n/** Parses the right-hand side of an `alias:literal` token into a primitive. */\nfunction parseLiteral(raw: string): unknown {\n const text = raw.trim();\n if (text.length >= 2) {\n const first = text[0];\n const last = text[text.length - 1];\n if ((first === '\"' && last === '\"') || (first === \"'\" && last === \"'\")) {\n return text.slice(1, -1);\n }\n }\n if (text === 'true') return true;\n if (text === 'false') return false;\n if (text === 'null') return null;\n if (text === 'undefined') return undefined;\n if (text !== '' && !Number.isNaN(Number(text))) return Number(text);\n return text;\n}\n\nconst splitPath = (raw: string): string[] => raw.split('.').map(s => s.trim()).filter(Boolean);\n\n/**\n * Reshapes a single item according to the projection expression.\n *\n * @internal\n */\nexport function projectObject(item: unknown, expression: string): Record<string, unknown> {\n const source: Record<string, unknown> = isRecord(item) ? item : {};\n const result: Record<string, unknown> = {};\n\n const tokens = expression.split(',').map(k => k.trim());\n\n for (const token of tokens) {\n if (token === '') continue;\n\n // `*` — spread the entire source object.\n if (token === '*') {\n for (const k of Object.keys(source)) result[k] = source[k];\n continue;\n }\n\n const braceOpen = token.indexOf('{');\n const braceClose = token.indexOf('}');\n const colon = token.indexOf(':');\n const hasBrace = braceOpen !== -1 && braceClose !== -1 && braceClose > braceOpen;\n\n // `alias:{deep.path}` — deep bind & rename (legacy form).\n if (hasBrace && colon !== -1 && colon < braceOpen) {\n const alias = token.slice(0, colon).trim();\n if (alias === '') continue;\n const path = splitPath(token.slice(braceOpen + 1, braceClose));\n result[alias] = path.length > 0 ? getValueByPath(source, path) : undefined;\n continue;\n }\n\n // `{deep.path}` — deep pick, key defaults to the last segment.\n if (hasBrace && colon === -1) {\n const path = splitPath(token.slice(braceOpen + 1, braceClose));\n const alias = path[path.length - 1];\n if (alias === undefined) continue;\n result[alias] = getValueByPath(source, path);\n continue;\n }\n\n // `alias:literal` — constant field injection.\n if (!hasBrace && colon !== -1) {\n const alias = token.slice(0, colon).trim();\n if (alias === '') continue;\n result[alias] = parseLiteral(token.slice(colon + 1));\n continue;\n }\n\n // Plain shallow pick.\n if (token in source) {\n result[token] = source[token];\n }\n }\n\n return result;\n}\n","import { getValueByPath } from '../getDeepObject';\nimport { evaluatePredicate } from './predicate-dsl';\nimport { projectObject } from './projection-dsl';\n\n/**\n * Operation registry for the array-access engine. Each declarative operation\n * (`filter`, `find`, `map`, `sort`, `slice`, `unique`, `flatten`, `groupBy`,\n * `reduce`) is described here as one of three kinds so the pipeline can fuse\n * and short-circuit them:\n *\n * - `lazy` - a streaming generator transform (no intermediate array; can be\n * consumed item-by-item and short-circuited by a downstream op).\n * - `array` - needs the full set, returns an array, the chain continues.\n * - `terminal` - collapses the set to a non-array value and ends the chain.\n *\n * Adding a new operation is a matter of adding one entry to {@link OPERATIONS}\n * (and its string to the `FunctionTypes` enum) - nothing else changes.\n *\n * @internal\n */\n\ntype LazyTransform = (input: Iterable<unknown>, expression: string) => Iterable<unknown>;\ntype ArrayTransform = (input: unknown[], expression: string) => unknown[];\ntype TerminalTransform = (input: Iterable<unknown>, expression: string) => unknown;\n\nexport interface OperationDescriptor {\n readonly kind: 'lazy' | 'array' | 'terminal';\n readonly lazy?: LazyTransform;\n readonly array?: ArrayTransform;\n readonly terminal?: TerminalTransform;\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null;\n\nconst splitPath = (raw: string): string[] => raw.split('.').map(s => s.trim()).filter(Boolean);\n\nconst isPresent = (v: unknown): boolean => v !== undefined && v !== null;\n\n/** Ordering used by `sort` and `min`/`max`; nulls/undefined sort last. */\nfunction compareValues(a: unknown, b: unknown): number {\n if (!isPresent(a) && !isPresent(b)) return 0;\n if (!isPresent(a)) return 1;\n if (!isPresent(b)) return -1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'boolean' && typeof b === 'boolean') return (a ? 1 : 0) - (b ? 1 : 0);\n const sa = String(a);\n const sb = String(b);\n return sa < sb ? -1 : sa > sb ? 1 : 0;\n}\n\n// --- filter ------------------------------------------------------------------\nfunction* filterTransform(input: Iterable<unknown>, expression: string): Iterable<unknown> {\n for (const item of input) {\n let keep = false;\n try { keep = evaluatePredicate(expression, item); } catch { keep = false; }\n if (keep) yield item;\n }\n}\n\n// --- map ---------------------------------------------------------------------\n// Preserves legacy semantics: a per-item projection error yields `undefined`\n// in place (the array length is preserved).\nfunction* mapTransform(input: Iterable<unknown>, expression: string): Iterable<unknown> {\n for (const item of input) {\n let projected: Record<string, unknown> | undefined;\n try { projected = projectObject(item, expression); } catch { projected = undefined; }\n yield projected;\n }\n}\n\n// --- flatten -----------------------------------------------------------------\n// Empty expression: flatten nested arrays one level. With a path: flat-map by\n// that child array (items whose child is absent contribute nothing).\nfunction* flattenTransform(input: Iterable<unknown>, expression: string): Iterable<unknown> {\n const path = expression.trim();\n for (const item of input) {\n if (path === '') {\n if (Array.isArray(item)) { for (const sub of item) yield sub; }\n else yield item;\n continue;\n }\n const child = getValueByPath(item, splitPath(path));\n if (Array.isArray(child)) { for (const sub of child) yield sub; }\n else if (isPresent(child)) yield child;\n }\n}\n\n// --- unique ------------------------------------------------------------------\n// Whole-item identity when no key paths are given, otherwise a composite key\n// built from the listed paths. First occurrence wins.\nfunction identityKey(item: unknown, keyPaths: string[][]): string {\n if (keyPaths.length === 0) {\n return isRecord(item) || Array.isArray(item) ? JSON.stringify(item) : `${typeof item}:${String(item)}`;\n }\n return JSON.stringify(keyPaths.map(p => getValueByPath(item, p) ?? null));\n}\n\nfunction* uniqueTransform(input: Iterable<unknown>, expression: string): Iterable<unknown> {\n const keyPaths = expression.trim() === ''\n ? []\n : expression.split(',').map(s => s.trim()).filter(Boolean).map(splitPath);\n const seen = new Set<string>();\n for (const item of input) {\n const key = identityKey(item, keyPaths);\n if (!seen.has(key)) { seen.add(key); yield item; }\n }\n}\n\n// --- slice -------------------------------------------------------------------\ninterface SliceBounds { start: number; end: number | undefined; }\n\nfunction parseSliceBounds(expression: string): SliceBounds {\n const expr = expression.trim();\n if (expr.includes(':')) {\n const [a = '', b = ''] = expr.split(':');\n const start = a.trim() === '' ? 0 : Number(a);\n const end = b.trim() === '' ? undefined : Number(b);\n return {\n start: Number.isNaN(start) ? 0 : start,\n end: end !== undefined && Number.isNaN(end) ? undefined : end,\n };\n }\n if (expr.includes(',')) {\n const [a = '', b = ''] = expr.split(',');\n const start = Number(a);\n const count = Number(b);\n const safeStart = Number.isNaN(start) ? 0 : start;\n return { start: safeStart, end: Number.isNaN(count) ? undefined : safeStart + count };\n }\n const single = Number(expr);\n if (Number.isNaN(single)) return { start: 0, end: undefined };\n return single < 0 ? { start: single, end: undefined } : { start: 0, end: single };\n}\n\nfunction* sliceTransform(input: Iterable<unknown>, expression: string): Iterable<unknown> {\n const { start, end } = parseSliceBounds(expression);\n // Streaming + short-circuit path for non-negative bounds.\n if (start >= 0 && (end === undefined || end >= 0)) {\n let idx = 0;\n for (const item of input) {\n if (end !== undefined && idx >= end) return;\n if (idx >= start) yield item;\n idx++;\n }\n return;\n }\n // Negative bounds require the full set; defer to Array.slice semantics.\n yield* [...input].slice(start, end);\n}\n\n// --- sort --------------------------------------------------------------------\ninterface SortKey { path: string[]; dir: 'asc' | 'desc'; }\n\nfunction parseSortKeys(expression: string): SortKey[] {\n return expression.split(',').map(s => s.trim()).filter(Boolean).map(part => {\n const segments = part.split(/\\s+/);\n const pathStr = segments[0] ?? '';\n const dir = (segments[1] ?? 'asc').toLowerCase() === 'desc' ? 'desc' : 'asc';\n return { path: splitPath(pathStr), dir };\n });\n}\n\nfunction sortTransform(input: unknown[], expression: string): unknown[] {\n const keys = parseSortKeys(expression);\n const copy = [...input];\n copy.sort((a, b) => {\n if (keys.length === 0) return compareValues(a, b);\n for (const key of keys) {\n const av = getValueByPath(a, key.path);\n const bv = getValueByPath(b, key.path);\n const c = compareValues(av, bv);\n if (c !== 0) return key.dir === 'desc' ? -c : c;\n }\n return 0;\n });\n return copy;\n}\n\n// --- find --------------------------------------------------------------------\n// Lenient (a per-item predicate error is treated as \"no match\"), unlike the\n// original throw-on-error behaviour - see the note in the rules doc.\nfunction findTransform(input: Iterable<unknown>, expression: string): unknown {\n for (const item of input) {\n try { if (evaluatePredicate(expression, item)) return item; } catch { /* skip */ }\n }\n return undefined;\n}\n\n// --- groupBy -----------------------------------------------------------------\nfunction groupByTransform(input: Iterable<unknown>, expression: string): Record<string, unknown[]> {\n const paths = expression.split(',').map(s => s.trim()).filter(Boolean).map(splitPath);\n const out: Record<string, unknown[]> = {};\n for (const item of input) {\n const key = paths.length === 0\n ? String(item)\n : paths.map(p => String(getValueByPath(item, p) ?? '')).join('|');\n const bucket = out[key] ?? (out[key] = []);\n bucket.push(item);\n }\n return out;\n}\n\n// --- reduce ------------------------------------------------------------------\nfunction aggregate(items: unknown[], spec: string): unknown {\n const colon = spec.indexOf(':');\n const fn = (colon === -1 ? spec : spec.slice(0, colon)).trim().toLowerCase();\n const pathStr = colon === -1 ? '' : spec.slice(colon + 1).trim();\n const path = splitPath(pathStr);\n const valuesAt = (): unknown[] => (path.length === 0 ? items : items.map(i => getValueByPath(i, path)));\n const numbers = (): number[] => valuesAt().map(Number).filter(n => !Number.isNaN(n));\n\n switch (fn) {\n case 'count':\n return path.length === 0 ? items.length : valuesAt().filter(isPresent).length;\n case 'sum':\n return numbers().reduce((a, b) => a + b, 0);\n case 'avg': {\n const nums = numbers();\n return nums.length === 0 ? 0 : nums.reduce((a, b) => a + b, 0) / nums.length;\n }\n case 'min': {\n const present = valuesAt().filter(isPresent);\n return present.length === 0 ? undefined : present.reduce((a, b) => (compareValues(b, a) < 0 ? b : a));\n }\n case 'max': {\n const present = valuesAt().filter(isPresent);\n return present.length === 0 ? undefined : present.reduce((a, b) => (compareValues(b, a) > 0 ? b : a));\n }\n case 'first':\n return path.length === 0 ? items[0] : valuesAt()[0];\n case 'last': {\n const vals = valuesAt();\n return vals[vals.length - 1];\n }\n case 'join':\n return valuesAt().filter(isPresent).map(String).join(', ');\n default:\n throw new Error(`Unknown aggregate: ${fn}`);\n }\n}\n\nfunction reduceTransform(input: Iterable<unknown>, expression: string): unknown {\n const items = [...input];\n // Multi-aggregate object form: `alias=spec, alias2=spec2`.\n if (expression.includes('=')) {\n const out: Record<string, unknown> = {};\n for (const part of expression.split(',').map(s => s.trim()).filter(Boolean)) {\n const eq = part.indexOf('=');\n if (eq === -1) continue;\n const alias = part.slice(0, eq).trim();\n if (alias === '') continue;\n out[alias] = aggregate(items, part.slice(eq + 1).trim());\n }\n return out;\n }\n // Single-aggregate scalar form.\n return aggregate(items, expression.trim());\n}\n\n/**\n * The operation registry. Keyed by the {@link FunctionTypes} string values.\n *\n * @internal\n */\nexport const OPERATIONS: Readonly<Record<string, OperationDescriptor>> = {\n filter: { kind: 'lazy', lazy: filterTransform },\n map: { kind: 'lazy', lazy: mapTransform },\n flatten: { kind: 'lazy', lazy: flattenTransform },\n unique: { kind: 'lazy', lazy: uniqueTransform },\n slice: { kind: 'lazy', lazy: sliceTransform },\n sort: { kind: 'array', array: sortTransform },\n find: { kind: 'terminal', terminal: findTransform },\n groupBy: { kind: 'terminal', terminal: groupByTransform },\n reduce: { kind: 'terminal', terminal: reduceTransform },\n};\n","import type { IArrayFunction } from 'ngx-t-forms-types';\nimport { OPERATIONS } from './operations';\n\n/**\n * Fused, lazily-evaluated executor for a chain of declarative array operations.\n *\n * Adjacent `lazy` operations (`filter`, `map`, `flatten`, `unique`, `slice`)\n * compose into a single streaming pass with no intermediate arrays, and a\n * downstream `terminal` op (`find`) or a `slice` upper bound short-circuits the\n * upstream producers - so `[filter, map, find]` stops at the first match\n * instead of transforming the whole input.\n *\n * The observable result is identical to applying each operation eagerly in\n * sequence, preserving the original contract:\n *\n * - An `array` op (`sort`) materialises the stream, transforms it, and the\n * chain continues.\n * - A `terminal` op (`find`, `groupBy`, `reduce`) collapses the stream to a\n * non-array value and ends the chain - any later rules are ignored, exactly\n * as the legacy reducer skipped rules once the accumulator stopped being an\n * array.\n * - An empty rule list returns the original array reference unchanged.\n *\n * @internal\n */\nexport function runPipeline(array: unknown[], rules: IArrayFunction[]): unknown {\n if (rules.length === 0) return array;\n\n let cursor: Iterable<unknown> = array;\n\n for (const rule of rules) {\n const op = OPERATIONS[rule.function];\n if (op === undefined) {\n // Validation upstream guarantees a known op; this is a defensive stop.\n return materialize(cursor);\n }\n\n if (op.kind === 'lazy' && op.lazy) {\n cursor = op.lazy(cursor, rule.expression);\n } else if (op.kind === 'array' && op.array) {\n cursor = op.array(materialize(cursor), rule.expression);\n } else if (op.kind === 'terminal' && op.terminal) {\n return op.terminal(cursor, rule.expression);\n }\n }\n\n return materialize(cursor);\n}\n\n/** Collapses a (possibly lazy) cursor into a concrete array, once. */\nfunction materialize(cursor: Iterable<unknown>): unknown[] {\n return Array.isArray(cursor) ? cursor : [...cursor];\n}\n","import { IArrayFunction } from \"ngx-t-forms-types\"\nimport { runPipeline } from \"./array-access/pipeline\";\n\n/**\n * Declarative array-transform operations. Mirrors the `FunctionTypes` enum in\n * `ngx-t-forms-types` (kept in lock-step) and is the set the runtime validates\n * each rule's `function` against.\n */\nexport enum FunctionTypes {\n Filter = \"filter\",\n Find = \"find\",\n Map = \"map\",\n Sort = \"sort\",\n Slice = \"slice\",\n Unique = \"unique\",\n Flatten = \"flatten\",\n GroupBy = \"groupBy\",\n Reduce = \"reduce\",\n // Add more function types here as needed\n}\n\n/**\n * Applies an ordered chain of declarative array operations to an input array.\n *\n * The chain is fused and lazily evaluated (see {@link runPipeline}): streaming\n * operations run in a single pass and terminal operations short-circuit, while\n * the observable result is identical to applying each operation eagerly.\n *\n * @param array The input array to operate on.\n * @param rule The ordered rules specifying the operation and expression to apply.\n * @returns The transformed array, a single item (`find`), or an aggregate\n * value (`groupBy` / `reduce`); `undefined` when `find` matches nothing.\n * @throws Error if the arguments are structurally invalid.\n */\nexport function arrayAccessFunctions<T>(array: T[], rule: IArrayFunction[]): T[] | T | undefined {\n // Input validation\n if (!Array.isArray(array)) {\n throw new Error(\"First argument must be an array\");\n }\n if (!rule || !Array.isArray(rule) || !rule.every(r => typeof r.expression === 'string')) {\n throw new Error(\"Rule must have a valid function and expression\");\n }\n const hasCorrectFunctionType = rule.every((r) => Object.values(FunctionTypes).includes(r.function as FunctionTypes));\n if (!hasCorrectFunctionType) {\n throw new Error(`Invalid function type`);\n }\n\n return runPipeline(array, rule) as T[] | T | undefined;\n}\n","import type { DeepPropertyValue, IArrayFunction, PropertyPath } from 'ngx-t-forms-types';\r\nimport { arrayAccessFunctions } from \"./evaluateArrayAccessRules\";\r\n\r\nexport type { DeepPropertyValue, PropertyPath };\r\n/**\r\n * Custom error class for property access errors in deep object traversal.\r\n *\r\n * @class PropertyAccessError\r\n * @extends Error\r\n *\r\n * @property {PropertyPath} path - The path segment where the error occurred.\r\n * @property {string | number | symbol} segment - The specific path segment that caused the error.\r\n *\r\n * @description\r\n * This error is thrown when there's an issue accessing a property during deep object traversal.\r\n * It provides detailed information about where in the path the error occurred and what caused it.\r\n *\r\n * @example\r\n * try {\r\n * const result = returnDeepProperty(obj, ['a', 'b', 'c']);\r\n * } catch (error) {\r\n * if (error instanceof PropertyAccessError) {\r\n * console.log(`Error at path: ${error.path.join('.')}`);\r\n * console.log(`Problem segment: ${String(error.segment)}`);\r\n * console.log(`Error message: ${error.message}`);\r\n * }\r\n * }\r\n *\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\nclass PropertyAccessError extends Error {\r\n constructor(message: string, public path: PropertyPath, public segment: string | number | IArrayFunction[]) {\r\n super(message);\r\n this.name = 'PropertyAccessError';\r\n }\r\n}\r\n/**\r\n * Retrieves a deeply nested property from an object using a path array.\r\n *\r\n * @function returnDeepProperty\r\n *\r\n * @param {unknown} item - The object to traverse.\r\n * @param {(string|number|symbol)[]} path - An array representing the path to the desired property.\r\n * Each element in the array can be a string (for object properties),\r\n * a number (for array indices), or a symbol.\r\n *\r\n * @returns {DeepPropertyValue} The value of the deep property if it exists, otherwise undefined.\r\n *\r\n * @throws {Error} If the input item is null or undefined, or if the path is not a non-empty array.\r\n *\r\n * @example\r\n * const obj = {\r\n * a: {\r\n * b: [\r\n * { c: 1 },\r\n * { c: 2 }\r\n * ]\r\n * }\r\n * };\r\n *\r\n * returnDeepProperty(obj, ['a', 'b', 1, 'c']); // Returns 2\r\n * returnDeepProperty(obj, ['a', 'x']); // Returns undefined\r\n *\r\n * @description\r\n * This function allows for safe traversal of nested objects and arrays.\r\n * It can handle various types of keys including strings, numbers, and symbols.\r\n * The function is optimized for performance and can handle very deep object structures.\r\n *\r\n * Key features:\r\n * - Iterative approach for better performance with deep structures\r\n * - Handles array indices (both as numbers and strings)\r\n * - Supports symbol keys\r\n * - Safely returns undefined for non-existent paths without throwing errors\r\n * - Type-safe with TypeScript\r\n *\r\n * Performance considerations:\r\n * - Efficient for very deep object structures (tested up to 1000 levels deep)\r\n * - Faster than naive recursive approaches for deep traversal\r\n *\r\n * Error handling:\r\n * - Returns undefined for non-existent paths or when trying to access properties of non-objects\r\n * - Throws an error if the input item is null/undefined or if the path is invalid\r\n *\r\n * @see safeReturnDeepProperty for a version that never throws and returns an object with value and error properties\r\n *\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\nconst returnDeepProperty = (item: unknown, path: PropertyPath): DeepPropertyValue => {\r\n // Input validation\r\n if (item == null) {\r\n throw new Error('Item cannot be null or undefined');\r\n }\r\n if (!Array.isArray(path) || path.length === 0) {\r\n throw new Error('Path must be a non-empty array');\r\n }\r\n\r\n // Internal traversal cursor: structurally `unknown` but read via narrowed branches below.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): refactor to a `Reflect`-based reader so cursor stays `unknown`.\r\n let current: any = item;\r\n for (let i = 0; i < path.length; i++) {\r\n const key = path[i];\r\n if(!key) return undefined\r\n\r\n // Check if we've hit undefined or null\r\n if (current == null) {\r\n return new PropertyAccessError(`Cannot access property '${String(key)}' of ${current}`, path.slice(0, i), key);\r\n }\r\n\r\n if (typeof key === 'object' && Array.isArray(key) && key.every(k=>'function' in k)) {\r\n // Handle array operations\r\n if (!Array.isArray(current)) {\r\n return new PropertyAccessError(`Cannot apply array operation to non-array`, path.slice(0, i), key);\r\n }\r\n current = arrayAccessFunctions(current, key);\r\n continue;\r\n }\r\n\r\n if (Array.isArray(current)) {\r\n if (typeof key === 'string') {\r\n const index = parseInt(key, 10);\r\n if (!isNaN(index) && index.toString() === key) {\r\n // Valid numeric index\r\n current = current[index];\r\n } else if (current.length > 0 && typeof current[0] === 'object' && key in current[0]) {\r\n // Valid property access on array elements\r\n current = current.map(item => item && typeof item === 'object' ? item[key] : undefined);\r\n } else {\r\n // Invalid key for array\r\n return new PropertyAccessError(`Invalid array access key: '${key}'`, path.slice(0, i + 1), key);\r\n }\r\n } else if (typeof key === 'number') {\r\n current = current[key];\r\n } else {\r\n return new PropertyAccessError(`Invalid array access key: '${String(key)}'`, path.slice(0, i + 1), key);\r\n }\r\n continue;\r\n }\r\n\r\n // Handle regular object property access\r\n if (typeof current !== 'object' && typeof current !== 'function') {\r\n return new PropertyAccessError(`Cannot access property '${String(key)}' of ${typeof current}`, path.slice(0, i), key);\r\n }\r\n\r\n if ((key as string | number) in current) {\r\n current = current[key as string | number];\r\n } else {\r\n return new PropertyAccessError(`Property '${String(key)}' does not exist`, path.slice(0, i + 1), key);\r\n }\r\n }\r\n\r\n return current;\r\n}\r\n\r\n/**\r\n * Safely retrieves a deeply nested property from an object using a path array.\r\n *\r\n * @function safeReturnDeepProperty\r\n *\r\n * @param {unknown} item - The object to traverse.\r\n * @param {(string|number|symbol)[]} path - An array representing the path to the desired property.\r\n * Each element in the array can be a string (for object properties),\r\n * a number (for array indices), or a symbol.\r\n *\r\n * @returns {{value: DeepPropertyValue, error: string|null}} An object containing:\r\n * - value: The value of the deep property if found, otherwise undefined.\r\n * - error: A string describing the error if one occurred, otherwise null.\r\n *\r\n * @example\r\n * const obj = {\r\n * a: {\r\n * b: [\r\n * { c: 1 },\r\n * { c: 2 }\r\n * ]\r\n * }\r\n * };\r\n *\r\n * safeReturnDeepProperty(obj, ['a', 'b', 1, 'c']);\r\n * // Returns { value: 2, error: null }\r\n *\r\n * safeReturnDeepProperty(obj, ['a', 'x']);\r\n * // Returns { value: undefined, error: \"Property 'x' does not exist\" }\r\n *\r\n * safeReturnDeepProperty(null, ['a']);\r\n * // Returns { value: undefined, error: \"Item cannot be null or undefined\" }\r\n *\r\n * @description\r\n * This function is a wrapper around returnDeepProperty that never throws exceptions.\r\n * Instead, it returns an object with both the retrieved value and any error message.\r\n * This makes it suitable for use in situations where you want to handle all possible\r\n * errors without try/catch blocks.\r\n *\r\n * Key features:\r\n * - Never throws exceptions\r\n * - Provides both the retrieved value and error information\r\n * - Handles the same range of inputs as returnDeepProperty\r\n *\r\n * Use this function when you need to:\r\n * - Safely traverse objects without worrying about exceptions\r\n * - Get detailed error information along with the result\r\n * - Implement error handling in a functional programming style\r\n *\r\n * @see returnDeepProperty for the core implementation that this function wraps\r\n *\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\n\r\nconst safeReturnDeepProperty = (item: unknown, path: PropertyPath): { value: DeepPropertyValue, error: string | null } => {\r\n try {\r\n const result = returnDeepProperty(item, path);\r\n if (result instanceof PropertyAccessError) {\r\n return { value: undefined, error: result.message };\r\n }\r\n return { value: result, error: null };\r\n } catch (error) {\r\n return { value: undefined, error: error instanceof Error ? error.message : String(error) };\r\n }\r\n}\r\n\r\n/**\r\n * Gets a value from an object by a dot-separated or array path.\r\n * Returns undefined if any segment is missing or null/undefined.\r\n */\r\nfunction getValueByPath<T = unknown>(obj: unknown, path: string | (string | number)[]): T | undefined {\r\n if (obj == null) return undefined;\r\n const segments = Array.isArray(path)\r\n ? path\r\n : path.split('.').map(s => s.trim()).filter(Boolean);\r\n if (segments.length === 0) return undefined;\r\n // Internal reducer cursor; each step narrows back to `Record<string|number, unknown>` for indexing.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): refactor to typed accessor.\r\n return segments.reduce<any>(\r\n (acc, seg) => (acc != null && acc[seg] !== undefined ? acc[seg] : undefined),\r\n obj\r\n ) as T | undefined;\r\n }\r\nexport { returnDeepProperty, safeReturnDeepProperty,getValueByPath, PropertyAccessError };\r\n","/**\n * Validates an object against a validation expression.\n *\n * @param {string} expression - The validation expression to evaluate.\n * @param {object} object - The object to validate.\n * @returns {boolean} - A boolean indicating whether the object is valid according to the expression.\n *\n * Backed by the shared predicate evaluator ({@link evaluatePredicate}), a\n * paren-aware, backward-compatible superset of the original space-split DSL. It\n * supports `===`/`==`/`!==`/`!=`/`>`/`<`/`>=`/`<=`, `&&`/`||` with correct\n * precedence and grouping, unary `!`, deep-path operands, multi-word quoted\n * strings, the keyword operators `includes`/`in`/`startsWith`/`endsWith`/`matches`,\n * and bare-operand truthiness.\n */\n\nimport { evaluatePredicate } from '../../functions/array-access/predicate-dsl';\n\n/**\n * Public callers pass either a plain object (e.g. `{ age: 1 }`) or an array\n * value (`item as T[]` from {@link evaluateArrayAccessRules}). Both are valid\n * index containers for the DSL (arrays support `length`, numeric indices, and\n * the `in` operator on string keys), so accept `object` and narrow internally.\n */\ntype ValidationTarget = object;\n\n/**\n * Validates an object against a predicate expression. Delegates to the shared,\n * paren-aware predicate evaluator (a backward-compatible superset of the\n * original space-split DSL). Throws on a structurally invalid expression.\n */\nconst validateObjectAgainstString = (expression: string, object: ValidationTarget): boolean => {\n return evaluatePredicate(expression, object);\n};\n\n/**\n * @public\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\n * barrel; remains functional. A renamed/improved replacement may be introduced\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\n */\nfunction validateExpressionSyntax(expression: string): string | null {\n expression = expression.trim();\n\n // Rule 1: Expression cannot be empty. An empty string is not a valid expression.\n if (typeof expression !== 'string') {\n throw new Error(\"Expression must be a string.\");\n }\n if (expression === '') {\n throw new Error(\"The expression cannot be blank. Please enter a condition.\");\n }\n\n // Rule 2: Check for balanced parentheses.\n // This ensures that every opening parenthesis has a corresponding closing one, and vice-versa.\n let balance = 0;\n for (let i = 0; i < expression.length; i++) {\n if (expression[i] === '(') {\n balance++;\n } else if (expression[i] === ')') {\n balance--;\n }\n // If balance drops below zero, it means an unmatched closing parenthesis appeared prematurely.\n if (balance < 0) {\n throw new Error(\"It looks like you have an extra closing parenthesis ')'. Please check your expression.\");\n }\n }\n // If balance is not zero at the end, it means there are unmatched opening parentheses.\n if (balance !== 0) {\n throw new Error(\"It looks like you're missing a closing parenthesis ')'. Make sure every opening parenthesis has a matching closing one.\");\n }\n\n // Rule 3: Handle outermost parentheses if they truly enclose the entire logical expression.\n // This recursive step simplifies the expression for further validation,\n // ensuring we only validate the \"core\" logical unit at each level.\n let isFullyEnclosed = false;\n if (expression.startsWith('(') && expression.endsWith(')')) {\n let openCount = 0;\n isFullyEnclosed = true;\n // Iterate through the content *inside* the potential outermost parentheses (from index 1 to length-2)\n // to check if any top-level logical operators exist within them.\n for (let i = 1; i < expression.length - 1; i++) {\n if (expression[i] === '(') {\n openCount++;\n } else if (expression[i] === ')') {\n openCount--;\n }\n // If we find a top-level logical operator (&& or ||) within the content\n // (i.e., openCount is 0, meaning not inside nested parentheses),\n // then the outer parentheses are just for grouping a sub-expression, not the entire expression.\n if (openCount === 0 && (expression.substring(i, i + 2) === '&&' || expression.substring(i, i + 2) === '||')) {\n isFullyEnclosed = false;\n break; // Found a top-level operator, so outer parentheses don't enclose the whole.\n }\n }\n }\n // If truly fully enclosed and balanced, recursively validate the inner expression.\n if (isFullyEnclosed) {\n return validateExpressionSyntax(expression.slice(1, -1).trim());\n }\n\n // Rule 4: Check for logical operators (|| then &&, respecting precedence).\n // We iterate to find the lowest precedence operator ('||') first, then '&&'.\n // This mirrors the parsing logic in `validateObjectAgainstString`.\n const logicalOperators = ['||', '&&'];\n\n for (const op of logicalOperators) {\n let openParenCount = 0;\n for (let i = 0; i < expression.length; i++) {\n if (expression[i] === '(') {\n openParenCount++;\n } else if (expression[i] === ')') {\n openParenCount--;\n }\n // If a top-level logical operator is found (outside any parentheses)\n if (openParenCount === 0 && expression.substring(i, i + op.length) === op) {\n // Split the expression into two parts around the operator.\n const part1 = expression.substring(0, i).trim();\n const part2 = expression.substring(i + op.length).trim();\n\n // Rule 4a: Logical operators cannot be at the beginning or end of an expression\n // (i.e., parts cannot be empty). This catches cases like \"&& b\" or \"a &&\".\n if (part1 === '' || part2 === '') {\n throw new Error(`The expression seems incomplete. A connector like '${op}' must have a condition on both sides.`);\n\n }\n // Rule 4b: Recursively validate both parts of the logical expression.\n // If both parts are syntactically valid, then this logical expression is valid.\n return validateExpressionSyntax(part1) && validateExpressionSyntax(part2);\n }\n }\n }\n\n // Rule 5: If no top-level logical operators were found, it must be a simple comparison.\n // Use regex to validate the format of a simple comparison: `operand operator operand`.\n\n // Regex for valid identifiers (e.g., object keys like 'age', 'name').\n const identifierRegex = `[a-zA-Z_][a-zA-Z0-9_]*`;\n // Regex for valid number literals (e.g., '10', '3.14').\n const numberRegex = `\\\\d+(?:\\\\.\\\\d+)?`;\n // Regex for valid boolean literals.\n const booleanRegex = `true|false`;\n // Regex for valid string literals (enclosed in single or double quotes, handles escaped quotes).\n const stringLiteralRegex = `(['\"])(?:(?=(\\\\\\\\?))\\\\2.)*?\\\\1`;\n\n // Combined regex for any valid operand type. This covers object keys, booleans, numbers, and strings.\n const operandRegex = `(?:${identifierRegex}|${booleanRegex}|${numberRegex}|${stringLiteralRegex})`;\n\n // Regex for valid comparison operators (sorted by length descending for correct matching).\n const comparisonOperators = `===|==|!==|!=|>=|<=|>|<`;\n\n // Full regex pattern for a simple comparison, allowing for flexible whitespace around operands and operators.\n const simpleComparisonPattern = new RegExp(`^\\\\s*(${operandRegex})\\\\s*(${comparisonOperators})\\\\s*(${operandRegex})\\\\s*$`);\n\n const match = expression.match(simpleComparisonPattern);\n\n // Rule 5a: If the expression doesn't match the simple comparison pattern, it's invalid.\n // This catches malformed comparisons or unrecognized characters.\n if (!match) {\n throw new Error(`The expression '${expression}' seems invalid. A condition should look like 'value > 10' or 'status == \"active\"'.`);\n\n }\n\n // Rule 5b: Although regex matches, ensure operands are not just empty strings if the regex allowed it.\n // (The `operandRegex` is already designed to prevent truly empty matches, but this adds robustness).\n const [, leftRaw, , rightRaw] = match;\n if (leftRaw?.trim() === '' || rightRaw?.trim() === '') {\n throw new Error(`A value seems to be missing in your expression '${expression}'. Please check both sides of the operator.`);\n }\n\n // If all checks pass for this level of the expression, it is considered syntactically valid.\n return null;\n}\n\nexport { validateObjectAgainstString, validateExpressionSyntax }\n","import { ConfigurationValidTestInterface } from 'ngx-t-forms-types';\r\n\r\n\r\nimport { safeReturnDeepProperty } from \"../../../shared/functions/getDeepObject\";\r\nimport { validateObjectAgainstString } from '../../../shared/modules/stringJsonValidator/getObjectValidations';\r\n/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\nexport function testAgainstItem(test: ConfigurationValidTestInterface, item: unknown): boolean {\r\n try {\r\n const testValue = test.deepBind ? safeReturnDeepProperty(item, test.deepBind || [])?.value : item\r\n const key = test.deepBind ? test.deepBind[test.deepBind.length - 1] : ''\r\n const objectValue = test.deepBind ? { [key || '']: testValue } : testValue\r\n if (test.expression) {\r\n try {\r\n return validateObjectAgainstString(test.expression, (objectValue ?? {}) as object);\r\n } catch {\r\n return false\r\n }\r\n \r\n }\r\n if(test.testType === 'exists'){\r\n return test.testType === 'exists' && testValue !== '' && testValue !== undefined;\r\n }\r\n if(test.testType === 'equalTo'){\r\n return testValue === test.valueMatch\r\n }\r\n return false\r\n } catch (error) {\r\n return false\r\n }\r\n }","\r\nimport { FormInterface, getElementEditorConfig } from \"ngx-t-forms-types\";\r\nimport { validateFormColumnInputsWithRequired } from \"ngx-t-forms-types\";\r\nimport { AllFormInputPrimaryKeys, DefaultInputConfig, ElementEditorInnerSectionElementInterface, ElementEditorTypes, FormInputKeys, SpecialElementKeys } from \"ngx-t-forms-types\";\r\nimport { DefaultInputConfigInterface } from \"ngx-t-forms-types\";\r\nimport { FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport { InClassFormUtilsInterface, NgxTFormsConfig } from \"ngx-t-forms-types\";\r\nimport { testAgainstItem } from \"../../../../components/t-dynamic-data-edit/functions/testData\";\r\nimport { ValidationError } from \"ngx-t-forms-types\";\r\n\r\n/** Union of identifier types accepted by element-applicability tests. */\r\ntype ElementNameKey = FormInputKeys | SpecialElementKeys | AllFormInputPrimaryKeys;\r\n\r\nexport function inputElementEditorConfigs(form: FormInterface | undefined, inputInEdit: (FormColumnInputs) | undefined,\r\n NGX_T_FORMS_CONFIG: NgxTFormsConfig, utils: InClassFormUtilsInterface) {\r\n try {\r\n // Get base configuration \r\n const config = getElementEditorConfig\r\n // Get validation errors for the input being edited\r\n const errors = inputInEditValidationErrors(form, inputInEdit)\r\n // Create a completely new configuration object (for change detection)\r\n return {\r\n ...config, // Copy all base properties\r\n // Create new array with new section objects\r\n editorSections: config.editorSections.map(section => {\r\n\r\n const elements: ElementEditorInnerSectionElementInterface[] = getSectionElements(section.elements, inputInEdit, NGX_T_FORMS_CONFIG, utils, errors);\r\n // Check if any element in this section has errors\r\n const hasErrors = section.elements.some(el =>\r\n errors.some(err => err.key === el.deepBind?.join('.')))\r\n return ({\r\n ...section,\r\n elements: elements.map(el => ({\r\n ...el,\r\n editType: el.deepBind[0] === AllFormInputPrimaryKeys.FormControlName && (/^[^.]+(\\.[^.]+)+$/).test(inputInEdit?.formControlName || '')\r\n ? ElementEditorTypes.ChipOptionsCreator\r\n : el.editType,\r\n })),\r\n hasErrors\r\n })\r\n })\r\n };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to configure columns';\r\n throw new Error(message)\r\n\r\n }\r\n}\r\n\r\n/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\nexport function getSectionElements(elements: ElementEditorInnerSectionElementInterface[],\r\n inputInEdit: (FormColumnInputs) | undefined, NGX_T_FORMS_CONFIG: NgxTFormsConfig,\r\n utils: InClassFormUtilsInterface, errors: ValidationError[] = []): ElementEditorInnerSectionElementInterface[] {\r\n try {\r\n const defaultInputs: DefaultInputConfigInterface = { ...DefaultInputConfig }\r\n if (!inputInEdit) return []\r\n const defaultInput = defaultInputs[inputInEdit?.element]\r\n const processedElements = elements\r\n .map(el => processElement(el, inputInEdit, NGX_T_FORMS_CONFIG, utils, errors))\r\n // `processElement` returns `[]` on the no-input branch; drop those so\r\n // the filter callback can rely on an element shape.\r\n .filter((el): el is ElementEditorInnerSectionElementInterface => !Array.isArray(el));\r\n const filteredElements = processedElements.filter(el => isElementApplicable(inputInEdit, defaultInput?.properties, el));\r\n // DEPRECATED: the MongoDB pipeline builder is no longer offered as a\r\n // selectable editor option. Already-configured (legacy) inputs still render\r\n // via the t-dynamic-data-edit switch case; authors can no longer pick it.\r\n return filteredElements.filter(el => el.editType !== ElementEditorTypes.MongoPipelineBuilder);\r\n } catch (err) {\r\n return [];\r\n }\r\n}\r\n\r\nexport function processElement(element: ElementEditorInnerSectionElementInterface,\r\n inputInEdit: (FormColumnInputs) | undefined, NGX_T_FORMS_CONFIG: NgxTFormsConfig,\r\n utils: InClassFormUtilsInterface, errors: ValidationError[] = []): ElementEditorInnerSectionElementInterface | [] {\r\n const defaultInputs: DefaultInputConfigInterface = { ...DefaultInputConfig }\r\n if (!inputInEdit) return []\r\n const defaultInput = defaultInputs[inputInEdit?.element]\r\n // `requiredProperties` is typed as `Array<FormInputKeys | AllFormInputPrimaryKeys>`\r\n // while `element.name` widens to include `SpecialElementKeys`. The narrowing\r\n // happens by string equality at runtime; describe that to the compiler\r\n // without smuggling an `any` through.\r\n const requiredKeys = (defaultInput?.requiredProperties ?? []) as readonly ElementNameKey[];\r\n return {\r\n ...element,\r\n computedErrors: computedErrors(element, errors),\r\n required: requiredKeys.includes(element.name),\r\n postmanCollectionConfig: getPostmanConfig(element, NGX_T_FORMS_CONFIG),\r\n httpGetDataFunction: utils.httpGetDataFunction.bind(utils),\r\n getWorkflowOptions: NGX_T_FORMS_CONFIG.formBuilder.workflows(),\r\n getMscoaTree: element.editType === ElementEditorTypes.ConfigMscoaSegments ?\r\n NGX_T_FORMS_CONFIG.formBuilder.getScoaTree() :\r\n undefined\r\n };\r\n};\r\n\r\nexport function getPostmanConfig(element: ElementEditorInnerSectionElementInterface, NGX_T_FORMS_CONFIG: NgxTFormsConfig): { collectionUrl: string; collectionKey: string } | undefined {\r\n const validForPostman = [ElementEditorTypes.ApiCall, ElementEditorTypes.ApiValueAccessRules,ElementEditorTypes.DataSourcePicker].includes(element.editType) \r\n \r\n if(!validForPostman) return undefined;\r\n\r\n const config = {\r\n collectionUrl: String(NGX_T_FORMS_CONFIG['POSTMAN_COLLECTION_URL'] || ''),\r\n collectionKey: String(NGX_T_FORMS_CONFIG['POSTMAN_COLLECTION_KEY'] || '')\r\n };\r\n return config\r\n}\r\nexport function isElementApplicable(\r\n input: FormColumnInputs,\r\n inputProperties: ElementNameKey[] | undefined,\r\n element: ElementEditorInnerSectionElementInterface\r\n): boolean {\r\n const { name, additionalTest } = element;\r\n const isDefault = name === SpecialElementKeys.Default;\r\n\r\n if (!!isDefault && !additionalTest) return true;\r\n\r\n\r\n // Check property inclusion. `name` and `inputProperties` are both already\r\n // typed as `ElementNameKey`-family unions.\r\n const isInputProperty = inputProperties?.includes(name);\r\n if (!isInputProperty && !isDefault) return false;\r\n\r\n // Execute additional tests\r\n return additionalTest ?\r\n additionalTest.every(test => testAgainstItem(test, input)) :\r\n !!isInputProperty;\r\n};\r\nexport function inputInEditValidationErrors(form: FormInterface | undefined, inputInEdit: (FormColumnInputs) | undefined): ValidationError[] {\r\n try {\r\n const defaultInputs: DefaultInputConfigInterface = { ...DefaultInputConfig }\r\n\r\n let allInputs = form?.slides?.flatMap(slide => slide.columns) || []\r\n const parentInput = allInputs.find(input => input.id === inputInEdit?.multipleInputInEditId)\r\n\r\n if (!inputInEdit || !inputInEdit.element) return []\r\n const editingNewInput = !inputInEdit?.id\r\n // `ValidationOptions.requiredKeys` was widened upstream (H-014) to include\r\n // `SpecialElementKeys`, so this lookup no longer needs an `any` escape hatch.\r\n const requiredKeys = defaultInputs[inputInEdit.element]?.requiredProperties ?? [];\r\n // `validateFormColumnInputsWithRequired` accepts a `Record<string, unknown>`\r\n // value-bag; spreading produces a plain object that satisfies the index\r\n // signature without a double cast.\r\n const dataBag: Record<string, unknown> = { ...inputInEdit };\r\n if (!editingNewInput) {\r\n return validateFormColumnInputsWithRequired({\r\n data: dataBag,\r\n requiredKeys,\r\n })\r\n }\r\n // Improved duplicate check logic\r\n const isDuplicateFormControl = () => {\r\n if (!inputInEdit.formControlName) return false\r\n if (parentInput) {\r\n return parentInput.formInputs?.some(input =>\r\n input.formControlName === inputInEdit.formControlName\r\n ) || false\r\n }\r\n return allInputs.some(input =>\r\n input.formControlName === inputInEdit.formControlName\r\n )\r\n }\r\n\r\n const duplicateError = isDuplicateFormControl()\r\n ? [{ key: 'formControlName', message: 'Form control name must be unique' }]\r\n : []\r\n\r\n return [...duplicateError, ...validateFormColumnInputsWithRequired({\r\n data: dataBag,\r\n requiredKeys,\r\n })]\r\n\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Failed to check form config';\r\n throw new Error(msg)\r\n\r\n }\r\n}\r\n\r\nfunction computedErrors(element: ElementEditorInnerSectionElementInterface, allErrors: ValidationError[]) {\r\n\r\n const errors = allErrors?.filter(error => error.key === element.deepBind?.join('.'))\r\n return [...[], ...errors];\r\n}","import { ElementTypes, FormColumnInputs, FormInterface } from \"ngx-t-forms-types\";\r\n\r\nexport const returnAnyFormInputFromForm = (form: FormInterface, id: string): FormColumnInputs | undefined => {\r\n try {\r\n const [mainInputId, nestedInputId] = id.split(\".\");\r\n \r\n if (!mainInputId) return undefined;\r\n \r\n // Flatten all form inputs from the structure\r\n const allInputs = form.slides.flatMap(slide => \r\n slide.columns.flatMap(column => {\r\n if(column.element === ElementTypes.MultipleInput ) {\r\n return [column, ...(column?.formInputs || [])] \r\n }\r\n if(column.element === ElementTypes.MscoaSelection){\r\n return [column, ...(column?.mscoaConfig.inputs || [])]\r\n }\r\n return [column] // return only the\r\n \r\n }\r\n \r\n )\r\n );\r\n \r\n // Find the main input by ID\r\n const mainInput = allInputs.find(input => input.id === mainInputId);\r\n \r\n if (!mainInput) return undefined;\r\n \r\n // If it's a multiple input and we have a nested ID, find the nested input\r\n if (mainInput.element === ElementTypes.MultipleInput && nestedInputId) {\r\n return mainInput.formInputs?.find(input => input.id === nestedInputId);\r\n }\r\n if(mainInput.element === ElementTypes.DateRangePicker && nestedInputId) {\r\n const isStartDate = nestedInputId === mainInput.startDateControl;\r\n const rangeValue = mainInput.value as { start?: unknown; end?: unknown } | undefined;\r\n return {\r\n ...mainInput,\r\n id,\r\n value: (isStartDate ? rangeValue?.start : rangeValue?.end) as FormColumnInputs['value'],\r\n\r\n }\r\n }\r\n\r\n // If it's a mscoa input and we have a nested ID, find the nested input\r\n if (mainInput.element === ElementTypes.MscoaSelection && nestedInputId) {\r\n return mainInput.mscoaConfig.inputs?.find(input => input.id === nestedInputId);\r\n }\r\n \r\n // Otherwise return the main input\r\n return mainInput;\r\n \r\n } catch (error) {\r\n throw new Error(error instanceof Error ? error.message : 'Failed to find form input');\r\n }\r\n };","import { computed, Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport type { Observable } from 'rxjs';\nimport {\n DefaultInputConfig,\n DefaultInputConfigInterface,\n validateForm,\n} from 'ngx-t-forms-types';\nimport { validateFormColumnInputsWithRequired } from 'ngx-t-forms-types';\nimport type { AllFormInputPrimaryKeys, FormInputKeys, ValidationError } from 'ngx-t-forms-types';\nimport { validateFormSlide } from 'ngx-t-forms-types';\nimport { missingConfig } from '../../../services/core/t-form-builder/functions/formCanSave';\nimport { inputElementEditorConfigs } from '../../../services/core/t-form-builder/functions/inputElementEditorConfigs';\nimport { returnAnyFormInputFromForm } from '../functions/findFormInput';\nimport { FormsStoreService } from './forms-store.service';\n\n/** Element keys actually present in `DefaultInputConfigInterface`. */\ntype ConfiguredElementType = keyof DefaultInputConfigInterface;\n/** Required-key list shape consumed by `validateFormColumnInputsWithRequired`. */\ntype RequiredKeyList = ReadonlyArray<FormInputKeys | AllFormInputPrimaryKeys>;\n\n/**\n * Signal-native mirror of {@link formsFormBuilderStoreSelectors}. Each derived\n * value is a synchronous projection of `editForm` / `inputInEdit`, so it becomes\n * a memoised `computed()` graph — `computed()` already provides the multicast +\n * reference-stable memoisation the Observable layer hand-rolled with\n * `shareLatest`/`distinctUntilChanged` (plan P4). The pure projection helpers\n * (`validateForm`, `missingConfig`, …) are reused verbatim, so behaviour is\n * identical; only the reactive wrapper differs.\n *\n * The one genuinely-async selector — `getAllFormInputs` — fans into an HTTP call\n * (`getFinacialCycles`), so it stays an Observable adapted once via `toSignal`.\n *\n * @internal\n */\nexport function formsFormBuilderStoreSignalSelectors(store: FormsStoreService) {\n const defaultInputs: DefaultInputConfigInterface = { ...DefaultInputConfig };\n\n /** `editForm?.form` — the upstream shared by ~12 derived reads. */\n const formInEdit = computed(() => store.signalSelectors.selectFormInEdit()?.form);\n\n const selectFormSlides = computed(() => [...(formInEdit()?.slides || [])]);\n\n const selectFormSlideSections = computed(() =>\n selectFormSlides().map((slide) => ({\n ...slide,\n inputConfigErrors: validateFormSlide(slide),\n })),\n );\n\n const missingConfigSignal = computed(() => missingConfig(formInEdit()));\n\n const canSaveForm = computed(() => {\n if (store.signalSelectors.selectFormBuilderIsBusy()) return false;\n const form = formInEdit();\n return form !== undefined ? validateForm(form).length === 0 : false;\n });\n\n const hasMissingConfigs = computed(() => !canSaveForm());\n\n const isNewForm = computed(() => !formInEdit()?.formId);\n\n const formErrors = computed<ReadonlyArray<ValidationError>>(() => {\n const form = formInEdit();\n return form === null\n ? [{ message: 'Form is empty', key: 'form' }]\n : validateForm(form as Parameters<typeof validateForm>[0]);\n });\n\n const formValidationErrorsMessages = computed(() => {\n const errors: ReadonlyArray<ValidationError> = formErrors() || [];\n const errorCounts = errors.reduce<Record<string, number>>((acc, error) => {\n acc[error.message] = (acc[error.message] || 0) + 1;\n return acc;\n }, {});\n return Object.entries(errorCounts).map(([message, count]) =>\n count > 1 ? `${message} × ( ${count} )` : message,\n );\n });\n\n const inputInEdit = computed(() => {\n const inputInEditId = store.signalSelectors.selectInputInEditId();\n const form = formInEdit();\n return form && inputInEditId !== null ? returnAnyFormInputFromForm(form, inputInEditId) : undefined;\n });\n\n const defaultInputInEdit = computed(() => {\n const current = inputInEdit();\n if (!current) return null;\n const element = current.element as ConfiguredElementType;\n return defaultInputs[element] ?? null;\n });\n\n const inputInEditValidationErrors = computed<ReadonlyArray<ValidationError>>(() => {\n const form = formInEdit();\n const current = inputInEdit();\n\n const allInputs = form?.slides.flatMap((slide) => slide.columns) || [];\n const parentInput = allInputs.find((input) => input.id === current?.multipleInputInEditId);\n\n if (!current || !current.element) return [];\n\n const editingNewInput = !current.id;\n const elementKey = current.element as ConfiguredElementType;\n // `requiredProperties` is `(FormInputKeys | AllFormInputPrimaryKeys | SpecialElementKeys)[]`,\n // but `RequiredKeyList` only narrows to the first two. The third is filtered at the validator boundary.\n const requiredKeys = (defaultInputs[elementKey]?.requiredProperties ?? []) as RequiredKeyList;\n const inputAsRecord: Record<string, unknown> = { ...current };\n if (!editingNewInput) {\n return validateFormColumnInputsWithRequired({\n data: inputAsRecord,\n requiredKeys: [...requiredKeys],\n });\n }\n\n const isDuplicateFormControl = (): boolean => {\n if (!current.formControlName) return false;\n if (parentInput) {\n return (\n parentInput.formInputs?.some((input) => input.formControlName === current.formControlName) ||\n false\n );\n }\n return allInputs.some((input) => input.formControlName === current.formControlName);\n };\n\n const duplicateError = isDuplicateFormControl()\n ? [{ key: 'formControlName', message: 'Form control name must be unique' }]\n : [];\n\n return [\n ...duplicateError,\n ...validateFormColumnInputsWithRequired({\n data: inputAsRecord,\n requiredKeys: [...requiredKeys],\n }),\n ];\n });\n\n const selectFormTitle = computed(() => formInEdit()?.formTitle);\n\n const inputElementEditorConfigsSignal = computed(() =>\n inputElementEditorConfigs(formInEdit(), inputInEdit(), store.NGX_T_FORMS_CONFIG, store.utils),\n );\n\n // Genuinely async (HTTP fan-in via `getFinacialCycles`): keep the Observable\n // selector, adapt to a signal once here so consumers stay pull-based.\n type GetAllFormInputsValue =\n typeof store.formBuilderSelectors.getAllFormInputs$ extends Observable<infer T> ? T : never;\n const getAllFormInputs = toSignal(store.formBuilderSelectors.getAllFormInputs$, {\n initialValue: [] as GetAllFormInputsValue,\n });\n\n return {\n selectFormSlides,\n selectFormSlideSections,\n missingConfig: missingConfigSignal,\n canSaveForm,\n isNewForm,\n hasMissingConfigs,\n formErrors,\n formValidationErrorsMessages,\n inputInEdit,\n defaultInputInEdit,\n inputInEditValidationErrors,\n selectFormTitle,\n inputElementEditorConfigs: inputElementEditorConfigsSignal,\n getAllFormInputs,\n } satisfies Record<string, Signal<unknown>>;\n}\n","import { FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\n\r\n/**\r\n * Deeply merges two objects\r\n * @param target The target object\r\n * @param source The source object to merge into the target\r\n * @returns A new object with properties from both objects deeply merged\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): recursive deep-merge over heterogeneous objects; narrower types reject the descent. Internal helper.\r\nexport function deepMerge(target: any, source: any): any {\r\n // Handle null/undefined cases\r\n if (source === null || source === undefined) {\r\n return target;\r\n }\r\n if (target === null || target === undefined) {\r\n return source;\r\n }\r\n\r\n // Create a new object to avoid modifying the target\r\n const result = { ...target };\r\n // Iterate through source properties\r\n Object.keys(source).forEach(key => {\r\n const sourceValue = source[key];\r\n const targetValue = target[key];\r\n\r\n // If both values are objects (and not null), merge them recursively\r\n if (\r\n sourceValue && targetValue &&\r\n typeof sourceValue === 'object' && typeof targetValue === 'object'\r\n ) {\r\n // Handle arrays specially\r\n if (Array.isArray(sourceValue) && Array.isArray(targetValue)) {\r\n result[key] = [...sourceValue]; // Replace arrays by default\r\n } else {\r\n // For objects, recursively merge\r\n result[key] = deepMerge(targetValue, sourceValue);\r\n }\r\n } else {\r\n // For non-objects or if only one side is an object, use the source value\r\n result[key] = sourceValue;\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Updates a form input configuration with deep merge support\r\n */\r\nexport const updateFormInputConfig = (\r\n self: FormTowerControllerService,\r\n inputId: string,\r\n config: FormColumnInputs\r\n) => {\r\n const form = self.form;\r\n\r\n if (!form) {\r\n throw new Error('Form not initialized');\r\n }\r\n\r\n\r\n self.form = {\r\n ...form,\r\n slides: form.slides.map((slide) => ({\r\n ...slide,\r\n columns: slide.columns.map((column) => {\r\n if (column.id === inputId) {\r\n self._onFormInputConfigChange?.(inputId, deepMerge(column, config));\r\n return deepMerge(column, config);\r\n }\r\n if (column.formInputs) {\r\n return {\r\n ...column,\r\n formInputs: column.formInputs.map((input) => {\r\n if (input.id === inputId || input.id === inputId.split('.')[1]) {\r\n self._onFormInputConfigChange?.(inputId, deepMerge(input, config));\r\n return deepMerge(input, config);\r\n }\r\n return input;\r\n })\r\n }\r\n \r\n }\r\n return column;\r\n }\r\n\r\n\r\n )\r\n }))\r\n };\r\n \r\n};","\r\nimport { ActivatedRouteSnapshot } from \"@angular/router\";\r\nimport { DatabaseFormInterface, ElementTypes, FormColumnInputs, FormInterface } from 'ngx-t-forms-types';\r\nimport { FormListSection, FormStateErrors, IFormsInitStateInterface } from 'ngx-t-forms-types';\r\nimport { validateForm } from 'ngx-t-forms-types';\r\nimport { FormsStoreService } from \"./forms-store.service\";\r\nimport { deepMerge } from \"../../../services/core/t-form-tower-controller/functions/updateFormInputConfig\";\r\n\r\n\r\nconst handleLoadFormListSuccess = (state: IFormsInitStateInterface, { forms }: { forms: DatabaseFormInterface[] }) => ({\r\n ...state,\r\n forms: forms.map((form) => ({ \r\n ...form,\r\n busy: false,\r\n errors: validateForm({\r\n slides: form.form.slides,\r\n submissionHandle: form.form.submissionHandle,\r\n formId: form._id,\r\n formTitle: form.form.formTitle,\r\n })\r\n }))\r\n});\r\n\r\nconst handleToggleFormBuilderBusy = (state: IFormsInitStateInterface) => ({\r\n ...state,\r\n formBuilderBusy: !state.formBuilderBusy\r\n});\r\n\r\nconst handleSetSubmittingForm = (state: IFormsInitStateInterface, { submittingForm }: { submittingForm: boolean }) => ({\r\n ...state,\r\n submittingForm\r\n});\r\nconst handleToggleLoadingForm = (state: IFormsInitStateInterface) => ({\r\n ...state,\r\n loadingForm: !state.loadingForm\r\n});\r\n\r\nconst handleToggleLoadingForms = (state: IFormsInitStateInterface,{loadingForms}:{loadingForms:boolean}) => ({\r\n ...state,\r\n loadingForms: loadingForms\r\n});\r\n\r\nconst handleLoadFormSuccess = (state: IFormsInitStateInterface, { form }: { form: DatabaseFormInterface }) => ({\r\n ...state,\r\n editForm: {\r\n ...state.editForm,\r\n ...form,\r\n }\r\n});\r\n\r\nconst handleToggleFormBusy = (state: IFormsInitStateInterface, { formId }: { formId: string }) => ({\r\n ...state,\r\n forms: state.forms.map(form => form._id === formId ? { ...form, busy: !form.busy } : form)\r\n});\r\nconst handleSetFormInitialValues = (state: IFormsInitStateInterface, { initialFormValues }: { initialFormValues: Record<string, any> }) => ({\r\n ...state,\r\n initialFormValues\r\n});\r\n\r\nconst handleArchivedSuccess = (state: IFormsInitStateInterface, { formId }: { formId: string }) => ({\r\n ...state,\r\n forms: state.forms.filter(form => form._id !== formId)\r\n});\r\nconst handleSetFormId = (state: IFormsInitStateInterface, { formId }: { formId: string }) => ({\r\n ...state,\r\n formId\r\n});\r\nconst handleListSectionChange = (state: IFormsInitStateInterface, { listSection }: { listSection: FormListSection}) => ({\r\n ...state,\r\n listSection: listSection === null || listSection === undefined ? FormListSection.ALL : listSection\r\n});\r\nconst handleSetError = (state: IFormsInitStateInterface, { error, type }: { error: string|undefined, type: FormStateErrors}) => {\r\n const errors = {\r\n ArchiveForm: state.errors?.ArchiveForm,\r\n CreateForm: state.errors?.CreateForm,\r\n UpdateForm: state.errors?.UpdateForm,\r\n GetForm: state.errors?.GetForm,\r\n LoadForms: state.errors?.LoadForms,\r\n [type]: error\r\n };\r\n return { ...state, errors };\r\n}\r\nconst handleEditorUpdateFormInEdit = (state: IFormsInitStateInterface, { form }: { form: FormInterface }) => ({\r\n ...state,\r\n editForm: {\r\n ...state.editForm,\r\n form\r\n } as DatabaseFormInterface\r\n});\r\n\r\nconst handleSetInputInEditId = (state: IFormsInitStateInterface, { inputInEdit }: { inputInEdit: string |null}) => ({\r\n ...state,\r\n inputInEdit\r\n});\r\n\r\nconst handleRouterStateChange = (state: IFormsInitStateInterface, { routerState }: { routerState: ActivatedRouteSnapshot|null }) =>\r\n ({ ...state, routerState }) as IFormsInitStateInterface\r\nconst handleUpdateFormInputConfigFromTower = (\r\n state: IFormsInitStateInterface,\r\n { inputId, config }: { inputId: string; config: FormColumnInputs }\r\n) => {\r\n const currentForm = state.editForm?.form;\r\n if (!currentForm) return state;\r\n\r\n const updatedForm: FormInterface = {\r\n ...currentForm,\r\n slides: currentForm.slides.map((slide) => ({\r\n ...slide,\r\n columns: slide.columns.map((column) => {\r\n if (column.id === inputId) {\r\n return deepMerge(column, config);\r\n }\r\n if (column.formInputs) {\r\n return {\r\n ...column,\r\n formInputs: column.formInputs.map((input) =>\r\n input.id === inputId || input.id === inputId.split('.')[1]\r\n ? deepMerge(input, config)\r\n : input\r\n )\r\n };\r\n }\r\n if (column.element === ElementTypes.MscoaSelection && column.mscoaConfig?.inputs) {\r\n return {\r\n ...column,\r\n mscoaConfig: {\r\n ...column.mscoaConfig,\r\n inputs: column.mscoaConfig.inputs.map((input) =>\r\n input.id === inputId || input.id === inputId.split('.')[1]\r\n ? deepMerge(input, config)\r\n : input\r\n )\r\n }\r\n };\r\n }\r\n return column;\r\n })\r\n }))\r\n };\r\n\r\n return {\r\n ...state,\r\n editForm: {\r\n ...state.editForm,\r\n form: updatedForm\r\n } as DatabaseFormInterface\r\n };\r\n};\r\n\r\nexport function formsStoreActions(store:FormsStoreService ) {\r\n\r\n return {\r\n \r\n loadFormListSuccess: store.updater(handleLoadFormListSuccess),\r\n toggleFormBuilderBusy: store.updater(handleToggleFormBuilderBusy),\r\n toggleLoadingForm: store.updater(handleToggleLoadingForm),\r\n toggleLoadingForms: store.updater(handleToggleLoadingForms),\r\n loadFormSuccess: store.updater(handleLoadFormSuccess),\r\n toggleFormBusy: store.updater(handleToggleFormBusy),\r\n archivedSuccess: store.updater(handleArchivedSuccess),\r\n setFormId: store.updater(handleSetFormId),\r\n setError: store.updater(handleSetError),\r\n handleListSectionChange : store.updater(handleListSectionChange),\r\n handleRouterStateChange : store.updater(handleRouterStateChange),\r\n handleSetSubmittingForm: store.updater(handleSetSubmittingForm),\r\n setFormInitialValues: store.updater(handleSetFormInitialValues),\r\n handleEditorUpdateFormInEdit: store.updater(handleEditorUpdateFormInEdit),\r\n updateFormInputConfigFromTower: store.updater(handleUpdateFormInputConfigFromTower),\r\n setInputInEditId: store.updater(handleSetInputInEditId)\r\n \r\n }\r\n}","import { FormColumnInputs, FormInterface, FormInterfaceMigration, FormSubmissionHandleInterface, IAllInputs, OLD_FormInterface } from 'ngx-t-forms-types';\r\nimport { APIDataFetchingConfigurationInterface } from \"ngx-t-forms-types\";\r\nimport { DataSources } from \"ngx-t-forms-types\"\r\nimport { FormSlideInterface } from \"ngx-t-forms-types\"\r\nimport { formColumnInputsSchema } from \"ngx-t-forms-types\"\r\n\r\nconst emptyForm: FormInterface = {\r\n slides: [],\r\n submissionHandle: { submissionAPI: [] },\r\n formId: undefined,\r\n formTitle: ''\r\n}\r\n\r\n/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\nconst initFormConfigToV2: (formConfig: FormInterfaceMigration) => FormInterface = (formConfig: FormInterfaceMigration) => {\r\n try {\r\n if (!formConfig) return emptyForm;\r\n if (itsOldFormConfig(formConfig)) {\r\n const { formId, formTitle, } = formConfig;\r\n const newForm: FormInterface = {\r\n slides: transformSlides(formConfig),\r\n submissionHandle: transformOldSubmissionHandle(formConfig),\r\n formId,\r\n formTitle,\r\n }\r\n return newForm;\r\n\r\n }\r\n return formConfig;\r\n } catch {\r\n return emptyForm;\r\n\r\n\r\n }\r\n\r\n}\r\n\r\n\r\nfunction transformOldSubmissionHandle(config: OLD_FormInterface):FormSubmissionHandleInterface {\r\n try {\r\n const { submisionHandle } = config;\r\n const canSubmitAPI:Array<APIDataFetchingConfigurationInterface> =submisionHandle.canSubmitAPI ? [{\r\n _id: submisionHandle.canSubmitAPI._id,\r\n name: 'No Name',\r\n httpEndPoint: submisionHandle.canSubmitAPI.httpEndPoint,\r\n inputSourceId: '',\r\n httpMethod:submisionHandle.canSubmitAPI.httpMethod,\r\n postFormData: submisionHandle.canSubmitAPI.httpMethod === 'POST',\r\n backEndConfig: {\r\n minimumInputRequired: [] \r\n },\r\n valueAccessRules: [],\r\n \r\n source:DataSources.Api,\r\n \r\n }] : []\r\n const submissionAPI:APIDataFetchingConfigurationInterface[] = [{\r\n _id: submisionHandle.submissionId._id,\r\n name: 'No Name',\r\n httpEndPoint: submisionHandle.submissionId.httpEndPoint,\r\n inputSourceId: '',\r\n httpMethod:submisionHandle.submissionId.httpMethod,\r\n postFormData: submisionHandle.submissionId.httpMethod === 'POST',\r\n backEndConfig: {\r\n minimumInputRequired: [] \r\n },\r\n valueAccessRules: [],\r\n \r\n source:DataSources.Api,\r\n \r\n }]\r\n return {\r\n innerComponentShowSubmitButton: submisionHandle?.innerComponentShowSubmitButton,\r\n canSubmitAPI ,\r\n submissionAPI,\r\n submissionMessage: submisionHandle.handle.submissionMessage\r\n }\r\n } catch (error) {\r\n void error;\r\n return { submissionAPI: [] }\r\n }\r\n\r\n}\r\nfunction transformSlides(config: OLD_FormInterface): Array<FormSlideInterface> {\r\n\r\n const { slides, formSectionSteps } = config\r\n return (slides||[]).map((slide) => {\r\n const step = (formSectionSteps|| []).find((section) => section.sectionId === slide.sectionId);\r\n return {\r\n label: step?.label || '',\r\n sectionId: slide.sectionId,\r\n columns: transformOldInputs(slide.slideContentRows[0]?.columns||[]),\r\n }\r\n })\r\n\r\n}\r\nfunction transformOldInputs(columns: Array<IAllInputs>): Array<FormColumnInputs> {\r\n const c = (columns||[]).map((column) => formColumnInputsSchema\r\n .validate(column, { stripUnknown: true,\r\n presence: 'required',\r\n abortEarly: false }).value\r\n\r\n\r\n\r\n )\r\n return c;\r\n\r\n\r\n}\r\nconst itsOldFormConfig = (formConfig: FormInterfaceMigration): formConfig is OLD_FormInterface => {\r\n if (typeof formConfig !== 'object') return false;\r\n const hasOldPrimaryKeys = (['formSectionSteps', 'activeSlideNumber'] as const).every(\r\n (key) => Reflect.get(formConfig, key) !== undefined,\r\n );\r\n if (hasOldPrimaryKeys) return true;\r\n // Legacy slides carry `slideContentRows`; current `FormInterface` does not.\r\n const slides = (formConfig as OLD_FormInterface).slides ?? [];\r\n const hasSlideContentRows = slides.some((slide) => slide.slideContentRows !== undefined);\r\n return hasSlideContentRows;\r\n\r\n}\r\nexport { initFormConfigToV2 }","export enum HintType {\r\n WARNING = 'warning',\r\n ERROR = 'error',\r\n SUCCESS = 'success',\r\n LOADING = 'loading',\r\n INFO = 'info',\r\n QUESTION = 'question',\r\n CRITICAL = 'critical',\r\n PENDING = 'pending',\r\n BLOCKED = 'blocked',\r\n COMPLETED = 'completed',\r\n CANCELLED = 'cancelled',\r\n DEFAULT = 'default',\r\n QUERY_SUCCESS = 'query_success',\r\n DB_LOAD = 'db_load',\r\n CALCULATED = 'calculated',\r\n TAG = 'tag',\r\n DOCUMENT = 'document',\r\n HISTORY = 'history',\r\n\r\n}\r\n\r\n/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\nexport function textIconsForUserHints(hint: string, type: HintType): string {\r\n switch (type.toLowerCase()) {\r\n case HintType.WARNING:\r\n return `⚠️ ${hint}`;\r\n case HintType.ERROR:\r\n return `❌ ${hint}`;\r\n case HintType.SUCCESS:\r\n return `✅ ${hint}`;\r\n case HintType.LOADING:\r\n return `🔄 ${hint}`;\r\n case HintType.INFO:\r\n return `💡 ${hint}`;\r\n case HintType.QUESTION:\r\n return `❓ ${hint}`;\r\n case HintType.CRITICAL:\r\n return `🔴 ${hint}`;\r\n case HintType.PENDING:\r\n return `⏱️ ${hint}`;\r\n case HintType.BLOCKED:\r\n return `🚫 ${hint}`;\r\n case HintType.COMPLETED:\r\n return `🏁 ${hint}`;\r\n case HintType.CANCELLED:\r\n return `🚮 ${hint}`;\r\n case HintType.QUERY_SUCCESS:\r\n return `✨ ${hint}`;\r\n case HintType.DB_LOAD:\r\n return `🗃️ ${hint}`;\r\n case HintType.CALCULATED:\r\n return `📊 ${hint}`;\r\n case HintType.TAG:\r\n return `🏷️ ${hint}`;\r\n case HintType.DOCUMENT:\r\n return `📄 ${hint}`;\r\n case HintType.HISTORY:\r\n return `🕰️ ${hint}`;\r\n case HintType.DEFAULT:\r\n default:\r\n return `ℹ️ ${hint}`;\r\n }\r\n}\r\n\r\n// Usage example:\r\n// const message = textIconsForUserHints(\"Operation completed\", HintType.SUCCESS);","\r\n\r\n\r\n\r\n\r\nimport { create, all, FormatOptions, } from 'mathjs';\r\n\r\nimport { CalculationFunctions, calculationVariableInterface } from \"ngx-t-forms-types\";\r\n\r\nimport { CalculatedFieldRules } from \"ngx-t-forms-types\";\r\n\r\nimport { HintType } from \"../../../../shared/functions/textIconsForUserHints\";\r\nimport { ElementTypes, FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport { Observable, of, throwError } from \"rxjs\";\r\nimport { IFunctionUtils } from \"../../t-form-tower-controller/form-tower-controller.service\";\r\n\r\n/** Loose alias for the form-value snapshot used by calculation helpers. */\r\ntype FormValueSnapshot = Record<string, unknown>;\r\n/**\r\n * mathjs operates on BigNumber instances at runtime; the public typings of\r\n * mathjs reduce all numeric ops to `MathType`, which is broader than `number`.\r\n * We use `MathScalar` to express \"either a number or a BigNumber-ish value\r\n * coming back from mathjs\" without resorting to `any`.\r\n */\r\ntype MathScalar = number | unknown;\r\n\r\n// mathjs types `all` as `FactoryFunctionMap | undefined`, but the named export is\r\n// always defined at runtime. A single type assertion (no `!`, no `as unknown as`)\r\n// satisfies `create()` without a non-null assertion.\r\nconst math = create(all as Parameters<typeof create>[0], {\r\n number: 'BigNumber',\r\n precision: 64, // Sufficient for almost all financial/engineering forms\r\n});\r\n\r\nexport function calculateInput(\r\n inputConfig: FormColumnInputs,\r\n formValue: () => FormValueSnapshot,\r\n utils: IFunctionUtils\r\n): Observable<void> {\r\n try {\r\n //1) check if all variables values are valid\r\n\r\n const areValid = (inputConfig.calculatedFieldRules?.variables || []).every(\r\n (Variable: calculationVariableInterface) => {\r\n let inputId: string | undefined;\r\n if (Variable.parentInputId && !!Variable.applyFunctionToCol) {\r\n\r\n inputId = Variable.parentInputId;\r\n } else if (Variable.parentInputId && !inputId && !Variable.applyFunctionToCol) {\r\n inputId = Variable.inputId;\r\n\r\n } else {\r\n inputId = Variable.inputId;\r\n }\r\n const inputValue = formValue()[inputId as string];\r\n const valid = !!inputValue ? inputValue !== '' : false;\r\n\r\n if (!valid) {\r\n utils.setTemporaryHint(\r\n inputConfig.id,\r\n `Cannot complete calculation: Please provide a valid value for \"${Variable.label}\".`,\r\n HintType.INFO\r\n );\r\n }\r\n return valid;\r\n }\r\n );\r\n\r\n utils.setInputStatus(inputConfig.id, \"59565b2a-7deb-4b6b-a762-1cbb2465f55a\", 'Calculating...');\r\n if (areValid) {\r\n\r\n const scope: { [key: string]: MathScalar } = configureCalculationScope(\r\n inputConfig,\r\n formValue()\r\n );\r\n\r\n const calculationRules = inputConfig.calculatedFieldRules;\r\n\r\n const inputCalculatedValue = evaluateFormulaAgainstScope(\r\n calculationRules,\r\n scope\r\n );\r\n\r\n if (inputCalculatedValue || inputCalculatedValue == '0') {\r\n\r\n\r\n utils.updateValue(inputConfig.id, inputCalculatedValue);\r\n utils.setTemporaryHint(\r\n inputConfig.id,\r\n `Successfully calculated value`,\r\n HintType.CALCULATED\r\n );\r\n }\r\n }\r\n utils.removeInputStatus(inputConfig.id, \"59565b2a-7deb-4b6b-a762-1cbb2465f55a\");\r\n return of(void 0); // Return Observable that completes with void\r\n } catch (error) {\r\n utils.removeInputStatus(inputConfig.id, \"59565b2a-7deb-4b6b-a762-1cbb2465f55a\");\r\n utils.setTemporaryHint(\r\n inputConfig.id,\r\n error instanceof Error ? error.message : 'Failed to calculate input value', HintType.ERROR\r\n );\r\n return throwError(() => error instanceof Error ? error.message : 'Failed to calculate input value');\r\n }\r\n}\r\n\r\nexport function configureCalculationScope(\r\n input: FormColumnInputs,\r\n formValue: FormValueSnapshot,\r\n): Record<string, MathScalar> {\r\n const scope: Record<string, MathScalar> = {};\r\n const variables = input.calculatedFieldRules\r\n ? input.calculatedFieldRules?.variables\r\n : [];\r\n\r\n\r\n for (let index = 0; index < variables.length; index++) {\r\n const rule = variables[index];\r\n if (!rule) continue;\r\n\r\n if (rule.function) {\r\n const inputId = rule.parentInputId\r\n ? rule.parentInputId\r\n : rule.inputId;\r\n\r\n // Because the input is a multiple input, we need to filter the values by a column\r\n const formInputValues = (formValue[inputId as string] ?? []) as Array<Record<string, unknown>>;\r\n if (!Array.isArray(formInputValues)) continue;\r\n let arrayValues: MathScalar[] = [];\r\n\r\n if (rule.filterValuesByCol) {\r\n\r\n arrayValues = formInputValues\r\n .filter(\r\n (v) => v[rule.filterValuesByCol as string]\r\n )\r\n .map((v) =>\r\n math.bignumber(v[rule.applyFunctionToCol as string] as number)\r\n );\r\n\r\n\r\n } else {\r\n if (input.element === ElementTypes.MultipleInput) {\r\n arrayValues = formInputValues.map((v) =>\r\n math.bignumber(v[rule.inputId as string] as number)\r\n );\r\n\r\n } else {\r\n\r\n\r\n arrayValues = formInputValues\r\n ? formInputValues.map((v) =>\r\n math.bignumber(v[rule.inputId as string] as number)\r\n )\r\n : [];\r\n }\r\n }\r\n\r\n scope[rule.variable] = calculateListOveralFunctions(rule.function, arrayValues);\r\n\r\n } else {\r\n\r\n scope[rule.variable] = math.bignumber(formValue[rule.inputId] as number);\r\n }\r\n }\r\n return scope;\r\n}\r\n\r\nexport function evaluateFormulaAgainstScope(\r\n rules: CalculatedFieldRules | undefined,\r\n scope: { [key: string]: MathScalar }\r\n): string | undefined {\r\n\r\n try {\r\n\r\n if (rules) {\r\n const allVariablesAreInScope =\r\n Object.keys(scope).length === rules.variables.length;\r\n for (const key of Object.keys(scope)) {\r\n if (scope[key] === undefined || scope[key] === null) scope[key] = 0;\r\n isNaN(Number(scope[key] ?? 0)) ? (scope[key] = 0) : '';\r\n }\r\n\r\n\r\n if (allVariablesAreInScope && !!rules?.formula\r\n ) {\r\n\r\n let result = math.evaluate(rules.formula, scope as Record<string, number>);\r\n if (typeof rules.decimalPlaces === 'number') {\r\n result = applyRounding(result, rules.decimalPlaces, rules.roundingMode);\r\n\r\n }\r\n const formatOptions = (typeof rules.decimalPlaces === 'number')\r\n ? { notation: 'fixed', precision: rules.decimalPlaces }\r\n : { notation: 'fixed' }; // Default fixed to avoid 1e-7\r\n\r\n return math.format(result, formatOptions as FormatOptions);\r\n } else {\r\n return undefined;\r\n }\r\n } else {\r\n return undefined;\r\n }\r\n } catch {\r\n return undefined;\r\n }\r\n\r\n}\r\n\r\nexport function calculateListOveralFunctions(rule: CalculationFunctions, arrayValues: MathScalar[]): number {\r\n try {\r\n const len = arrayValues.length;\r\n const sum = math.sum(arrayValues as number[]);\r\n switch (rule) {\r\n case CalculationFunctions.Avg: {\r\n const avg = len == 0 ? Number(sum) : Number(sum) / len;\r\n return avg;\r\n }\r\n\r\n case CalculationFunctions.Sum:\r\n return Number(sum);\r\n\r\n case CalculationFunctions.Max:\r\n return Math.max(...(arrayValues as number[]));\r\n\r\n case CalculationFunctions.Min:\r\n return Math.min(...(arrayValues as number[]));\r\n\r\n case CalculationFunctions.Count:\r\n return len;\r\n default:\r\n return 0;\r\n\r\n }\r\n\r\n } catch (_error) {\r\n return 0;\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Helper to handle Floor/Ceil logic with decimals which isn't native to basic math functions\r\n */\r\nfunction applyRounding(value: MathScalar, decimals: number, mode: 'FLOOR' | 'CEIL' | 'ROUND' = 'ROUND'): MathScalar {\r\n // If decimals is 0, we can use standard functions directly\r\n if (decimals === 0) {\r\n if (mode === 'FLOOR') return math.floor(value as number);\r\n if (mode === 'CEIL') return math.ceil(value as number);\r\n return math.round(value as number);\r\n }\r\n\r\n // If decimals > 0, we must shift the decimal point\r\n // logic: value * (10 ^ decimals) -> op -> value / (10 ^ decimals)\r\n const scale = math.pow(10, decimals);\r\n\r\n let scaledValue = math.multiply(value as number, scale as number);\r\n\r\n switch (mode) {\r\n case 'FLOOR':\r\n scaledValue = math.floor(scaledValue as number);\r\n break;\r\n case 'CEIL':\r\n scaledValue = math.ceil(scaledValue as number);\r\n break;\r\n case 'ROUND':\r\n default:\r\n // MathJS round supports decimals natively, but for consistency in BigNumber\r\n // operations, the scaling method is robust.\r\n // However, math.round(val, decimals) is safe in mathjs.\r\n return math.round(value as number, decimals);\r\n }\r\n\r\n return math.divide(scaledValue as number, scale as number);\r\n}\r\n","import { AbstractControlOptions, ValidatorFn, AbstractControl, ValidationErrors } from \"@angular/forms\";\r\n\r\n\r\nimport { Validators } from '@angular/forms';\r\n\r\n\r\nimport { ElementTypes, FormControlCustomValidatorsInterface, InputObservedForChange, InputTypes } from 'ngx-t-forms-types';\r\n\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { validateObjectAgainstString } from \"../../../../shared/modules/stringJsonValidator/getObjectValidations\";\r\nimport { calculateListOveralFunctions } from \"../../t-form-controller/function/calculateInputValue\";\r\n\r\n\r\n\r\n\r\n/**\r\n * Generates a form group based on the provided inputs and optional validator.\r\n * \r\n * @param inputs - An array of form inputs. Each input can be of type IBasicFormInput, IMultiple, ITableSelectionInput, IFileUploadInput, or IMatrixInput.\r\n * @param validator - An optional object containing validation rules for the form group.\r\n * \r\n * @returns A FormGroup instance. If a validator is provided, it is applied to the form group.\r\n * \r\n * @throws Will throw an error if an error occurs while crwhile postingeating the form group.\r\n */\r\n\r\n\r\n\r\nexport interface FormObject {\r\n [key: string]: [{ value: unknown, disabled: boolean }, AbstractControlOptions];\r\n}\r\n\r\nexport function compileInputValidators(input: FormColumnInputs,getFormValue:()=>Record<string, unknown>): AbstractControlOptions {\r\n\r\n const isRequired = !!input.required;\r\n let inputValidators = input.validators ? [...input.validators] : [];\r\n if (isRequired && !inputValidators.includes('required')) {\r\n inputValidators = [...inputValidators, 'required'];\r\n } else if (!isRequired && inputValidators.includes('required')) {\r\n inputValidators = inputValidators.filter((validator) => validator !== 'required');\r\n }\r\n // Email may be stored on `type` and/or `inputType` (ITowerStepColumn / saved forms).\r\n // `InputTypes` is a string enum, so its members widen to `string` without a cast.\r\n const rawType: string | undefined = input.type;\r\n const rawInputType: string | undefined = (input as FormColumnInputs & { inputType?: string }).inputType;\r\n const typeLooksEmail = (v: string | undefined) =>\r\n v != null && (v === InputTypes.Email || v === 'email' || String(v).toLowerCase() === 'email');\r\n const isEmailInputType =\r\n typeLooksEmail(rawType) || typeLooksEmail(rawInputType);\r\n if (isEmailInputType && !inputValidators.includes('email')) {\r\n inputValidators = [...inputValidators, 'email'];\r\n }\r\n // e.g. formControlName \"email.user\" (type may still be text in saved forms)\r\n const fcnSegments = (input.formControlName || '').split('.').map(s => s.toLowerCase());\r\n const isEmailFieldByControlName =\r\n input.element === ElementTypes.Input && fcnSegments.some(seg => seg === 'email');\r\n if (isEmailFieldByControlName && !inputValidators.includes('email')) {\r\n inputValidators = [...inputValidators, 'email'];\r\n }\r\n\r\n const formControlOptions: AbstractControlOptions = { validators: returnValidator(inputValidators,getFormValue,input) };\r\n \r\n // Set updateOn to 'change' if custom validation functions are present\r\n \r\n formControlOptions.updateOn = 'change';\r\n \r\n \r\n return formControlOptions;\r\n}\r\n\r\n\r\n\r\nexport function returnValidator(validators: Array<string | FormControlCustomValidatorsInterface>,formValue:()=>Record<string,unknown>,input: FormColumnInputs): ValidatorFn[] {\r\n const Val: ValidatorFn[] = [];\r\n validators.forEach(validate => {\r\n if (typeof validate === 'object') {\r\n // return a custom validator based on a function that takes validation expression and form values\r\n \r\n Val.push(createCustomValidator(validate,formValue));\r\n }else{\r\n switch (validate) {\r\n case 'required':\r\n if(input.element === ElementTypes.Toggle) {\r\n Val.push(toggleRequiredValidator);\r\n break;\r\n }\r\n if(input.element === ElementTypes.MultipleInput){\r\n Val.push(multipleInPutRequiredValidator);\r\n break;\r\n }\r\n if(input.element === ElementTypes.DateRangePicker){\r\n \r\n }\r\n\r\n Val.push(Validators.required);\r\n break;\r\n case 'email':\r\n Val.push(Validators.email);\r\n break;\r\n }\r\n }\r\n \r\n });\r\n\r\n const rawType: string | undefined = input.type;\r\n if (\r\n input.element === ElementTypes.Input &&\r\n (rawType === InputTypes.Number || rawType === 'number')\r\n ) {\r\n Val.push(numberInputValidator);\r\n }\r\n\r\n return Val;\r\n}\r\n\r\n/** Rejects values that are not finite numbers (aligns with matInput type=\"number\" for imports). */\r\nconst numberInputValidator = (control: AbstractControl): ValidationErrors | null => {\r\n const raw = control.value;\r\n if (raw === null || raw === undefined || raw === '') {\r\n return null;\r\n }\r\n if (typeof raw === 'number') {\r\n return Number.isFinite(raw) ? null : { pattern: { requiredPattern: 'number', actualValue: String(raw) } };\r\n }\r\n if (typeof raw === 'string') {\r\n const t = raw.trim();\r\n if (t === '') return null;\r\n const n = Number(t);\r\n return Number.isFinite(n) ? null : { pattern: { requiredPattern: 'number', actualValue: t } };\r\n }\r\n return { pattern: { requiredPattern: 'number', actualValue: String(raw) } };\r\n};\r\n\r\nconst multipleInPutRequiredValidator = (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value;\r\n if (value === null || value === undefined || value === '') {\r\n return { 'required': true };\r\n }\r\nif (Array.isArray(value) === false) {\r\n return { 'required': true };\r\n }\r\n \r\n \r\n return value.length === 0 ? { 'required': true } : null;\r\n}\r\n\r\nconst toggleRequiredValidator = (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value;\r\n \r\n if (value === null || value === undefined || value === '') {\r\n return { 'required': true };\r\n }\r\n if(typeof value !== 'boolean'){\r\n return { 'required': true };\r\n }\r\n \r\n \r\n return null;\r\n}\r\nfunction createCustomValidator(config:FormControlCustomValidatorsInterface,formValue:()=>Record<string,unknown>): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const formGroup = control.parent;\r\n const {message,expression, canOverride, inputsObservedForChanges} = config\r\n if (!formGroup && !formValue()) {\r\n return null;\r\n }\r\n \r\n try{\r\n const scope = getValidationScopeFromFormValue(inputsObservedForChanges,formValue());\r\n const isInvalid = validateObjectAgainstString(expression,scope)\r\n const ev =isInvalid ? { [config.id]: { message ,canOverride} } : null;\r\n if(isInvalid){\r\n control.markAsTouched()\r\n control.markAsDirty()\r\n }\r\n\r\n \r\n return ev\r\n }catch(error:unknown){\r\n return { [config.id]: { message,canOverride,error} } \r\n }\r\n\r\n\r\n \r\n };\r\n }\r\n\r\n\r\n \r\n// Rewritten to avoid potential recursion issues\r\nconst getValidationScopeFromFormValue = (\r\n inputsObservedForChanges: InputObservedForChange[],\r\n formData: Record<string, unknown>\r\n): Record<string, unknown> => {\r\n // Create a new object directly instead of using reduce with spread operator\r\n const result: Record<string, unknown> = {};\r\n\r\n // Simple loop instead of reduce to avoid deep recursion\r\n for (let i = 0; i < inputsObservedForChanges.length; i++) {\r\n const { inputId, variable, parentInputId, function: aggregate } = inputsObservedForChanges[i] || {};\r\n if(!inputId || !variable) continue;\r\n // List binding with an aggregate: read the multiple-input row array from the\r\n // parent container and reduce the bound column to a scalar (parity with the\r\n // tower's buildValidationScope and configureCalculationScope).\r\n if (aggregate) {\r\n const rows = formData[parentInputId ?? inputId];\r\n result[variable] = Array.isArray(rows)\r\n ? calculateListOveralFunctions(\r\n aggregate,\r\n (rows as Array<Record<string, unknown>>).map((row) => Number(row?.[inputId])),\r\n )\r\n : 0;\r\n } else {\r\n result[variable] = formData[inputId];\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n ","import { FormGroup, AbstractControl, FormControl } from \"@angular/forms\";\r\n\r\n\r\nimport {compileInputValidators } from \"./commonFormOperations\";\r\nimport { ElementTypes, FormColumnInputs, } from \"ngx-t-forms-types\";\r\n\r\n\r\n\r\n/**\r\n * Generates a hierarchical form with nested FormGroups based on section IDs.\r\n * Parent form listens to all descendant changes, with validation cascading upward.\r\n * \r\n * @param inputs Array of form inputs with their configurations\r\n * @param getFormValue Record of form values used for custom validation\r\n * @returns A FormGroup with nested FormGroups for each section\r\n *\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Phase-4: public surface (api-extractor baseline locks `any`). Tighten to `unknown` in v3.0.0.\r\nexport function formGenerator(inputs: Array<FormColumnInputs>,getFormValue:()=>Record<string, any>): FormGroup {\r\n \r\n \r\n // Group inputs by sectionId using a more functional approach\r\n const sectionInputsMap = inputs.reduce<Record<string, FormColumnInputs[]>>((sections, input) => {\r\n // Skip section titles as they don't need form controls and multiple inputs in edit mode\r\n if (input.element === ElementTypes.SectionTitle || input.multipleInputInEditId) {\r\n return sections;\r\n }\r\n \r\n // Use a default section ID if none provided\r\n const sectionId = input.sectionId || 'default';\r\n \r\n // Initialize section array if it doesn't exist\r\n if (!sections[sectionId]) {\r\n sections[sectionId] = [];\r\n }\r\n \r\n sections[sectionId].push(input);\r\n return sections;\r\n }, {});\r\n\r\n // Transform the input map into section FormGroups\r\n const sectionControls = Object.entries(sectionInputsMap).reduce<Record<string, FormGroup>>((formGroups, [sectionId, sectionInputs]) => {\r\n // Skip if section has no inputs\r\n if (sectionInputs.length === 0) {\r\n return formGroups;\r\n }\r\n \r\n // Create controls for each input in the section\r\n const controls = sectionInputs.reduce<Record<string, FormControl>>((formControls, input) => {\r\n // Create explicit FormControl with initial value, disabled state, and validators\r\n const value = getDefaultValue(input);\r\n \r\n formControls[input.id] = new FormControl({\r\n value: value,\r\n disabled: !!input.disabled\r\n }, compileInputValidators(input, getFormValue));\r\n \r\n return formControls;\r\n }, {});\r\n \r\n // Create FormGroup for this section with the controls\r\n formGroups[sectionId] = new FormGroup(controls);\r\n \r\n return formGroups;\r\n }, {});\r\n\r\n // Create parent FormGroup containing all section FormGroups\r\n return new FormGroup(sectionControls);\r\n}\r\n/**\r\n * Retrieves a section FormGroup from the parent form\r\n * \r\n * @param form The parent FormGroup\r\n * @param sectionId The ID of the section to retrieve\r\n * @returns The section FormGroup or null if not found\r\n */\r\nexport function getSectionForm(form: FormGroup | undefined, sectionId: string): FormGroup | null {\r\n if (!form) {\r\n return null;\r\n }\r\n return form.get(sectionId) as FormGroup || form.controls[sectionId];\r\n}\r\n\r\n/**\r\n * Retrieves a specific control from a section\r\n * \r\n * @param form The parent FormGroup\r\n * @param sectionId The ID of the section containing the control\r\n * @param controlId The ID of the control to retrieve\r\n * @returns The form control or null if not found\r\n */\r\nexport function getSectionControl(form: FormGroup, sectionId: string, controlId: string): AbstractControl | null {\r\n const sectionForm = getSectionForm(form, sectionId);\r\n if (!sectionForm) {\r\n return null;\r\n }\r\n return sectionForm.get(controlId) || (sectionForm.controls[controlId] as AbstractControl);\r\n}\r\n\r\n/**\r\n * Builds the flat control map for a set of inputs (used to add a MultipleInput\r\n * row sub-form's controls). `getFormValue` MUST be passed through to\r\n * `compileInputValidators` as a **getter function**, not its invoked result —\r\n * custom (object) validators call `formValue()` internally, so passing a plain\r\n * value object made every such validator throw on control construction\r\n * (\"Failed to generate controls\"). This was latent until validators could be\r\n * authored on MultipleInput sub-items.\r\n */\r\nexport function generateControlsForTheseInputs(\r\n inputs: FormColumnInputs[],\r\n getFormValue: () => Record<string, unknown>,\r\n): Record<string, FormControl> {\r\n const filteredInputs = inputs.filter(input => input.element !== ElementTypes.SectionTitle);\r\n const controls = filteredInputs.reduce<Record<string, FormControl>>((formControls, input) => {\r\n\r\n const controlName = input.multipleInputInEditId? `${input.multipleInputInEditId}.${input.id}` : input.id;\r\n // Create explicit FormControl with initial value, disabled state, and validators\r\n const value = getDefaultValue(input);\r\n formControls[controlName] = new FormControl({\r\n value: value,\r\n disabled: !!input.disabled\r\n }, compileInputValidators(input, getFormValue));\r\n\r\n return formControls;\r\n }, {});\r\n\r\n return controls\r\n}\r\nconst getDefaultValue = (input: FormColumnInputs): unknown => {\r\n try { \r\n const { value, element } = input;\r\n if(element === ElementTypes.Toggle){\r\n return Boolean(value) \r\n }\r\n if (element === ElementTypes.MultipleInput) {\r\n if(!Array.isArray(value)){\r\n return []\r\n }\r\n return value\r\n }\r\n \r\n \r\n return value ||''\r\n \r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Unknown error';\r\n throw new Error('Error in getDefaultValue: ' + msg);\r\n \r\n }\r\n}","import { validateCalculatedFieldRules, MinimumInputRequiredInterface, WorkflowFunctionTypes } from 'ngx-t-forms-types';\r\nimport {FormColumnInputs} from \"ngx-t-forms-types\";\r\n\r\nimport { APIDataFetchingConfigurationInterface, DataSources } from \"ngx-t-forms-types\";\r\n\r\n/**\r\n * Workflow function-type enum, upstreamed to `ngx-t-forms-types` as\r\n * {@link WorkflowFunctionTypes} per DECISIONS.md D-016. Re-exported here under\r\n * its historical name `FunctionTypes` to preserve every existing local import\r\n * path (including the immutable `form-tower-controller.service.ts` per D-007).\r\n *\r\n * @public\r\n */\r\nexport const FunctionTypes = WorkflowFunctionTypes;\r\n// eslint-disable-next-line @typescript-eslint/no-redeclare -- D-016: enum-shaped value + type alias to preserve historical name.\r\nexport type FunctionTypes = WorkflowFunctionTypes;\r\n\r\n\r\nexport function getAllFunctionTypes(inputConfig: FormColumnInputs): Partial<Record<FunctionTypes, boolean>>{\r\n const functionTypes: Partial<Record<FunctionTypes, boolean>> = {};\r\n\r\n try {\r\n \r\n // Check for each function type\r\n functionTypes[FunctionTypes.ValueCalculation] = Boolean(!!validateCalculatedFieldRules(inputConfig.calculatedFieldRules).value)\r\n functionTypes[FunctionTypes.ValuePostMethodAPI] = Boolean(inputConfig.matOptions?.fetch?.value?.source === 'api' && (inputConfig.matOptions?.fetch.value as APIDataFetchingConfigurationInterface)?.httpMethod === 'POST')\r\n functionTypes[FunctionTypes.ValuePostMethodAPIWithAllDefaultParams] = Boolean(\r\n inputConfig.matOptions?.fetch.value?.source === 'api' \r\n && (inputConfig.matOptions?.fetch?.value as APIDataFetchingConfigurationInterface)?.httpMethod === 'POST')\r\n && (inputConfig.matOptions?.fetch?.value as APIDataFetchingConfigurationInterface).backEndConfig.minimumInputRequired.every(\r\n (minIn: MinimumInputRequiredInterface) => minIn.type === 'default'\r\n )\r\n functionTypes[FunctionTypes.OptionsPostMethodAPI] = Boolean(inputConfig.matOptions?.fetch?.options?.source === 'api' && (inputConfig.matOptions?.fetch.options as APIDataFetchingConfigurationInterface)?.httpMethod === 'POST')\r\n functionTypes[FunctionTypes.OptionsPostMethodAPIWithAllDefaultParams] = Boolean(\r\n inputConfig.matOptions?.fetch?.options?.source === 'api' \r\n && (inputConfig.matOptions?.fetch?.options as APIDataFetchingConfigurationInterface)?.httpMethod === 'POST')\r\n && (inputConfig.matOptions?.fetch?.options as APIDataFetchingConfigurationInterface).backEndConfig.minimumInputRequired.every(\r\n (minIn: MinimumInputRequiredInterface) => minIn.type === 'default'\r\n )\r\n \r\n \r\n functionTypes[FunctionTypes.ValueGetMethodAPI] = Boolean(inputConfig.matOptions?.fetch?.value?.source === 'api' && (inputConfig.matOptions?.fetch.value as APIDataFetchingConfigurationInterface)?.httpMethod === 'GET')\r\n functionTypes[FunctionTypes.OptionsGetMethodAPI] = Boolean(inputConfig.matOptions?.fetch?.options?.source === 'api' && (inputConfig.matOptions?.fetch.options as APIDataFetchingConfigurationInterface)?.httpMethod === 'GET')\r\n functionTypes[FunctionTypes.InputSourcedValue] = Boolean(inputConfig.matOptions?.fetch.value?.source === DataSources.Local && !!inputConfig.matOptions?.fetch.value?.source)\r\n functionTypes[FunctionTypes.ManualValueValidation] = Boolean(inputConfig.validators?.filter(validator => typeof validator === 'object' && validator !== null).length !== 0)\r\n \r\n return functionTypes;\r\n } catch {\r\n return {}\r\n }\r\n}","import { FormColumnInputs, ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { getSectionForm } from \"../../t-form-section-controller/Functions/formGenerator\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nimport { ElementTypes, ITowerFormSteps } from 'ngx-t-forms-types'\r\nimport { take } from \"rxjs\";\r\nimport type { IFormTour } from 'ngx-t-forms-types';\r\n\r\n/**\r\n * `IFormTour` has been upstreamed to `ngx-t-forms-types` per DECISIONS.md\r\n * D-016. The re-export below keeps every consumer importing from this file\r\n * working unchanged.\r\n */\r\nexport type { IFormTour };\r\nexport const sectionFormErrorMessage = (self: FormTowerControllerService, sectionId: string) => {\r\n const sectionInputs = self.allFormInputs()?.filter(input => input.sectionId === sectionId && !input.multipleInputInEditId &&\r\n\r\n input.element !== ElementTypes.SectionTitle\r\n ) || []\r\n const sectionForm = getSectionForm(self.mainForm, sectionId)\r\n const allInputsWithErrors = sectionInputs.filter(input => {\r\n const control = sectionForm?.controls[input.id]\r\n if (!control) {\r\n return false\r\n }\r\n return !!control?.invalid\r\n })\r\n\r\n const firstError = allInputsWithErrors[0]\r\n if (!firstError) return ''\r\n const numberOfAllOtherErrors = allInputsWithErrors.length - 1\r\n if (numberOfAllOtherErrors === 0) return `${firstError?.label} is invalid`\r\n\r\n return ` ${allInputsWithErrors[0]?.label} and ${allInputsWithErrors.length - 1} other are invalid`\r\n}\r\nexport function selectFormSteps(self: FormTowerControllerService): ITowerFormSteps[] {\r\n try {\r\n const slides = self.form?.slides\r\n\r\n if (!slides) return []\r\n return slides.map((slide) => {\r\n\r\n const activeSectionHasTour = slide.columns.some((column) => column.tourContent)\r\n const tourOptions = slide.columns.map((column) => column.tourContent)\r\n const sectionForm = getSectionForm(self.mainForm, slide.sectionId)\r\n const errMsg = sectionFormErrorMessage(self, slide.sectionId)\r\n\r\n return {\r\n label: slide.label,\r\n sectionId: slide.sectionId,\r\n sectionForm,\r\n sectionIsInvalid: sectionForm?.invalid,\r\n sectionIsSeen: slide.sectionIsSeen,\r\n sectionFormErrorMessage: errMsg,\r\n activeSectionHasTour,\r\n tourOptions,\r\n columns: slide.columns.map((col) => ({\r\n ...col,\r\n canReload: getReloadFunction(self, col),\r\n } as ITowerStepColumn)),\r\n isActive: slide.isActive,\r\n }\r\n })\r\n }\r\n catch {\r\n return [];\r\n }\r\n}\r\nexport const selectAllFormTours = (self: FormTowerControllerService): IFormTour[] => {\r\n const steps = selectFormSteps(self);\r\n return steps.flatMap((step) => {\r\n return step.columns.filter(c=>!!c.tourContent).map((column) => ({\r\n \r\n anchorId: column.id,\r\n title: step.label,\r\n content: column.tourContent || '',\r\n sectionId: step.sectionId,\r\n popoverClass:'ngx-t-forms-tour-popover',\r\n \r\n }))\r\n })\r\n\r\n}\r\n\r\n\r\nconst getReloadFunction = (self: FormTowerControllerService, column: FormColumnInputs): {\r\n canReload: boolean;\r\n emit: () => void;\r\n} | undefined => {\r\n const canReload = self.canRefreshFn(column.id)\r\n if (!canReload) {\r\n return undefined;\r\n }\r\n return {\r\n emit: () => {\r\n self.refreshInput(column.id).pipe(take(1)).subscribe()\r\n \r\n },\r\n canReload: true\r\n }\r\n}","import { ElementTypes, FormColumnInputs, FormInterface } from \"ngx-t-forms-types\";\r\n\r\n\r\nexport const allFormInputs= (form: FormInterface | undefined) : FormColumnInputs[] | undefined=> {\r\n \r\n return form?.slides.flatMap((slide) => slide.columns.flatMap((column) => {\r\n const isMultipleFormInput = Boolean(column.formInputs)\r\n const isDateRange = column.element === ElementTypes.DateRangePicker\r\n if (isDateRange) {\r\n const rangeValue = column.value as { start?: string | Date; end?: string | Date } | undefined;\r\n const start = {\r\n ...column,\r\n id: `${column.id}.${column.startDateControl}`,\r\n label: `${column.label} Start Date`,\r\n formControlName: column.startDateControl,\r\n min: column.startMinDate,\r\n value: rangeValue?.start ? new Date(rangeValue.start) : undefined,\r\n max: column.startMaxDate,\r\n } as FormColumnInputs\r\n const end = {\r\n ...column,\r\n id: `${column.id}.${column.endDateControl}`,\r\n label: `${column.label} End Date`,\r\n formControlName: column.endDateControl,\r\n min: column.endMinDate,\r\n value: rangeValue?.end ? new Date(rangeValue.end) : undefined,\r\n max: column.endMaxDate,\r\n } as FormColumnInputs\r\n return [start, end]\r\n }\r\n if(isMultipleFormInput ){\r\n const mInputs = column.formInputs?.map((input) => ({...input, id: `${column.id}.${input.id}`,originalId: input.id})) ||[]\r\n \r\n return [column,...mInputs]\r\n }\r\n \r\n const isScoaInput = column.element === ElementTypes.MscoaSelection\r\n if(isScoaInput){\r\n const scoaInputs = column.mscoaConfig.inputs?.map((input) => ({...input, id: `${column.id}.${input.id}`,originalId: input.id})) ||[]\r\n return [column,...scoaInputs]\r\n }\r\n\r\n\r\n return [column]\r\n }))\r\n}","\r\nimport { ElementTypes, FormSubmissionStatus, ITowerFormSteps } from 'ngx-t-forms-types';\r\nimport { FormTowerControllerService } from '../form-tower-controller.service';\r\nimport { MatStepper } from '@angular/material/stepper';\r\nimport { HintType, textIconsForUserHints } from '../../../../shared/functions/textIconsForUserHints';\r\nimport { FormGroup } from '@angular/forms';\r\nexport function formProgress(self: FormTowerControllerService): number {\r\ntry {\r\n const requiredInputs =self.allFormInputs()?.filter(c=>c.required && !c.multipleInputInEditId&& c.element !== ElementTypes.SectionTitle)||[];\r\n\r\n\r\n const allValidRequiredInputs = requiredInputs.filter(c => {\r\n const sectionGroup = self.mainForm?.controls[c.sectionId] as FormGroup | undefined;\r\n const inputControl = sectionGroup?.controls[c.id];\r\n return inputControl?.valid === true || inputControl?.invalid === false;\r\n })\r\n \r\n\r\n const valid = allValidRequiredInputs.length;\r\n const total = requiredInputs.length;\r\n return Math.round((valid/total)*100);\r\n} catch {\r\n return 0\r\n}\r\n \r\n \r\n \r\n}\r\n\r\nexport const formSubmissionMessage = (self: FormTowerControllerService)=>{\r\n const buttonLabel = self.form?.submissionHandle?.submissionMessage||'Continue to submit'\r\n const submissionStatus = self?.submittingStatus\r\n if(submissionStatus === FormSubmissionStatus.SUBMITTING) return 'Submitting form...'\r\n if(submissionStatus === FormSubmissionStatus.UPLOADING) return 'Uploading files...'\r\n if(submissionStatus === FormSubmissionStatus.VALIDATING) return 'Validating form...'\r\n if(submissionStatus === FormSubmissionStatus.FAILED) return 'Submission failed, please try again'\r\n \r\n return buttonLabel\r\n }\r\n\r\nexport function getSubmissionStatusFn(stepper: MatStepper | undefined,mainForm:FormGroup|undefined,formProgress:number,steps:ITowerFormSteps[],loading:boolean): string {\r\n const progress = formProgress || 0;\r\n\r\n \r\n if (loading === true) {\r\n return '⏳ Loading form...';\r\n }\r\n \r\n if (!!mainForm?.valid && progress === 100) {\r\n return textIconsForUserHints(`Form complete (${progress.toFixed(0)}%)`, HintType.SUCCESS);\r\n }\r\n \r\n if (stepper === undefined) return ''\r\n const currentStep = steps[stepper?.selectedIndex];\r\n const invalidSteps = steps.filter((step) => step.sectionIsInvalid);\r\n const incompleteSteps = steps.filter((step) => !step.sectionIsSeen);\r\n \r\n if (currentStep?.sectionIsInvalid) {\r\n return textIconsForUserHints(\r\n `Please fix errors in current section (${progress.toFixed(0)}% complete)`,\r\n HintType.WARNING\r\n );\r\n }\r\n \r\n if (invalidSteps.length > 0) {\r\n return textIconsForUserHints(\r\n `${invalidSteps.length} section${invalidSteps.length > 1 ? 's' : ''} need${invalidSteps.length === 1 ? 's' : ''} attention (${progress.toFixed(0)}% complete)`,\r\n HintType.ERROR\r\n );\r\n }\r\n \r\n if (incompleteSteps.length > 0) {\r\n return textIconsForUserHints(\r\n `${incompleteSteps.length} section${incompleteSteps.length > 1 ? 's' : ''} left (${progress.toFixed(0)}% complete)`,\r\n HintType.WARNING\r\n );\r\n }\r\n \r\n return textIconsForUserHints(\r\n `Progress: ${progress.toFixed(0)}%`,\r\n HintType.INFO\r\n );\r\n }","/**\n * @file Pure helpers for the **overridable validation** submission gate.\n *\n * A custom validator declared with `canOverride === true` does not block\n * submission outright. The gate distinguishes two error classes across the\n * settled form:\n *\n * - **Blocking** — every error that is NOT an overridable custom-validator\n * error: standard validators (`required`, `email`, `minlength`, …), MSCOA\n * business-rule errors, and custom validators with `canOverride === false`.\n * These MUST be resolved before the form can be submitted.\n * - **Overridable** — a custom-validator error whose value object carries\n * `canOverride === true`. The form may be submitted with these still failing\n * **provided each one is motivated** with a non-empty comment.\n *\n * The error-record shape these helpers read is produced verbatim by the\n * {@link FunctionTypes.ManualValueValidation} builder\n * (`build-manual-validation.ts`): `{ [validatorId]: { message, canOverride } }`,\n * merged onto `control.errors` by the W11 projection adapter. A validator id is\n * a uuid unique per `(input, validator)`, so it uniquely keys an override\n * reason.\n *\n * All functions here are pure reads over the projected `FormGroup` tree and the\n * tower's `allFormInputs()` index — no signal writes, no Angular runtime\n * primitives created. They are safe to call from template getters during change\n * detection (mirrors `getSubmissionStatus.ts`).\n */\nimport { AbstractControl, FormArray, FormGroup, ValidationErrors } from '@angular/forms';\nimport type { FileData, FormColumnInputs, IFormValidationOverride } from 'ngx-t-forms-types';\nimport type { FormTowerControllerService } from '../form-tower-controller.service';\n\n/**\n * Key under which the captured override motivations ride on the submission\n * payload. Always attached to the **primary** payload object and preserved\n * across `projectFormData` projection (see `formHttpSubmissions.ts`).\n */\nexport const VALIDATION_OVERRIDES_KEY = '_validationOverrides';\n\n/**\n * A still-failing overridable custom validation surfaced to the override UI.\n */\nexport interface OverridableError {\n /** The custom validator's id — the `control.errors` key and the reason key. */\n validatorId: string;\n /** The owning input's id (its control name within the section group). */\n inputId: string;\n /** The owning input's `formControlName`, used to build the submission entry. */\n formControlName: string;\n /** The input's display label, for the override-reason prompt. */\n label: string;\n /** The validator's human-readable message. */\n message: string;\n}\n\n/**\n * A single captured override motivation, keyed in the engine by `validatorId`.\n */\nexport interface OverrideReason {\n /** User-supplied motivation. Must be non-empty (trimmed) to unlock submission. */\n comment: string;\n /** Optional supporting file, carried as base64 {@link FileData}. */\n attachment?: FileData;\n}\n\n/** Map of `validatorId → captured reason`. The engine's override-reason state. */\nexport type OverrideReasons = Record<string, OverrideReason>;\n\n/** Result of partitioning a set of errors. */\nexport interface ErrorPartition {\n /** Errors that must be resolved before submission is possible. */\n blocking: { inputId: string; key: string }[];\n /** Overridable errors that may be bypassed with a motivation. */\n overridable: OverridableError[];\n}\n\n/** A `control.errors` value is overridable iff it is an object with `canOverride === true`. */\nfunction isOverridableErrorValue(value: unknown): value is { message?: unknown; canOverride: true } {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { canOverride?: unknown }).canOverride === true\n );\n}\n\n/**\n * Classifies one control's error record into the blocking / overridable\n * accumulators, resolving `formControlName` / `label` from the input index.\n */\nfunction classifyErrors(\n inputId: string,\n errors: ValidationErrors,\n byId: Map<string, FormColumnInputs>,\n blocking: { inputId: string; key: string }[],\n overridable: OverridableError[],\n): void {\n for (const [errKey, errVal] of Object.entries(errors)) {\n if (isOverridableErrorValue(errVal)) {\n const input = byId.get(inputId);\n const message =\n typeof errVal.message === 'string' && errVal.message.length > 0 ? errVal.message : errKey;\n overridable.push({\n validatorId: errKey,\n inputId,\n formControlName: input?.formControlName ?? inputId,\n label: input?.label ?? input?.formControlName ?? inputId,\n message,\n });\n } else {\n blocking.push({ inputId, key: errKey });\n }\n }\n}\n\n/** Builds the `inputId → input` index from the tower (including sub-inputs). */\nfunction inputIndex(self: FormTowerControllerService): Map<string, FormColumnInputs> {\n return new Map((self.allFormInputs() ?? []).map((input) => [input.id, input]));\n}\n\n/**\n * Walks the whole projected control tree and partitions every error into\n * blocking vs overridable.\n *\n * The walk tracks the nearest control key as the `inputId`; at the section→input\n * depth this is the real form-input id (resolvable in {@link FormTowerControllerService.allFormInputs}).\n * Deeper keys (MultipleInput sub-rows) fall back to the raw key.\n *\n * @param self - The tower whose `mainForm` + `allFormInputs()` are read.\n * @returns The blocking / overridable partition.\n */\nexport function partitionFormErrors(self: FormTowerControllerService): ErrorPartition {\n const blocking: { inputId: string; key: string }[] = [];\n const overridable: OverridableError[] = [];\n const main = self.mainForm;\n if (!main) return { blocking, overridable };\n\n const byId = inputIndex(self);\n\n const visit = (control: AbstractControl, key: string): void => {\n if (control.errors) classifyErrors(key, control.errors, byId, blocking, overridable);\n\n if (control instanceof FormGroup) {\n for (const [childKey, child] of Object.entries(control.controls)) visit(child, childKey);\n } else if (control instanceof FormArray) {\n control.controls.forEach((child, index) => visit(child, `${key}[${index}]`));\n }\n };\n\n // mainForm's direct children are section groups keyed by sectionId; their\n // children are inputs keyed by inputId — the depth at which `key` is a real id.\n for (const [sectionKey, section] of Object.entries(main.controls)) visit(section, sectionKey);\n\n return { blocking, overridable };\n}\n\n/**\n * Partitions a flat list of named controls (e.g. the open inner inputs of a\n * MultipleInput sub-row) into blocking vs overridable. Used by the sub-row save\n * gate, where validation lives on transient controls outside the main walk.\n *\n * @param self - The tower (for the input index).\n * @param controls - `{ inputId, control }` pairs to classify.\n * @returns The blocking / overridable partition over just those controls.\n */\nexport function partitionControlList(\n self: FormTowerControllerService,\n controls: { inputId: string; control: AbstractControl }[],\n): ErrorPartition {\n const blocking: { inputId: string; key: string }[] = [];\n const overridable: OverridableError[] = [];\n const byId = inputIndex(self);\n for (const { inputId, control } of controls) {\n if (control.errors) classifyErrors(inputId, control.errors, byId, blocking, overridable);\n }\n return { blocking, overridable };\n}\n\n/**\n * Projects overridable errors + their captured reasons into submission entries.\n * Shared by the form-level and sub-row capture paths.\n *\n * @param overridable - The overridable errors to convert.\n * @param reasons - The captured motivations keyed by `validatorId`.\n * @returns One {@link IFormValidationOverride} per overridable error.\n */\nexport function reasonsToOverrides(\n overridable: OverridableError[],\n reasons: OverrideReasons,\n): IFormValidationOverride[] {\n return overridable.map((e) => {\n const reason = reasons[e.validatorId];\n const entry: IFormValidationOverride = {\n formControlName: e.formControlName,\n validationMessage: e.message,\n comment: (reason?.comment ?? '').trim(),\n };\n if (reason?.attachment) entry.attachment = reason.attachment;\n return entry;\n });\n}\n\n/**\n * Whether the form may be submitted: no blocking errors remain AND every\n * overridable error has a non-empty (trimmed) motivation.\n *\n * @param self - The tower to inspect.\n * @param reasons - The engine's captured override reasons (`validatorId → reason`).\n * @returns `true` when submission is allowed.\n */\nexport function canSubmitForm(self: FormTowerControllerService, reasons: OverrideReasons): boolean {\n const { blocking, overridable } = partitionFormErrors(self);\n if (blocking.length > 0) return false;\n return overridable.every((e) => (reasons[e.validatorId]?.comment ?? '').trim().length > 0);\n}\n\n/**\n * Projects the captured reasons for the form's current (live) overridable\n * errors into the submission-payload array. Sub-row overrides captured at\n * save time are merged separately by the engine (they are no longer live\n * controls once a row is closed).\n *\n * @param self - The tower to inspect.\n * @param reasons - The engine's captured override reasons.\n * @returns One {@link IFormValidationOverride} per active overridable error.\n */\nexport function buildValidationOverrides(\n self: FormTowerControllerService,\n reasons: OverrideReasons,\n): IFormValidationOverride[] {\n return reasonsToOverrides(partitionFormErrors(self).overridable, reasons);\n}\n","import { FormTowerControllerService } from \"../form-tower-controller.service\";\r\n\r\nexport function setControlTempErrors(self: FormTowerControllerService, inputId: string, message: string): void {\r\n try {\r\n const mainForm = self?.mainForm;\r\n if (!mainForm) return;\r\n const input = self.allFormInputs()?.find(input => input.id === inputId);\r\n if (!input) return;\r\n\r\n\r\n const control = mainForm.get(inputId);\r\n const touched = control?.touched;\r\n input.onlySetTempErrorOnTouch\r\n\r\n if (!control || !touched && !!input.onlySetTempErrorOnTouch) return;\r\n\r\n // Create new errors object explicitly\r\n const currentErrors = control.errors ? { ...control.errors } : {};\r\n currentErrors[\"temporaryError\"] = message;\r\n\r\n // Set errors and mark as touched\r\n control.markAsTouched();\r\n control.markAsDirty();\r\n control.setErrors(currentErrors);\r\n\r\n // Force control update in form\r\n mainForm.controls[inputId] = control;\r\n\r\n // Force form validation\r\n mainForm.updateValueAndValidity();\r\n\r\n setTimeout(() => {\r\n // Get fresh control reference\r\n const laterForm = self?.mainForm;\r\n if (!laterForm) return;\r\n const currentControl = laterForm.get(inputId);\r\n if (!currentControl) return;\r\n\r\n // Create new errors object\r\n const remainingErrors = currentControl.errors ? { ...currentControl.errors } : {};\r\n delete remainingErrors[\"temporaryError\"];\r\n\r\n // Set remaining errors or null\r\n currentControl.setErrors(Object.keys(remainingErrors).length > 0 ? remainingErrors : null);\r\n\r\n // Update form control\r\n laterForm.controls[inputId] = currentControl;\r\n\r\n // Force validation\r\n laterForm.updateValueAndValidity();\r\n\r\n }, calculateReadDelay(message));\r\n\r\n } catch {\r\n }\r\n}\r\n\r\nexport function calculateReadDelay(message: string): number {\r\n const WORDS_PER_MINUTE = 200; // Average reading speed\r\n const MIN_DELAY = 4000; // Minimum 4 seconds\r\n const MILLISECONDS_PER_MINUTE = 60000;\r\n \r\n // Count words (split by spaces)\r\n const wordCount = message.split(' ').length;\r\n \r\n // Calculate reading time in milliseconds\r\n const readingTime = (wordCount / WORDS_PER_MINUTE) * MILLISECONDS_PER_MINUTE;\r\n \r\n // Return max of minimum delay or calculated reading time\r\n return Math.max(MIN_DELAY, readingTime);\r\n}\r\n\r\n","import { FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nimport { calculateReadDelay } from \"./setControlTempErrors\";\r\nimport { HintType, textIconsForUserHints } from \"../../../../shared/functions/textIconsForUserHints\";\r\n\r\n export const setInputTemporaryError = (self: FormTowerControllerService ,inputId: string, message: string) => {\r\n // Clear any existing timeout\r\n\r\n if (self._errorTimeoutIds[inputId]) {\r\n clearTimeout(self._errorTimeoutIds[inputId]);\r\n }\r\n\r\n self.setInputError({ temporaryError: message }, inputId);\r\n // Set more descriptive emojis/icons based on hint type\r\n // Clear the hint after 5 seconds\r\n self._errorTimeoutIds[inputId] = setTimeout(() => {\r\n self.setInputError({ temporaryError: null }, inputId);\r\n self._errorTimeoutIds[inputId] = undefined\r\n }, calculateReadDelay(message));\r\n }\r\n\r\n export const setTemporaryHint = (self: FormTowerControllerService ,inputId: string, hint: string, type: HintType) => {\r\n // Clear any existing timeout\r\n if (self._hintTimeoutIds[inputId]) {\r\n clearTimeout(self._hintTimeoutIds[inputId]);\r\n }\r\n // Set the temporary hint\r\n const newHint = textIconsForUserHints(hint, type);\r\n // `updateFormInputConfig` expects a full `FormColumnInputs`, but the immutable\r\n // service implementation only reads the supplied fields (partial patch). The\r\n // cast below is a structural patch — never a `as unknown as` widening — and\r\n // mirrors the original contract documented on the immutable service.\r\n self.updateFormInputConfig(inputId, { temporaryHint: newHint } as Partial<FormColumnInputs> as FormColumnInputs);\r\n // Set more descriptive emojis/icons based on hint type\r\n // Clear the hint after 5 seconds\r\n self._hintTimeoutIds[inputId] = setTimeout(() => {\r\n self.updateFormInputConfig(inputId, { temporaryHint: undefined } as Partial<FormColumnInputs> as FormColumnInputs);\r\n\r\n\r\n self._hintTimeoutIds[inputId] = undefined\r\n }, calculateReadDelay(hint));\r\n }\r\n\r\n export const setInputError = (self: FormTowerControllerService ,err: Record<string, unknown>, inputId: string) => {\r\n if (!self.mainForm) return;\r\n const input:FormColumnInputs|undefined = self.allFormInputs()?.find(input => input.id === inputId);\r\n \r\n if (!input?.sectionId) return;\r\n const control = self.mainForm.get(input.sectionId)?.get(inputId);\r\n if(!control){\r\n return\r\n }\r\n \r\n // Store the current validation state\r\n\r\n const previousErrors = { ...(control.errors || {}) };\r\n\r\n // Handle clearing temporary error\r\n if (err['temporaryError'] === null) {\r\n if (previousErrors['temporaryError']) {\r\n const { temporaryError, ...remainingErrors } = previousErrors;\r\n\r\n if (Object.keys(remainingErrors).length === 0) {\r\n control.setErrors(null);\r\n } else {\r\n // Force update by setting to null first\r\n control.setErrors(null);\r\n // Then set the remaining errors\r\n control.setErrors(remainingErrors);\r\n }\r\n }\r\n } else {\r\n // Add the new error(s)\r\n const mergedErrors = { ...previousErrors, ...err };\r\n // Ensure the control is marked as invalid if errors exist\r\n if (Object.keys(mergedErrors).length > 0\r\n ) {\r\n // If somehow still valid despite errors, force invalid state\r\n control.markAsDirty();\r\n control.markAsTouched();\r\n\r\n }\r\n // Force update by setting to null first\r\n control.setErrors(null);\r\n // Then set the merged errors\r\n control.setErrors(mergedErrors);\r\n\r\n }\r\n\r\n // Debug logs to verify what's happening\r\n\r\n // Update form validity\r\n self.mainForm.updateValueAndValidity();\r\n \r\n }","import { getSectionControl } from \"../../t-form-section-controller/Functions/formGenerator\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\n\r\n export const setInputAsTouchedAndDirty = (self: FormTowerControllerService,inputId: string) => {\r\n \r\n const input = self.allFormInputs()?.find(input => input.id === inputId);\r\n if (!input?.sectionId) {\r\n\r\n return;\r\n }\r\n const mainForm = self.mainForm;\r\n const inputSectionIsSeen = !!mainForm?.controls[input.sectionId]?.touched && !!mainForm?.controls[input.sectionId]?.dirty;\r\n if(!inputSectionIsSeen || !mainForm){\r\n return\r\n }\r\n const control = getSectionControl(mainForm, input.sectionId, inputId);\r\n control?.markAsTouched();\r\n control?.markAsDirty();\r\n control?.updateValueAndValidity({emitEvent: true});\r\n self.mainForm?.updateValueAndValidity({emitEvent: true});\r\n }","import { getSectionForm } from \"../../t-form-section-controller/Functions/formGenerator\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\n\r\n export const setSectionAsSeen = (self: FormTowerControllerService,sectionId: string) => {\r\n const control = getSectionForm(self.mainForm, sectionId);\r\n control?.markAsTouched()\r\n control?.markAsDirty()\r\n\r\n }\r\n\r\n export const setSectionAsActive = (self: FormTowerControllerService,sectionId: string) => {\r\n\r\n if ( !self.form ) return\r\n\r\n self.form = {\r\n ...self.form,\r\n slides:self.form.slides.map((slide) => {\r\n \r\n return {\r\n ...slide,\r\n isActive: slide.sectionId === sectionId\r\n }\r\n })\r\n }\r\n const control = getSectionForm(self.mainForm, sectionId);\r\n const touched = control?.touched\r\n if(touched&& control.controls){\r\n Object.keys(control.controls).forEach(key => {\r\n control.controls[key]?.markAsTouched()\r\n control.controls[key]?.markAsDirty()\r\n control.controls[key]?.updateValueAndValidity()\r\n })\r\n\r\n }\r\n\r\n }","/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\n/* eslint-disable @typescript-eslint/no-explicit-any -- Phase-4: public surface (api-extractor baseline locks `any`). Recursive deep-mutation also requires structural any for index access. Tighten in v3.0.0. */\r\nexport function assignDeepPropertyToObject(item: any, path: Array<string>, value: any): any {\r\n const obj: any = new Object(item);\r\n path.reduce((acc, key, index) => {\r\n acc[key] = acc[key] || {};\r\n if (index === path.length - 1) {\r\n acc[key] = value;\r\n }\r\n return acc[key];\r\n }, obj);\r\n return obj;\r\n}\r\n/* eslint-enable @typescript-eslint/no-explicit-any */","import { ElementTypes, FormColumnInputs, FormInterface } from \"ngx-t-forms-types\";\r\nimport { returnAnyFormInputFromForm } from \"../../../../components/forms/functions/findFormInput\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nimport { assignDeepPropertyToObject } from \"../../../../shared/functions/assignDeepPropertyToObject\";\r\n\r\nexport const getFormValue = (self: FormTowerControllerService,): Record<string, unknown> => {\r\n if (!self.mainForm?.value) return {};\r\n // Angular FormGroup.value is structurally `Record<string, Record<string, unknown>>` here —\r\n // the outer keys are section ids, inner keys are control names.\r\n const sections = Object.values(self.mainForm.value as Record<string, Record<string, unknown>>);\r\n return sections.reduce<Record<string, unknown>>((acc, section) => ({\r\n ...acc,\r\n ...(section ?? {}),\r\n }), {});\r\n};\r\nexport const getFormValueAsFormControlBasedObject = (\r\n self: FormTowerControllerService,\r\n): Record<string, unknown> => {\r\n try {\r\n // Validate essential inputs exist\r\n const form = self.form;\r\n if (!self.mainForm?.controls || !form) {\r\n return {};\r\n }\r\n\r\n const formValues = getFormValue(self);\r\n if (!formValues || typeof formValues !== 'object') {\r\n return {};\r\n }\r\n // First, find all MultipleInput elements to handle them specially\r\n const multipleInputs = findAllMultipleInputs(form);\r\n const multipleInputIds = multipleInputs.map(input => input.id);\r\n\r\n return Object.entries(formValues).reduce<Record<string, unknown>>((result, [key, value]) => {\r\n // Skip null/undefined values\r\n if (value === undefined || value === null) {\r\n return result;\r\n }\r\n\r\n // Skip individual fields within MultipleInput controls as they'll be handled with the array values\r\n const keyParts = key.split('.');\r\n if (keyParts.length > 1 && keyParts[0] && multipleInputIds.includes(keyParts[0])) {\r\n return result;\r\n }\r\n\r\n const input = returnAnyFormInputFromForm(form, key);\r\n if (!input || !input.formControlName) {\r\n return result;\r\n }\r\n\r\n // Handle MultipleInput elements (array values with nested inputs)\r\n if (input.element === ElementTypes.MultipleInput) {\r\n result[input.formControlName] = processMultipleInputValue(input, value, formValues);\r\n return result;\r\n }\r\n\r\n // Handle DateRangePicker elements (dot notation for start/end)\r\n if (input.element === ElementTypes.DateRangePicker) {\r\n processDateRangePickerValue(result, key, value);\r\n return result;\r\n }\r\n // TS narrowing helper — `input.formControlName` is required string above\r\n // so the index access is safe.\r\n\r\n if (input.element === ElementTypes.MscoaSelection) {// FIXME: this is a temporary fix for MSCOA inputs, we need to find a better way to handle this\r\n const inputs = input.mscoaConfig?.inputs || [];\r\n const mscoaInputsValue = inputs.reduce<Record<string, unknown>>((acc, mscoaInput) => {\r\n acc[mscoaInput.formControlName] = formValues[`${input.id}.${mscoaInput.id}`];\r\n return acc;\r\n }, {});\r\n result[input.formControlName] = {\r\n ... (typeof value === 'object' && value !== null ? value : {}),\r\n ... mscoaInputsValue\r\n };\r\n return result;\r\n }\r\n // Handle all other input types - map to formControlName\r\n result[input.formControlName] = value;\r\n return result;\r\n }, {});\r\n } catch (error) {\r\n const msg = error instanceof Error ? `Error in getFormValueAsFormControlBasedObject: ${error.message}` : \"Error in getFormValueAsFormControlBasedObject\";\r\n throw new Error(msg);\r\n }\r\n};\r\n\r\n/**\r\n * Find all MultipleInput elements in the form\r\n */\r\nconst findAllMultipleInputs = (form: FormInterface): FormColumnInputs[] => {\r\n return form.slides.flatMap(slide =>\r\n slide.columns.filter(column =>\r\n column.element === ElementTypes.MultipleInput\r\n )\r\n );\r\n};\r\n\r\n/**\r\n * Process a MultipleInput value (array of objects with their own form inputs)\r\n */\r\nconst processMultipleInputValue = (\r\n input: FormColumnInputs,\r\n value: unknown,\r\n allFormValues: Record<string, unknown>\r\n): Array<Record<string, unknown>> => {\r\n // Validate value is an array\r\n if (!value || !Array.isArray(value)) {\r\n return [];\r\n }\r\n\r\n const inputId = input.id;\r\n\r\n // Transform each item in the multiple input array\r\n return value.map((rawItem: unknown) => {\r\n if (!rawItem || typeof rawItem !== 'object') {\r\n return {};\r\n }\r\n const item = rawItem as Record<string, unknown>;\r\n\r\n const result: Record<string, unknown> = {};\r\n const itemId = (typeof item[\"id\"] === 'string' ? item[\"id\"] : '') || '';\r\n\r\n // Process each form input within the multiple input.\r\n // The synthetic `id` entry below is a structural pseudo-input used only\r\n // to round-trip the row identifier; it intentionally only carries the\r\n // two fields the loop below reads.\r\n const pseudoIdInput = { id: 'id', formControlName: 'id' } as Pick<FormColumnInputs, 'id' | 'formControlName'>;\r\n ([...(input.formInputs || []), pseudoIdInput])?.forEach(formInput => {\r\n if (!formInput?.id || !formInput.formControlName) return;\r\n\r\n // Different possible key formats for the input value\r\n const possibleKeys = [\r\n // Format in the item object directly\r\n formInput.id,\r\n // Format with parent.child structure in the main form\r\n `${inputId}.${formInput.id}`,\r\n // Format with parent.child.rowId to target specific row\r\n `${inputId}.${formInput.id}.${itemId}`\r\n ];\r\n\r\n // Try to find the value using the different possible key formats\r\n let found = false;\r\n\r\n // First check if the value exists in the item directly\r\n for (const key of possibleKeys) {\r\n if (typeof item[key] !== 'undefined') {\r\n result[formInput.formControlName] = item[key];\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n // Then check in the overall form values (for parent.child notation)\r\n if (!found) {\r\n for (const key of possibleKeys) {\r\n if (typeof allFormValues[key] !== 'undefined') {\r\n result[formInput.formControlName] = allFormValues[key];\r\n found = true;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n });\r\n};\r\n\r\n/**\r\n * Process a DateRangePicker value (dot notation keys for start/end dates)\r\n */\r\nconst processDateRangePickerValue = (\r\n result: Record<string, unknown>,\r\n key: string,\r\n value: unknown\r\n): void => {\r\n const parts = key.split(\".\");\r\n\r\n // DateRangePicker keys should have format: \"dateRangePickerId.controlName\"\r\n if (parts.length !== 2 || !parts[1]) {\r\n return;\r\n }\r\n\r\n const controlName = parts[1];\r\n // Only map known control types for date ranges (typically start/end)\r\n if (controlName) {\r\n result[controlName] = value;\r\n }\r\n};\r\nexport const unFlattenFormValue = (value: Record<string, unknown>): Record<string, unknown> => {\r\n return Object.entries(value).reduce<Record<string, unknown>>((acc, [key, val]) => {\r\n const dotNotationRegex = /^[^.]+(\\.[^.]+)+$/;\r\n if(!dotNotationRegex.test(key)) {\r\n acc[key] = val; // If no dot notation, keep as is\r\n return acc;\r\n }\r\n const keys = key.split('.');\r\n assignDeepPropertyToObject(acc, keys, val);\r\n return acc;\r\n }, {});\r\n}","import { FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nexport const setInputStatus=(self: FormTowerControllerService, inputId: string,statusId:string, statusMessage: string): void =>{\r\n try {\r\n const input = self.allFormInputs()?.find(input => input.id === inputId);\r\n if (!input) return;\r\n const status = {\r\n ...input.status,\r\n [statusId]: statusMessage\r\n }\r\n // updateFormInputConfig is typed to accept a full FormColumnInputs, but its\r\n // implementation deep-merges a partial — the structural Partial cast preserves\r\n // the contract without widening to `any`.\r\n self.updateFormInputConfig(inputId, { status } as Partial<FormColumnInputs> as FormColumnInputs)\r\n\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Failed to set status';\r\n throw new Error(errorMessage)\r\n \r\n }\r\n\r\n}\r\n\r\nexport const removeInputStatus=(self: FormTowerControllerService, inputId: string,statusId:string): void =>{\r\n try {\r\n const input = self.allFormInputs()?.find(input => input.id === inputId);\r\n if (!input) return;\r\n const status = {\r\n ...input.status,\r\n [statusId]: undefined\r\n }\r\n // updateFormInputConfig is typed to accept a full FormColumnInputs, but its\r\n // implementation deep-merges a partial — the structural Partial cast preserves\r\n // the contract without widening to `any`.\r\n self.updateFormInputConfig(inputId, { status } as Partial<FormColumnInputs> as FormColumnInputs)\r\n\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Failed to set status';\r\n throw new Error(errorMessage)\r\n \r\n }\r\n\r\n}","import { ElementTypes, FormColumnInputs, InputDataTypes } from \"ngx-t-forms-types\";\r\n\r\nexport const multipleInputRowIDControlInput=(value:string|undefined,multipleInputInEditId:string):FormColumnInputs =>({\r\n id:\"id\",\r\n element:ElementTypes.Input,\r\n value,\r\n formControlName:\"id\",\r\n label:\"ID\",\r\n required:false,\r\n dataType:InputDataTypes.String,\r\n appearance:\"outline\",\r\n multipleInputInEditId\r\n} as Partial<FormColumnInputs> as FormColumnInputs)","import { Observable, forkJoin, of } from \"rxjs\";\r\nimport { catchError, map } from \"rxjs/operators\";\r\nimport { FunctionTypes } from \"./getAllFunctionTypes\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\n\r\n/**\r\n * Function types that can prepopulate values when the multiple input form opens.\r\n * Includes InputSourcedValue (sources from other form inputs) and API-based fetchers.\r\n */\r\nconst PREPOPULATION_FUNCTION_TYPES: FunctionTypes[] = [\r\n FunctionTypes.ValueGetMethodAPI,\r\n FunctionTypes.OptionsGetMethodAPI,\r\n FunctionTypes.InputSourcedValue,\r\n FunctionTypes.ValuePostMethodAPIWithAllDefaultParams,\r\n FunctionTypes.OptionsPostMethodAPIWithAllDefaultParams,\r\n FunctionTypes.ValuePostMethodAPI,\r\n FunctionTypes.OptionsPostMethodAPI,\r\n FunctionTypes.ValueCalculation,\r\n];\r\n\r\n/**\r\n * Runs all prepopulation functions for nested inputs of an opened multiple input form.\r\n * Includes ValueGetMethodAPI, InputSourcedValue, OptionsGetMethodAPI, and related types.\r\n *\r\n * @param self The FormTowerControllerService instance\r\n * @param multipleInputId The ID of the MultipleInput whose add/edit form was opened\r\n * @returns Observable that completes when all prepopulation functions have run\r\n */\r\nexport function runMultipleInputPrepopulationFunctions(\r\n self: FormTowerControllerService,\r\n multipleInputId: string\r\n): Observable<void> {\r\n const allInputs = self.allFormInputs() ?? [];\r\n const nestedInputs = allInputs.filter(\r\n (input) => input.id.startsWith(`${multipleInputId}.`) && input.id !== multipleInputId\r\n );\r\n\r\n const observables: Observable<void>[] = [];\r\n\r\n nestedInputs.forEach((nestedInput) => {\r\n const functions = self.inputFunctionsCollection[nestedInput.id];\r\n if (!functions) return;\r\n\r\n PREPOPULATION_FUNCTION_TYPES.forEach((fnType) => {\r\n const obs$ = functions[fnType];\r\n if (obs$) {\r\n observables.push(\r\n obs$.pipe(\r\n catchError(() => {\r\n return of(void 0);\r\n })\r\n )\r\n );\r\n }\r\n });\r\n });\r\n\r\n if (observables.length === 0) {\r\n return of(void 0);\r\n }\r\n\r\n return forkJoin(observables).pipe(map(() => void 0));\r\n}\r\n","import { ElementTypes } from \"ngx-t-forms-types\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nimport { AbstractControl, FormGroup } from \"@angular/forms\";\r\nimport { generateControlsForTheseInputs } from \"../../t-form-section-controller/Functions/formGenerator\";\r\nimport { HintType } from \"../../../../shared/functions/textIconsForUserHints\";\r\nimport { multipleInputRowIDControlInput } from \"./multipleInputRowIDControllInput\";\r\nimport { runMultipleInputPrepopulationFunctions } from \"./runMultipleInputPrepopulationFunctions\";\r\nimport { take } from \"rxjs\";\r\n\r\nexport const toggleMultipleInput = (\r\n self: FormTowerControllerService,\r\n mainForm: FormGroup | undefined,\r\n inputId: string,\r\n open: boolean,\r\n rowInEditId?: string\r\n): boolean => {\r\n\r\n // Find and validate the input is a MultipleInput\r\n const input = self.allFormInputs()?.find(input => input.id === inputId);\r\n if (!input) {\r\n return false;\r\n }\r\n\r\n if (input.element !== ElementTypes.MultipleInput) {\r\n return false;\r\n }\r\n\r\n\r\n const sectionGroup = mainForm?.get(input.sectionId) as FormGroup;\r\n if (!sectionGroup) {\r\n self.setInputTemporaryError(inputId, 'Failed to find section group');\r\n return false;\r\n }\r\n try {\r\n // Generate controls from input's formInputs (defensive programming)\r\n const formInputs = input.formInputs || [];\r\n let controls: Record<string, AbstractControl> = {};\r\n\r\n if (open === true) {\r\n try {\r\n const idInput = multipleInputRowIDControlInput(rowInEditId, inputId)\r\n controls = generateControlsForTheseInputs(idInput ? [...formInputs, idInput] : formInputs, self.getFormValue.bind(this));\r\n } catch {\r\n self.setInputTemporaryError(inputId, 'Failed to generate controls');\r\n return false;\r\n }\r\n\r\n Object.entries(controls).forEach(([key, control]) => {\r\n const controlExists = !!sectionGroup.get(key);\r\n\r\n if (open && !controlExists) {\r\n // Add control if we're opening and control doesn't exist\r\n sectionGroup.addControl(key, control);\r\n }\r\n });\r\n\r\n } else {\r\n // Drop the live sub-row valueChanges → updateValue bridge before the\r\n // controls are removed (mirrors bindMultipleInputRowControls on open).\r\n self.unbindMultipleInputRowControls(inputId);\r\n const subFormControlNames = [...formInputs.map(i => `${inputId}.${i.id}`), `${inputId}.id`]\r\n // Remove controls if we're closing and control exists\r\n subFormControlNames.forEach(controlName => {\r\n const control = sectionGroup.controls[controlName];\r\n if (control) {\r\n sectionGroup.removeControl(controlName);\r\n }\r\n });\r\n\r\n //\r\n }\r\n\r\n // Toggle controls based on new state\r\n\r\n\r\n\r\n\r\n // Update the input configuration with new state\r\n self.updateFormInputConfig(inputId, { ...input, formIsOpen: open });\r\n if (!!open && sectionGroup.controls[`${inputId}.id`] && rowInEditId) {\r\n sectionGroup.controls[`${inputId}.id`]?.setValue(rowInEditId);\r\n }\r\n if (open) {\r\n // Bridge live sub-row edits into the signal graph so in-row (and\r\n // primary-form) calculations/fetches/validators recalculate as their\r\n // sub-row dependencies change — the inner inputs render via\r\n // *ngComponentOutlet, which drops the valueChange output the primary\r\n // form relies on. Controls exist by now (added above).\r\n self.bindMultipleInputRowControls(inputId);\r\n // NOTE: This is not a good idea to run the prepopulation functions here\r\n runMultipleInputPrepopulationFunctions(self, inputId).pipe(take(1)).subscribe();\r\n self.setTemporaryHint(inputId, 'Multiple input opened', HintType.DB_LOAD);\r\n }\r\n \r\n\r\n return true;\r\n } catch {\r\n self.setInputTemporaryError(inputId, 'Failed to toggle multiple input')\r\n return false;\r\n }\r\n}\r\n\r\n\r\nexport const multipleInputEditRow = (self: FormTowerControllerService, mainForm: FormGroup | undefined, inputId: string, rowId: string): boolean => {\r\n\r\n try {\r\n const toggled = toggleMultipleInput(self, mainForm, inputId, true, rowId);\r\n if (!toggled) {\r\n return false;\r\n }\r\n\r\n const input = self.allFormInputs()?.find(input => input.id === inputId);\r\n\r\n if (!input) {\r\n return false;\r\n }\r\n const sectionGroup = mainForm?.get(input.sectionId) as FormGroup;\r\n if (!sectionGroup) {\r\n self.setInputTemporaryError(inputId, 'Failed to find section group');\r\n return false;\r\n }\r\n \r\n const row = (sectionGroup.controls[inputId]?.value as Array<Record<string, unknown>> | undefined)?.find((row) => row[`${inputId}.id`] === rowId);\r\n\r\n if (!row) {\r\n self.setInputTemporaryError(inputId,\"Could not find row to duplicate\");\r\n return false;\r\n }\r\n Object.entries(row).forEach(([key, value]) => {\r\n self.updateValue(key,value)\r\n })\r\n\r\n return true;\r\n\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Failed to edit multiple input row';\r\n self.setInputTemporaryError(inputId, errorMessage);\r\n return false;\r\n\r\n }\r\n}\r\n\r\nexport const multipleInputDuplicateRow = (self: FormTowerControllerService, mainForm: FormGroup | undefined, inputId: string, rowId: string): boolean => {\r\n\r\n try {\r\n const toggled = toggleMultipleInput(self, mainForm, inputId, true);\r\n\r\n if (!toggled) {\r\n return false;\r\n }\r\n const input = self.allFormInputs()?.find(input => input.id === inputId);\r\n\r\n if (!input) {\r\n return false;\r\n }\r\n const sectionGroup = mainForm?.get(input.sectionId) as FormGroup;\r\n if (!sectionGroup) {\r\n self.setInputTemporaryError(inputId, 'Failed to find section group');\r\n return false;\r\n }\r\n sectionGroup.controls[`${inputId}.id`]?.setValue(undefined);\r\n const row = (sectionGroup.controls[inputId]?.value as Array<Record<string, unknown>> | undefined)?.find((row) => row[`${inputId}.id`] === rowId);\r\n\r\n if (!row) {\r\n self.setInputTemporaryError(inputId,\"Could not find row to duplicate\");\r\n return false;\r\n }\r\n const newRow = { ...row, id: undefined };\r\n Object.entries(newRow).forEach(([key, value]) => {\r\n self.updateValue(key,value)\r\n })\r\n return true;\r\n\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : 'Failed to duplicate multiple input row';\r\n self.setInputTemporaryError(inputId, errorMessage);\r\n return false;\r\n\r\n }\r\n}","import { StepperSelectionEvent } from '@angular/cdk/stepper';import { FormTowerControllerService } from '../form-tower-controller.service';\r\n\r\nexport const handleStepChange = (self: FormTowerControllerService,event: StepperSelectionEvent) => {\r\n \r\n const slides = self.form?.slides\r\n \r\n\r\n const sectionId = slides?.[event.selectedIndex]?.sectionId\r\n if(!sectionId) return\r\n self.setSectionAsActive(sectionId)\r\n self.setSectionAsSeen(sectionId)\r\n\r\n const previousSectionId = slides?.[event.previouslySelectedIndex]?.sectionId\r\n if(!previousSectionId) return\r\n self.setSectionAsSeen(previousSectionId)\r\n\r\n }","import { AbstractControl, FormGroup } from \"@angular/forms\";\r\n\r\nimport { ElementTypes, FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport type { IFormValidationOverride } from \"ngx-t-forms-types\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nimport { HintType } from \"../../../../shared/functions/textIconsForUserHints\";\r\n\r\n/** Override motivations captured for a sub-row, returned by `collectRowOverrideState`. */\r\ninterface RowOverrideState {\r\n entries: IFormValidationOverride[];\r\n validatorIds: string[];\r\n blockingInputIds: string[];\r\n unmotivatedInputIds: string[];\r\n}\r\n\r\n/**\r\n * Moves a saved sub-row's override motivations out of the live reason map and\r\n * into the engine's per-row store, keyed by the now-known row id.\r\n */\r\nconst persistRowOverrides = (\r\n self: FormTowerControllerService,\r\n inputId: string,\r\n rowId: string,\r\n overrideState: RowOverrideState,\r\n): void => {\r\n self.setRowOverrides(inputId, rowId, overrideState.entries);\r\n self.clearOverrideReasons(overrideState.validatorIds);\r\n};\r\n\r\n\r\n/**\r\n * Saves data from a multiple input form component\r\n * @param self The form controller service instance\r\n * @param mainForm The main form group\r\n * @param inputId The ID of the multiple input component\r\n * @returns true if save was successful, false otherwise\r\n */\r\nexport const saveMultipleInputForm = (\r\n self: FormTowerControllerService,\r\n mainForm: FormGroup | undefined,\r\n inputId: string\r\n): boolean => {\r\n // Early validation to ensure required objects exist\r\n if (!mainForm) {\r\n self.setInputTemporaryError(inputId, 'Form not initialized');\r\n return false;\r\n }\r\n // Find and validate the input is a MultipleInput\r\n const input = self.allFormInputs()?.find(input => input.id === inputId);\r\n if (!input) {\r\n self.setInputTemporaryError(inputId, `Input with ID ${inputId} not found`);\r\n return false;\r\n }\r\n\r\n if (input.element !== ElementTypes.MultipleInput) {\r\n self.setInputTemporaryError(inputId, `Input with ID ${inputId} is not a MultipleInput`);\r\n return false;\r\n }\r\n \r\n // Get the section group containing this input\r\n const sectionGroup = mainForm.get(input.sectionId) as FormGroup;\r\n if (!sectionGroup) {\r\n self.setInputTemporaryError(inputId, `Section with ID ${input.sectionId} not found`);\r\n return false;\r\n }\r\n\r\n // Get the main multiple input control\r\n const mainInput = sectionGroup.get(inputId);\r\n if (!mainInput) {\r\n self.setInputTemporaryError(inputId, 'Could not find main input. Check your configuration');\r\n return false;\r\n }\r\n\r\n // Collect all inner inputs for the multiple input\r\n const innerInputs = self.allFormInputs()?.filter(input =>\r\n input.id.includes('.') &&\r\n !!input.originalId &&\r\n input.id.split('.')[0] === inputId\r\n ) || [];\r\n\r\n // First, validate all inner inputs. A row may be saved while overridable\r\n // (canOverride === true) validations still fail, PROVIDED each is motivated;\r\n // only blocking errors and unmotivated overrides prevent the save.\r\n const validationResult = validateInnerInputs(self, sectionGroup, inputId, innerInputs);\r\n if (!validationResult.isValid) {\r\n return false;\r\n }\r\n\r\n // Capture the row's overridable motivations (built from the live inner-input\r\n // errors + the reasons the user entered). Persisted against the saved row id\r\n // below so they survive the controls being torn down on close.\r\n const overrideState = self.collectRowOverrideState(inputId, innerInputs);\r\n\r\n try {\r\n // Collect values from all inner inputs\r\n const innerInputsValues = collectInnerInputValues(self, sectionGroup, innerInputs);\r\n\r\n // Check if we're editing an existing row or adding a new one\r\n const rowInEditId = sectionGroup.controls[`${inputId}.id`]?.value;\r\n if (rowInEditId) {\r\n // Update existing row\r\n return updateExistingRow(self, mainInput, rowInEditId, innerInputsValues, inputId, overrideState);\r\n } else {\r\n // Add new row\r\n return addNewRow(self, mainInput, innerInputsValues, inputId, overrideState);\r\n }\r\n } catch (error) {\r\n const errorMessage = error instanceof Error \r\n ? `Error saving multiple input: ${error.message}` \r\n : 'Failed to save multiple input';\r\n \r\n self.setInputTemporaryError(inputId, errorMessage);\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Validates all inner inputs within a multiple input component.\r\n *\r\n * Partition-aware: a row is allowed to save while overridable\r\n * (`canOverride === true`) validations still fail, AS LONG AS each is motivated\r\n * with a reason. The save is rejected only for:\r\n * - **blocking** errors (required, standard validators, business rules,\r\n * `canOverride === false`), or\r\n * - overridable errors that have **no motivation** yet.\r\n */\r\nconst validateInnerInputs = (\r\n self: FormTowerControllerService,\r\n sectionGroup: FormGroup,\r\n inputId: string,\r\n innerInputs: FormColumnInputs[]\r\n): { isValid: boolean; invalidInputs?: FormColumnInputs[] } => {\r\n const { blockingInputIds, unmotivatedInputIds } = self.collectRowOverrideState(inputId, innerInputs);\r\n const labelFor = (id: string): string =>\r\n innerInputs.find(i => i.id === id)?.label || id;\r\n\r\n if (blockingInputIds.length > 0) {\r\n const remainingCount = blockingInputIds.length - 1;\r\n const errorMessage = `'${labelFor(blockingInputIds[0]!)}' ${\r\n remainingCount > 0 ? `and ${remainingCount} other field${remainingCount > 1 ? 's' : ''}` : ''\r\n } ${remainingCount > 0 ? 'are' : 'is'} invalid`;\r\n self.setInputTemporaryError(inputId, errorMessage);\r\n return { isValid: false };\r\n }\r\n\r\n if (unmotivatedInputIds.length > 0) {\r\n const remainingCount = unmotivatedInputIds.length - 1;\r\n const errorMessage = `Provide an override reason for '${labelFor(unmotivatedInputIds[0]!)}'${\r\n remainingCount > 0 ? ` and ${remainingCount} other field${remainingCount > 1 ? 's' : ''}` : ''\r\n } before saving`;\r\n self.setInputTemporaryError(inputId, errorMessage);\r\n return { isValid: false };\r\n }\r\n\r\n return { isValid: true };\r\n};\r\n\r\n/**\r\n * Collects values from all inner inputs\r\n */\r\nconst collectInnerInputValues = (\r\n self: FormTowerControllerService,\r\n sectionGroup: FormGroup,\r\n innerInputs: FormColumnInputs[]\r\n): Record<string, unknown> => {\r\n\r\n return innerInputs?.reduce<Record<string, unknown>>((values, innerInput) => {\r\n const control = sectionGroup?.controls[innerInput.id]\r\n values[innerInput.id] = control?.value;\r\n if (control?.value === null || control?.value === undefined) {\r\n self.setInputTemporaryError(innerInput.id, `Please fill all fields`);\r\n }\r\n\r\n return values;\r\n }\r\n , {});\r\n\r\n\r\n};\r\n\r\n/**\r\n * Updates an existing row in the multiple input\r\n */\r\nconst updateExistingRow = (\r\n self: FormTowerControllerService,\r\n mainInput: AbstractControl,\r\n rowInEditId: string,\r\n innerInputsValues: Record<string, unknown>,\r\n inputId: string,\r\n overrideState: RowOverrideState\r\n): boolean => {\r\n const currentValue = mainInput.value;\r\n \r\n if (!Array.isArray(currentValue)) {\r\n self.setInputTemporaryError(inputId, 'Invalid data structure. Expected array');\r\n return false;\r\n }\r\n\r\n // Find the row to be updated\r\n const rowIndex = (currentValue as Array<Record<string, unknown>>).findIndex((row) => row[`${inputId}.id`] === rowInEditId);\r\n if (rowIndex === -1) {\r\n self.setInputTemporaryError(inputId, 'Could not find row to update');\r\n return false;\r\n }\r\n\r\n // Update the existing row with new values\r\n const updatedValue = [...currentValue];\r\n // Add this line to preserve the row ID\r\n innerInputsValues[`${inputId}.id`] = rowInEditId;\r\n updatedValue[rowIndex] = innerInputsValues;\r\n \r\n // Set the updated value back to the main input\r\n mainInput.setValue(updatedValue);\r\n persistRowOverrides(self, inputId, rowInEditId, overrideState);\r\n self.setTemporaryHint(inputId, 'Record updated successfully', HintType.DB_LOAD);\r\n //Ensure to pass the rowInEditId to the toggleMultipleInput function\r\n // to close the edit mode for the row\r\n self.toggleMultipleInput(inputId, false,rowInEditId);\r\n \r\n return true;\r\n};\r\n\r\n/**\r\n * Adds a new row to the multiple input\r\n */\r\nconst addNewRow = (\r\n self: FormTowerControllerService,\r\n mainInput: AbstractControl,\r\n innerInputsValues: Record<string, unknown>,\r\n inputId: string,\r\n overrideState: RowOverrideState\r\n): boolean => {\r\n // Generate a unique ID for the new row\r\n const rowId = uuidv4();\r\n innerInputsValues[`${inputId}.id`] = rowId;\r\n\r\n // Get current value or initialize empty array\r\n const currentValue = mainInput.value || [];\r\n if (!Array.isArray(currentValue)) {\r\n self.setInputTemporaryError(inputId, 'Invalid data structure. Expected array');\r\n return false;\r\n }\r\n\r\n // Add new row to the array\r\n mainInput.setValue([...currentValue, innerInputsValues]);\r\n persistRowOverrides(self, inputId, rowId, overrideState);\r\n\r\n self.setTemporaryHint(inputId, 'New record added to your list', HintType.DB_LOAD);\r\n self.toggleMultipleInput(inputId, false);\r\n \r\n return true;\r\n};","import { FormInterface } from \"ngx-t-forms-types\";\r\n\r\nexport const createEmptyForm = (): FormInterface => ({\r\n slides: [],\r\n // `submissionHandle` is optional upstream (D-018b); empty form starts with none.\r\n formId: '',\r\n formTitle: '',\r\n })\r\n","import { ElementTypes, FormInterface } from \"ngx-t-forms-types\";\r\nimport { createEmptyForm } from \"./createEmptyForm\";\r\nimport { safeReturnDeepProperty } from \"../../../../shared/functions/getDeepObject\";\r\n\r\nexport const prepPopulateForm = (form: FormInterface, initValue: Record<string, unknown>): FormInterface => {\r\n try {\r\n if (!form || !form.slides || !form.slides.length) {\r\n return createEmptyForm()\r\n }\r\n\r\n return {\r\n ...form,\r\n slides: form.slides.map(slide => {\r\n return {\r\n ...slide,\r\n columns: (slide.columns ?? []).map(column => {\r\n const deepValue = column.formControlName ? safeReturnDeepProperty(initValue, column.formControlName?.split('.')).value : undefined;\r\n\r\n if (column.element === ElementTypes.SectionTitle) {\r\n return column\r\n }\r\n if (column.element === ElementTypes.Toggle) {\r\n return {\r\n ...column,\r\n value: Boolean(deepValue ?? initValue[column.formControlName ?? ''] ?? column.value ?? false)\r\n }\r\n }\r\n if (column.element === ElementTypes.DateRangePicker) {\r\n const startValue= safeReturnDeepProperty(initValue, column.startDateControl?.split('.')||[]).value;\r\n const endValue = safeReturnDeepProperty(initValue, column.endDateControl?.split('.')||[]).value;\r\n return {\r\n ...column,\r\n value: {\r\n start: startValue ?? initValue[String(column.startDateControl)],\r\n end: endValue ?? initValue[String(column.endDateControl)]\r\n }\r\n }\r\n }\r\n if (column.element === ElementTypes.MultipleInput) {\r\n const rawSeed = (deepValue ?? initValue[column.formControlName ?? ''] ?? column.value ?? []) as Array<Record<string, unknown>>;\r\n const seedRows = Array.isArray(rawSeed) ? rawSeed : [];\r\n const newM = {\r\n ...column,\r\n formIsOpen: column.formIsOpen ?? false,\r\n value: seedRows.map((item) => {\r\n\r\n return Object.entries(item).reduce<Record<string, unknown>>((acc, [key, value]) => {\r\n const inputId = column.formInputs?.find(input => input.formControlName === key)?.id\r\n if (key === 'id') {\r\n return {\r\n ...acc,\r\n [`${column.id}.id`]: value ?? ''\r\n }\r\n }\r\n if (!inputId) {\r\n return acc\r\n }\r\n return {\r\n ...acc,\r\n [`${column.id}.${inputId}`]: value ?? ''\r\n }\r\n }, {})\r\n })\r\n }\r\n return newM\r\n }\r\n\r\n\r\n return {\r\n ...column,\r\n value: deepValue ?? initValue[column.formControlName ?? ''] ?? column.value ?? ''\r\n }\r\n })\r\n }\r\n })\r\n }\r\n\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : String(error)\r\n\r\n throw new Error(msg);\r\n\r\n }\r\n}\r\n\r\n\r\n\r\n","import { FileUploadInputValueInterface } from \"ngx-t-forms-types\";\r\n\r\n\r\nconst b64toBlob = (b64Data: string, contentType = '', sliceSize = 512): Blob => {\r\n const byteCharacters = atob(b64Data);\r\n const byteArrays = [];\r\n\r\n for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {\r\n const slice = byteCharacters.slice(offset, offset + sliceSize);\r\n const byteNumbers = new Array(slice.length);\r\n for (let i = 0; i < slice.length; i++) {\r\n byteNumbers[i] = slice.charCodeAt(i);\r\n }\r\n const byteArray = new Uint8Array(byteNumbers);\r\n byteArrays.push(byteArray);\r\n }\r\n\r\n const blob = new Blob(byteArrays, { type: contentType });\r\n return blob;\r\n};\r\n\r\n/**\r\n * Creates a file upload data object from a Base64 string.\r\n *\r\n * @param fileName The desired name for the file (e.g., 'my-image.png').\r\n * @param contentType The MIME type of the file (e.g., 'image/png').\r\n * @param base64Content The raw Base64 encoded content of the file.\r\n * @returns A populated FileUploadInputValueInterface object.\r\n *\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\nexport const createFileFromBase64 = (\r\n fileName: string,\r\n contentType: string,\r\n base64Content: string\r\n): FileUploadInputValueInterface => {\r\n // Create the Blob from the Base64 string\r\n const fileBlob = b64toBlob(base64Content, contentType);\r\n\r\n // Extract the file extension from the file name\r\n const fileExtension = fileName.split('.').pop() || '';\r\n\r\n // Construct the full Base64 data URI\r\n const fullBase64 = `data:${contentType};base64,${base64Content}`;\r\n\r\n const fileData: FileUploadInputValueInterface = {\r\n fileName: fileName,\r\n // Upstream `FileUploadInputValueInterface.type` now accepts a raw MIME string\r\n // alongside the `InputFileType` enum (D-018b widening).\r\n type: contentType,\r\n base64: fullBase64,\r\n blob: fileBlob,\r\n fileExtension: fileExtension\r\n };\r\n\r\n return fileData;\r\n};","import { AdjudicationSteps, ElementTypes, FileUploadInputValueInterface, FormColumnInputs, InputDataTypes, InputTypes, WorkflowAdjudicationMicroFlowReviewValue, WorkflowAdjudicationResponseElectedSupplierSelectionValue, WorkflowAdjudicationScoreSheetValue } from \"ngx-t-forms-types\";\r\nimport { createFileFromBase64 } from \"./createFileUploadSample\";\r\nimport { BasicPoint } from \"signature_pad\";\r\nimport { OutputData } from \"@editorjs/editorjs\";\r\n\r\n\r\n// A mock definition for an MSCOA account for demonstration purposes.\r\n const sampleFileName = \"red_dot_image.png\";\r\nconst sampleContentType = 'image/png';\r\n// Sample Base64 encoded string for a small red PNG image\r\nconst redDotBase64 = \"iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\";\r\n\r\nconst mscoaaccount = {\r\n\r\n \"_id\": \"67f3cc80e5109efe61dbf7e7\",\r\n \"SCOAid\": \"ac97d0b1-d32f-4077-947c-f147177f7bfb\",\r\n \"ParentSCOAId\": \"3b60c880-756e-42e6-b609-778569e8d219\",\r\n \"DefinitionDescription\": \"Funding source used for Opening Balances. Where no funding source are utilised\",\r\n \"SCOAFile\": \"FUND\",\r\n \"SCOAAccount\": \"Fund:Non-funding Transactions\",\r\n \"SCOALevel\": \"1\",\r\n \"ShortDescription\": \"Non-funding Transactions\",\r\n \"VATStatus\": \"N/a\",\r\n \"BreakDownAllowed\": \"N\",\r\n \"Principle\": \"N/a\",\r\n \"ApplicableTo\": \"All\",\r\n \"PostingLevel\": \"Y\",\r\n \"AccountNumber\": \"FD003000000000000000000000000000000000\",\r\n \"AccountNumberPrefix\": \"FD\",\r\n \"AccountNumber1\": \"003\",\r\n \"AccountNumber2\": \"000\",\r\n \"AccountNumber3\": \"000\",\r\n \"AccountNumber4\": \"000\",\r\n \"AccountNumber5\": \"000\",\r\n \"AccountNumber6\": \"000\",\r\n \"AccountNumber7\": \"000\",\r\n \"AccountNumber8\": \"000\",\r\n \"AccountNumber9\": \"000\",\r\n \"AccountNumber10\": \"000\",\r\n \"AccountNumber11\": \"000\",\r\n \"AccountNumber12\": \"000\",\r\n \"version\": {\r\n \"versionNumber\": \"6.9\",\r\n \"description\": \"6.9\",\r\n \"updatedAt\": \"2025-04-07T12:59:58.920Z\"\r\n },\r\n \"previousVersion\": [\r\n {\r\n \"versionNumber\": \"6.9\",\r\n \"description\": \"6.9\"\r\n }\r\n ],\r\n \"AccountNumberShortened\": \"FD003\"\r\n\r\n}\r\n\r\n// Interface for a single form input configuration.\r\n\r\n\r\n// --- SAMPLE VALUE GENERATION LOGIC ---\r\n\r\n/**\r\n * A record mapping each input type to a function that generates a sample value.\r\n * Returns are heterogeneous (date string, number, etc.) — `unknown` reflects that.\r\n */\r\nconst INPUT_TYPE_SAMPLE_GENERATORS: Record<InputTypes, () => unknown> = {\r\n [InputTypes.Text]: () => 'Sample Text',\r\n [InputTypes.Number]: () => 42,\r\n [InputTypes.Color]: () => '#ff0000',\r\n [InputTypes.Date]: () => new Date().toISOString().split('T')[0], // YYYY-MM-DD\r\n [InputTypes.Email]: () => 'example@email.com',\r\n [InputTypes.Password]: () => 'samplePassword123',\r\n [InputTypes.Tel]: () => '123-456-7890',\r\n [InputTypes.Url]: () => 'https://example.com',\r\n [InputTypes.DateTimeLocal]: () => new Date().toISOString().slice(0, 16), // YYYY-MM-DDTHH:MM\r\n [InputTypes.Month]: () => new Date().toISOString().slice(0, 7), // YYYY-MM\r\n [InputTypes.Week]: () => `${new Date().getFullYear()}-W${Math.ceil((new Date().getDate() + new Date().getDay() + 1) / 7)}`,\r\n [InputTypes.Time]: () => '14:30',\r\n [InputTypes.Search]: () => 'Search Query',\r\n};\r\n\r\n/**\r\n * Generates a sample value for a standard input element based on its type or data type.\r\n * This function serves as the default handler.\r\n * @param {FormColumnInputs} input - The input configuration object.\r\n * @returns A generated sample value (heterogeneous by branch).\r\n */\r\nconst getDefaultSampleValue = (input: FormColumnInputs): unknown => {\r\n // Priority:\r\n // 1. A provided default value.\r\n // 2. A value based on the specific input.type (e.g., 'email', 'date').\r\n // 3. A value based on the generic input.dataType (e.g., 'number', 'boolean').\r\n // 4. An empty string as a final fallback.\r\n\r\n if (input.value !== undefined && input.value !== null) {\r\n return input.value;\r\n }\r\n\r\n if (input.type && INPUT_TYPE_SAMPLE_GENERATORS[input.type]) {\r\n return INPUT_TYPE_SAMPLE_GENERATORS[input.type]();\r\n }\r\n\r\n switch (input.dataType) {\r\n case InputDataTypes.Number:\r\n case InputDataTypes.NumberOrString:\r\n return 100;\r\n case InputDataTypes.Boolean:\r\n return false;\r\n case InputDataTypes.Date:\r\n return new Date();\r\n case InputDataTypes.Array:\r\n return [];\r\n case InputDataTypes.Object:\r\n return {};\r\n case InputDataTypes.String:\r\n default:\r\n return 'Default String';\r\n }\r\n};\r\n\r\n/**\r\n * A record mapping each element type to a function that generates a sample value.\r\n * This makes the main function clean and delegates logic appropriately.\r\n */\r\nconst ELEMENT_SAMPLE_GENERATORS: Record<ElementTypes, (input: FormColumnInputs) => unknown> = {\r\n [ElementTypes.MultipleInput]: (input) => {\r\n const oneEntry = input.formInputs?.reduce<Record<string, unknown>>((acc, formInput) => {\r\n // Recursively generate sample values for sub-inputs\r\n if (formInput.element === ElementTypes.DateRangePicker) {\r\n acc = {\r\n ...acc,\r\n ...(getSampleValueForInput(formInput) as Record<string, unknown>)\r\n }\r\n return acc;\r\n }\r\n acc[formInput.formControlName] = getSampleValueForInput(formInput);\r\n return acc;\r\n }, {}) || {};\r\n\r\n // MultipleInput typically returns an array of objects\r\n return [{\r\n ...oneEntry,\r\n id: input.id || `entry-${Math.random().toString(36).substr(2, 9)}`,\r\n }];\r\n },\r\n [ElementTypes.DatePicker]: () => new Date(),\r\n [ElementTypes.DateRangePicker]: (input) => ({\r\n [input.startDateControl || 'startDate']: new Date(new Date().setDate(new Date().getDate() - 7)),\r\n [input.endDateControl || 'endDate']: new Date(),\r\n }),\r\n [ElementTypes.Toggle]: () => false,\r\n [ElementTypes.MscoaSelection]: (input) => {\r\n return input.mscoaConfig?.segments?.reduce<Record<string, unknown>>((acc, segment) => {\r\n if (segment.segment) {\r\n acc[segment.segment] = {\r\n debit: mscoaaccount,\r\n credit: mscoaaccount,\r\n };\r\n }\r\n return acc;\r\n }, {}) || {};\r\n },\r\n // These elements fall back to the default handler\r\n [ElementTypes.Input]: getDefaultSampleValue,\r\n [ElementTypes.Textarea]: getDefaultSampleValue,\r\n [ElementTypes.Select]: getDefaultSampleValue,\r\n [ElementTypes.Location]: () => {\r\n const v:GeolocationPosition = {\r\n coords: {\r\n accuracy: 0,\r\n altitude: 53.2734,\r\n altitudeAccuracy: 0,\r\n heading: 0,\r\n latitude: -7.77832031,\r\n longitude: 0,\r\n speed: 33,\r\n toJSON: function () {\r\n throw new Error(\"Function not implemented.\");\r\n }\r\n },\r\n timestamp: Date.now(),\r\n toJSON: function () {\r\n throw new Error(\"Function not implemented.\");\r\n }\r\n }\r\n return v\r\n },\r\n [ElementTypes.AutoCompleteInput]: getDefaultSampleValue,\r\n [ElementTypes.IconSelect]: getDefaultSampleValue,\r\n [ElementTypes.FileUpload]: function (input: FormColumnInputs) {\r\n\r\n\r\n return createFileFromBase64(sampleFileName, sampleContentType, redDotBase64);\r\n },\r\n [ElementTypes.Signature]: function (input: FormColumnInputs) {\r\n const p:BasicPoint = {\r\n x: 0,\r\n y: 0,\r\n pressure: 0,\r\n time: 0\r\n }\r\n return {\r\n points: [p],\r\n }\r\n },\r\n [ElementTypes.ImageCapture]: function (input: FormColumnInputs) {\r\n const file = createFileFromBase64(sampleFileName, sampleContentType, redDotBase64);\r\n const image:FileUploadInputValueInterface = {\r\n fileName: \"\",\r\n type: undefined,\r\n base64: null,\r\n blob: file.blob,\r\n fileExtension: \"\"\r\n }\r\n return image;\r\n },\r\n [ElementTypes.SectionTitle]: getDefaultSampleValue,\r\n [ElementTypes.Editor]: function (input: FormColumnInputs) {\r\n const rixhText:OutputData = {\r\n blocks: []\r\n }\r\n return rixhText;\r\n },\r\n [ElementTypes.WorkflowDocumentPicker]: getDefaultSampleValue,\r\n // TODO: Implement sample value for PaginatedSelectionTable\r\n [ElementTypes.PaginatedSelectionTable]: () => [],\r\n [ElementTypes.WorkflowAdjudication]: (input: FormColumnInputs) => {\r\n if(input.adjudicationStep === AdjudicationSteps.SubMissionReview){\r\n const review: WorkflowAdjudicationMicroFlowReviewValue = {\r\n id: \"\",\r\n adj_microFlow_review: undefined,\r\n nameOfBidder: \"\",\r\n supplierNumber: \"\",\r\n createdAt: new Date(),\r\n updatedAt: new Date(),\r\n adjudicationPricePreferenceCalculation: 0,\r\n reference: \"\"\r\n }\r\n return review;\r\n \r\n }\r\n if(input.adjudicationStep === AdjudicationSteps.ScoreCreation){\r\n const scoreSheet:WorkflowAdjudicationScoreSheetValue[] =[{\r\n id: \"\",\r\n formControlName: \"\",\r\n totalPoints: 0,\r\n description: \"\",\r\n pointType: input.adjudicationPointTypes[0] || \"\",\r\n inputId: undefined,\r\n isEditRow: true\r\n }];\r\n return scoreSheet;\r\n }\r\n if(input.adjudicationStep === AdjudicationSteps.SupplierSelection){\r\n const c:WorkflowAdjudicationResponseElectedSupplierSelectionValue = {\r\n id: \"\",\r\n supplierNumber: \"\",\r\n resolutionNotes: \"\",\r\n resolutionAttachment: \"\"\r\n }\r\n return c;\r\n }\r\n return {};\r\n\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Creates a sample value for a given form input configuration.\r\n * It determines the value based on the input's element type, specific input type (e.g., email, number),\r\n * or data type, with a fallback to a default value.\r\n *\r\n * @param {FormColumnInputs} input - The configuration object for the form input.\r\n * @returns {any} A sample value appropriate for the input type.\r\n *\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Phase-4: public surface (api-extractor baseline locks `any`). Narrow to `unknown` in v3.0.0.\r\nexport function getSampleValueForInput(input: FormColumnInputs): any {\r\n // Find the appropriate generator function for the element type, or use the default.\r\n const generator = ELEMENT_SAMPLE_GENERATORS[input.element] || getDefaultSampleValue;\r\n return generator(input);\r\n}\r\n\r\n","import { DatePipe, CurrencyPipe, DecimalPipe, UpperCasePipe, LowerCasePipe, TitleCasePipe } from '@angular/common';\r\nimport { DocumentLitsLabelConfigInterfaceValueType, FormColumnInputs, InputDataTypes, InputPipeTypes } from 'ngx-t-forms-types';\r\n\r\n\r\n// Cache instances to prevent memory pressure and speed up execution\r\nconst PIPE_CACHE = {\r\n date: new DatePipe('en-ZA'),\r\n currency: new CurrencyPipe('en-ZA'),\r\n decimal: new DecimalPipe('en-ZA'),\r\n upper: new UpperCasePipe(),\r\n lower: new LowerCasePipe(),\r\n title: new TitleCasePipe(),\r\n};\r\n\r\n/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Phase-4: public surface (api-extractor baseline locks `any`). Pipe-style helper mirrors Angular's PipeTransform contract; narrow to `unknown` in v3.0.0.\r\nexport function getPipedValueFromDataType(\r\n dataType: InputDataTypes | undefined | DocumentLitsLabelConfigInterfaceValueType,\r\n value: any,\r\n pipe: FormColumnInputs['pipe'] | undefined\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n): any {\r\n // 1. Guard for empty values\r\n if (value === null || value === undefined || value === '') return value;\r\n try {\r\n const pipeType = pipe?.pipeType;\r\n const param = pipe?.param;\r\n\r\n // 2. Priority: Explicit Pipe Configuration\r\n if (pipeType) {\r\n switch (pipeType) {\r\n case InputPipeTypes.Date:\r\n return PIPE_CACHE.date.transform(value, param || 'd MMMM y');\r\n \r\n case InputPipeTypes.Currency:\r\n // Ensure we handle strings that look like numbers\r\n const numValue = typeof value === 'string' ? parseFloat(value) : value;\r\n \r\n return PIPE_CACHE.currency.transform(numValue, param || 'ZAR', 'symbol-narrow', '1.2-2');\r\n \r\n case InputPipeTypes.Percent:\r\n return PIPE_CACHE.decimal.transform(parseFloat(value), param || '1.0-2') + '%';\r\n \r\n case InputPipeTypes.Number:\r\n case InputPipeTypes.Decimal:\r\n return PIPE_CACHE.decimal.transform(parseFloat(value), param);\r\n \r\n case InputPipeTypes.Integer:\r\n return PIPE_CACHE.decimal.transform(parseFloat(value), '1.0-0');\r\n\r\n case InputPipeTypes.UpperCase:\r\n return PIPE_CACHE.upper.transform(String(value));\r\n\r\n case InputPipeTypes.LowerCase:\r\n return PIPE_CACHE.lower.transform(String(value));\r\n\r\n case InputPipeTypes.TitleCase:\r\n return PIPE_CACHE.title.transform(String(value));\r\n\r\n case InputPipeTypes.Trim:\r\n return typeof value === 'string' ? value.trim() : value;\r\n\r\n case InputPipeTypes.Time:\r\n return PIPE_CACHE.date.transform(value, param || 'shortTime');\r\n\r\n default:\r\n break; // Fall through to DataType logic if no pipe type matched\r\n }\r\n }\r\n\r\n // 3. Fallback: Default behavior based on dataType (The \"Auto-Pipe\" logic)\r\n switch (dataType) {\r\n case 'date':\r\n // If it's a date string but not formatted, force mediumDate\r\n const formattedDate = PIPE_CACHE.date.transform(value, 'd MMMM y');\r\n return formattedDate ?? value; // Return original if transform fails\r\n\r\n case 'currency':\r\n const curValue = typeof value === 'string' ? parseFloat(value) : value;\r\n return PIPE_CACHE.currency.transform(curValue, 'ZAR', 'symbol-narrow') ?? value;\r\n\r\n default:\r\n return value;\r\n }\r\n\r\n } catch {\r\n // Fail silently but return the original value so data isn't lost\r\n return value;\r\n }\r\n}","import { NgxTFormsConfig } from 'ngx-t-forms-types';\r\n\r\n/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\nexport function getUrl(url: string,variables: NgxTFormsConfig): string {\r\n const hasVariables = url.includes('{{') && url.includes('}}');\r\n if (hasVariables) {\r\n const newUrl = replaceEnvironmentVariables(url,variables);\r\n return newUrl \r\n }\r\n return `${variables.base_url}/${url}`\r\n }\r\nfunction replaceEnvironmentVariables(url: string,variables: NgxTFormsConfig): string {\r\n // NgxTFormsConfig has heterogeneous, optional fields; the template grammar\r\n // looks them up by string key, so we treat the bag as a string-keyed record.\r\n const bag: Record<string, unknown> = { ...(variables as object) } as Record<string, unknown>;\r\n return url.replace(/\\{\\{(\\$?)(.+?)\\}\\}/g, (match, _dollar: string, p1: string) => {\r\n void _dollar;\r\n const key = p1.trim();\r\n\r\n if (!key) {\r\n return match; // Return original if the key is empty\r\n }\r\n\r\n const envVar = bag[key];\r\n\r\n if (envVar === undefined) {\r\n return match; // Return original if not found\r\n }\r\n\r\n return String(envVar);\r\n });\r\n }"," import { v4 as uuidv4 } from 'uuid';\r\n\r\nexport const expandDotNotation = (obj: Record<string, any> | null | undefined): Record<string, any> => {\r\n if (obj == null || typeof obj !== 'object') return {};\r\n const result: Record<string, any> = {};\r\n for (const [key, value] of Object.entries(obj)) {\r\n const parts = key.split('.').filter(p => p.length > 0);\r\n if (parts.length === 0) continue;\r\n if (parts.length === 1) {\r\n const leaf = parts[0]!;\r\n if (leaf in result && typeof result[leaf] === 'object' && !Array.isArray(result[leaf])) {\r\n console.warn(`expandDotNotation: flat key \"${key}\" conflicts with an existing nested path — skipping.`);\r\n continue;\r\n }\r\n result[leaf] = value;\r\n continue;\r\n }\r\n let node = result;\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i]!;\r\n if (!(part in node)) {\r\n node[part] = {};\r\n } else if (typeof node[part] !== 'object' || node[part] === null || Array.isArray(node[part])) {\r\n console.warn(`expandDotNotation: key \"${key}\" conflicts with existing non-object value at \"${parts.slice(0, i + 1).join('.')}\" — overwriting.`);\r\n node[part] = {};\r\n }\r\n node = node[part] as Record<string, any>;\r\n }\r\n node[parts.at(-1)!] = value;\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\n const sheetConsolodation = (allSheets: Record<string, Record<string, any>[]>): Record<string, any>[] => {\r\n if (typeof allSheets !== \"object\" || allSheets === null)\r\n throw new Error(\"Sheet consolidation failed: allSheets must be a non-null object.\");\r\n\r\n const main = allSheets[\"main\"];\r\n if (!Array.isArray(main))\r\n throw new Error(\"Sheet consolidation failed: main sheet must be an array.\");\r\n\r\n const childKeys = Object.keys(allSheets).filter(key => key !== \"main\");\r\n return main.reduce<Record<string, any>[]>((acc, row, index) => {\r\n if (typeof row !== \"object\" || row === null) {\r\n console.warn(`Skipping invalid row at index ${index} in main sheet.`);\r\n return acc;\r\n }\r\n\r\n const consolidatedRow ={ ...row } //expandDotNotation({ ...row });\r\n\r\n for (const key of childKeys) {\r\n const sheet = allSheets[key];\r\n if (!Array.isArray(sheet)) {\r\n console.warn(`Skipping sheet \"${key}\": expected an array.`);\r\n continue;\r\n }\r\n consolidatedRow[key] = sheet.filter(r => Number(r['$index']) === index + 1).map(\r\n r => {\r\n delete r['$index'];\r\n return{ ...r, id: r['id'] ?? uuidv4() } //expandDotNotation({ ...r, id: r['id'] ?? uuidv4() });\r\n }\r\n );\r\n }\r\n\r\n acc.push(consolidatedRow);\r\n return acc;\r\n }, []);\r\n}\r\nexport{ sheetConsolodation }","import { catchError, EMPTY, filter, forkJoin, map, Observable, of, switchMap, tap } from \"rxjs\"\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\n\r\nimport { assignDeepPropertyToObject } from \"../../../shared\";\r\nimport { APIDataFetchingConfigurationInterface, InClassFormUtilsInterface, FormInterface, FormSubmissionStatus } from 'ngx-t-forms-types';\r\nimport { VALIDATION_OVERRIDES_KEY } from \"../../../services/core/t-form-tower-controller/functions/overrideValidation\";\r\n\r\n/** Loose record alias used for dynamic form payloads flowing through HTTP helpers. */\r\ntype FormValues = Record<string, unknown>;\r\n\r\n/** File-data shape produced by the file-upload input. */\r\ninterface FileData {\r\n base64: string;\r\n fileName: string;\r\n type: string;\r\n id: string;\r\n fileExtension?: string;\r\n}\r\n\r\n\r\nexport type FileUploadFn = (\r\n file: string,\r\n fileName: string,\r\n fileType: string,\r\n) => Observable<{ url: string }>;\r\n\r\n/**\r\n * Checks if a value is a FileData object\r\n */\r\nconst isFileData = (value: unknown): value is FileData => {\r\n if (!value || typeof value !== 'object') return false;\r\n const v = value as Record<string, unknown>;\r\n return (\r\n 'base64' in v &&\r\n 'fileName' in v &&\r\n 'fileExtension' in v\r\n );\r\n};\r\n\r\n/**\r\n * Recursively finds all file objects in the form data\r\n */\r\nconst findFileControls = (\r\n data: unknown,\r\n path: string[] = [],\r\n result: { path: string[]; fileData: FileData }[] = []\r\n): { path: string[]; fileData: FileData }[] => {\r\n if (!data || typeof data !== 'object') {\r\n return result;\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n data.forEach((item, index) => {\r\n findFileControls(item, [...path, index.toString()], result);\r\n });\r\n return result;\r\n }\r\n\r\n Object.entries(data as Record<string, unknown>).forEach(([key, value]) => {\r\n if (isFileData(value)) {\r\n result.push({ path: [...path, key], fileData: value });\r\n } else if (typeof value === 'object') {\r\n findFileControls(value, [...path, key], result);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Sets a deeply nested value in an object using a path array\r\n */\r\nconst setNestedValue = (obj: FormValues, path: string[], value: unknown): FormValues => {\r\n return assignDeepPropertyToObject({ ...obj }, path, value) as FormValues;\r\n};\r\n\r\n/**\r\n * A single asset queued for upload. `fileData` nodes are replaced by the `{ url }` object the\r\n * upload resolves to; `quillEmbed` nodes are an `insert.<image|video>` string inside a Quill\r\n * Delta and must be replaced by the bare URL string so Quill keeps rendering the embed.\r\n */\r\ninterface PendingUpload {\r\n kind: 'fileData' | 'quillEmbed';\r\n path: string[];\r\n base64: string;\r\n fileName: string;\r\n fileType: string;\r\n}\r\n\r\n/** Embed inserts a Quill Delta can carry as a base64 data-URI. */\r\nconst QUILL_EMBED_KINDS = ['image', 'video'] as const;\r\n\r\n/** Loosely-typed Quill Delta op — we only ever read `insert`. */\r\ninterface QuillOpLike {\r\n insert?: unknown;\r\n}\r\n\r\n/** Maps a data-URI mime type to a file extension for the synthesized upload name. */\r\nconst DATA_URI_EXTENSIONS: Record<string, string> = {\r\n 'image/png': 'png',\r\n 'image/jpeg': 'jpg',\r\n 'image/jpg': 'jpg',\r\n 'image/gif': 'gif',\r\n 'image/webp': 'webp',\r\n 'image/svg+xml': 'svg',\r\n 'image/bmp': 'bmp',\r\n 'video/mp4': 'mp4',\r\n 'video/webm': 'webm',\r\n 'video/ogg': 'ogv',\r\n 'video/quicktime': 'mov',\r\n};\r\n\r\n/** Extracts the mime type from a `data:<mime>[;base64],…` URI. */\r\nconst parseDataUriMime = (dataUri: string): string => {\r\n const match = /^data:([^;,]+)/.exec(dataUri);\r\n return match?.[1] ?? 'application/octet-stream';\r\n};\r\n\r\n/** Builds a unique upload filename so bucket keys never collide (data-URIs carry no name). */\r\nconst buildQuillAssetFileName = (dataUri: string, kind: string): string => {\r\n const mime = parseDataUriMime(dataUri);\r\n const extension = DATA_URI_EXTENSIONS[mime] ?? mime.split('/')[1]?.split('+')[0] ?? 'bin';\r\n return `quill-${kind}-${uuidv4()}.${extension}`;\r\n};\r\n\r\n/** A Quill control value is a Delta: an object carrying an `ops` array. */\r\nconst isQuillDelta = (value: unknown): value is { ops: QuillOpLike[] } => {\r\n if (!value || typeof value !== 'object') return false;\r\n return Array.isArray((value as Record<string, unknown>)['ops']);\r\n};\r\n\r\n/**\r\n * Recursively finds every base64 Quill asset in the form data — nested objects, arrays and\r\n * multiple-input rows included. Only `data:` srcs are collected, so existing `http(s)` URLs are\r\n * left untouched and re-submits never re-upload.\r\n */\r\nconst findQuillAssets = (\r\n data: unknown,\r\n path: string[] = [],\r\n result: PendingUpload[] = []\r\n): PendingUpload[] => {\r\n if (!data || typeof data !== 'object') {\r\n return result;\r\n }\r\n\r\n if (Array.isArray(data)) {\r\n data.forEach((item, index) => {\r\n findQuillAssets(item, [...path, index.toString()], result);\r\n });\r\n return result;\r\n }\r\n\r\n if (isQuillDelta(data)) {\r\n data.ops.forEach((op, index) => {\r\n const insert = op?.insert;\r\n if (!insert || typeof insert !== 'object') return;\r\n const embed = insert as Record<string, unknown>;\r\n QUILL_EMBED_KINDS.forEach(kind => {\r\n const src = embed[kind];\r\n if (typeof src === 'string' && src.startsWith('data:')) {\r\n result.push({\r\n kind: 'quillEmbed',\r\n path: [...path, 'ops', index.toString(), 'insert', kind],\r\n base64: src,\r\n fileName: buildQuillAssetFileName(src, kind),\r\n fileType: parseDataUriMime(src),\r\n });\r\n }\r\n });\r\n });\r\n return result;\r\n }\r\n\r\n Object.entries(data as Record<string, unknown>).forEach(([key, value]) => {\r\n if (value && typeof value === 'object') {\r\n findQuillAssets(value, [...path, key], result);\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Uploads all form assets to storage and swaps the inlined base64 for the resolved resource\r\n * URL, with support for nested objects, arrays and multiple-input rows. Handles both\r\n * file-upload inputs (`FileData` nodes) and base64 media embedded in Quill rich-text values\r\n * (`insert.image` / `insert.video` data-URIs inside a Delta).\r\n */\r\nconst uploadFormFilesToServer = (\r\n formData: unknown,\r\n fileUpload: FileUploadFn\r\n): Observable<unknown> => {\r\n // 1) Check Required Params\r\n if (typeof fileUpload !== 'function') {\r\n return of(formData);\r\n }\r\n\r\n // 2) Check if data is an object\r\n if (typeof formData !== 'object' || formData === null) {\r\n return of(formData);\r\n }\r\n\r\n // 3) Collect every asset needing upload (including nested) — file-upload inputs and Quill\r\n // base64 media share the single upload + replacement pass below.\r\n const pending: PendingUpload[] = [\r\n ...findFileControls(formData).map(({ path, fileData }): PendingUpload => ({\r\n kind: 'fileData',\r\n path,\r\n base64: fileData.base64,\r\n fileName: fileData.fileName,\r\n fileType: fileData.type,\r\n })),\r\n ...findQuillAssets(formData),\r\n ];\r\n\r\n if (pending.length === 0) {\r\n return of(formData);\r\n }\r\n\r\n // 4) Create observables for asset uploads\r\n const uploads = pending.map(item =>\r\n fileUpload(\r\n item.base64,\r\n item.fileName,\r\n item.fileType,\r\n ).pipe(\r\n map(result => ({ item, result }))\r\n )\r\n );\r\n\r\n // 5) Upload all assets and update form data. Quill embeds receive the bare URL string;\r\n // file-upload nodes receive the resolved `{ url }` object (existing behaviour).\r\n return forkJoin(uploads).pipe(\r\n map(results => {\r\n let updatedFormData: FormValues = { ...(formData as FormValues) };\r\n\r\n results.forEach(({ item, result }) => {\r\n const replacement = item.kind === 'quillEmbed' ? result.url : { ...result };\r\n updatedFormData = setNestedValue(updatedFormData, item.path, replacement);\r\n });\r\n\r\n return updatedFormData;\r\n }),\r\n catchError(error => {\r\n throw error;\r\n })\r\n );\r\n};\r\n\r\nconst createQueryString = (data: Record<string, unknown>): string => {\r\n const params = new URLSearchParams(\r\n Object.entries(data || {}).map(([key, value]) => [key, String(value)])\r\n );\r\n return params.toString();\r\n};\r\n\r\nconst makeApiCall = (\r\n api: APIDataFetchingConfigurationInterface,\r\n formData: FormValues,\r\n Utils: InClassFormUtilsInterface\r\n): Observable<unknown> => {\r\n\r\n const { httpMethod, httpEndPoint } = api;\r\n\r\n if (!httpEndPoint) {\r\n throw new Error('httpEndPoint is not defined in api');\r\n }\r\n if (typeof Utils.httpPostDataFunction !== 'function' || typeof Utils.httpGetDataFunction !== 'function') {\r\n throw new Error('httpPostDataFunction or httpGetDataFunction is not defined in Utils');\r\n }\r\n return httpMethod === 'POST'\r\n ? Utils.httpPostDataFunction(httpEndPoint, formData, {})\r\n : Utils.httpGetDataFunction(\r\n `${httpEndPoint}?${createQueryString(formData)}`,\r\n {}\r\n );\r\n};\r\n/**\r\n * Extracts specific properties from an object based on a comma-separated string of keys.\r\n * Supports both direct key mapping and binding key notation for property renaming.\r\n *\r\n * @param obj - The source object to extract properties from\r\n * @param keysString - A comma-separated string of keys to extract.\r\n * Supports two formats:\r\n * 1. Direct key: \"propName\"\r\n * 2. Binding key: \"newName:{originalName}\"\r\n *\r\n * @returns A new object containing only the specified properties\r\n *\r\n * @example\r\n * // Direct key usage\r\n * destructureObject({a: 1, b: 2}, \"a,b\") // Returns {a: 1, b: 2}\r\n *\r\n * @example\r\n * // Binding key usage\r\n * destructureObject({orig: 1}, \"new:{orig}\") // Returns {new: 1}\r\n */\r\nfunction destructureObject(obj: Record<string, unknown>, keysString: string): FormValues {\r\n // Split the keys string into an array of keys\r\n const keys = keysString.split(',').map(key => key.trim()) || [];\r\n\r\n // Create a new object with the desired keys\r\n const result: FormValues = {};\r\n keys.forEach(key => {\r\n if (key in obj) {\r\n result[key] = obj[key];\r\n }\r\n // Check if the key is a binding key and extract the value from the object\r\n if (key.includes('{') && key.includes('}') && key.includes(':')) {\r\n const properties = key.split(':');\r\n const keyName = properties[0];\r\n const bindKey = properties[1]?.replace('{', '').replace('}', '');\r\n if (!bindKey || !keyName) return;\r\n if (bindKey in obj) {\r\n result[keyName] = obj[bindKey];\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n/**\r\n * Projects and combines form data according to API configuration and additional passed data.\r\n *\r\n * @param api - The API configuration object containing projection settings\r\n * @param formData - The form data to be processed\r\n * @param passData - Additional data to be merged with the form data\r\n * @returns The projected and combined data object\r\n *\r\n * If api.projectFormData is not present:\r\n * - Returns merged formData and passData if passData is a non-null object\r\n * - Returns formData as-is otherwise\r\n *\r\n * If api.projectFormData is present:\r\n * - Destructures formData according to projection rules\r\n * - Merges with passData if passData is a non-null object\r\n */\r\nconst projectApiData = (\r\n api: APIDataFetchingConfigurationInterface,\r\n formData: FormValues,\r\n passData: unknown,\r\n): FormValues => {\r\n\r\n // Validation overrides are a submission-level concern that must reach the\r\n // backend regardless of the form's `projectFormData` whitelist, so they are\r\n // re-attached to the primary payload after projection (never destructured\r\n // through `$formValue`).\r\n const overrides = formData?.[VALIDATION_OVERRIDES_KEY];\r\n const withOverrides = (projected: FormValues): FormValues =>\r\n overrides !== undefined ? { ...projected, [VALIDATION_OVERRIDES_KEY]: overrides } : projected;\r\n\r\n if (!api?.projectFormData) {\r\n if (typeof passData === 'object' && passData !== null) {\r\n return withOverrides({\r\n ...formData,\r\n ...(passData as FormValues),\r\n });\r\n }\r\n return withOverrides(formData);\r\n }\r\n\r\n if (typeof passData === 'object' && passData !== null) {\r\n return withOverrides({\r\n ...destructureObject({ \"$formValue\": formData }, api.projectFormData),\r\n ...(passData as FormValues),\r\n });\r\n }\r\n return withOverrides(destructureObject({ \"$formValue\": formData }, api.projectFormData));\r\n\r\n};\r\n\r\nconst executeApiCalls = (\r\n apis: APIDataFetchingConfigurationInterface[],\r\n formData: FormValues,\r\n Utils: InClassFormUtilsInterface,\r\n passData?: unknown,\r\n): Observable<unknown[]> => {\r\n\r\n const apiCalls = apis.map(api => makeApiCall(api, projectApiData(api, formData, passData), Utils));\r\n return forkJoin(apiCalls);\r\n};\r\n\r\nconst handleCanSubmitAPI = (\r\n form: FormInterface,\r\n formData: FormValues,\r\n passData: unknown,\r\n Utils: InClassFormUtilsInterface,\r\n): Observable<boolean> => {\r\n try {\r\n // `submissionHandle` is optional upstream — guard before destructure.\r\n const canSubmitAPI = form.submissionHandle?.canSubmitAPI;\r\n if (!canSubmitAPI || canSubmitAPI.length === 0) {\r\n return of(true);\r\n }\r\n Utils.setSubmissionStatusValue(FormSubmissionStatus.VALIDATING);\r\n return executeApiCalls(canSubmitAPI, formData, Utils, passData).pipe(\r\n map(responses => responses.every(response => response === true))\r\n );\r\n } catch {\r\n return of(false);\r\n }\r\n};\r\n\r\nconst handleSubmissionAPI = (\r\n form: FormInterface,\r\n getAllValues: FormValues,\r\n passData: unknown,\r\n Utils: InClassFormUtilsInterface,\r\n): Observable<unknown> => {\r\n // `submissionHandle` is optional upstream — guard before destructure.\r\n const submissionAPI = form.submissionHandle?.submissionAPI;\r\n if (!submissionAPI) {\r\n return EMPTY;\r\n }\r\n Utils.setSubmissionStatusValue(FormSubmissionStatus.UPLOADING);\r\n\r\n return uploadFormFilesToServer(getAllValues, Utils.fileUpload).pipe(\r\n tap(() => Utils.setSubmissionStatusValue(FormSubmissionStatus.SUBMITTING)),\r\n switchMap(formData => executeApiCalls(submissionAPI, formData as FormValues, Utils, passData))\r\n );\r\n\r\n};\r\n\r\nexport const formHttpSubmissions = (\r\n form: FormInterface,\r\n formData: FormValues,\r\n passData: unknown,\r\n Utils: InClassFormUtilsInterface,\r\n): Observable<unknown> => {\r\n try {\r\n const { submissionHandle } = form;\r\n if (!submissionHandle) {\r\n return EMPTY;\r\n }\r\n if (typeof Utils.httpPostDataFunction !== 'function' || typeof Utils.httpGetDataFunction !== 'function' || typeof Utils.fileUpload !== 'function') {\r\n throw new Error('httpPostDataFunction or httpGetDataFunction is not defined in Utils');\r\n }\r\n\r\n Utils.setSubmissionStatusValue(FormSubmissionStatus.SUBMITTING);\r\n return handleCanSubmitAPI(form, formData, passData, Utils).pipe(\r\n filter(canSubmit => canSubmit),\r\n switchMap(() =>\r\n handleSubmissionAPI(form, formData, passData, Utils).pipe(\r\n catchError(_error => {\r\n Utils.setSubmissionStatusValue(FormSubmissionStatus.FAILED);\r\n return EMPTY;\r\n })\r\n )\r\n ),\r\n catchError(() => {\r\n Utils.setSubmissionStatusValue(FormSubmissionStatus.FAILED);\r\n return EMPTY;\r\n })\r\n );\r\n } catch (error) {\r\n throw error;\r\n }\r\n};\r\n","/**\r\n * Compares previous and current objects, returning only properties that changed.\r\n * - Properties in prev but not in current: set to undefined\r\n * - Properties in current but not in prev: included with current value\r\n * - Properties in both with different values: included with current value\r\n *\r\n * @example\r\n * // prev = {a: 8, b: 0}, current = {b: 5}\r\n * // result = {b: 5, a: undefined}\r\n */\r\nexport function getChangedProperties<T extends Record<string, unknown>>(\r\n prevPassed: T | null | undefined,\r\n currentPassed: T | null | undefined\r\n ): Partial<T> {\r\n // Handle edge cases\r\n // remove undefined in prev\r\n const prev = prevPassed ? Object.keys(prevPassed).reduce((acc, key) => {\r\n if (prevPassed[key] !== undefined) {\r\n (acc as Record<string, unknown>)[key] = prevPassed[key];\r\n }\r\n return acc;\r\n }, {} as Partial<T>) : undefined;\r\n // remove undefined in current\r\n const current = currentPassed ? Object.keys(currentPassed).reduce((acc, key) => {\r\n if (currentPassed[key] !== undefined) {\r\n (acc as Record<string, unknown>)[key] = currentPassed[key];\r\n }\r\n return acc;\r\n }, {} as Partial<T>) : undefined;\r\n // if both are undefined return empty object\r\n\r\n if (!prev && !current) return {};\r\n if (!prev) return { ...current } as Partial<T>;\r\n if (!current) {\r\n return Object.keys(prev).reduce((acc, key) => {\r\n (acc as Record<string, unknown>)[key] = undefined;\r\n return acc;\r\n }, {} as Partial<T>);\r\n }\r\n\r\n const changedProperties: Partial<T> = {};\r\n\r\n // Check properties from prev\r\n for (const key in prev) {\r\n if (!(key in current)) {\r\n // Property removed in current\r\n changedProperties[key] = undefined;\r\n } else if (!_isEqual(prev[key], current[key])) {\r\n // Property value changed\r\n changedProperties[key] = current[key];\r\n }\r\n }\r\n\r\n // Check for new properties in current\r\n for (const key in current) {\r\n if (!(key in prev)) {\r\n // New property added\r\n changedProperties[key] = current[key];\r\n }\r\n }\r\n\r\n return changedProperties;\r\n }\r\n\r\nexport function _isEqual(prev: unknown, next: unknown): boolean {\r\n if (prev === next) return true;\r\n\r\n const prevType = typeof prev;\r\n const nextType = typeof next;\r\n\r\n if (prevType !== nextType) return false;\r\n\r\n if (prevType === 'number') {\r\n return (prev === next) || (Number.isNaN(prev) && Number.isNaN(next));\r\n }\r\n\r\n if (prevType === 'string' || prevType === 'boolean') {\r\n return prev === next;\r\n }\r\n\r\n if (Array.isArray(prev) && Array.isArray(next)) {\r\n if (prev.length !== next.length) return false;\r\n for (let i = 0; i < prev.length; i++) {\r\n if (!_isEqual(prev[i], next[i])) return false;\r\n }\r\n return true;\r\n }\r\n\r\n if (prevType === 'object' && prev !== null && next !== null) {\r\n const prevObj = prev as Record<string, unknown>;\r\n const nextObj = next as Record<string, unknown>;\r\n const prevConstructor = prevObj.constructor;\r\n const nextConstructor = nextObj.constructor;\r\n\r\n if (prevConstructor !== nextConstructor) return false;\r\n\r\n if (prevConstructor === Date) {\r\n return (prev as Date).getTime() === (next as Date).getTime();\r\n }\r\n\r\n if (prevConstructor === RegExp) {\r\n const pRe = prev as RegExp;\r\n const nRe = next as RegExp;\r\n return pRe.source === nRe.source && pRe.flags === nRe.flags;\r\n }\r\n\r\n const prevKeys = Object.keys(prevObj);\r\n const nextKeys = Object.keys(nextObj);\r\n\r\n if (prevKeys.length !== nextKeys.length) return false;\r\n\r\n for (const key of prevKeys) {\r\n if (!Object.prototype.hasOwnProperty.call(nextObj, key)) return false;\r\n if (!_isEqual(prevObj[key], nextObj[key])) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return prev === null && next === null;\r\n}\r\n","import {\r\n AdjudicationSteps,\r\n ElementTypes,\r\n FormColumnInputs,\r\n IFinancialCycles,\r\n InputDataTypes,\r\n InputTypes,\r\n OptionSelectTypes,\r\n} from \"ngx-t-forms-types\";\r\nimport { RichTextEditorType } from \"ngx-t-forms-types\";\r\n\r\n/**\r\n * Default values for the required fields that `FormColumnInputs` inherits from\r\n * its sibling intersection members (`ISelectInputInterface`, `IMultiple`,\r\n * `IScoaInput`, `IRichTextEditor`, `IWorkflowAdjudicationInput`,\r\n * `IWorkflowDocumentPicker`, `IPaginatedSelectionTableInputInterface`).\r\n *\r\n * System-generated inputs are simple text/date fields and never exercise these\r\n * branches, but the upstream `FormColumnInputs` type is a structural\r\n * intersection so every required key must still be present. Defining these\r\n * defaults once keeps the literal type-checked end-to-end and removes the need\r\n * for an `as unknown as FormColumnInputs` cast at the construction site.\r\n */\r\nconst SIBLING_INTERSECTION_DEFAULTS = {\r\n optionSelectType: OptionSelectTypes.DropDown,\r\n allowMultipleSelection: false,\r\n paginationSelectionConfig: {\r\n useLocalPagination: false,\r\n columns: [] as Array<{ key: string; label: string; id: string }>,\r\n },\r\n workflowPickerConfig: {\r\n workflowId: \"\",\r\n documentSourceType: \"default\" as const,\r\n },\r\n handleLabel: \"\",\r\n calculateListFunctions: [],\r\n mscoaConfig: {\r\n inputs: [],\r\n label: \"\",\r\n segments: undefined,\r\n cashSegments: undefined,\r\n accountValueLabel: \"\",\r\n showAllSegments: false,\r\n },\r\n richTextEditorLibrary: RichTextEditorType.EditorJS,\r\n workflowFormForScoreSheet: \"\",\r\n adjudicationStep: AdjudicationSteps.ScoreCreation,\r\n adjudicationPointTypes: [] as string[],\r\n adjudicationReviewFeedbackTemplate: null,\r\n};\r\n\r\ninterface SystemInputConfig {\r\n id: string;\r\n controlName: string;\r\n label: string;\r\n value: unknown;\r\n sectionId: string;\r\n}\r\n\r\n/**\r\n * Factory to create standardized DatePicker inputs.\r\n * Prevents repetitive object literals and enforces type safety.\r\n */\r\nfunction createDateInput(config: SystemInputConfig): FormColumnInputs {\r\n const dateValue =\r\n config.value instanceof Date\r\n ? new Date(config.value.toISOString())\r\n : undefined;\r\n const input: FormColumnInputs = {\r\n ...SIBLING_INTERSECTION_DEFAULTS,\r\n element: ElementTypes.DatePicker,\r\n formControlName: config.controlName,\r\n id: config.id,\r\n label: config.label,\r\n placeholder: config.label,\r\n value: dateValue,\r\n sectionId: config.sectionId,\r\n dataType: InputDataTypes.Date,\r\n appearance: \"fill\",\r\n required: false,\r\n colSize: 0,\r\n onlySetTempErrorOnTouch: false,\r\n isCalculatedField: false,\r\n validators: [],\r\n };\r\n return input;\r\n}\r\n\r\nfunction createTextInput(config: SystemInputConfig): FormColumnInputs {\r\n const textValue: string | number | boolean | undefined =\r\n typeof config.value === \"string\" ||\r\n typeof config.value === \"number\" ||\r\n typeof config.value === \"boolean\"\r\n ? config.value\r\n : undefined;\r\n const input: FormColumnInputs = {\r\n ...SIBLING_INTERSECTION_DEFAULTS,\r\n element: ElementTypes.Input,\r\n type: InputTypes.Text,\r\n formControlName: config.controlName,\r\n id: config.id,\r\n label: config.label,\r\n placeholder: config.label,\r\n value: textValue,\r\n sectionId: config.sectionId,\r\n dataType: InputDataTypes.String,\r\n appearance: \"fill\",\r\n required: false,\r\n colSize: 0,\r\n onlySetTempErrorOnTouch: false,\r\n isCalculatedField: false,\r\n validators: [],\r\n };\r\n return input;\r\n}\r\n\r\ninterface IInputConfigGenSysInputs{\r\n condition: boolean;\r\n items: {\r\n id: string;\r\n name: keyof IFinancialCycles;\r\n label: string;\r\n inputType?: 'date' | 'text';\r\n }[];\r\n}\r\nexport function generateSystemInputs(globals: IFinancialCycles, sectionId: string): FormColumnInputs[] {\r\n if (!globals) return [];\r\n\r\n const inputConfigs:IInputConfigGenSysInputs[] = [\r\n {\r\n condition: Boolean(globals.CURRENT_FINANCIAL_CYCLE),\r\n items: [\r\n { id: SystemInputIDs.CURRENT_FINANCIAL_CYCLE, name: 'CURRENT_FINANCIAL_CYCLE', label: 'Current Financial Cycle', inputType: 'text' }\r\n ]\r\n },\r\n {\r\n condition: Boolean(globals.CURRENT_FINANCIAL_CYCLE_START_DATE && globals.CURRENT_FINANCIAL_CYCLE_END_DATE),\r\n items: [\r\n { id: SystemInputIDs.CURRENT_FINANCIAL_CYCLE_START_DATE, name: 'CURRENT_FINANCIAL_CYCLE_START_DATE' , label: 'Current Financial Cycle Start Date' },\r\n { id: SystemInputIDs.CURRENT_FINANCIAL_CYCLE_END_DATE, name: 'CURRENT_FINANCIAL_CYCLE_END_DATE' , label: 'Current Financial Cycle End Date' }\r\n ]\r\n },\r\n {\r\n condition: Boolean(globals.CURRENT_SPRINT_START_DATE && globals.CURRENT_SPRINT_END_DATE),\r\n items: [\r\n { id: SystemInputIDs.CURRENT_SPRINT_START_DATE, name: 'CURRENT_SPRINT_START_DATE' , label: 'Current Sprint Start Date' },\r\n { id: SystemInputIDs.CURRENT_SPRINT_END_DATE, name: 'CURRENT_SPRINT_END_DATE' , label: 'Current Sprint End Date' }\r\n ]\r\n },\r\n {\r\n condition: Boolean(globals.NEXT_FINANCIAL_CYCLE),\r\n items: [\r\n { id: SystemInputIDs.NEXT_FINANCIAL_CYCLE, name: 'NEXT_FINANCIAL_CYCLE', label: 'Next Financial Cycle', inputType: 'text' }\r\n ]\r\n },\r\n {\r\n condition: Boolean(globals.NEXT_FINANCIAL_CYCLE_START_DATE && globals.NEXT_FINANCIAL_CYCLE_END_DATE),\r\n items: [\r\n { id: SystemInputIDs.NEXT_FINANCIAL_CYCLE_START_DATE, name: 'NEXT_FINANCIAL_CYCLE_START_DATE', label: 'Next Financial Cycle Start Date' },\r\n { id: SystemInputIDs.NEXT_FINANCIAL_CYCLE_END_DATE, name: 'NEXT_FINANCIAL_CYCLE_END_DATE', label: 'Next Financial Cycle End Date' }\r\n ]\r\n },\r\n {\r\n condition: Boolean(globals.PREVIOUS_FINANCIAL_CYCLE),\r\n items: [\r\n { id: SystemInputIDs.PREVIOUS_FINANCIAL_CYCLE, name: 'PREVIOUS_FINANCIAL_CYCLE', label: 'Previous Financial Cycle', inputType: 'text' }\r\n ]\r\n },\r\n {\r\n condition: Boolean(globals.PREVIOUS_FINANCIAL_CYCLE_START_DATE && globals.PREVIOUS_FINANCIAL_CYCLE_END_DATE),\r\n items: [\r\n { id: SystemInputIDs.PREVIOUS_FINANCIAL_CYCLE_START_DATE, name: 'PREVIOUS_FINANCIAL_CYCLE_START_DATE', label: 'Previous Financial Cycle Start Date' },\r\n { id: SystemInputIDs.PREVIOUS_FINANCIAL_CYCLE_END_DATE, name: 'PREVIOUS_FINANCIAL_CYCLE_END_DATE', label: 'Previous Financial Cycle End Date' }\r\n ]\r\n }\r\n ];\r\n\r\n return inputConfigs\r\n .filter(group => group.condition)\r\n .flatMap(group => group.items.map(item =>\r\n item.inputType === 'text'\r\n ? createTextInput({ id: item.id, controlName: item.name, label: `🏢 System: ${item.label}`, value: globals[item.name], sectionId })\r\n : createDateInput({ id: item.id, controlName: item.name, label: `🏢 System: ${item.label}`, value: globals[item.name], sectionId })\r\n ));\r\n}\r\n\r\nexport enum SystemInputIDs{\r\n CURRENT_FINANCIAL_CYCLE = \"3f7a1c2d-8e4b-4f9a-b6c5-1d2e3f4a5b6c\",\r\n CURRENT_FINANCIAL_CYCLE_START_DATE = \"aabe9916-efbe-4aee-8ca4-2500832786b1\",\r\n CURRENT_FINANCIAL_CYCLE_END_DATE = \"a9b41b41-6370-4dce-b2b3-cc8bbb7f6b5f\",\r\n CURRENT_SPRINT_START_DATE = \"956d6333-b5a5-4790-ba80-4276dd53ee90\",\r\n CURRENT_SPRINT_END_DATE = \"1e2468d2-4ae3-4778-a007-754d2fa694af\",\r\n NEXT_FINANCIAL_CYCLE = \"7d8e9f0a-1b2c-3d4e-5f6a-7b8c9d0e1f2a\",\r\n NEXT_FINANCIAL_CYCLE_START_DATE = \"b2c3d4e5-f6a7-8b9c-0d1e-2f3a4b5c6d7e\",\r\n NEXT_FINANCIAL_CYCLE_END_DATE = \"c3d4e5f6-a7b8-9c0d-1e2f-3a4b5c6d7e8f\",\r\n PREVIOUS_FINANCIAL_CYCLE = \"d4e5f6a7-b8c9-0d1e-2f3a-4b5c6d7e8f9a\",\r\n PREVIOUS_FINANCIAL_CYCLE_START_DATE = \"e5f6a7b8-c9d0-1e2f-3a4b-5c6d7e8f9a0b\",\r\n PREVIOUS_FINANCIAL_CYCLE_END_DATE = \"f6a7b8c9-d0e1-2f3a-4b5c-6d7e8f9a0b1c\",\r\n}","import { firstValueFrom } from \"rxjs\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nimport { generateSystemInputs } from \"../../../../components/forms/functions/generateSystemInputs\";\r\n\r\n/**\r\n * Fetches global financial-cycle variables and populates the tower's system inputs.\r\n *\r\n * Must be `await`ed inside `initialize` **before** `formGenerator` is called so that\r\n * system-input controls are included in the `FormGroup` from the start.\r\n * Previously this fired a fire-and-forget `.subscribe()` which created a race condition:\r\n * `formGenerator` ran before the observable resolved, so system inputs had no\r\n * corresponding `FormControl`s and every later `updateValue` call for them threw.\r\n *\r\n * Errors are swallowed because system inputs are optional — if `getFinacialCycles`\r\n * fails the tower still functions, just without system-input controls.\r\n *\r\n * @param self - The tower instance whose `systemInputs` will be populated.\r\n */\r\nexport const loadSystemInputs = async (self: FormTowerControllerService): Promise<void> => {\r\n try {\r\n const globalVariables = await firstValueFrom(\r\n self.NGX_T_FORMS_CONFIG.formBuilder.getFinacialCycles()\r\n );\r\n const firstSectionId = self.form?.slides[0]?.columns[0]?.sectionId;\r\n if (!firstSectionId) return;\r\n self.systemInputs = generateSystemInputs(globalVariables, firstSectionId);\r\n } catch {\r\n // system inputs are optional — swallow errors silently\r\n }\r\n}\r\n","/**\n * @file Refresh-order helper for the signal-graph engine (Phase 1 rewrite).\n *\n * In the legacy push-graph this computed a topological order from an explicit\n * `_inputChangeDependencyRecords` table so dependencies ran before dependents.\n * The signal pull-graph self-wires: re-running a resource via `.reload()` makes\n * its `computed` params re-read their dependencies, which propagate through the\n * reactive graph — order is resolved by Angular, not by us.\n *\n * The function is RETAINED (consumer-reachable via `refreshInputWithDependencies`)\n * but no longer needs the dependency-records table. With no explicit graph to\n * walk it simply returns the target input (when it owns refreshable functions),\n * because triggering the target's resources is sufficient — the signal graph\n * re-resolves every dependency automatically.\n *\n * @param targetInputId - The input the caller asked to refresh.\n * @param _legacyDependencyRecords - Ignored (kept for signature parity; the\n * signal graph needs no dependency table).\n * @param inputFunctionsCollection - The legacy-shaped registry adapter over\n * `#derived`; used to filter to inputs that actually have functions to run.\n * @returns The target input ID when it has functions, else an empty array.\n */\nexport function getTopologicalExecutionOrder(\n targetInputId: string,\n _legacyDependencyRecords: Partial<Record<string, Partial<Record<string, Record<string, boolean>>>>>,\n inputFunctionsCollection: Record<string, Partial<Record<string, unknown>>>,\n): string[] {\n void _legacyDependencyRecords;\n const fns = inputFunctionsCollection[targetInputId];\n const hasFunctions = Boolean(fns) && Object.keys(fns ?? {}).length > 0;\n return hasFunctions ? [targetInputId] : [];\n}\n","import { Observable, of, from, concatMap, forkJoin, catchError, tap, last, map } from 'rxjs';\nimport { FormTowerControllerService } from '../form-tower-controller.service';\nimport { getTopologicalExecutionOrder } from './getTopologicalExecutionOrder';\nimport { FunctionTypes } from './getAllFunctionTypes';\nimport { HintType } from '../../../../shared/functions/textIconsForUserHints';\n\n/**\n * Function types that count as \"refreshable\" for the refresh-button gate. The\n * exact membership of this set is the truth value\n * `user-form-stepper.component.html` line 43 / `form-section-stepper` gate on\n * (`engine.canRefreshSection(...)`), so it MUST be preserved verbatim across the\n * Phase 1 signal-graph rewrite (Blueprint §4 / W13).\n */\nconst REFRESH_FUNCTION_TYPES = [\n FunctionTypes.ValueCalculation,\n FunctionTypes.ValuePostMethodAPI,\n FunctionTypes.OptionsPostMethodAPI,\n FunctionTypes.ValueGetMethodAPI,\n FunctionTypes.OptionsGetMethodAPI,\n FunctionTypes.InputSourcedValue,\n FunctionTypes.ValuePostMethodAPIWithAllDefaultParams,\n FunctionTypes.OptionsPostMethodAPIWithAllDefaultParams,\n];\n\n/**\n * Returns true if the input has at least one refreshable function registered in\n * the (signal-graph-backed) `inputFunctionsCollection` adapter.\n *\n * @param self The FormTowerControllerService instance.\n * @param inputId The ID of the input to check.\n * @returns true if the input has at least one refresh function.\n */\nexport function canRefresh(self: FormTowerControllerService, inputId: string): boolean {\n const fns = self.inputFunctionsCollection[inputId];\n if (!fns) return false;\n return REFRESH_FUNCTION_TYPES.some((t) => Boolean(fns[t]));\n}\n\n/**\n * Returns true if any input in the section is refreshable. This is the exact\n * truth value the HTML refresh-button gate depends on (Blueprint §4 / W13).\n *\n * @param self The FormTowerControllerService instance.\n * @param sectionId The ID of the section to check.\n * @returns true if at least one input in the section is refreshable.\n */\nexport function canRefreshSectionFn(self: FormTowerControllerService, sectionId: string): boolean {\n const allInputs = self.allFormInputs();\n if (!allInputs) return false;\n const inputsInSection = allInputs.filter((input) => input.sectionId === sectionId);\n return inputsInSection.some((input) => canRefresh(self, input.id));\n}\n\n/**\n * Refreshes a specified input by re-triggering its signal-graph functions\n * (`resource.reload()` via the `inputFunctionsCollection` adapter). In the\n * signal pull-graph dependents re-resolve automatically once their dependencies\n * change, so an explicit topological dependency walk is no longer required —\n * `getTopologicalExecutionOrder` now simply yields the target itself.\n *\n * @param self The FormTowerControllerService instance.\n * @param inputId The ID of the input to refresh.\n * @returns Observable that completes when the refresh has run.\n */\nexport function refreshInputWithDependencies(self: FormTowerControllerService, inputId: string): Observable<void> {\n // The legacy dependency-records table is gone; pass an empty table for\n // signature parity (getTopologicalExecutionOrder ignores it in Phase 1).\n const order = getTopologicalExecutionOrder(inputId, {}, self.inputFunctionsCollection);\n\n if (order.length === 0) return of(void 0);\n\n return from(order).pipe(\n concatMap((id) => {\n const fns = self.inputFunctionsCollection[id];\n if (!fns) return of(void 0);\n\n const observables = REFRESH_FUNCTION_TYPES\n .map((t) => fns[t])\n .filter((obs): obs is Observable<void> => Boolean(obs))\n .map((obs$) =>\n obs$.pipe(\n catchError(() => of(void 0)),\n ),\n );\n\n return observables.length > 0\n ? forkJoin(observables).pipe(map(() => void 0))\n : of(void 0);\n }),\n tap(() => {\n self.setTemporaryHint(inputId, 'Field Refreshed', HintType.LOADING);\n }),\n last(),\n );\n}\n\n/**\n * Refreshes all inputs within a given section by collecting each refreshable\n * input's refresh observable and running them in parallel.\n *\n * @param self The FormTowerControllerService instance.\n * @param sectionId The ID of the section to refresh.\n * @returns An observable that completes when all inputs in the section have been refreshed.\n */\nexport function refreshSectionInput(self: FormTowerControllerService, sectionId: string): Observable<void> {\n const allInputs = self.allFormInputs();\n if (!allInputs) return of(void 0);\n\n const refreshObservables = allInputs\n .filter((input) => input.sectionId === sectionId && canRefresh(self, input.id))\n .map((input) => refreshInputWithDependencies(self, input.id));\n\n if (refreshObservables.length === 0) return of(void 0);\n\n return forkJoin(refreshObservables).pipe(map(() => void 0));\n}\n","/**\n * @file Shared diagnostic for the dependency-gated `FunctionType` builders.\n *\n * Three function types silently short-circuit when a *required upstream input*\n * they depend on has no value yet:\n *\n * | FunctionType | Short-circuit site |\n * |-----------------------|-----------------------------------------------------|\n * | `ValueCalculation` | `computed` returns `undefined` (a variable is empty)|\n * | `ValuePostMethodAPI` | `params` returns `undefined` → resource stays `idle`|\n * | `OptionsPostMethodAPI`| `params` returns `undefined` → resource stays `idle`|\n *\n * In every case the field is typically **required** (it either *is* the value,\n * or supplies the only way to pick the value), yet nothing is surfaced to the\n * user — the field just never calculates / never loads, and the user is left\n * guessing why. This module restores visibility: it names the missing upstream\n * field(s) by label and tells the user *what* is blocked, *where*, and *what to\n * do about it*.\n *\n * ## Why an `effect` (not the computed itself)\n *\n * The short-circuit is detected inside a `computed` (the calc signal / the\n * resource `params`). A `computed` MUST be side-effect free — calling\n * `setTemporaryHint` there (which patches the definition signal and arms a\n * timer) is the forbidden \"write a signal inside a computed\" anti-pattern and\n * would corrupt the signal graph. So this diagnostic runs in a dedicated\n * `effect()` — an external sink, exactly like the options builder's\n * resolved-edge `effect` and the persist `effect`. The effect reads the same\n * dependencies through `readDep`, so Angular re-runs it whenever they change.\n *\n * ## Emit policy (deterministic, self-throttling)\n *\n * The effect tracks the *set of still-missing dependency ids* between runs:\n *\n * 1. **First run establishes a silent baseline.** During `initialize()` the\n * effect's first flush happens *after* `#seedModelFromDefinition`, so the\n * baseline reflects authored defaults. No hint fires on load — a wholly\n * unstarted required field is already covered by standard required-field\n * validation, and a load-time hint would auto-clear before the user looked.\n * 2. **Subsequent runs emit only on a *change* to the missing-set** that leaves\n * it non-empty. This is the high-signal moment: the user edited something and\n * the function is *still* blocked — e.g. \"you filled A, I still need B\", or\n * they cleared a previously-supplied value. Deduping on the set key means a\n * stable missing-set never re-spams.\n * 3. **A now-empty missing-set emits nothing** — the function proceeds (the\n * calc runs / the resource fires), which is its own feedback.\n *\n * ## Hint semantics\n *\n * Emitted as {@link HintType.WARNING} (⚠️, amber). Per the design rule book a\n * missing dependency is *user-action-needed, not failure/culpability* — amber,\n * never error-red. Red is reserved for genuine failures (HTTP errors keep their\n * existing {@link FormTowerControllerService.setInputTemporaryError} red hints).\n */\nimport { effect, runInInjectionContext, untracked } from '@angular/core';\nimport { HintType } from '../../../../../shared/functions/textIconsForUserHints';\nimport type { DerivedBuildContext } from './types';\n\n/**\n * The kind of work a short-circuited function performs — selects the phrasing\n * of the generated hint so the message reads naturally for the user.\n */\nexport type MissingDependencyKind = 'calculation' | 'value' | 'options';\n\n/**\n * Collects the dependency input ids a single `minimumInputRequired` entry maps\n * to. `'default'` entries (which carry their value inline) map to nothing and\n * yield `[]`, so they can never be reported as \"missing\".\n *\n * Handles both the single-target (`mapto`) shape (`mapTo.inputId`) and the\n * multi-target (`mapDocFilter`) shape (`mapTo: Array<{ inputId }>`), mirroring\n * the snapshot-building logic in the value/options POST-computed builders.\n *\n * @param minInput - A `minimumInputRequired` entry (loosely typed to the only\n * fields read here, avoiding an `@angular/common/http` type import).\n * @returns The mapped dependency input ids (possibly empty).\n */\nexport function collectMinInputDepIds(minInput: { readonly mapTo?: unknown }): string[] {\n const mapTo = minInput.mapTo;\n if (Array.isArray(mapTo)) {\n return (mapTo as Array<{ inputId?: string }>)\n .map((entry) => entry?.inputId)\n .filter((id): id is string => typeof id === 'string' && id.length > 0);\n }\n if (mapTo && typeof mapTo === 'object') {\n const id = (mapTo as { inputId?: string }).inputId;\n return id ? [id] : [];\n }\n return [];\n}\n\n/**\n * Computes the unmet dependency input ids for an HTTP POST-computed function\n * (`ValuePostMethodAPI` / `OptionsPostMethodAPI`), mirroring the builder's own\n * `params` validation: it assembles a snapshot of every mapped dependency value\n * via `readDep`, then runs the supplied `validate` (the shared `validateMinInput`)\n * for each non-`'default'` entry. Any entry that fails contributes its mapped\n * dependency ids to the result.\n *\n * The validator is injected (rather than imported) so this module stays free of\n * the `t-form-controller` value-fetch helpers and any import-cycle risk.\n *\n * @typeParam M - The `minimumInputRequired` entry shape (only `mapTo` is read here).\n * @param minInputs - The fetch config's `backEndConfig.minimumInputRequired`.\n * @param readDep - Cycle-safe dependency reader from {@link DerivedBuildContext}.\n * @param validate - Predicate returning `true` when an entry is satisfied\n * (typically `(m, snap) => validateMinInput(m, snap)`); a throw is treated as\n * unsatisfied, matching the builders' `try/catch`.\n * @returns The unmet dependency input ids (empty when every entry is satisfied).\n */\nexport function computeUnmetMinInputs<M extends { readonly mapTo?: unknown }>(\n minInputs: readonly M[],\n readDep: (inputId: string) => unknown,\n validate: (minInput: M, snapshot: Record<string, unknown>) => boolean,\n): string[] {\n const snapshot: Record<string, unknown> = {};\n for (const minInput of minInputs) {\n for (const id of collectMinInputDepIds(minInput)) snapshot[id] = readDep(id);\n }\n\n const missing: string[] = [];\n for (const minInput of minInputs) {\n const depIds = collectMinInputDepIds(minInput);\n if (depIds.length === 0) continue; // 'default' entries carry inline values\n let satisfied: boolean;\n try {\n satisfied = validate(minInput, snapshot);\n } catch {\n satisfied = false;\n }\n if (!satisfied) missing.push(...depIds);\n }\n return missing;\n}\n\n/**\n * Renders the human-readable, action-oriented label list (`\"A\"`, `\"A\" and \"B\"`,\n * `\"A\", \"B\" and \"C\"`), de-duplicated and blank-stripped.\n *\n * @internal\n */\nfunction joinLabels(labels: readonly string[]): { list: string; plural: boolean } {\n const unique = [...new Set(labels)].filter((l) => l && l.trim().length > 0);\n const quoted = unique.map((l) => `\"${l}\"`);\n if (quoted.length <= 1) return { list: quoted[0] ?? 'an upstream field', plural: false };\n return {\n list: `${quoted.slice(0, -1).join(', ')} and ${quoted[quoted.length - 1]}`,\n plural: true,\n };\n}\n\n/**\n * Builds the context-rich hint message for a short-circuited function: it states\n * *what* is blocked (this field, by label), *with what* (the missing upstream\n * fields, by label), and *what to do* (provide them).\n *\n * @param targetLabel - The blocked input's own display label.\n * @param missingLabels - Display labels of the unmet dependency inputs.\n * @param kind - The function's work kind (selects phrasing).\n * @returns The plain hint string (the leading ⚠️ icon is added by `setTemporaryHint`).\n */\nexport function formatMissingDependencyHint(\n targetLabel: string,\n missingLabels: readonly string[],\n kind: MissingDependencyKind,\n): string {\n const { list, plural } = joinLabels(missingLabels);\n const it = plural ? 'them' : 'it';\n switch (kind) {\n case 'calculation':\n return `\"${targetLabel}\" can't be calculated yet — it needs ${list}. Fill ${it} in to calculate this field.`;\n case 'value':\n return `\"${targetLabel}\" can't load yet — it's waiting for ${list}. Provide ${it} to fetch this field.`;\n case 'options':\n return `Options for \"${targetLabel}\" can't load yet — waiting for ${list}. Select or enter ${it} first.`;\n }\n}\n\n/**\n * Builds the hint for a calculation that has all its variables but **can't\n * evaluate** because one or more of them holds a non-numeric value (the\n * `math.bignumber('Ada')` throw in `configureCalculationScope`, otherwise\n * swallowed to `undefined`). It states *what* is blocked, *which* field(s) are\n * not numeric, and *what to do*.\n *\n * @param targetLabel - The calculated field's own display label.\n * @param invalidLabels - Display labels of the non-numeric source fields.\n * @returns The plain hint string (the leading ⚠️ icon is added by `setTemporaryHint`).\n */\nexport function formatInvalidNumberHint(\n targetLabel: string,\n invalidLabels: readonly string[],\n): string {\n const { list, plural } = joinLabels(invalidLabels);\n return plural\n ? `\"${targetLabel}\" can't be calculated — ${list} aren't numbers. Enter numeric values to calculate this field.`\n : `\"${targetLabel}\" can't be calculated — ${list} isn't a number. Enter a numeric value to calculate this field.`;\n}\n\n/**\n * Wires the missing-dependency diagnostic `effect` for one input.\n *\n * Creates an `effect()` (in `ctx.injector`'s context) that re-runs whenever the\n * function's dependencies change (because `readMissing` reads them through\n * `ctx.readDep`), applies the emit policy documented at the top of this file,\n * and — on a fresh non-empty missing-set — emits a {@link HintType.WARNING}\n * hint naming the missing upstream fields. The effect is registered for\n * teardown via {@link DerivedBuildContext.registerCleanup} so it does not leak\n * across re-initialisations.\n *\n * @param ctx - Shared build context (`readDep`, `describeDep`, `utils`,\n * `injector`, `registerCleanup`).\n * @param opts - Diagnostic configuration.\n * @param opts.inputId - The blocked input's id (hint target).\n * @param opts.targetLabel - The blocked input's display label.\n * @param opts.kind - The function's work kind (selects phrasing).\n * @param opts.readMissing - Reads the current dependency state and returns the\n * ids of the unmet dependencies. MUST read every dependency through\n * `ctx.readDep` so the effect tracks them reactively; returns `[]` when the\n * function is not blocked.\n */\nexport function wireMissingDependencyDiagnostic(\n ctx: DerivedBuildContext,\n opts: {\n readonly inputId: string;\n readonly targetLabel: string;\n readonly kind: MissingDependencyKind;\n readonly readMissing: () => readonly string[];\n },\n): void {\n wireInputSetDiagnostic(ctx, {\n inputId: opts.inputId,\n readIds: opts.readMissing,\n message: (labels) => formatMissingDependencyHint(opts.targetLabel, labels, opts.kind),\n });\n}\n\n/**\n * Wires the non-numeric-value diagnostic for a {@link FunctionTypes.ValueCalculation}\n * input whose variables are all present but one or more holds a value that\n * cannot be coerced to a number — the silent `configureCalculationScope` throw\n * (`math.bignumber('Ada')`) that the calc `computed` swallows to `undefined`.\n *\n * Same effect + emit policy as {@link wireMissingDependencyDiagnostic} (silent\n * baseline, emit on a fresh non-empty set, deduped, registered for cleanup) — it\n * differs only in the message ({@link formatInvalidNumberHint}).\n *\n * @param ctx - Shared build context.\n * @param opts.inputId - The calculated input's id (hint target).\n * @param opts.targetLabel - The calculated input's display label.\n * @param opts.readInvalid - Reads the current source values and returns the ids\n * of the present-but-non-numeric variable inputs (MUST read via `ctx.readDep`);\n * returns `[]` when the calculation is not blocked on a non-numeric value.\n */\nexport function wireInvalidNumberDiagnostic(\n ctx: DerivedBuildContext,\n opts: {\n readonly inputId: string;\n readonly targetLabel: string;\n readonly readInvalid: () => readonly string[];\n },\n): void {\n wireInputSetDiagnostic(ctx, {\n inputId: opts.inputId,\n readIds: opts.readInvalid,\n message: (labels) => formatInvalidNumberHint(opts.targetLabel, labels),\n });\n}\n\n/**\n * Shared core for the per-input diagnostics: an `effect()` that tracks a *set of\n * offending input ids* between runs and emits a `HintType.WARNING` hint — naming\n * the ids by label — on a fresh, non-empty transition. See the module header for\n * the full emit policy and the *why-an-effect* / *untracked label* rationale.\n *\n * @param ctx - Shared build context.\n * @param opts.inputId - The hint target input id.\n * @param opts.readIds - Reads the current offending-id set (reads deps via\n * `ctx.readDep`); `[]` when there is nothing to report.\n * @param opts.message - Builds the hint body from the resolved labels.\n *\n * @internal\n */\nfunction wireInputSetDiagnostic(\n ctx: DerivedBuildContext,\n opts: {\n readonly inputId: string;\n readonly readIds: () => readonly string[];\n readonly message: (labels: string[]) => string;\n },\n): void {\n runInInjectionContext(ctx.injector, () => {\n // Edge-trackers: plain closure variables (NOT signals — nothing reads them\n // reactively), so this effect never writes a signal.\n let firstRun = true;\n let prevKey = '';\n\n const ref = effect(() => {\n const ids = opts.readIds(); // reads deps via readDep → reactive\n const key = [...ids].sort().join('|');\n\n // 1. First flush (post-seed): record the baseline silently — no load spam.\n if (firstRun) {\n firstRun = false;\n prevKey = key;\n return;\n }\n // 2. Stable set: nothing new to tell the user.\n if (key === prevKey) return;\n prevKey = key;\n // 3. Now clear: the function proceeds — its own result is the feedback.\n if (ids.length === 0) return;\n\n // Fresh, still-blocked: name the offending fields by label. describeDep\n // resolves labels via untracked reads (see its contract); the extra\n // untracked here is belt-and-braces so the label map never becomes a\n // reactive dependency of this effect.\n const labels = untracked(() => ids.map((id) => ctx.describeDep(id)));\n ctx.utils.setTemporaryHint(opts.inputId, opts.message(labels), HintType.WARNING);\n });\n\n ctx.registerCleanup(() => ref.destroy());\n });\n}\n","/**\n * @file Pure factory for the {@link FunctionTypes.ValueCalculation} derived\n * entry.\n *\n * `buildValueCalculation` returns a {@link ValueDerivedEntry} whose `signal`\n * is an Angular `computed<string | undefined>` that continuously re-evaluates\n * the MathJS formula defined in {@link FormColumnInputs.calculatedFieldRules}.\n *\n * ### How it works\n *\n * 1. On each reactive read the computed callback iterates\n * `calculatedFieldRules.variables` and resolves each variable's input value\n * via `ctx.readDep(inputId)`. The result is assembled into a scope object\n * compatible with {@link configureCalculationScope}.\n * 2. If every variable resolves to a non-empty value the scope is passed to\n * {@link evaluateFormulaAgainstScope}, which delegates to `math.evaluate`.\n * 3. If any variable is missing or empty — matching the \"old skip\" branch in\n * `calculateInput` — the computed returns `undefined`. No hint is emitted,\n * no value is published: **the signal IS the value** (blueprint §3, no-publish\n * rule).\n *\n * ### Cycle-safety\n *\n * The computed closes over `ctx.readDep`, which resolves exclusively from the\n * engine's `#model` signal and `#derived` Map — NEVER from the merged\n * `value()` computed. `readDep(self.id)` returns `undefined` (self-edge\n * guard in the engine; see `DerivedBuildContext`). This prevents the reactive\n * cycle that Angular's signal graph would detect and throw on at runtime.\n *\n * ### Phase 1 constraints\n *\n * - No `@angular/forms/signals` (Phase 3).\n * - No `utils.updateValue` / `utils.updateFormInputConfig` calls.\n * - No module-top-level side effects.\n * - All Angular primitives used here (`computed`, `runInInjectionContext`) are\n * stable in Angular ≥ 19. This workspace targets Angular 21\n * (`@angular/core ^21.2.12`).\n * - MultipleInput / DateRange / MSCOA column-aggregation paths inside\n * {@link configureCalculationScope} are untouched — Phase 2 fence.\n *\n * @see SIGNAL_FORMS_PHASE1_BLUEPRINT.md §3 builder #1 for the authoritative\n * design reference.\n * @see {@link calculateInput} in `calculateInputValue.ts` for the legacy\n * RxJS implementation whose pure helpers this builder reuses.\n */\nimport { computed, runInInjectionContext } from '@angular/core';\nimport type { FormColumnInputs } from 'ngx-t-forms-types';\nimport {\n configureCalculationScope,\n evaluateFormulaAgainstScope,\n} from '../../../t-form-controller/function/calculateInputValue';\nimport type { BuildValueCalculationFn, ValueDerivedEntry } from './types';\nimport { wireInvalidNumberDiagnostic, wireMissingDependencyDiagnostic } from './missing-dependency-hint';\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves the dependency input id a calculation variable reads from, mirroring\n * the legacy inputId resolution logic from `calculateInput`:\n * - `parentInputId` present AND `applyFunctionToCol` set → use `parentInputId`\n * (column-aggregate over a MultipleInput array).\n * - otherwise → use `inputId`.\n *\n * @param variable - A single `calculatedFieldRules.variables` entry.\n * @returns The input id whose value the variable resolves to.\n *\n * @internal\n */\nfunction resolveVariableInputId(\n variable: NonNullable<FormColumnInputs['calculatedFieldRules']>['variables'][number],\n): string {\n if (variable.parentInputId && variable.applyFunctionToCol) {\n return variable.parentInputId;\n }\n return variable.inputId;\n}\n\n/**\n * Returns the resolved input ids of the variables that currently have NO\n * non-empty value — i.e. the dependencies blocking the calculation. An empty\n * array means every variable is satisfied and the formula can evaluate.\n *\n * Resolution uses `readDep` (cycle-safe) rather than the full form-value\n * snapshot so the read stays within the `#model` + `#derived`-only boundary.\n *\n * @param input - The column-input config whose `calculatedFieldRules` to inspect.\n * @param readDep - Cycle-safe dependency reader from {@link DerivedBuildContext}.\n * @returns The unmet variable input ids (empty when all variables are valid).\n *\n * @internal\n */\nfunction missingVariableIds(\n input: FormColumnInputs,\n readDep: (inputId: string) => unknown,\n): string[] {\n const variables = input.calculatedFieldRules?.variables ?? [];\n const missing: string[] = [];\n for (const variable of variables) {\n const resolvedInputId = resolveVariableInputId(variable);\n const value = readDep(resolvedInputId);\n // Matches legacy: `!!inputValue ? inputValue !== '' : false`\n if (value === undefined || value === null || value === '') {\n missing.push(resolvedInputId);\n }\n }\n return missing;\n}\n\n/**\n * Determines whether every variable in `calculatedFieldRules.variables` has a\n * non-empty resolved value, mirroring the `areValid` guard inside the legacy\n * `calculateInput` function.\n *\n * @param input - The column-input config whose `calculatedFieldRules` to inspect.\n * @param readDep - Cycle-safe dependency reader from {@link DerivedBuildContext}.\n * @returns `true` when every variable resolves to a truthy, non-empty value.\n *\n * @internal\n */\nfunction allVariablesValid(\n input: FormColumnInputs,\n readDep: (inputId: string) => unknown,\n): boolean {\n return missingVariableIds(input, readDep).length === 0;\n}\n\n/**\n * Returns the input ids of **scalar** (non-aggregate) variables that are present\n * but hold a value that cannot be coerced to a number — the values that make\n * `math.bignumber(value)` throw inside `configureCalculationScope` (e.g. `\"Ada\"`),\n * which the calc `computed` otherwise swallows to `undefined` with no feedback.\n *\n * Scope notes (deliberate, matches the real throw site at\n * `configureCalculationScope`):\n * - Only variables **without** a `function` are checked — aggregate variables\n * read a row array and coerce per-row, a structurally different path that this\n * field-level check does not model.\n * - A variable read uses `variable.inputId` (the exact key\n * `configureCalculationScope` passes to `math.bignumber` for the scalar branch).\n * - Empty/absent values are NOT reported here — that is the missing-dependency\n * diagnostic's job. Coercion uses `Number(value)`, a dependency-free heuristic\n * that rejects the same non-numeric strings `math.bignumber` does.\n *\n * @param input - The column-input config whose `calculatedFieldRules` to inspect.\n * @param readDep - Cycle-safe dependency reader from {@link DerivedBuildContext}.\n * @returns The ids of present-but-non-numeric scalar variable inputs.\n *\n * @internal\n */\nfunction nonNumericVariableIds(\n input: FormColumnInputs,\n readDep: (inputId: string) => unknown,\n): string[] {\n const variables = input.calculatedFieldRules?.variables ?? [];\n const invalid: string[] = [];\n for (const variable of variables) {\n if (variable.function) continue; // aggregate — per-row coercion, out of scope\n if (!variable.inputId) continue;\n const value = readDep(variable.inputId);\n const present = value !== undefined && value !== null && value !== '';\n if (present && Number.isNaN(Number(value))) {\n invalid.push(variable.inputId);\n }\n }\n return invalid;\n}\n\n/**\n * Builds a `Record<string, unknown>` snapshot keyed by every `inputId` (and\n * `parentInputId` where applicable) referenced in\n * `calculatedFieldRules.variables`.\n *\n * This snapshot is passed as the `formValue` argument of\n * {@link configureCalculationScope}, which then reads `formValue[rule.inputId]`\n * and `formValue[rule.parentInputId]`. Only the keys actually referenced by\n * the formula variables are populated — no other form state is read, keeping\n * the computed's reactive dependency set minimal and avoiding accidental reads\n * of `value()`.\n *\n * @param input - Column-input config carrying the variable list.\n * @param readDep - Cycle-safe dependency reader.\n * @returns A partial snapshot containing only the keys needed by\n * `configureCalculationScope`.\n *\n * @internal\n */\nfunction buildScopeSnapshot(\n input: FormColumnInputs,\n readDep: (inputId: string) => unknown,\n): Record<string, unknown> {\n const snapshot: Record<string, unknown> = {};\n const variables = input.calculatedFieldRules?.variables ?? [];\n\n for (const variable of variables) {\n // Populate both inputId and parentInputId so configureCalculationScope\n // can find whichever key it needs for any variable branch.\n snapshot[variable.inputId] = readDep(variable.inputId);\n if (variable.parentInputId) {\n snapshot[variable.parentInputId] = readDep(variable.parentInputId);\n }\n }\n\n return snapshot;\n}\n\n// ---------------------------------------------------------------------------\n// Builder\n// ---------------------------------------------------------------------------\n\n/**\n * Pure factory that creates the {@link ValueDerivedEntry} for a\n * {@link FunctionTypes.ValueCalculation} input.\n *\n * The returned entry holds a `computed<string | undefined>` signal that\n * re-evaluates the MathJS formula whenever any of its variable inputs change.\n * The builder is wrapped in `runInInjectionContext` so that the `computed` is\n * created with a valid injection context even when called from inside\n * `initialize()` (Blueprint §2.6 — NG0203 guard).\n *\n * @example\n * ```ts\n * // Inside the engine dispatcher, wrapped in runInInjectionContext:\n * const entry = buildValueCalculation(input, ctx);\n * this.#derived.set(`${input.id}:${FunctionTypes.ValueCalculation}`, entry);\n * ```\n *\n * @param input - The full column-input config. `calculatedFieldRules` carries\n * the MathJS `formula` string and the `variables[]` dependency list.\n * @param ctx - Shared build context supplying `readDep` (cycle-safe\n * dependency reader) and `injector` (required for `computed()` inside\n * `initialize()`).\n * @returns A {@link ValueDerivedEntry} whose `signal` is a\n * `computed<string | undefined>`. Returns `undefined` from the signal when\n * any variable is missing or empty (old skip semantics).\n */\nexport const buildValueCalculation: BuildValueCalculationFn = (\n input: FormColumnInputs,\n ctx,\n): ValueDerivedEntry => {\n const signal = runInInjectionContext(ctx.injector, () =>\n computed<string | undefined>(() => {\n // Guard: if any variable has no valid value, skip the calculation.\n // Mirrors the `areValid` early-exit in the legacy `calculateInput`.\n if (!allVariablesValid(input, ctx.readDep)) {\n return undefined;\n }\n\n // Build the minimal form-value snapshot from readDep so\n // configureCalculationScope can resolve its internal variable branches\n // without touching value() or #model directly.\n const snapshot = buildScopeSnapshot(input, ctx.readDep);\n\n try {\n // Reuse the pure scope-builder from calculateInputValue.ts verbatim.\n // This handles column-aggregation (Avg/Sum/Max/Min over MultipleInput\n // arrays) — Phase 2 fence; do not alter this call.\n const scope = configureCalculationScope(input, snapshot);\n\n // Reuse the pure formula evaluator from calculateInputValue.ts verbatim.\n return evaluateFormulaAgainstScope(input.calculatedFieldRules, scope);\n } catch {\n // Parity with the legacy `calculateInput`'s OUTER try/catch (which wraps\n // configureCalculationScope too): a non-numeric / unconvertible variable\n // — e.g. math.bignumber('Ada') inside configureCalculationScope — must\n // SKIP the calculation (return undefined), never throw. An uncaught throw\n // inside this computed would break value()/isBusy()/settled() for the\n // entire form. (evaluateFormulaAgainstScope already swallows its own\n // errors; this guards the scope-builder, which does not.)\n return undefined;\n }\n }),\n );\n\n const targetLabel = input.label?.trim() || input.id;\n\n // Surface a context-rich hint when the calculation is silently skipped because\n // one or more of its variable inputs has no value yet (the \"old skip\" branch\n // produced no feedback at all). The diagnostic effect names the missing\n // upstream field(s) by label so the user knows what to fill in.\n wireMissingDependencyDiagnostic(ctx, {\n inputId: input.id,\n targetLabel,\n kind: 'calculation',\n readMissing: () => missingVariableIds(input, ctx.readDep),\n });\n\n // Surface a context-rich hint when all variables are present but the formula\n // still can't evaluate because a scalar variable holds a non-numeric value —\n // the `math.bignumber('Ada')` throw the computed swallows to `undefined`.\n // Gated on `allVariablesValid` so it never competes with the missing-dependency\n // hint (missing is reported first; non-numeric only once everything is filled).\n wireInvalidNumberDiagnostic(ctx, {\n inputId: input.id,\n targetLabel,\n readInvalid: () =>\n allVariablesValid(input, ctx.readDep) ? nonNumericVariableIds(input, ctx.readDep) : [],\n });\n\n return { kind: 'value', signal };\n};\n","/**\n * @file Pure factory for the {@link FunctionTypes.InputSourcedValue} builder.\n *\n * ## Semantics (confirmed against `getInputSourcedValue.ts`)\n *\n * The old helper (`getInputSourcedValue`) read `formVal[inheritValueFromInputId]`\n * from the snapshot returned by `formValue()` and then published through\n * `utils.updateValue(inputConfig.id, sourcedValue)`. A subsequent source\n * change always overwrote any prior user edit — there was no sticky-override\n * mechanism.\n *\n * Phase 1 reproduces those semantics with a `linkedSignal`:\n *\n * ```\n * linkedSignal({\n * source: () => readDep(inputSourceId),\n * computation: v => v,\n * })\n * ```\n *\n * - **Source change re-clobbers a prior user edit** — `linkedSignal` resets\n * `computation` whenever `source` produces a new value, which matches the\n * old \"re-run always overwrites\" behaviour.\n * - **Transient user override** — the engine's `updateValue` routes to\n * `entry.signal.set(v)` for sourced inputs, providing a transient override\n * that is valid until the next source change.\n * - **`#model` is NOT consulted** — the merge `value()` computed reads\n * `entry.signal()` directly and skips the `#model` map for any input that\n * owns a `sourced` entry (Blueprint §2.3).\n * - **No publish** — this builder MUST NOT call `ctx.utils.updateValue` or\n * `ctx.utils.updateFormInputConfig` (Blueprint §3, no-publish rule).\n *\n * ## Injection context\n *\n * `linkedSignal` with a `computation` function creates an internal effect and\n * therefore requires an injection context. Because this builder is called\n * from inside `initialize()` (which runs after construction), the\n * `linkedSignal` creation MUST be wrapped in\n * `runInInjectionContext(ctx.injector, …)` (Blueprint §2.6 / HAZARD 1).\n *\n * ## No module-top-level side effects\n *\n * This module is a pure factory. It creates no signals, resources, or\n * subscriptions at import time.\n *\n * @see SIGNAL_FORMS_PHASE1_BLUEPRINT.md §3 builder #2 \"InputSourcedValue\"\n * @see getInputSourcedValue.ts — the helper this builder replaces (read for\n * parity verification).\n */\nimport { linkedSignal, runInInjectionContext } from '@angular/core';\nimport type { FormColumnInputs } from 'ngx-t-forms-types';\nimport type { BuildInputSourcedValueFn, DerivedBuildContext, SourcedDerivedEntry } from './types';\n\n// ---------------------------------------------------------------------------\n// Internal type narrowing\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal structural type that carries the optional `inputSourceId` field\n * used by `DataSources.Local` fetch configurations.\n *\n * `APIDataFetchingConfigurationInterface` declares `inputSourceId?: string`;\n * this interface exists so the cast is structurally sound without importing\n * the full `APIDataFetchingConfigurationInterface` (which would pull in\n * `@angular/common/http` — an Angular concretion — into this pure module).\n *\n * @internal\n */\ninterface FetchValueWithInputSource {\n readonly inputSourceId?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Builder implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a {@link SourcedDerivedEntry} for an input whose value is sourced\n * from another form input at runtime (`FunctionTypes.InputSourcedValue`).\n *\n * The returned entry holds a `WritableSignal<unknown>` created via\n * `linkedSignal`. The signal's source is `ctx.readDep(inputSourceId)`, so\n * whenever the upstream input's value changes the linkedSignal resets to that\n * value — replicating the old `getInputSourcedValue` re-clobber semantics\n * exactly.\n *\n * **Routing contract (enforced by the engine dispatcher):**\n * - `engine.updateValue(sourcedInputId, v)` → `entry.signal.set(v)`\n * - The merged `value()` computed reads `entry.signal()` and does NOT consult\n * `#model` for this `inputId`.\n *\n * **No publish rule:** this builder MUST NOT call `ctx.utils.updateValue` or\n * `ctx.utils.updateFormInputConfig`. The linkedSignal IS the value.\n *\n * @param input - The full column-input config. The `inputSourceId` is read\n * from `input.matOptions?.fetch.value` (cast to {@link FetchValueWithInputSource}).\n * When `inputSourceId` is absent or empty the source accessor returns\n * `undefined` on every read, so the linkedSignal initialises to `undefined`\n * and remains stable until the config is corrected.\n * @param ctx - Shared build context providing `readDep`, `utils`, and\n * `injector` (see {@link DerivedBuildContext}).\n * @returns A {@link SourcedDerivedEntry} whose `signal` is the writable\n * linkedSignal tracking the source input's current value.\n *\n * @example\n * ```ts\n * const entry = buildInputSourcedValue(inputConfig, ctx);\n * // Engine reads the value:\n * const current = entry.signal();\n * // Engine applies a transient user override:\n * entry.signal.set(userProvidedValue);\n * // Next source change resets the linkedSignal to readDep(inputSourceId).\n * ```\n */\nexport const buildInputSourcedValue: BuildInputSourcedValueFn = (\n input: FormColumnInputs,\n ctx: DerivedBuildContext,\n): SourcedDerivedEntry => {\n // Extract the source input ID from the fetch config. The field lives on\n // APIDataFetchingConfigurationInterface (DataSources.Local variant); cast\n // via the minimal structural interface to avoid importing Angular HTTP types.\n const inputSourceId = (\n input.matOptions?.fetch?.value as FetchValueWithInputSource | undefined\n )?.inputSourceId;\n\n // Build the linkedSignal inside runInInjectionContext because initialize()\n // is called after construction — outside Angular's injection context.\n // Omitting this wrapper causes NG0203 at runtime (Blueprint §2.6 / HAZARD 1).\n const sig = runInInjectionContext(ctx.injector, () =>\n linkedSignal<unknown, unknown>({\n // source: re-evaluates when any signal read inside it changes.\n // readDep(inputSourceId) reads #model or #derived — NEVER value() —\n // so there is no reactive cycle (Blueprint §2.3 cycle-guard).\n // When inputSourceId is absent or falsy, readDep returns undefined,\n // which matches the old behaviour of sourcing from a missing key.\n source: () => (inputSourceId ? ctx.readDep(inputSourceId) : undefined),\n // computation: identity — the sourced value IS the signal value.\n // linkedSignal resets to this computation whenever source changes,\n // replicating the old re-clobber semantics of getInputSourcedValue.\n computation: (v: unknown) => v,\n }),\n );\n\n return { kind: 'sourced', signal: sig };\n};\n","\r\n\r\n\r\n\r\nimport { FormInputBasicOptionInterface, TreeNode } from 'ngx-t-forms-types';\r\nimport { PropertyPath, safeReturnDeepProperty } from '../../../../../lib/shared/functions/getDeepObject';\r\n\r\n\r\n/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\nconst returnMappedPathValue = (pathMap: TreeNode[], obj: unknown): unknown => {\r\n if (typeof pathMap === 'string') {\r\n\r\n return safeReturnDeepProperty(obj, [pathMap]);\r\n }\r\n\r\n if (!Array.isArray(pathMap)) {\r\n throw new Error('Invalid pathMap: expected array or string');\r\n }\r\n const extractionPath:PropertyPath = pathMap.map(a => {\r\n const keyIsArrayIndex = typeof a.key === 'number' || a.keyIsArrayIndex || !isNaN(Number(a.key))\r\n const isValidNodeFunction = Array.isArray(a.functions) && a.functions.length > 0 && a.functions.every(f => 'function' in f && 'expression' in f)\r\n if (!keyIsArrayIndex || !isValidNodeFunction) {\r\n return a.key\r\n }\r\n return a.functions\r\n })\r\n\r\n const { value} = safeReturnDeepProperty(obj, extractionPath );\r\n\r\n return value\r\n\r\n}\r\n\r\n/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\nconst getValueFromValueAccessor = (\r\n valueAccessRules: FormInputBasicOptionInterface | TreeNode[] | Record<string, TreeNode[]>,\r\n data: unknown,\r\n): unknown => {\r\n try {\r\n const hasValueAccess = !!valueAccessRules;\r\n if (!hasValueAccess) {\r\n return data;\r\n }\r\n const isMultipleControlBind = !Array.isArray(valueAccessRules) && typeof valueAccessRules === 'object' && Object.keys(valueAccessRules).length > 1\r\n if (isMultipleControlBind) {\r\n // Multi-control bind shape: `Record<string, TreeNode[]>`. The legacy\r\n // `FormInputBasicOptionInterface` is excluded by the `Object.keys(...).length > 1`\r\n // guard above (legacy shape only carries `{ value: string }`).\r\n const multiRules = valueAccessRules as Record<string, TreeNode[]>;\r\n const v: Record<string, unknown> = {};\r\n for (const key in multiRules) {\r\n const rules = multiRules[key];\r\n if (!rules) continue;\r\n v[key] = returnMappedPathValue(rules, data);\r\n }\r\n return v;\r\n\r\n }\r\n const isNotLegacyValueAccess = Array.isArray(valueAccessRules) && valueAccessRules.length > 0 && 'functions' in (valueAccessRules?.[0]||{})\r\n if (isNotLegacyValueAccess) {\r\n\r\n return returnMappedPathValue(valueAccessRules as TreeNode[], data)\r\n }\r\n\r\n const isLegacyValueAccess = !Array.isArray(valueAccessRules) && valueAccessRules['value'] && typeof valueAccessRules['value'] === 'string'\r\n if (isLegacyValueAccess) {\r\n const legacyKey = (valueAccessRules as FormInputBasicOptionInterface)['value'] as string;\r\n if (data && typeof data === 'object') {\r\n return (data as Record<string, unknown>)[legacyKey];\r\n }\r\n return undefined;\r\n }\r\n return undefined\r\n } catch (error) {\r\n throw error instanceof Error ? error : new Error('Failed to get value ');\r\n }\r\n}\r\nexport { returnMappedPathValue, getValueFromValueAccessor } ","import { ElementTypes, FormColumnInputs } from \"ngx-t-forms-types\";\r\n\r\nexport function multipleFormInputMapValueToInputsId(\r\n input: FormColumnInputs,\r\n value: unknown,\r\n): unknown {\r\n try {\r\n if (input.element !== ElementTypes.MultipleInput) return value;\r\n if (!Array.isArray(value)) return value;\r\n return (value as Array<Record<string, unknown>>).map((val) =>\r\n\r\n {\r\n const newVal = Object.entries(val).reduce<Record<string, unknown>>((acc, [key, value]) => {\r\n const inputId = input.formInputs?.find((input) => input.formControlName === key)?.id\r\n if (!inputId) return acc\r\n return {\r\n ...acc,\r\n [`${input.id}.${inputId}`]: value\r\n }\r\n }, {})\r\n return {\r\n ...newVal,\r\n [`${input.id}.id`]: val['id'] // Assuming you want to keep the id as well\r\n }\r\n }\r\n\r\n )\r\n\r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : \"Error mapping value to input\"\r\n console\r\n .error(msg)\r\n throw new Error(msg)\r\n\r\n }\r\n}","\r\nimport { ElementTypes, InputDataTypes, MinimumInputRequiredInterface, MinInputMapInput, MinInputTypes } from\"ngx-t-forms-types\";\r\n\r\n\r\n/**\r\n * Validates the minimum input required for a post request.\r\n * @param input - The minimum input required.\r\n * @param formValues - The form values.\r\n * @returns A boolean indicating whether the minimum input is valid or not.\r\n */\r\nexport function validateMinInput(input: MinimumInputRequiredInterface, formValues: Record<string, unknown>): boolean {\r\n switch (input.type) {\r\n case MinInputTypes.Default:\r\n return true;\r\n case MinInputTypes.MapTo:\r\n const inputValue = getMinInputValue(input, formValues);\r\n const dataType = (input.mapTo as MinInputMapInput).dataType;\r\n const matchType = dataType === InputDataTypes.Date ? InputDataTypes.Object : dataType\r\n const mapToIsValid = inputValue !==undefined && inputValue !==null && inputValue !== '' && typeof inputValue === matchType;\r\n if (!mapToIsValid) {\r\n let typeText = matchType === 'string' ? 'text' :\r\n matchType === 'number' ? 'numeric value' :\r\n matchType === 'object' ? 'valid date' :\r\n matchType === 'boolean' ? 'true/false value' : matchType;\r\n \r\n throw new Error(`Please provide a valid ${typeText} for ${input.name}. The current value (${inputValue}) is not acceptable.`);\r\n }\r\n return mapToIsValid\r\n case MinInputTypes.MapDocFilter:\r\n const mapDocFilterIsValid = (input.mapTo as MinInputMapInput[]).every(mapInput => {\r\n const value = formValues[mapInput.inputId];\r\n return value !== undefined && value !==null && value !== '' && typeof value === (mapInput as MinInputMapInput).dataType\r\n });\r\n if (!mapDocFilterIsValid) {\r\n throw new Error(`Please provide valid values for ${input.name}.`);\r\n }1\r\n return mapDocFilterIsValid;\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Retrieves the minimum input value from the form values based on the provided input configuration.\r\n * @param input - The minimum input configuration.\r\n * @param formValues - The form values object.\r\n * @returns The minimum input value from the form values.\r\n */\r\n function getMinInputValue(input:MinimumInputRequiredInterface, formValues:Record<string, unknown>): unknown {\r\n\r\n if (input.mapTo) {\r\n const mapTo = input.mapTo as MinInputMapInput;\r\n if (mapTo.element === ElementTypes.DateRangePicker) {\r\n return formValues[input.name];\r\n }\r\n return formValues[mapTo.inputId];\r\n }\r\n return input.mapTo;\r\n }","\r\n\r\n\r\ninterface HttpErrorBody {\r\n errors: { message: string };\r\n validation: { body: { message: string } };\r\n [k: string]: unknown;\r\n}\r\n\r\ninterface HttpError extends Error {\r\n status?: number;\r\n // HTTP error bodies are heterogeneous (server-dependent); the resolver reads\r\n // `.errors.message` / `.validation.body.message` paths after `hasOwnProperty`\r\n // guards. Field typed `unknown` here so callers can pass framework Error\r\n // objects with arbitrary `.error` payloads (postApiDataFetching, etc.).\r\n error?: unknown;\r\n}\r\n\r\nexport function errorResolver(err: HttpError | undefined):string|undefined {\r\n // Cast to the narrow body shape for the internal switch — runtime guards\r\n // protect access; field is structurally `unknown` on the public signature\r\n // so heterogeneous caller payloads are accepted.\r\n const body = (err?.error ?? {}) as HttpErrorBody;\r\n if(!err) return undefined\r\n let errorMessage = ''\r\n switch (err?.status) {\r\n case 0:\r\n errorMessage =\r\n 'Oops, something went wrong. Please check your internet connection and try again.';\r\n break;\r\n case 500:\r\n errorMessage = body.errors\r\n ? body.errors.message\r\n : 'Sorry, an unknown error occurred. Please try again later.';\r\n break;\r\n case 400:\r\n body.hasOwnProperty('validation')\r\n ? (errorMessage = body.validation.body.message)\r\n : (errorMessage =\r\n 'Sorry, your request was invalid. Please try again.');\r\n break;\r\n case 401:\r\n errorMessage =\r\n 'Sorry, you are not authorized to access this resource. Please login again.';\r\n break;\r\n case 404: \r\n errorMessage = 'Sorry, the resource you are looking for was not found.';\r\n break;\r\n case 403:\r\n errorMessage = 'Sorry, you do not have permission to access this resource.';\r\n break;\r\n case 405:\r\n errorMessage = 'Sorry, the requested method is not allowed for this resource.';\r\n break;\r\n case 408:\r\n errorMessage = 'Sorry, the request timed out. Please try again.';\r\n break;\r\n case 409:\r\n errorMessage = 'Sorry, there was a conflict with the current state of the resource.';\r\n break;\r\n case 503:\r\n errorMessage = 'Sorry, the service is currently unavailable. Please try again later.';\r\n break;\r\n default:\r\n errorMessage =\r\n 'Sorry, an unknown error occurred. Please try again later.';\r\n break;\r\n }\r\nreturn errorMessage\r\n}\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any -- TODO(phase-4): consumers (`setInputTemporaryError`) widen to string at call-time; tightening cascades. */\r\nexport function resolveErrorString(error: Error | any): any {\r\n if (error == null) return error;\r\n if (typeof error === 'string') return error;\r\n const bag = error as Record<string, unknown>;\r\n const validation = Object.prototype.hasOwnProperty.call(bag, 'validation');\r\n\r\n if (validation) {\r\n const errMsg = (bag['validation'] as { body?: { message?: string } } | undefined)?.body?.message;\r\n\r\n return errMsg\r\n } else {\r\n return error\r\n }\r\n };\r\n/* eslint-enable @typescript-eslint/no-explicit-any */","\r\nimport { HintType } from \"../../../../shared/functions/textIconsForUserHints\";\r\nimport { ElementTypes, FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport { catchError, Observable, of, tap, throwError } from \"rxjs\";\r\nimport { errorResolver, resolveErrorString } from \"../../t-form-section-controller/Functions/errorResolver\";\r\n\r\nimport { APIDataFetchingConfigurationInterface } from \"ngx-t-forms-types\";\r\nimport { validateMinInput } from \"./../../../../services/core/t-form-controller/function/validateMinInputForPostRequest\";\r\nimport { MinimumInputRequiredInterface, MinInputMapInput, MinInputTypes } from \"ngx-t-forms-types\";\r\nimport { IFunctionUtils } from \"../../t-form-tower-controller/form-tower-controller.service\";\r\nimport { getValueFromValueAccessor } from \"../../t-form-section-controller/Functions/getValueFromPathMap\";\r\nimport { multipleFormInputMapValueToInputsId } from \"./multipleFormInputsMapValueToFormInputId\";\r\n\r\n/** Loose alias for the form-value snapshot accessor used by input fetchers. */\r\ntype FormValueSnapshot = Record<string, unknown>;\r\n\r\n/**\r\n * Retrieves the input data for a POST request.\r\n * @param inputConfig - The input configuration requesting the data.\r\n * @param formValues - Accessor returning the latest form-value snapshot.\r\n * @param dataFor - A string indicating whether the data is for \"options\" or \"value\".\r\n * @param utils - Tower utility surface (HTTP, hint, status helpers).\r\n */\r\nexport function inputGetApiPostData(\r\n inputConfig: FormColumnInputs,\r\n formValues: () => FormValueSnapshot,\r\n dataFor: \"options\" | \"value\",\r\n utils: IFunctionUtils,\r\n): Observable<void> {\r\n\r\n try {\r\n const fetchOptions = inputConfig.matOptions?.fetch?.[dataFor] as\r\n | APIDataFetchingConfigurationInterface\r\n | undefined;\r\n if (fetchOptions?.source !== \"api\") {\r\n utils.setInputTemporaryError(inputConfig.id, `Cannot fetch data. Source is not\r\n from an API`);\r\n return of();\r\n }\r\n const minInputs = fetchOptions.backEndConfig.minimumInputRequired;\r\n if (minInputs.length === 0) {\r\n\r\n utils.setInputTemporaryError(inputConfig.id, `Cannot fetch data. No minimum inputs provided`);\r\n return of();\r\n }\r\n //1) Check if all required inputs have a valid value as required\r\n\r\n const AreValid = minInputs.every(input => {\r\n try {\r\n return validateMinInput(input, formValues());\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : `Invalid minimum input=${input.name}`;\r\n utils.setInputTemporaryError(inputConfig.id, errorMessage);\r\n return false;\r\n }\r\n });\r\n if (!AreValid) {\r\n return of();\r\n }\r\n const endpoint = fetchOptions.httpEndPoint as string;\r\n\r\n const submissionParameters = {\r\n handleId: fetchOptions._id,\r\n handle: {\r\n submissionMessage: `fetching ${inputConfig.label} options from database`,\r\n },\r\n data: returnMappedData(formValues(), minInputs, endpoint),\r\n httpHeaderOptions: fetchOptions.httpHeaderOptions,\r\n refresh: false,\r\n httpEndPoint: endpoint,\r\n };\r\n\r\n\r\n utils.setInputStatus(inputConfig.id, 'd19be9ca-ceda-4388-9f7b-3fcb5f12d921', 'Fetching data...');\r\n utils.setTemporaryHint(inputConfig.id, 'Fetching data...', HintType.LOADING);\r\n\r\n return utils.httpPostDataFunction(submissionParameters.httpEndPoint, submissionParameters.data, submissionParameters.httpHeaderOptions).pipe(\r\n // httpPostDataFunction is typed Observable<any>; we narrow `response` locally.\r\n tap(\r\n (response) => {\r\n utils.removeInputStatus(inputConfig.id, 'd19be9ca-ceda-4388-9f7b-3fcb5f12d921');\r\n const valueAccessRules = fetchOptions.valueAccessRules;\r\n\r\n const results = !valueAccessRules ? response : getValueFromValueAccessor(valueAccessRules || [], response);\r\n\r\n if (dataFor !== \"options\") {\r\n const mappedData = multipleFormInputMapValueToInputsId(inputConfig, results);\r\n\r\n utils.updateValue(inputConfig.id, mappedData);\r\n utils.setTemporaryHint(inputConfig.id, 'Data fetched successfully', HintType.SUCCESS);\r\n\r\n return;\r\n }\r\n const matOptions = {\r\n ...inputConfig.matOptions,\r\n options: results,\r\n };\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Phase 4 TODO: tighten updateFormInputConfig signature so matOptions union accepts results: unknown\r\n utils.updateFormInputConfig(inputConfig.id, { matOptions } as any);\r\n utils.setTemporaryHint(inputConfig.id, 'Data options fetched successfully', HintType.DOCUMENT);\r\n utils.removeInputStatus(inputConfig.id, 'd19be9ca-ceda-4388-9f7b-3fcb5f12d921');\r\n\r\n }\r\n ),\r\n catchError((error) => {\r\n utils.removeInputStatus(inputConfig.id, 'd19be9ca-ceda-4388-9f7b-3fcb5f12d921');\r\n const errorMessage = errorResolver(error);\r\n const err = resolveErrorString(errorMessage);\r\n utils.setInputTemporaryError(inputConfig.id, err);\r\n return throwError(() => error instanceof Error ? error.message : 'Failed to fetch data');\r\n })\r\n );\r\n\r\n } catch (error) {\r\n const errorMessage = errorResolver(error instanceof Error ? (error as Error & { status?: number; error?: unknown }) : undefined);\r\n const err = resolveErrorString(errorMessage);\r\n utils.setInputTemporaryError(inputConfig.id, err);\r\n utils.removeInputStatus(inputConfig.id, 'd19be9ca-ceda-4388-9f7b-3fcb5f12d921');\r\n console.error(`[getPostInputData] while posting\r\n ${inputConfig.label} data, an error occurred:`, error\r\n );\r\n return throwError(() => error instanceof Error ? error.message : 'Failed to fetch data');\r\n }\r\n\r\n\r\n}\r\n\r\n/** Shape of the mapped payload returned to the HTTP layer. */\r\ninterface MappedDataPayload {\r\n data: Record<string, unknown> | undefined;\r\n [extraKey: string]: unknown;\r\n}\r\n\r\nexport function returnMappedData(\r\n formValues: FormValueSnapshot,\r\n minInputs: MinimumInputRequiredInterface[],\r\n endpoint: string\r\n): MappedDataPayload {\r\n try {\r\n const newData: MappedDataPayload = {\r\n data: {},\r\n };\r\n for (let index = 0; index < minInputs.length; index++) {\r\n const minInput = minInputs[index];\r\n if (!minInput) continue;\r\n const isPrimary = minInput.primaryKey;\r\n if (minInput.type === MinInputTypes.Default) {\r\n const v = typeof minInput.defaultValue === \"string\" && minInput.defaultValue.startsWith(\"{\") &&\r\n minInput.defaultValue.endsWith(\"}\") ? JSON.parse(minInput.defaultValue) : minInput.defaultValue;\r\n if (isPrimary) {\r\n newData[minInput.name] = v;\r\n } else {\r\n (newData.data as Record<string, unknown>)[minInput.name] = v;\r\n }\r\n } else if (minInput.type === MinInputTypes.MapTo && minInput.mapTo) {\r\n if ((minInput.mapTo as MinInputMapInput).element === ElementTypes.DateRangePicker) {\r\n if (isPrimary) {\r\n newData[minInput.name] = formValues[minInput.name];\r\n } else {\r\n (newData.data as Record<string, unknown>)[minInput.name] = formValues[minInput.name];\r\n }\r\n } else {\r\n const inputId = (minInput.mapTo as MinInputMapInput).inputId;\r\n if (isPrimary) {\r\n newData[minInput.name] = formValues[inputId];\r\n } else {\r\n (newData.data as Record<string, unknown>)[minInput.name] = formValues[inputId];\r\n }\r\n }\r\n\r\n } else if (minInput.type === MinInputTypes.MapDocFilter) {\r\n const docFilter = (minInput.mapTo as MinInputMapInput[]).map((mappedInput) => ({\r\n key: mappedInput.inputId,\r\n filterValue: formValues[mappedInput.inputId],\r\n }));\r\n if (isPrimary) {\r\n newData['docFilter'] = docFilter;\r\n } else {\r\n (newData.data as Record<string, unknown>)['docFilter'] = docFilter;\r\n }\r\n }\r\n }\r\n // budget depleted\r\n\r\n\r\n if (endpoint === \"/api/internal/getListBudgetData\") {\r\n const { startPeriod, endPeriod, searchFilter } = newData;\r\n const payload: MappedDataPayload = { ...newData, startPeriod: undefined, endPeriod: undefined, searchFilter: undefined };\r\n (payload.data as Record<string, unknown>)['filter'] = {};\r\n\r\n return {\r\n startPeriod, endPeriod, searchFilter,\r\n ...payload,\r\n };\r\n }\r\n if (Object.keys(newData.data || {}).length === 0) {\r\n newData.data = undefined;\r\n }\r\n return newData;\r\n } catch (error) {\r\n console.error(`[returnMappedData] an error occurred:`, error);\r\n const msg = error instanceof Error ? error.message : 'Failed to fetch data';\r\n throw new Error(msg);\r\n }\r\n\r\n}\r\n","/**\n * @file Pure factory for value-API `resource()` entries.\n *\n * Handles three `FunctionType` variants that fetch an input's **value** from\n * a remote API and expose the result as a signal-graph primitive\n * ({@link ResourceDerivedEntry}):\n *\n * | Variant | HTTP method | Request shape |\n * |---|---|---|\n * | `ValueGetMethodAPI` | GET | Static — no form-value dependencies. |\n * | `ValuePostMethodAPI` | POST | Computed — `params` re-maps `readDep` values; stays `idle` when `validateMinInput` fails. |\n * | `ValuePostMethodAPIWithAllDefaultParams` | POST | Static — all `minimumInputRequired` entries are `'default'`; no reactive params needed. |\n *\n * ### No-publish rule (Blueprint §3, HAZARD 6)\n * These builders MUST NOT call `ctx.utils.updateValue`. The resource's\n * `.value()` IS the signal-graph value; the engine's `value()` computed reads\n * it directly. Writing back through `utils.updateValue` would pollute `#model`\n * and break the structural skip-logic invariant.\n *\n * ### Injection-context contract (Blueprint §2.6, HAZARD 1)\n * Every `resource()` call is wrapped in\n * `runInInjectionContext(ctx.injector, …)` because this factory is called\n * from inside `initialize()`, which runs after Angular's DI construction\n * context has closed. Skipping the wrap throws NG0203 at runtime — a crash\n * invisible to `tsc` / `ng build`.\n *\n * ### `params → undefined` idle contract (Blueprint §2.4)\n * When `validateMinInput` gating fails for the POST-computed branch, the\n * `params` computed returns `undefined`. Angular's `resource()` treats\n * `undefined` params as \"not ready\" and keeps the resource in the `idle`\n * state — which is NOT busy — exactly matching the old `of()` short-circuit\n * in `inputGetApiPostData`.\n *\n * ### Liveness contract (Blueprint §2.4 resource-activation)\n * The resource does not enter `'pending'` until its `.status()` is read in a\n * reactive context. The engine's `isBusy` computed iterates every resource's\n * `.status()`, which serves as the activation reader. Workers MUST NOT remove\n * or short-circuit that iteration.\n *\n * @see SIGNAL_FORMS_PHASE1_BLUEPRINT.md §3 builder #3, #4, #5\n * @see {@link DerivedBuildContext} for the shared context bag contract.\n * @see {@link ResourceDerivedEntry} for the returned entry type.\n *\n * **Phase 1 stability constraint:**\n * Uses only stable Angular ≥ 19 primitives (`resource`, `computed`,\n * `runInInjectionContext`). `@angular/forms/signals` (Phase 3) is\n * explicitly excluded.\n */\nimport { computed, resource, runInInjectionContext } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport type { APIDataFetchingConfigurationInterface } from 'ngx-t-forms-types';\nimport type { FormColumnInputs } from 'ngx-t-forms-types';\nimport { getValueFromValueAccessor } from '../../../t-form-section-controller/Functions/getValueFromPathMap';\nimport { multipleFormInputMapValueToInputsId } from '../../../t-form-controller/function/multipleFormInputsMapValueToFormInputId';\nimport { validateMinInput } from '../../../t-form-controller/function/validateMinInputForPostRequest';\nimport { returnMappedData } from '../../../t-form-controller/function/postApiDataFetching';\nimport { HintType } from '../../../../../shared/functions/textIconsForUserHints';\nimport type { DerivedBuildContext, ResourceDerivedEntry } from './types';\nimport { computeUnmetMinInputs, wireMissingDependencyDiagnostic } from './missing-dependency-hint';\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Applies `valueAccessRules` to raw API response data and maps the result\n * through `multipleFormInputMapValueToInputsId` for MultipleInput elements.\n *\n * Mirrors the value-path branch in `getApiDataFetching` and\n * `inputGetApiPostData` — without the `utils.updateValue` publish side-effect\n * (Blueprint §3 no-publish rule).\n *\n * @param input - The column-input config for the target field.\n * @param fetchCfg - The resolved `APIDataFetchingConfigurationInterface` for\n * the `'value'` fetch slot.\n * @param rawData - The raw HTTP response.\n * @returns The processed value ready for the signal graph.\n */\nfunction applyValueAccessRules(\n input: FormColumnInputs,\n fetchCfg: APIDataFetchingConfigurationInterface,\n rawData: unknown,\n): unknown {\n const { valueAccessRules } = fetchCfg;\n const extracted =\n !valueAccessRules ||\n (Array.isArray(valueAccessRules) && valueAccessRules.length === 0)\n ? rawData\n : getValueFromValueAccessor(valueAccessRules, rawData);\n return multipleFormInputMapValueToInputsId(input, extracted);\n}\n\n/**\n * Extracts the typed `APIDataFetchingConfigurationInterface` from the input's\n * `matOptions.fetch.value` slot. Returns `undefined` when absent or when\n * the source is not `'api'`.\n *\n * @param input - The full column-input config.\n * @returns The API fetch config or `undefined`.\n */\nfunction resolveValueFetchConfig(\n input: FormColumnInputs,\n): APIDataFetchingConfigurationInterface | undefined {\n const fetchValue = input.matOptions?.fetch?.value;\n if (!fetchValue || fetchValue.source !== 'api') {\n return undefined;\n }\n return fetchValue as APIDataFetchingConfigurationInterface;\n}\n\n// ---------------------------------------------------------------------------\n// GET-static branch (ValueGetMethodAPI)\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a static GET `resource()` for the {@link FunctionTypes.ValueGetMethodAPI}\n * function type.\n *\n * The loader calls `ctx.utils.httpGetDataFunction(endpoint, headerOptions)`,\n * applies `valueAccessRules`, and maps through\n * `multipleFormInputMapValueToInputsId`. There are no reactive parameters —\n * the resource fires once on activation and again on explicit `.reload()`.\n *\n * On HTTP error the resource enters the `'error'` state (not `'pending'`), so\n * the engine's `isBusy` drops to `false` and `waitUntilSettled` resolves\n * correctly (Blueprint §2.4).\n *\n * Created via `runInInjectionContext(ctx.injector, …)` to satisfy the\n * NG0203 injection-context requirement (Blueprint §2.6).\n *\n * @param input - The full column-input config.\n * @param ctx - Shared build context (`readDep`, `utils`, `injector`).\n * @returns A {@link ResourceDerivedEntry} backed by the GET resource.\n */\nfunction buildValueGetMethodApi(\n input: FormColumnInputs,\n ctx: DerivedBuildContext,\n): ResourceDerivedEntry {\n const fetchCfg = resolveValueFetchConfig(input);\n\n const ref = runInInjectionContext(ctx.injector, () =>\n resource<unknown, void>({\n loader: async () => {\n if (!fetchCfg) {\n ctx.utils.setInputTemporaryError(\n input.id,\n `Cannot fetch data. Source is not from an API`,\n );\n return undefined;\n }\n\n try {\n const rawData = await firstValueFrom(\n ctx.utils.httpGetDataFunction(\n fetchCfg.httpEndPoint,\n fetchCfg.httpHeaderOptions,\n ),\n );\n ctx.utils.setTemporaryHint(\n input.id,\n `Data fetched successfully`,\n HintType.SUCCESS,\n );\n return applyValueAccessRules(input, fetchCfg, rawData);\n } catch (error) {\n ctx.utils.setInputTemporaryError(\n input.id,\n `Error fetching data from API`,\n );\n throw error;\n }\n },\n }),\n );\n\n return { kind: 'resource', resource: ref };\n}\n\n// ---------------------------------------------------------------------------\n// POST-static branch (ValuePostMethodAPIWithAllDefaultParams)\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a static POST `resource()` for the\n * {@link FunctionTypes.ValuePostMethodAPIWithAllDefaultParams} function type.\n *\n * All `minimumInputRequired` entries have `type === 'default'`, so the request\n * payload can be assembled once at resource creation time without reading any\n * `readDep` values. The resource fires once on activation and again on\n * explicit `.reload()`.\n *\n * Created via `runInInjectionContext(ctx.injector, …)` (Blueprint §2.6).\n *\n * @param input - The full column-input config.\n * @param ctx - Shared build context.\n * @returns A {@link ResourceDerivedEntry} backed by the POST resource.\n */\nfunction buildValuePostMethodApiWithAllDefaultParams(\n input: FormColumnInputs,\n ctx: DerivedBuildContext,\n): ResourceDerivedEntry {\n const fetchCfg = resolveValueFetchConfig(input);\n\n const ref = runInInjectionContext(ctx.injector, () =>\n resource<unknown, void>({\n loader: async () => {\n if (!fetchCfg) {\n ctx.utils.setInputTemporaryError(\n input.id,\n `Cannot fetch data. Source is not from an API`,\n );\n return undefined;\n }\n\n const minInputs = fetchCfg.backEndConfig.minimumInputRequired;\n // All-defaults branch: build the payload from default values only,\n // using an empty form-value snapshot (no readDep reads required).\n const payload = returnMappedData({}, minInputs, fetchCfg.httpEndPoint);\n\n try {\n ctx.utils.setTemporaryHint(\n input.id,\n 'Fetching data...',\n HintType.LOADING,\n );\n const rawData = await firstValueFrom(\n ctx.utils.httpPostDataFunction(\n fetchCfg.httpEndPoint,\n payload,\n fetchCfg.httpHeaderOptions,\n ),\n );\n const { valueAccessRules } = fetchCfg;\n const extracted = !valueAccessRules\n ? rawData\n : getValueFromValueAccessor(valueAccessRules, rawData);\n const result = multipleFormInputMapValueToInputsId(input, extracted);\n ctx.utils.setTemporaryHint(\n input.id,\n 'Data fetched successfully',\n HintType.SUCCESS,\n );\n return result;\n } catch (error) {\n ctx.utils.setInputTemporaryError(\n input.id,\n `Error fetching data from API`,\n );\n throw error;\n }\n },\n }),\n );\n\n return { kind: 'resource', resource: ref };\n}\n\n// ---------------------------------------------------------------------------\n// POST-computed branch (ValuePostMethodAPI)\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a computed-params POST `resource()` for the\n * {@link FunctionTypes.ValuePostMethodAPI} function type.\n *\n * The `params` signal is a `computed()` that reads the current dependency\n * values via `ctx.readDep` and attempts to validate them with\n * `validateMinInput`. When validation fails the computed returns `undefined`,\n * keeping the resource in the `idle` state (not busy) — matching the old\n * `of()` short-circuit in `inputGetApiPostData` (Blueprint §2.4).\n *\n * When `params` produces a defined payload the resource fires a POST request,\n * applies `valueAccessRules`, and maps through\n * `multipleFormInputMapValueToInputsId`.\n *\n * The `params` computed reads `ctx.readDep`, which resolves values from\n * `#model` and `#derived` ONLY — never from the merged `value()` computed —\n * preventing reactive cycles (Blueprint §2.3 cycle-guard).\n *\n * Created via `runInInjectionContext(ctx.injector, …)` (Blueprint §2.6).\n *\n * @param input - The full column-input config.\n * @param ctx - Shared build context.\n * @returns A {@link ResourceDerivedEntry} backed by the POST resource.\n */\nfunction buildValuePostMethodApi(\n input: FormColumnInputs,\n ctx: DerivedBuildContext,\n): ResourceDerivedEntry {\n const fetchCfg = resolveValueFetchConfig(input);\n\n const ref = runInInjectionContext(ctx.injector, () => {\n if (!fetchCfg) {\n // Config absent: return an idle resource that never fires.\n return resource<unknown, undefined>({\n params: computed(() => undefined as undefined),\n loader: async () => undefined,\n });\n }\n\n const minInputs = fetchCfg.backEndConfig.minimumInputRequired;\n\n /**\n * Reactive parameter signal.\n *\n * Reads each mapped dependency input's current value through `readDep`\n * (safe — never reads the merged `value()` computed) and runs\n * `validateMinInput` for every entry. Returns `undefined` when any\n * validation fails so the resource stays `idle`.\n *\n * Resolution order inside `readDep`:\n * 1. Self-edge guard → `undefined`.\n * 2. `#model` (user-written values).\n * 3. `#derived` entry (value / sourced / resource).\n */\n const params = computed<Record<string, unknown> | undefined>(() => {\n // Build a flat snapshot of only the dependency values this input needs.\n // We assemble the snapshot from readDep reads so the computed\n // automatically re-fires when any dependency changes.\n const snapshot: Record<string, unknown> = {};\n\n for (const minInput of minInputs) {\n // Collect the inputId(s) this minimumInputRequired entry maps to.\n if (\n minInput.type === 'mapto' &&\n minInput.mapTo &&\n !Array.isArray(minInput.mapTo)\n ) {\n const mapToInput = minInput.mapTo as { inputId: string };\n snapshot[mapToInput.inputId] = ctx.readDep(mapToInput.inputId);\n } else if (\n minInput.type === 'mapDocFilter' &&\n Array.isArray(minInput.mapTo)\n ) {\n for (const mapEntry of minInput.mapTo as Array<{ inputId: string }>) {\n snapshot[mapEntry.inputId] = ctx.readDep(mapEntry.inputId);\n }\n }\n // 'default' entries carry their value inline — no readDep needed.\n }\n\n // Validate every minimumInputRequired entry against the current snapshot.\n const allValid = minInputs.every((minInput) => {\n try {\n return validateMinInput(minInput, snapshot);\n } catch {\n return false;\n }\n });\n\n if (!allValid) {\n // params === undefined → resource stays idle (Blueprint §2.4).\n return undefined;\n }\n\n // All inputs valid: build the full request payload.\n try {\n return returnMappedData(snapshot, minInputs, fetchCfg.httpEndPoint) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n });\n\n return resource<unknown, Record<string, unknown> | undefined>({\n params,\n loader: async ({ params: payload }) => {\n if (payload === undefined) {\n return undefined;\n }\n\n try {\n ctx.utils.setTemporaryHint(\n input.id,\n 'Fetching data...',\n HintType.LOADING,\n );\n const rawData = await firstValueFrom(\n ctx.utils.httpPostDataFunction(\n fetchCfg.httpEndPoint,\n payload,\n fetchCfg.httpHeaderOptions,\n ),\n );\n const { valueAccessRules } = fetchCfg;\n const extracted = !valueAccessRules\n ? rawData\n : getValueFromValueAccessor(valueAccessRules, rawData);\n const result = multipleFormInputMapValueToInputsId(input, extracted);\n ctx.utils.setTemporaryHint(\n input.id,\n 'Data fetched successfully',\n HintType.SUCCESS,\n );\n return result;\n } catch (error) {\n ctx.utils.setInputTemporaryError(\n input.id,\n `Error fetching data from API`,\n );\n throw error;\n }\n },\n });\n });\n\n // Surface a context-rich hint when the POST stays idle because a required\n // mapped dependency is missing/invalid (the `params → undefined` short-circuit\n // is otherwise silent — the resource simply never fires). The diagnostic names\n // the unmet upstream field(s) by label so the user knows what to provide.\n if (fetchCfg) {\n const minInputs = fetchCfg.backEndConfig.minimumInputRequired;\n wireMissingDependencyDiagnostic(ctx, {\n inputId: input.id,\n targetLabel: input.label?.trim() || input.id,\n kind: 'value',\n readMissing: () => computeUnmetMinInputs(minInputs, ctx.readDep, validateMinInput),\n });\n }\n\n return { kind: 'resource', resource: ref };\n}\n\n// ---------------------------------------------------------------------------\n// Public factory (dispatcher entry point — Blueprint §3 #3, #4, #5)\n// ---------------------------------------------------------------------------\n\n/**\n * Pure factory for value-API `resource()` entries.\n *\n * Dispatches to one of three internal branches based on the detected\n * {@link FunctionTypes} variant for the input's `matOptions.fetch.value`\n * configuration:\n *\n * - **GET-static** (`ValueGetMethodAPI`): static loader, no reactive params.\n * - **POST-static** (`ValuePostMethodAPIWithAllDefaultParams`): static loader,\n * all `minimumInputRequired` entries are `'default'`.\n * - **POST-computed** (`ValuePostMethodAPI`): reactive `params` computed via\n * `ctx.readDep`; returns `undefined` when `validateMinInput` fails so the\n * resource stays `idle` (not busy).\n *\n * All three variants:\n * - Are created via `runInInjectionContext(ctx.injector, …)` (NG0203 guard).\n * - MUST NOT call `ctx.utils.updateValue` (no-publish rule).\n * - Apply `valueAccessRules` + `multipleFormInputMapValueToInputsId` in the\n * loader, mirroring `getApiDataFetching` / `inputGetApiPostData` value-path\n * behaviour without the publish side-effect.\n *\n * @param input - The full column-input config. `matOptions.fetch.value` must\n * carry an `APIDataFetchingConfigurationInterface` with an `httpMethod` of\n * `'GET'` or `'POST'` and a valid `httpEndPoint`.\n * @param ctx - Shared build context (readDep, utils, injector).\n * @returns A {@link ResourceDerivedEntry} whose `.resource.value()` becomes\n * this input's value in the engine's merged `value()` computed.\n */\nexport function buildValueApiResource(\n input: FormColumnInputs,\n ctx: DerivedBuildContext,\n): ResourceDerivedEntry {\n const fetchCfg = resolveValueFetchConfig(input);\n const httpMethod = fetchCfg?.httpMethod;\n\n if (httpMethod === 'GET') {\n return buildValueGetMethodApi(input, ctx);\n }\n\n if (httpMethod === 'POST') {\n const minInputs = fetchCfg?.backEndConfig.minimumInputRequired ?? [];\n const allDefault = minInputs.every((m) => m.type === 'default');\n\n if (allDefault) {\n return buildValuePostMethodApiWithAllDefaultParams(input, ctx);\n }\n\n return buildValuePostMethodApi(input, ctx);\n }\n\n // Fallback: misconfigured input — return an idle resource.\n ctx.utils.setInputTemporaryError(\n input.id,\n `Cannot fetch data. Unsupported HTTP method or missing fetch configuration.`,\n );\n\n const ref = runInInjectionContext(ctx.injector, () =>\n resource<unknown, undefined>({\n params: computed(() => undefined as undefined),\n loader: async () => undefined,\n }),\n );\n return { kind: 'resource', resource: ref };\n}\n","/**\n * @file Options API resource builder — W5 (Phase 1).\n *\n * Exports a single factory function {@link buildOptionsApiResource} that covers\n * all three options-fetch variants declared in {@link FunctionTypes}:\n *\n * | FunctionType | HTTP method | Request origin |\n * |-----------------------------------------|-------------|----------------|\n * | `OptionsGetMethodAPI` | GET | static (no deps) |\n * | `OptionsPostMethodAPI` | POST | computed from `readDep` |\n * | `OptionsPostMethodAPIWithAllDefaultParams` | POST | static (all defaults) |\n *\n * ### Resolved-edge write-back (blueprint §3 #6-8, HAZARD 3)\n *\n * On the **`pending → resolved` status edge only**, deduped (exactly once per\n * fetch, not on every effect tick), the builder calls\n * `ctx.utils.updateFormInputConfig(inputId, { matOptions: { options: results } })`\n * which is routed verbatim through `functions/updateFormInputConfig.ts`. That\n * helper's `deepMerge` walk is the mechanism that fires `_onFormInputConfigChange`\n * — the section-stepper depends on this callback (parity constraint).\n *\n * The edge is tracked via a plain `prevStatus` closure variable (NOT a signal —\n * nothing reads it reactively). The resolved-edge `effect()` reads the resource\n * status, compares it with `prevStatus`, fires the config write only on a\n * `'loading' → 'resolved'` transition, then records the new status. Using a\n * closure variable (rather than reading + writing a `WritableSignal` inside the\n * effect) keeps the effect free of the \"write a signal inside effect()\"\n * anti-pattern (CLAUDE.md §7) and removes a spurious self-trigger re-run.\n *\n * ### No-publish rule\n *\n * This builder does NOT call `ctx.utils.updateValue`. The chosen option value\n * stays in user state (A-4). Only `updateFormInputConfig` is called (options\n * builders are the sole exception to the no-publish rule — blueprint §3, CRITICAL).\n *\n * ### Injection context (HAZARD 1)\n *\n * `resource()`, `effect()`, `signal()`, and `computed()` are called inside\n * `runInInjectionContext(ctx.injector, …)` because the builder is invoked from\n * `initialize()`, which runs outside the Angular injection context. Omitting\n * the wrapper causes an NG0203 crash at runtime that is invisible to static\n * analysis gates.\n *\n * ### Liveness contract (HAZARD 2)\n *\n * The engine's `isBusy` computed iterates `entry.resource.status()`, which\n * activates the resource (lazy resources do not start until their `status()` is\n * read in a reactive context). The `lastStatus` accessor on the returned entry\n * returns the stored `prevStatus` closure value so callers can read the\n * last-observed status without a second `resource.status()` read.\n *\n * ### Phase 1 stability\n *\n * Only stable Angular primitives (`signal`, `computed`, `effect`, `resource`,\n * `runInInjectionContext`) are used. `@angular/forms/signals` (Phase 3) is\n * explicitly excluded.\n *\n * @module build-options-api-resource\n * @see SIGNAL_FORMS_PHASE1_BLUEPRINT.md §3 #6-8 for the authoritative design.\n */\nimport {\n ResourceStatus,\n computed,\n effect,\n resource,\n runInInjectionContext,\n} from '@angular/core';\nimport type { APIDataFetchingConfigurationInterface, FormColumnInputs, FormInputBasicOptionInterface } from 'ngx-t-forms-types';\nimport { getValueFromValueAccessor } from '../../../t-form-section-controller/Functions/getValueFromPathMap';\nimport { returnMappedData } from '../../../t-form-controller/function/postApiDataFetching';\nimport { validateMinInput } from '../../../t-form-controller/function/validateMinInputForPostRequest';\nimport { HintType } from '../../../../../shared/functions/textIconsForUserHints';\nimport { errorResolver, resolveErrorString } from '../../../t-form-section-controller/Functions/errorResolver';\nimport { firstValueFrom } from 'rxjs';\nimport type { DerivedBuildContext, OptionsDerivedEntry } from './types';\nimport { computeUnmetMinInputs, wireMissingDependencyDiagnostic } from './missing-dependency-hint';\n\n// ---------------------------------------------------------------------------\n// Status-ID constants — stable UUIDs that match the originals in the legacy\n// helpers so that any downstream consumers checking status keys see the same\n// values.\n// ---------------------------------------------------------------------------\n\n/** Status key used during GET options fetches (matches legacy `getApiDataFetching`). */\nconst GET_STATUS_ID = '2135bc6a-d957-4af1-9148-e104363afa30';\n\n/** Status key used during POST options fetches (matches legacy `inputGetApiPostData`). */\nconst POST_STATUS_ID = 'd19be9ca-ceda-4388-9f7b-3fcb5f12d921';\n\n// ---------------------------------------------------------------------------\n// Internal helper — apply valueAccessRules to raw HTTP response data.\n// ---------------------------------------------------------------------------\n\n/**\n * Applies `valueAccessRules` (if present) to the raw HTTP response and returns\n * the resulting options array. When no rules are configured the raw `data` is\n * returned as-is.\n *\n * Mirrors the identical inline logic in `getApiDataFetching` and\n * `inputGetApiPostData`.\n *\n * @param fetchConfig - The resolved options fetch configuration.\n * @param data - The raw HTTP response data.\n * @returns The extracted options value (cast to `readonly FormInputBasicOptionInterface[]`\n * by the caller after this helper returns).\n */\nfunction applyValueAccessRules(\n fetchConfig: APIDataFetchingConfigurationInterface,\n data: unknown,\n): unknown {\n const rules = fetchConfig.valueAccessRules;\n if (!rules || (Array.isArray(rules) && rules.length === 0)) {\n return data;\n }\n return getValueFromValueAccessor(rules, data);\n}\n\n// ---------------------------------------------------------------------------\n// Internal helper — build the resolved matOptions patch for updateFormInputConfig.\n// ---------------------------------------------------------------------------\n\n/**\n * Constructs the partial `FormColumnInputs` patch that is passed to\n * `utils.updateFormInputConfig` on the resolved edge.\n *\n * The shape mirrors what the legacy `getApiDataFetching` / `inputGetApiPostData`\n * produced when calling `utils.updateFormInputConfig`:\n * ```ts\n * { matOptions: { ...inputConfig.matOptions, options: results } }\n * ```\n *\n * The double-cast `as unknown as FormColumnInputs` is an existing frozen pattern\n * in the legacy helpers (tracked as Phase-4 TODO in the originals); it is NOT\n * new debt introduced here.\n *\n * @param input - The input config at the time the builder was created.\n * @param options - The resolved options array.\n * @returns A partial `FormColumnInputs` carrying only the updated `matOptions`.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Phase 4 TODO: tighten updateFormInputConfig signature so matOptions union accepts results: unknown. Mirrors legacy helpers.\nfunction buildOptionsPatch(input: FormColumnInputs, options: unknown): any {\n return {\n matOptions: {\n ...input.matOptions,\n options,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// GET-static branch\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an {@link OptionsDerivedEntry} for inputs whose options are fetched\n * via an HTTP **GET** request with no dynamic dependencies\n * (`FunctionTypes.OptionsGetMethodAPI`).\n *\n * The resource loader calls `ctx.utils.httpGetDataFunction` once and applies\n * `valueAccessRules` to extract the options from the response. A resolved-edge\n * `effect` (deduped via the `prevStatus` edge-tracker) calls `ctx.utils.updateFormInputConfig`\n * exactly once per successful fetch so the `_onFormInputConfigChange` callback\n * fires on the section-stepper.\n *\n * @param input - The full column-input configuration.\n * @param ctx - Shared builder context (readDep, utils, injector).\n * @returns An {@link OptionsDerivedEntry} wired to the GET resource.\n */\nfunction buildGetOptionsResource(\n input: FormColumnInputs,\n ctx: DerivedBuildContext,\n): OptionsDerivedEntry {\n return runInInjectionContext(ctx.injector, () => {\n const fetchConfig = input.matOptions?.fetch?.options as APIDataFetchingConfigurationInterface;\n\n // Track the previous resource status so we can detect the pending→resolved edge.\n // Edge-tracker: a plain closure variable (NOT a signal — nothing reads it\n // reactively), so the resolved-edge effect below never writes a signal.\n let prevStatus: ResourceStatus = 'idle';\n\n const optionsResource = resource<readonly FormInputBasicOptionInterface[], void>({\n loader: async () => {\n ctx.utils.setInputStatus(input.id, GET_STATUS_ID, 'Fetching options...');\n try {\n const data = await firstValueFrom(\n ctx.utils.httpGetDataFunction(fetchConfig.httpEndPoint, fetchConfig.httpHeaderOptions),\n );\n ctx.utils.removeInputStatus(input.id, GET_STATUS_ID);\n const results = applyValueAccessRules(fetchConfig, data);\n return (results ?? []) as readonly FormInputBasicOptionInterface[];\n } catch (error) {\n ctx.utils.removeInputStatus(input.id, GET_STATUS_ID);\n ctx.utils.setInputTemporaryError(input.id, 'Error fetching options from API');\n throw error;\n }\n },\n });\n\n // Resolved-edge effect: fires updateFormInputConfig exactly once per\n // pending→resolved transition, deduped by the prevStatus edge-tracker.\n effect(() => {\n const current = optionsResource.status();\n const prev = prevStatus;\n\n // Fire on BOTH pre-resolution edges: the first fetch transitions\n // `loading → resolved`, but `.reload()` (refresh family) transitions\n // `reloading → resolved` — never re-entering `'loading'`. Guarding on\n // `'loading'` alone silently dropped the reload write-back, so refreshed\n // options never re-patched `matOptions.options` (OG-6). Both are deduped\n // by the single `prevStatus` edge-tracker, preserving the once-per-fetch\n // contract (OG-9).\n if ((prev === 'loading' || prev === 'reloading') && current === 'resolved') {\n const results = optionsResource.value();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Phase 4 TODO: mirrors legacy helpers' cast.\n ctx.utils.updateFormInputConfig(input.id, buildOptionsPatch(input, results));\n ctx.utils.setTemporaryHint(input.id, 'Data options fetched successfully', HintType.DOCUMENT);\n }\n\n // Record the status AFTER the edge check. `prevStatus` is a plain closure\n // variable, so this is an ordinary assignment — not a signal write — and the\n // effect's only reactive dependency is `optionsResource.status()`.\n prevStatus = current;\n });\n\n const optionsSignal = computed(\n () => (optionsResource.value() ?? []) as readonly FormInputBasicOptionInterface[],\n );\n\n return {\n kind: 'options',\n signal: optionsSignal,\n resource: optionsResource,\n lastStatus: () => prevStatus,\n } satisfies OptionsDerivedEntry;\n });\n}\n\n// ---------------------------------------------------------------------------\n// POST-computed branch (OptionsPostMethodAPI)\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an {@link OptionsDerivedEntry} for inputs whose options are fetched\n * via an HTTP **POST** request whose body is composed from dependent input\n * values (`FunctionTypes.OptionsPostMethodAPI`).\n *\n * The resource's `params` signal is a `computed` that reads dependencies through\n * `ctx.readDep`. When `validateMinInput` fails for any required input the\n * `params` signal returns `undefined` and the resource stays `idle` (matching\n * the old `validateMinInput` skip in `inputGetApiPostData`). When all\n * dependencies are satisfied the params become defined and the resource flips\n * `idle → loading`.\n *\n * A resolved-edge `effect` (deduped via the `prevStatus` edge-tracker) calls\n * `ctx.utils.updateFormInputConfig` exactly once per successful fetch.\n *\n * @param input - The full column-input configuration.\n * @param ctx - Shared builder context.\n * @returns An {@link OptionsDerivedEntry} wired to the computed-POST resource.\n */\nfunction buildPostComputedOptionsResource(\n input: FormColumnInputs,\n ctx: DerivedBuildContext,\n): OptionsDerivedEntry {\n return runInInjectionContext(ctx.injector, () => {\n const fetchConfig = input.matOptions?.fetch?.options as APIDataFetchingConfigurationInterface;\n const minInputs = fetchConfig.backEndConfig?.minimumInputRequired ?? [];\n\n /**\n * Computed params signal. Returns `undefined` when any required (non-default)\n * minimum input is missing or invalid — which keeps the resource `idle`.\n */\n const paramsSignal = computed<Record<string, unknown> | undefined>(() => {\n // Read each dependency through readDep (cycle-safe: never reads value()).\n const snapshot: Record<string, unknown> = {};\n for (const minInput of minInputs) {\n // Build a per-call snapshot keyed by inputId for validateMinInput.\n if (minInput.mapTo && !Array.isArray(minInput.mapTo)) {\n const depId = (minInput.mapTo as { inputId?: string }).inputId;\n if (depId) {\n snapshot[depId] = ctx.readDep(depId);\n }\n } else if (Array.isArray(minInput.mapTo)) {\n for (const mapEntry of minInput.mapTo as Array<{ inputId?: string }>) {\n if (mapEntry.inputId) {\n snapshot[mapEntry.inputId] = ctx.readDep(mapEntry.inputId);\n }\n }\n }\n }\n\n // Validate all required inputs. If any fail, return undefined → idle.\n const allValid = minInputs.every((minInput) => {\n try {\n return validateMinInput(minInput, snapshot);\n } catch {\n return false;\n }\n });\n\n if (!allValid) {\n return undefined;\n }\n\n // Build the mapped POST body.\n return returnMappedData(snapshot, minInputs, fetchConfig.httpEndPoint as string) as Record<string, unknown>;\n });\n\n // Edge-tracker: a plain closure variable (NOT a signal — nothing reads it\n // reactively), so the resolved-edge effect below never writes a signal.\n let prevStatus: ResourceStatus = 'idle';\n\n const optionsResource = resource<readonly FormInputBasicOptionInterface[], Record<string, unknown> | undefined>({\n params: paramsSignal,\n loader: async ({ params }) => {\n if (params === undefined) {\n // Params undefined → stay idle; loader should not be called, but guard anyway.\n return [] as readonly FormInputBasicOptionInterface[];\n }\n ctx.utils.setInputStatus(input.id, POST_STATUS_ID, 'Fetching options...');\n ctx.utils.setTemporaryHint(input.id, 'Fetching options...', HintType.LOADING);\n try {\n const data = await firstValueFrom(\n ctx.utils.httpPostDataFunction(\n fetchConfig.httpEndPoint as string,\n params,\n (fetchConfig as APIDataFetchingConfigurationInterface).httpHeaderOptions,\n ),\n );\n ctx.utils.removeInputStatus(input.id, POST_STATUS_ID);\n const results = applyValueAccessRules(fetchConfig, data);\n return (results ?? []) as readonly FormInputBasicOptionInterface[];\n } catch (error) {\n ctx.utils.removeInputStatus(input.id, POST_STATUS_ID);\n const errMsg = errorResolver(\n error instanceof Error\n ? (error as Error & { status?: number; error?: unknown })\n : undefined,\n );\n ctx.utils.setInputTemporaryError(input.id, resolveErrorString(errMsg) ?? 'Error fetching options');\n throw error;\n }\n },\n });\n\n // Resolved-edge effect: deduped by the prevStatus edge-tracker.\n effect(() => {\n const current = optionsResource.status();\n const prev = prevStatus;\n\n // Fire on BOTH pre-resolution edges (`loading → resolved` first fetch and\n // `reloading → resolved` on `.reload()`); `'loading'` alone dropped the\n // reload write-back (OG-6). Deduped by the single `prevStatus` tracker (OP-9).\n if ((prev === 'loading' || prev === 'reloading') && current === 'resolved') {\n const results = optionsResource.value();\n ctx.utils.updateFormInputConfig(input.id, buildOptionsPatch(input, results));\n ctx.utils.setTemporaryHint(input.id, 'Data options fetched successfully', HintType.DOCUMENT);\n ctx.utils.removeInputStatus(input.id, POST_STATUS_ID);\n }\n\n prevStatus = current;\n });\n\n const optionsSignal = computed(\n () => (optionsResource.value() ?? []) as readonly FormInputBasicOptionInterface[],\n );\n\n // Surface a context-rich hint when options stay idle because a required\n // mapped dependency is missing/invalid (the `params → undefined` short-circuit\n // is otherwise silent — the options never load). The diagnostic names the\n // unmet upstream field(s) by label so the user knows what to select/enter.\n wireMissingDependencyDiagnostic(ctx, {\n inputId: input.id,\n targetLabel: input.label?.trim() || input.id,\n kind: 'options',\n readMissing: () => computeUnmetMinInputs(minInputs, ctx.readDep, validateMinInput),\n });\n\n return {\n kind: 'options',\n signal: optionsSignal,\n resource: optionsResource,\n lastStatus: () => prevStatus,\n } satisfies OptionsDerivedEntry;\n });\n}\n\n// ---------------------------------------------------------------------------\n// POST-static branch (OptionsPostMethodAPIWithAllDefaultParams)\n// ---------------------------------------------------------------------------\n\n/**\n * Creates an {@link OptionsDerivedEntry} for inputs whose options are fetched\n * via an HTTP **POST** request where ALL minimum inputs are of type `'default'`\n * (`FunctionTypes.OptionsPostMethodAPIWithAllDefaultParams`).\n *\n * Because every input is a static default there are no dynamic signal\n * dependencies — the request body is built once at loader invocation time\n * rather than through a `computed` params signal. This matches the old\n * `inputGetApiPostData('options', …)` path where all minInputs had\n * `type === 'default'`.\n *\n * A resolved-edge `effect` (deduped via the `prevStatus` edge-tracker) calls\n * `ctx.utils.updateFormInputConfig` exactly once per successful fetch.\n *\n * @param input - The full column-input configuration.\n * @param ctx - Shared builder context.\n * @returns An {@link OptionsDerivedEntry} wired to the static-POST resource.\n */\nfunction buildPostStaticOptionsResource(\n input: FormColumnInputs,\n ctx: DerivedBuildContext,\n): OptionsDerivedEntry {\n return runInInjectionContext(ctx.injector, () => {\n const fetchConfig = input.matOptions?.fetch?.options as APIDataFetchingConfigurationInterface;\n const minInputs = fetchConfig.backEndConfig?.minimumInputRequired ?? [];\n\n // Static request body — built once (all minInputs are 'default' type).\n const staticBody = returnMappedData({}, minInputs, fetchConfig.httpEndPoint as string) as Record<string, unknown>;\n\n // Edge-tracker: a plain closure variable (NOT a signal — nothing reads it\n // reactively), so the resolved-edge effect below never writes a signal.\n let prevStatus: ResourceStatus = 'idle';\n\n const optionsResource = resource<readonly FormInputBasicOptionInterface[], void>({\n loader: async () => {\n ctx.utils.setInputStatus(input.id, POST_STATUS_ID, 'Fetching options...');\n ctx.utils.setTemporaryHint(input.id, 'Fetching options...', HintType.LOADING);\n try {\n const data = await firstValueFrom(\n ctx.utils.httpPostDataFunction(\n fetchConfig.httpEndPoint as string,\n staticBody,\n (fetchConfig as APIDataFetchingConfigurationInterface).httpHeaderOptions,\n ),\n );\n ctx.utils.removeInputStatus(input.id, POST_STATUS_ID);\n const results = applyValueAccessRules(fetchConfig, data);\n return (results ?? []) as readonly FormInputBasicOptionInterface[];\n } catch (error) {\n ctx.utils.removeInputStatus(input.id, POST_STATUS_ID);\n const errMsg = errorResolver(\n error instanceof Error\n ? (error as Error & { status?: number; error?: unknown })\n : undefined,\n );\n ctx.utils.setInputTemporaryError(input.id, resolveErrorString(errMsg) ?? 'Error fetching options');\n throw error;\n }\n },\n });\n\n // Resolved-edge effect: deduped by the prevStatus edge-tracker.\n effect(() => {\n const current = optionsResource.status();\n const prev = prevStatus;\n\n // Fire on BOTH pre-resolution edges (`loading → resolved` first fetch and\n // `reloading → resolved` on `.reload()`); `'loading'` alone dropped the\n // reload write-back (OG-6). Deduped by the single `prevStatus` tracker (OP-9).\n if ((prev === 'loading' || prev === 'reloading') && current === 'resolved') {\n const results = optionsResource.value();\n ctx.utils.updateFormInputConfig(input.id, buildOptionsPatch(input, results));\n ctx.utils.setTemporaryHint(input.id, 'Data options fetched successfully', HintType.DOCUMENT);\n ctx.utils.removeInputStatus(input.id, POST_STATUS_ID);\n }\n\n prevStatus = current;\n });\n\n const optionsSignal = computed(\n () => (optionsResource.value() ?? []) as readonly FormInputBasicOptionInterface[],\n );\n\n return {\n kind: 'options',\n signal: optionsSignal,\n resource: optionsResource,\n lastStatus: () => prevStatus,\n } satisfies OptionsDerivedEntry;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Public factory — dispatches to the correct branch.\n// ---------------------------------------------------------------------------\n\n/**\n * Pure factory that creates an {@link OptionsDerivedEntry} for an input whose\n * options are fetched from an HTTP API.\n *\n * Covers all three options-fetch function types:\n * - `OptionsGetMethodAPI` — GET, static (no signal deps).\n * - `OptionsPostMethodAPI` — POST, computed request (params from `readDep`).\n * - `OptionsPostMethodAPIWithAllDefaultParams` — POST, static request (all minInputs are `'default'`).\n *\n * The correct branch is selected by reading `input.matOptions.fetch.options`:\n * - `httpMethod === 'GET'` → GET-static branch.\n * - `httpMethod === 'POST'` with all-default minInputs → POST-static branch.\n * - `httpMethod === 'POST'` with at least one non-default minInput → POST-computed branch.\n *\n * ### Resolved-edge write-back (parity constraint)\n *\n * On the `pending → resolved` status edge only, deduped (exactly once per\n * fetch), the builder calls `ctx.utils.updateFormInputConfig(inputId, patch)`.\n * This routes verbatim through `functions/updateFormInputConfig.ts` whose\n * `deepMerge` walk fires `_onFormInputConfigChange` — the mechanism the\n * section-stepper depends on (Blueprint §3 #6-8, HAZARD 3).\n *\n * ### No-publish rule\n *\n * This builder does NOT call `ctx.utils.updateValue`. The chosen option value\n * stays in user state (A-4, Blueprint §3 CRITICAL).\n *\n * ### Injection context (HAZARD 1)\n *\n * All reactive primitives are created inside `runInInjectionContext(ctx.injector, …)`\n * to avoid NG0203 when the builder is invoked from `initialize()`.\n *\n * @example\n * ```ts\n * // Inside the engine dispatcher (W8):\n * import { buildOptionsApiResource } from './builders/build-options-api-resource';\n *\n * const entry = buildOptionsApiResource(input, ctx);\n * this.#derived.set(`${input.id}:${FunctionTypes.OptionsGetMethodAPI}`, entry);\n * ```\n *\n * @param input - The full column-input configuration carrying `matOptions.fetch.options`.\n * @param ctx - Immutable builder context: `readDep`, `utils`, `injector`.\n * @returns An {@link OptionsDerivedEntry} whose `resource` is the backing fetch,\n * `signal` exposes the resolved options array, and `lastStatus` returns the\n * current {@link ResourceStatus} of the backing resource.\n */\nexport function buildOptionsApiResource(\n input: FormColumnInputs,\n ctx: DerivedBuildContext,\n): OptionsDerivedEntry {\n const fetchConfig = input.matOptions?.fetch?.options as APIDataFetchingConfigurationInterface | undefined;\n\n if (!fetchConfig || fetchConfig.source !== 'api') {\n // Defensive guard: if the config is absent or not API-sourced, return an\n // inert idle entry so the engine never crashes. The dispatcher's\n // `getAllFunctionTypes` check should prevent this path in practice.\n return runInInjectionContext(ctx.injector, () => {\n const inertResource = resource<readonly FormInputBasicOptionInterface[], void>({\n loader: async () => [] as readonly FormInputBasicOptionInterface[],\n });\n // Inert entry: no fetch, no resolved-edge effect — status stays 'idle'.\n const prevStatus: ResourceStatus = 'idle';\n return {\n kind: 'options',\n signal: computed(() => [] as readonly FormInputBasicOptionInterface[]),\n resource: inertResource,\n lastStatus: () => prevStatus,\n } satisfies OptionsDerivedEntry;\n });\n }\n\n const httpMethod = fetchConfig.httpMethod?.toUpperCase();\n\n if (httpMethod === 'GET') {\n return buildGetOptionsResource(input, ctx);\n }\n\n // POST — check whether all minInputs are of type 'default'.\n const minInputs = fetchConfig.backEndConfig?.minimumInputRequired ?? [];\n const allDefault = minInputs.every((m) => m.type === 'default');\n\n if (allDefault) {\n return buildPostStaticOptionsResource(input, ctx);\n }\n\n return buildPostComputedOptionsResource(input, ctx);\n}\n","/**\n * @file Pure factory for the {@link FunctionTypes.ManualValueValidation} builder.\n *\n * ### Phase-1 contract\n * Returns a synchronous `errorFn` predicate — a plain `() => Record<string, unknown> | null`\n * that reads observed input values via `ctx.readDep` and evaluates each custom validator's\n * expression using {@link validateObjectAgainstString}. The predicate is compatible with\n * Angular's `ValidationErrors` shape and is stored as a {@link ValidationDerivedEntry} in\n * the engine's `#derived` Map.\n *\n * Phase 1 attaches the predicate to the projected `FormControl` as a `ValidatorFn` (in\n * `W11 — FormGroup projection effect`) so `control.errors` remains populated for steppers\n * and the import controller.\n *\n * ### Phase-3 seam\n * The boundary between the pure predicate (this file) and the FormGroup adapter that\n * attaches it is **the only coupling to `@angular/forms`**. Phase 3 replaces the adapter\n * with `validate()` / `validateAsync()` from `@angular/forms/signals` — this file is\n * unchanged. Do not move any `ValidatorFn` / `AbstractControl` import into this module.\n *\n * ### Behaviour parity\n * The evaluation logic is extracted verbatim from `createCustomValidator` in\n * `t-form-section-controller/Functions/commonFormOperations.ts`, with two adaptations:\n *\n * 1. `formValue()[inputId]` is replaced by `ctx.readDep(inputId)` so the predicate reads\n * from the signal graph (`#model` + `#derived`), never from the merged `value()` computed\n * (cycle-guard contract — Blueprint §2.3).\n * 2. There is no `FormControl` reference inside the predicate (the predicate is `control`-free;\n * `control.markAsTouched()` / `control.markAsDirty()` remain the responsibility of the W11\n * projection adapter that wraps this predicate in a `ValidatorFn`).\n *\n * ### No module-load side effects\n * This module is a pure factory. It imports only `ngx-t-forms-types` type symbols and the\n * shared `validateObjectAgainstString` utility. No Angular runtime primitives are imported\n * or executed at module load time.\n *\n * @see {@link ValidationDerivedEntry} for the `#derived` Map entry shape.\n * @see {@link DerivedBuildContext} for the `readDep` / `utils` / `injector` contract.\n * @see SIGNAL_FORMS_PHASE1_BLUEPRINT.md §3 builder #9 and §2.7 Phase-3-seam note.\n */\nimport type {\n FormColumnInputs,\n FormControlCustomValidatorsInterface,\n InputObservedForChange,\n} from 'ngx-t-forms-types';\nimport { calculateListOveralFunctions } from '../../../t-form-controller/function/calculateInputValue';\nimport { validateObjectAgainstString } from '../../../../../shared/modules/stringJsonValidator/getObjectValidations';\nimport type { BuildManualValidationFn, DerivedBuildContext, ValidationDerivedEntry } from './types';\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Reduces a multiple-input row array to a single value for the validator scope.\n *\n * `rows` is the value of the multiple-input container (an array of row objects,\n * each keyed by inner-input id — see `collectInnerInputValues`). `columnId` is\n * the bound sub-input's id; `aggregate` is the function applied. Mirrors the\n * column-aggregation branch of {@link configureCalculationScope} and reuses the\n * same {@link calculateListOveralFunctions} reducer for behaviour parity with\n * calculated fields.\n *\n * @returns The aggregated number, or `0` when there are no rows.\n */\nfunction aggregateListColumn(\n rows: unknown,\n columnId: string,\n aggregate: NonNullable<InputObservedForChange['function']>,\n): number {\n if (!Array.isArray(rows)) return 0;\n const values = (rows as Array<Record<string, unknown>>).map((row) => Number(row?.[columnId]));\n return calculateListOveralFunctions(aggregate, values);\n}\n\n/**\n * Builds the variable scope that `validateObjectAgainstString` operates on.\n *\n * Each `{ inputId, variable }` entry maps `variable` to the current value of\n * `inputId` via `readDep`. When an entry carries an aggregate `function`, the\n * bound input is a multiple-input (list) column: the row array is read from\n * `parentInputId` (falling back to `inputId`) and reduced to a scalar via\n * {@link aggregateListColumn}. A list peer in the *same* group carries no\n * function and resolves directly (the sub-form engine exposes its row value).\n *\n * Mirrors `getValidationScopeFromFormValue` in `commonFormOperations.ts`,\n * substituting `readDep(inputId)` for `formData[inputId]`.\n *\n * @param inputsObservedForChanges - The dependency list from the validator config.\n * @param readDep - Signal-graph read accessor from {@link DerivedBuildContext}.\n * @returns A plain object keyed by variable name with the current input values.\n */\nfunction buildValidationScope(\n inputsObservedForChanges: ReadonlyArray<InputObservedForChange>,\n readDep: (inputId: string) => unknown,\n): Record<string, unknown> {\n const scope: Record<string, unknown> = {};\n for (const entry of inputsObservedForChanges) {\n const { inputId, variable, parentInputId, function: aggregate } = entry;\n if (!inputId || !variable) continue;\n if (aggregate) {\n scope[variable] = aggregateListColumn(readDep(parentInputId ?? inputId), inputId, aggregate);\n } else {\n scope[variable] = readDep(inputId);\n }\n }\n return scope;\n}\n\n/**\n * Evaluates a single {@link FormControlCustomValidatorsInterface} validator config\n * against the current signal-graph state.\n *\n * Returns a single-key error record when the expression evaluates to `true`\n * (invalid), or `null` when the input is valid. On evaluation errors, the\n * error detail is attached to the record so the UI / import controller can\n * surface the failure rather than silently swallowing it.\n *\n * Behaviour is byte-for-byte equivalent to `createCustomValidator` in\n * `commonFormOperations.ts` except:\n * - reads are via `readDep` instead of `formValue()`;\n * - there is no `AbstractControl` reference (no `markAsTouched`/`markAsDirty`\n * here — that is the W11 adapter's responsibility).\n *\n * @param config - The validator configuration entry.\n * @param readDep - Signal-graph read accessor.\n * @returns A `Record<string, unknown>` error entry or `null`.\n */\nfunction evaluateSingleValidator(\n config: FormControlCustomValidatorsInterface,\n readDep: (inputId: string) => unknown,\n): Record<string, unknown> | null {\n const { id, message, expression, canOverride, inputsObservedForChanges } = config;\n\n try {\n const scope = buildValidationScope(inputsObservedForChanges, readDep);\n const isInvalid = validateObjectAgainstString(expression, scope);\n return isInvalid ? { [id]: { message, canOverride } } : null;\n } catch (error: unknown) {\n // Surface evaluation errors so they are visible in `control.errors` and\n // the import controller's error collection — matches the old `catch` block.\n return { [id]: { message, canOverride, error } };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public factory\n// ---------------------------------------------------------------------------\n\n/**\n * Phase-1 builder for {@link FunctionTypes.ManualValueValidation}.\n *\n * Constructs a synchronous error predicate that evaluates **all** custom\n * validator configs declared on `input.validators`, merging their results into\n * a single `Record<string, unknown>` (or returning `null` when every validator\n * passes).\n *\n * ### Reactivity\n * The returned `errorFn` closes over `ctx.readDep`. Because `readDep` reads\n * from `#model` and `#derived` signals, Angular's signal graph automatically\n * tracks every `inputsObservedForChanges[].inputId` as a reactive dependency\n * when `errorFn` is evaluated inside a reactive context (e.g. inside the W11\n * `ValidatorFn` wrapper that calls `control.updateValueAndValidity()`).\n * No `effect()` or `computed()` is created in this builder — there is nothing\n * to wrap in `runInInjectionContext`.\n *\n * ### Phase-3 seam\n * This function returns a plain predicate. The W11 projection adapter is the\n * **only** caller that converts it to a `ValidatorFn`. When Phase 3 lands,\n * the adapter is replaced; this factory is unchanged.\n *\n * ```ts\n * // Phase 1 (W11 adapter — not this file):\n * const validatorFn: ValidatorFn = (_control) => entry.errorFn();\n * control.setValidators([validatorFn]);\n *\n * // Phase 3 seam (replace adapter only):\n * // form(model, schema).validate(entry.errorFn)\n * ```\n *\n * @param input - The full column-input config. Only `input.validators` entries\n * where `typeof validator === 'object'` (i.e. {@link FormControlCustomValidatorsInterface})\n * are evaluated; string validators (`'required'`, `'email'`, …) are handled by\n * the `formGenerator` / `returnValidator` path and are outside this builder's scope.\n * @param ctx - Shared build context (readDep, utils, injector).\n * @returns A {@link ValidationDerivedEntry} whose `errorFn` returns `null` when\n * all validators pass, or a merged error record when one or more fail.\n *\n * @example\n * ```ts\n * const entry = buildManualValidation(input, ctx);\n * // Inside the W11 ValidatorFn adapter:\n * const errors = entry.errorFn(); // null | Record<string, unknown>\n * ```\n */\nexport const buildManualValidation: BuildManualValidationFn = (\n input: FormColumnInputs,\n ctx: DerivedBuildContext,\n): ValidationDerivedEntry => {\n // Collect only the object-shaped (custom) validators; string validators are\n // handled by formGenerator / returnValidator — not this builder's concern.\n const customValidators: FormControlCustomValidatorsInterface[] = (input.validators ?? []).filter(\n (v): v is FormControlCustomValidatorsInterface =>\n typeof v === 'object' && v !== null,\n );\n\n /**\n * Synchronous error predicate.\n *\n * Evaluates each custom validator in declaration order, merging non-null\n * results into a single error record. Returns `null` only when every\n * validator passes (compatible with `ValidationErrors | null`).\n *\n * Reads via `ctx.readDep` — automatically tracked by Angular's signal graph\n * when called in a reactive context. Self-edge inputs return `undefined`\n * from `readDep` (Blueprint §2.3 cycle guard).\n *\n * @returns Merged error record or `null`.\n */\n const errorFn = (): Record<string, unknown> | null => {\n let merged: Record<string, unknown> | null = null;\n\n for (const config of customValidators) {\n const result = evaluateSingleValidator(config, ctx.readDep);\n if (result !== null) {\n // Lazily initialise and accumulate — avoids an unnecessary object\n // allocation when all validators pass.\n if (merged === null) {\n merged = { ...result };\n } else {\n Object.assign(merged, result);\n }\n }\n }\n\n return merged;\n };\n\n return { kind: 'validation', errorFn };\n};\n","/**\n * @file Form Tower Controller — runtime engine that turns a `FormInterface`\n * definition into a live, reactive form driven by the **native Angular signal\n * graph** (`signal` / `computed` / `linkedSignal` / `resource`), with per-input\n * calculations, API value/options fetchers, input-sourced values, custom\n * validators, async hint/error messaging, change history, and busy-state\n * tracking.\n *\n * **Mental model (Phase 1 — signal pull-graph):**\n * ```\n * FormInterface (declarative)\n * │\n * ▼\n * prepPopulateForm ──► formGenerator ──► #mainForm: FormGroup (Material carrier)\n * ▲\n * │ patchValue({emitEvent:false})\n * │ (signals → FormGroup, zero signal writes)\n * #formProjection (effect)\n * │\n * #model (user values) + #derived (per-input computed/linkedSignal/resource)\n * │\n * ▼\n * value = computed(merge)\n * │\n * ┌───────────────┴───────────────┐\n * ▼ ▼\n * isBusy / settled #persistEffect → saveFormData\n * (over resource.status()) (settled-gated, deduped)\n * ```\n *\n * The hand-rolled push graph (dependency records, reverse-dependency map,\n * `valueChanges` change-monitor, busy-set) is **gone**. Signals self-wire: a\n * derived signal reads its dependencies through `readDep` (`#model` + `#derived`\n * only — never the merged `value()`), so Angular's reactive graph IS the\n * dependency graph. Resources fetch lazily once their `.status()` is read in a\n * reactive context; `isBusy`/`settled` iterate every resource's `status()`,\n * which is what activates them (the resource-activation contract).\n *\n * The interactive `TFormController` component wires the tower to the UI; the\n * `TFormImportController` wires it to a programmatic, headless row-by-row import\n * flow (`initialize({skipInitialFunctions}) → initializeFormValues → waitUntilSettled`).\n */\nimport { ApplicationRef, Directive, EffectRef, Inject, Injector, OnDestroy, Signal, computed, effect, inject, runInInjectionContext, signal, untracked } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { FormColumnInputs, FormInterface, FormSubmissionStatus, IFormChangeHistory, InClassFormUtilsInterface } from 'ngx-t-forms-types';\nimport type { FileData, IFormValidationOverride } from 'ngx-t-forms-types';\n\n\nimport { AbstractControl, FormGroup, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { formGenerator, getSectionControl } from '../t-form-section-controller/Functions/formGenerator';\nimport { Observable, Subject, Subscription, catchError, filter, firstValueFrom, of, take, takeUntil, tap, timeout } from 'rxjs';\nimport { FunctionTypes, getAllFunctionTypes } from './functions/getAllFunctionTypes';\nimport { ElementTypes } from \"ngx-t-forms-types\"\nimport { HintType } from '../../../shared/functions/textIconsForUserHints';\n\nimport { HttpClient } from '@angular/common/http';\nimport { selectAllFormTours, selectFormSteps } from './functions/selectFormSteps';\nimport { allFormInputs } from './functions/allFormInputs';\nimport { formProgress, formSubmissionMessage } from './functions/getSubmissionStatus';\nimport {\n buildValidationOverrides,\n canSubmitForm,\n partitionControlList,\n partitionFormErrors,\n reasonsToOverrides,\n VALIDATION_OVERRIDES_KEY,\n type OverridableError,\n type OverrideReasons,\n} from './functions/overrideValidation';\nimport { setInputError, setInputTemporaryError, setTemporaryHint } from './functions/setInputError';\nimport { updateFormInputConfig } from './functions/updateFormInputConfig';\nimport { setInputAsTouchedAndDirty } from './functions/setInputAsTouchedAndDirty';\nimport { setSectionAsActive, setSectionAsSeen } from './functions/setSectionAsSeen';\nimport { getFormValueAsFormControlBasedObject, unFlattenFormValue } from './functions/getFormValue';\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../injection-tokens';\nimport { removeInputStatus, setInputStatus } from './functions/setInputStatus';\nimport { multipleInputDuplicateRow, multipleInputEditRow, toggleMultipleInput } from './functions/toggleMultipleInput';\nimport { handleStepChange } from './functions/handleStepChange';\nimport { StepperSelectionEvent } from '@angular/cdk/stepper';\nimport { saveMultipleInputForm } from './functions/saveMultipleInputForm';\nimport { prepPopulateForm } from './functions/prePoPulateForm';\nimport { formHttpSubmissions } from '../../../components/forms/functions/formHttpSubmissions';\nimport { safeReturnDeepProperty } from '../../../shared';\nimport { _isEqual } from '../../../shared/functions/isEqual';\nimport { loadSystemInputs } from './functions/loadSystemInputs';\nimport { canRefresh, canRefreshSectionFn, refreshInputWithDependencies, refreshSectionInput } from './functions/refreshInputWithDependencies';\nimport { buildValueCalculation } from './functions/builders/build-value-calculation';\nimport { buildInputSourcedValue } from './functions/builders/build-input-sourced-value';\nimport { buildValueApiResource } from './functions/builders/build-value-api-resource';\nimport { buildOptionsApiResource } from './functions/builders/build-options-api-resource';\nimport { buildManualValidation } from './functions/builders/build-manual-validation';\nimport type { DerivedBuildContext, DerivedEntry } from './functions/builders/types';\n\n/**\n * Bag of side-effect helpers passed into every input builder (calculations,\n * value/options API fetches, input-sourced values, validators).\n *\n * **Phase 1 rule (signal-graph):** value/calc/sourced builders **MUST NOT**\n * publish through {@link IFunctionUtils.updateValue} or\n * {@link IFunctionUtils.updateFormInputConfig} — the signal IS the value.\n * Options builders are the SOLE exception: they call\n * {@link IFunctionUtils.updateFormInputConfig} once, on the resource's\n * `pending → resolved` edge, routed verbatim through\n * `functions/updateFormInputConfig.ts` so the `_onFormInputConfigChange`\n * callback fires (section-stepper parity).\n *\n * `setInputStatus` / `removeInputStatus` no longer drive the busy state (busy\n * is resource-derived); they forward to the DOM-status helpers for badges only.\n *\n * The HTTP functions come from `NGX_T_FORMS_CONFIG.formBuilder` and may be\n * replaced by callers (the import controller swaps them for cache-aware wrappers\n * so concurrent rows share a single in-flight request).\n */\nexport interface IFunctionUtils {\n /** Show an error on the input's hint area; auto-clears after a short timer. */\n setInputTemporaryError: (inputId: string, message: string) => void,\n /** Show an informational hint (success, loading, history, …) below the input. */\n setTemporaryHint: (inputId: string, message: string, type: HintType) => void,\n /**\n * Mark a logical operation (`statusId`) as in-flight on `inputId` for DOM\n * badge rendering. Phase 1: this no longer affects the tower's busy state\n * ({@link FormTowerControllerService.isBusy} is derived from resource\n * `status()`), it only renders the per-input status chip.\n */\n setInputStatus: (inputId: string, statusId: string, status: string) => void,\n /** Companion to {@link IFunctionUtils.setInputStatus} — clears the DOM badge. */\n removeInputStatus: (inputId: string, statusId: string) => void,\n /**\n * Write a value to a form control by inputId.\n *\n * **Builder rule:** value/calc/sourced builders MUST NOT call this — the\n * signal IS the value. Reserved for consumer/import writes via the engine.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I-1 parity-frozen signature (consumers + import depend on it).\n updateValue: (inputId: string, value: any) => void,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I-1 parity-frozen signature.\n httpPostDataFunction: (url: string, data: any, options?: any) => Observable<any>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I-1 parity-frozen signature.\n httpGetDataFunction: (url: string, options?: any) => Observable<any>,\n /** Patch the input's column definition (e.g. set new options after a fetch). Options builders only. */\n updateFormInputConfig: (inputId: string, config: FormColumnInputs) => void,\n fileUpload: (file: string, fileName: string, fileType: string) => Observable<{ url: string }>,\n}\n\n/** Returns the `inputId` portion of a `#derived` Map key (`${inputId}:${functionType}`). */\nconst idOf = (key: string): string => key.slice(0, key.indexOf(':'));\n\n/**\n * The {@link FunctionTypes} that PRODUCE an input value (as opposed to options\n * or validation). Listed in `value()`/`readDep` merge-precedence order — the\n * single source of truth for both `#readDep` (where order is precedence) and\n * `#isInputDerived` (where it is a membership test).\n */\nconst VALUE_PRODUCING_TYPES = [\n FunctionTypes.ValueCalculation,\n FunctionTypes.InputSourcedValue,\n FunctionTypes.ValueGetMethodAPI,\n FunctionTypes.ValuePostMethodAPI,\n FunctionTypes.ValuePostMethodAPIWithAllDefaultParams,\n] as const;\n\n/**\n * Core orchestrator for a runtime form (the \"tower\") — abstract because every\n * concrete consumer (`TFormEngine`, the import row instance) extends it and\n * Angular's DI provides {@link HttpClient} + {@link NGX_T_FORMS_CONFIG_TOKEN}.\n *\n * ### Lifecycle (Phase 1)\n * 1. **{@link FormTowerControllerService.initialize}** — prepPopulate +\n * loadSystemInputs + formGenerator + setFirstStepAsActive, then builds the\n * per-input `#derived` signal graph (in injection context) and wires the\n * FormGroup-projection + persist effects. There is NO `valueChanges`\n * subscription and NO dependency-graph build.\n * 2. **{@link FormTowerControllerService.initializeFormValues}** — writes\n * user/import values into `#model` (tower-owned derived inputs are skipped\n * structurally) and forces a liveness lead-read so lazy resources start.\n * 3. User interaction / `updateValue` → writes `#model` (or a sourced\n * `linkedSignal.set`) → derived signals + resources recompute automatically.\n * 4. **{@link FormTowerControllerService.waitUntilSettled}** — used by headless\n * consumers (import) to wait for all in-flight async work to drain.\n * 5. **{@link FormTowerControllerService.ngOnDestroy}** — explicitly destroys\n * every resource, the projection/persist effects, the `isBusy$`\n * subscription, and clears hint/error timers.\n *\n * ### Why an abstract `@Directive()`?\n * Angular requires the `@Directive()` decorator on classes that participate in\n * DI inheritance + `OnDestroy`. Subclasses can be plain `@Injectable()` (see\n * {@link TFormEngine}).\n */\n@Directive()\nexport abstract class FormTowerControllerService implements OnDestroy {\n /** Resolved tower config (HTTP functions, file upload, getFinacialCycles, …). */\n readonly NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN)\n /** Convenience pass-through to the financial-cycles fetcher from config. */\n readonly getFinacialCycles = this.NGX_T_FORMS_CONFIG.formBuilder.getFinacialCycles\n\n /**\n * Captured at construction so reactive primitives created **after**\n * construction (inside {@link FormTowerControllerService.initialize}) can be\n * built via `runInInjectionContext(this.#injector, …)`. Without this every\n * `resource()` / `effect()` / `toObservable()` / `linkedSignal` created in\n * `initialize()` would throw NG0203 (HAZARD 1).\n */\n readonly #injector = inject(Injector);\n /** Used to flush the effect scheduler during the liveness lead-read (HAZARD 2). */\n readonly #appRef = inject(ApplicationRef);\n\n // Parameter-property constructor (no body): `isBusy$` is created as a field\n // initializer (see below) which runs in the construction injection context,\n // so it does NOT need runInInjectionContext (HAZARD 1 only applies to\n // primitives created inside initialize(), after construction).\n constructor(@Inject(HttpClient) private _http: HttpClient) { }\n\n // ──────────────────────────────────────────────────────────────────────────\n // W7 — Source signals (user-owned + structural state)\n // ──────────────────────────────────────────────────────────────────────────\n\n /** Emits exactly once on tower destruction. `takeUntil` anchor for long-lived subscriptions. */\n protected _destroyed$ = new Subject<void>();\n\n /** The (prepopulated) form definition the tower is currently driving. */\n readonly #definition = signal<FormInterface | undefined>(undefined);\n /** Tower-managed system inputs (financial cycle, current user, …). */\n readonly #systemInputs = signal<readonly FormColumnInputs[]>([]);\n /**\n * USER-OWNED values only (inputId-keyed). Derived inputs (calc/API/sourced)\n * are NEVER keys here — this replaces the old `_isInputValueOwnedByTower`\n * skip-logic structurally (Blueprint §2.1).\n */\n readonly #model = signal<Record<string, unknown>>({});\n /** True between {@link FormTowerControllerService.submitForm} starting and resolving/failing. */\n readonly #submittingForm = signal<boolean>(false);\n\n /**\n * Captured motivations for overridable (`canOverride === true`) validation\n * errors, keyed by the validator's id (the `control.errors` key). Writing this\n * signal re-drives the submission gate ({@link FormTowerControllerService.canSubmit})\n * so the continue button enables the moment every overridable error is motivated.\n */\n readonly #overrideReasons = signal<OverrideReasons>({});\n\n /**\n * Override motivations captured for MultipleInput **sub-rows** at row-save\n * time, keyed by `${inputId}::${rowId}`. A sub-row's inner inputs are\n * transient controls — they are removed from the form once the row is closed,\n * so their overridable-validation motivations cannot be re-derived from live\n * controls at submission time. They are recorded here on save and merged into\n * the submission payload, self-healing on submit (entries whose row no longer\n * exists in the parent array are dropped — covers row edit / delete).\n */\n readonly #rowOverrides = signal<Record<string, { inputId: string; rowId: string; entries: IFormValidationOverride[] }>>({});\n\n /**\n * Plain append-only change-history backing array. History is appended\n * IMPERATIVELY from `updateValue`/`initializeFormValues`/`revertBackHistory`\n * — NEVER from an effect (CLAUDE.md §7) (HAZARD 4 / Blueprint §2.5).\n */\n #changeHistoryArr: IFormChangeHistory[] = [];\n /** Readonly signal backing the {@link FormTowerControllerService.changeHistory} getter/setter. */\n readonly #changeHistory = signal<readonly IFormChangeHistory[]>([]);\n\n /** Live root `FormGroup` — the Material carrier (Blueprint §2.7). Built by `formGenerator`. */\n protected _mainForm: FormGroup | undefined;\n\n /** The values record last passed to {@link FormTowerControllerService.initializeFormValues}. */\n protected _initialFormValue: Record<string, any> = {}\n\n /**\n * Per-input derived signal graph, keyed `${inputId}:${functionType}`. The Map\n * IS the dependency graph — entries self-wire by reading `#model` / other\n * derived signals through `readDep`. Built once per `initialize` (Blueprint §2.2).\n */\n readonly #derived = new Map<string, DerivedEntry>();\n\n /** FormGroup-projection effect (signals → FormGroup). Created in `initialize`. */\n #formProjection: EffectRef | undefined;\n /** settled-gated `saveFormData` persist effect. Created in `initialize`. */\n #persistEffect: EffectRef | undefined;\n /**\n * Per-input re-validation effects for {@link FunctionTypes.ManualValueValidation}.\n * An Angular `ValidatorFn` only re-runs on its OWN control's value/validity\n * change, so a validator that observes OTHER inputs\n * (`inputsObservedForChanges`) would never re-evaluate when one of those\n * dependencies changes. Each effect reads the predicate's `readDep`\n * dependencies and re-triggers `updateValueAndValidity` so `control.errors`\n * tracks the signal graph. Destroyed in {@link FormTowerControllerService.clearFormState}.\n */\n #validationEffects: EffectRef[] = [];\n /**\n * Teardown callbacks for builder-created reactive primitives that are NOT\n * returned as part of a {@link DerivedEntry} — currently the per-input\n * missing-dependency diagnostic effects (see `missing-dependency-hint.ts`).\n * Registered via the `registerCleanup` channel on the builder context and\n * drained in {@link FormTowerControllerService.clearFormState} so they do not\n * leak across re-initialisations.\n */\n #derivedCleanups: Array<() => void> = [];\n /** Last persisted snapshot (structural dedupe key for {@link FormTowerControllerService.#persistEffect}). */\n #lastPersisted: Record<string, unknown> | undefined;\n\n /**\n * Live `valueChanges` subscriptions for the controls of an OPEN MultipleInput\n * sub-row, keyed by the MultipleInput's inputId.\n *\n * The inner sub-row inputs are rendered through `*ngComponentOutlet`, which\n * forwards inputs only and NEVER the `valueChange` output — so a sub-row edit\n * lands in the projected `FormGroup` (save works) but never reaches `#model`.\n * Any in-row function (calculation, value/options fetch, validator) that\n * depends on a sibling sub-row field would therefore never see the change and\n * never re-fire. {@link FormTowerControllerService.bindMultipleInputRowControls}\n * subscribes each sub-row control's `valueChanges` → `updateValue`, restoring\n * the same signal-graph reactivity the primary form gets via its explicit\n * `(valueChange)` binding. Torn down on close / re-open / re-init.\n */\n readonly #multipleInputRowSubs = new Map<string, Subscription>();\n\n /** Last reported submission state — drives the toolbar/spinner UI. */\n submittingStatus: FormSubmissionStatus | undefined\n\n // ──────────────────────────────────────────────────────────────────────────\n // W7 — Getters / setters re-pointed onto the source signals\n // ──────────────────────────────────────────────────────────────────────────\n\n /** True while a form submission is in flight. Counts toward {@link FormTowerControllerService.isBusy}. */\n get submittingForm(): boolean { return this.#submittingForm(); }\n set submittingForm(value: boolean) { this.#submittingForm.set(value); }\n\n // ──────────────────────────────────────────────────────────────────────────\n // Overridable-validation submission gate\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * The still-failing overridable (`canOverride === true`) validations on the\n * settled form, one per failing validator, each carrying the input's\n * `formControlName` / `label` and the validator message — the data the\n * override-reason UI renders a motivation prompt from.\n *\n * Reads the projected control tree, so it reflects the latest validity. When\n * there are blocking errors as well, those still prevent submission — see\n * {@link FormTowerControllerService.canSubmit}.\n */\n overridableErrors = (): OverridableError[] => partitionFormErrors(this).overridable;\n\n /**\n * `true` when at least one blocking (non-overridable) error remains on the\n * form. While this holds, submission is impossible regardless of motivations.\n */\n hasBlockingErrors = (): boolean => partitionFormErrors(this).blocking.length > 0;\n\n /**\n * Whether the form may be submitted: no blocking errors AND every overridable\n * error has a non-empty motivation. Replaces the blunt `mainForm.invalid`\n * submit gate — an overridable error with a reason no longer blocks.\n */\n canSubmit = (): boolean => canSubmitForm(this, this.#overrideReasons());\n\n /** The currently captured override motivations, keyed by validator id. */\n get overrideReasons(): OverrideReasons { return { ...this.#overrideReasons() }; }\n\n /**\n * Records (or updates) the motivation comment for one overridable validation.\n *\n * @param validatorId - The validator's id (the `control.errors` key).\n * @param comment - The user's motivation; an empty/whitespace value\n * re-locks submission for that error.\n */\n setOverrideComment = (validatorId: string, comment: string): void => {\n this.#overrideReasons.update((prev) => ({\n ...prev,\n [validatorId]: { ...prev[validatorId], comment },\n }));\n };\n\n /**\n * Attaches (or clears) a supporting file for one overridable validation.\n *\n * @param validatorId - The validator's id (the `control.errors` key).\n * @param attachment - The base64 {@link FileData}, or `undefined` to clear.\n */\n setOverrideAttachment = (validatorId: string, attachment: FileData | undefined): void => {\n this.#overrideReasons.update((prev) => ({\n ...prev,\n [validatorId]: { comment: prev[validatorId]?.comment ?? '', attachment },\n }));\n };\n\n /**\n * Drops the captured reasons for the given validator ids. Called once a\n * MultipleInput sub-row is saved — its motivations move from the live\n * reason map into {@link FormTowerControllerService.#rowOverrides}, and the\n * transient controls (and thus the live overridable errors) are removed.\n *\n * @param validatorIds - The validator ids whose live reasons to drop.\n */\n clearOverrideReasons = (validatorIds: readonly string[]): void => {\n if (validatorIds.length === 0) return;\n this.#overrideReasons.update((prev) => {\n const next = { ...prev };\n for (const id of validatorIds) delete next[id];\n return next;\n });\n };\n\n /**\n * Records (or clears) the captured override entries for one MultipleInput\n * sub-row. Replacing on every save keeps a re-edited row's motivations\n * current; passing an empty list removes the row's entry.\n *\n * @param inputId - The MultipleInput's id.\n * @param rowId - The sub-row's id (`${inputId}.id` value).\n * @param entries - The override entries captured for the row.\n */\n setRowOverrides = (inputId: string, rowId: string, entries: IFormValidationOverride[]): void => {\n const key = `${inputId}::${rowId}`;\n this.#rowOverrides.update((prev) => {\n const next = { ...prev };\n if (entries.length === 0) delete next[key];\n else next[key] = { inputId, rowId, entries };\n return next;\n });\n };\n\n /**\n * The sub-row override entries whose row still exists in its parent\n * MultipleInput array value. Stale entries (row edited away / deleted) are\n * dropped so a removed row never carries a phantom override to the backend.\n */\n #activeRowOverrides = (): IFormValidationOverride[] => {\n const stored = this.#rowOverrides();\n const out: IFormValidationOverride[] = [];\n for (const { inputId, rowId, entries } of Object.values(stored)) {\n const input = this.#inputById().get(inputId);\n if (!input?.sectionId) continue;\n const sectionGroup = this._mainForm?.get(input.sectionId) as FormGroup | null;\n const rows = sectionGroup?.get(inputId)?.value;\n const rowExists = Array.isArray(rows)\n && (rows as Array<Record<string, unknown>>).some((row) => row?.[`${inputId}.id`] === rowId);\n if (rowExists) out.push(...entries);\n }\n return out;\n };\n\n /**\n * Builds the override entries for the currently-open inner inputs of a\n * MultipleInput sub-row, pairing each overridable error with its captured\n * motivation. Returns the entries plus the validator ids consumed (so the\n * caller can move them out of the live reason map after the row is saved).\n *\n * @param inputId - The MultipleInput's id.\n * @param innerInputs - The sub-row's inner inputs (composite-id form inputs).\n * @returns The sub-row's override state: motivated `entries` ready to persist,\n * the `validatorIds` consumed, and the inner input ids that are blocking or\n * still unmotivated (for save-gate messaging).\n */\n collectRowOverrideState = (\n inputId: string,\n innerInputs: FormColumnInputs[],\n ): { entries: IFormValidationOverride[]; validatorIds: string[]; blockingInputIds: string[]; unmotivatedInputIds: string[] } => {\n const input = this.#inputById().get(inputId);\n const sectionGroup = input?.sectionId\n ? (this._mainForm?.get(input.sectionId) as FormGroup | null)\n : null;\n if (!sectionGroup) {\n return { entries: [], validatorIds: [], blockingInputIds: [], unmotivatedInputIds: [] };\n }\n // Use the literal-key controls map — `FormGroup.get('lines.note')` would\n // split on the dot and miss the composite sub-row control.\n const controls = innerInputs\n .map((inner) => ({ inputId: inner.id, control: sectionGroup.controls[inner.id] }))\n .filter((c): c is { inputId: string; control: NonNullable<typeof c.control> } => !!c.control);\n\n const { blocking, overridable } = partitionControlList(this, controls);\n const reasons = this.#overrideReasons();\n return {\n entries: reasonsToOverrides(overridable, reasons),\n validatorIds: overridable.map((e) => e.validatorId),\n blockingInputIds: [...new Set(blocking.map((b) => b.inputId))],\n unmotivatedInputIds: overridable\n .filter((e) => (reasons[e.validatorId]?.comment ?? '').trim().length === 0)\n .map((e) => e.inputId),\n };\n };\n\n /** The current form definition (post-{@link prepPopulateForm}). */\n public get form(): FormInterface | undefined { return this.#definition(); }\n set form(value: FormInterface | undefined) { this.#definition.set(value); }\n\n /** System inputs loaded by `loadSystemInputs`, prepended to {@link FormTowerControllerService.allFormInputs}. */\n get systemInputs(): FormColumnInputs[] { return [...this.#systemInputs()]; }\n set systemInputs(value: FormColumnInputs[]) { this.#systemInputs.set(value); }\n\n /** Live root `FormGroup` — `undefined` before {@link FormTowerControllerService.initialize}. */\n public get mainForm(): FormGroup | undefined { return this._mainForm; }\n\n /** Append-only change history; used by {@link FormTowerControllerService.revertBackHistory}. */\n get changeHistory(): IFormChangeHistory[] { return [...this.#changeHistory()]; }\n set changeHistory(value: IFormChangeHistory[]) {\n this.#changeHistoryArr = [...value];\n this.#changeHistory.set([...this.#changeHistoryArr]);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // W7 — Flat read-model (value computed) + cycle-safe readDep\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Merged, inputId-keyed form value: user `#model` overlaid with every derived\n * input's current value (computed value, sourced linkedSignal, resolved\n * resource). Cycle-safe — builders read dependencies via `readDep` (which\n * never reads `value()`), so the merge can read each derived entry directly\n * without forming a reactive cycle (Blueprint §2.3).\n */\n readonly #value: Signal<Record<string, unknown>> = computed(() => {\n const merged: Record<string, unknown> = { ...this.#model() };\n for (const [key, entry] of this.#derived) {\n const inputId = idOf(key);\n if (entry.kind === 'value') merged[inputId] = entry.signal();\n else if (entry.kind === 'sourced') merged[inputId] = entry.signal();\n else if (entry.kind === 'resource') {\n // Reading .value() on an ERRORED resource throws (Angular resource API).\n // An errored fetch contributes no value (matches the old\n // removeInputStatus-on-error skip); it must never break the value graph\n // (which feeds getFormValue/projection/persist/forceLiveness). isBusy is\n // unaffected — it reads status(), and 'error' ≠ 'loading'.\n try { merged[inputId] = entry.resource.value(); } catch { /* errored → no value */ }\n }\n // 'options' + 'validation' entries do not contribute a value.\n }\n return merged;\n });\n\n /**\n * Cycle-safe dependency reader handed to every builder. Resolves from `#model`\n * and `#derived` ONLY — never the merged {@link FormTowerControllerService.value}\n * computed — and returns `undefined` for the self-edge (Blueprint §2.3, HAZARD 5).\n *\n * @param selfId - The input that owns the builder requesting the read.\n * @param inputId - The dependency input to read.\n * @returns The dependency value, or `undefined` (self-edge / absent).\n */\n #readDep(selfId: string, inputId: string): unknown {\n if (inputId === selfId) return undefined;\n // A derived value/sourced/resource for inputId wins over the raw #model\n // entry (matches the value() merge precedence).\n for (const t of VALUE_PRODUCING_TYPES) {\n const entry = this.#derived.get(`${inputId}:${t}`);\n if (!entry) continue;\n if (entry.kind === 'value' || entry.kind === 'sourced') return entry.signal();\n // Reading .value() on an errored resource throws — treat as no value.\n if (entry.kind === 'resource') {\n try { return entry.resource.value(); } catch { return undefined; }\n }\n }\n return this.#model()[inputId];\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // W7 — Busy / settled computeds (resource-activation contract, Blueprint §2.4)\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Busy iff a submission is in flight OR any value/options resource is\n * `'loading'`. Reading every resource's `status()` here is what ACTIVATES the\n * lazy resources — workers MUST NOT short-circuit before iterating\n * (resource-activation contract, Blueprint §2.4 / HAZARD 2).\n */\n protected readonly isBusyComputed = computed<boolean>(() => {\n const submitting = this.#submittingForm();\n let anyPending = false;\n for (const entry of this.#derived.values()) {\n if (entry.kind === 'resource' || entry.kind === 'options') {\n // Always read status() (do NOT short-circuit) so the resource activates.\n if (entry.resource.status() === 'loading') anyPending = true;\n }\n }\n return submitting || anyPending;\n });\n\n /** Strict complement of {@link FormTowerControllerService.isBusyComputed}. */\n protected readonly settled = computed<boolean>(() => !this.isBusyComputed());\n\n /**\n * Reactive busy stream. Declared as a field initializer AFTER\n * {@link FormTowerControllerService.isBusyComputed} so the textual ordering of\n * field initialization (which runs during construction, in injection context)\n * guarantees `isBusyComputed` exists when `toObservable` reads it. It therefore\n * does NOT need `runInInjectionContext` (HAZARD 1 applies only to primitives\n * created inside `initialize()`, after construction).\n */\n readonly #isBusy$: Observable<boolean> = toObservable(this.isBusyComputed, { injector: this.#injector });\n /** Keeps {@link FormTowerControllerService.#isBusy$} hot so its computed stays live (resource-activation). */\n #isBusySub: Subscription = this.#isBusy$.subscribe();\n\n /** Synchronous snapshot of the busy state. */\n get isBusy(): boolean { return this.isBusyComputed(); }\n\n /**\n * Reactive stream of the tower's busy state. Emits `true` while any\n * calculation/API/validation is in flight or the form is submitting, `false`\n * once everything settles. Backed by `toObservable(isBusy)`.\n */\n get isBusy$(): Observable<boolean> { return this.#isBusy$; }\n\n // ──────────────────────────────────────────────────────────────────────────\n // W13 — waitUntilSettled (timeout + never-reject + lead-read)\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Resolves once the tower has finished all in-flight async work (calculations,\n * API fetches, sourced values). Used by headless consumers (import).\n *\n * **Contract (Blueprint §5 / §6, never changes):**\n * - Performs a one-tick liveness lead-read FIRST (reads `value()` + every\n * resource `status()` + flushes effects) so lazy resources start even when\n * no template reads them (HAZARD 2).\n * - Waits for the first `settled() === true` emission.\n * - On `timeoutMs` it resolves with `undefined` — it NEVER rejects and NEVER\n * hangs (`timeout` + `defaultIfEmpty`-equivalent via `catchError`).\n *\n * @param debounceMs - Accepted for signature parity; the signal graph needs no\n * debounce, so it is treated as a no-op lead time.\n * @param timeoutMs - Hard timeout before resolving with `undefined` (default 30s).\n * @returns A promise that always resolves (with `void`).\n */\n waitUntilSettled(debounceMs = 600, timeoutMs = 30_000): Promise<void> {\n void debounceMs;\n // One-tick liveness lead-read: force-activate resources + flush effects.\n this.#forceLiveness();\n return firstValueFrom(\n toObservable(this.settled, { injector: this.#injector }).pipe(\n filter((isSettled) => isSettled === true),\n take(1),\n timeout(timeoutMs),\n catchError(() => of(undefined)),\n tap(() => undefined),\n ),\n ).then(() => undefined);\n }\n\n /**\n * Forces the signal graph live: reads `value()` and every resource `status()`\n * in a reactive-free read, then flushes the effect scheduler so resources\n * transition `idle → loading`. Belt-and-braces for the headless import path\n * (Blueprint §2.7 liveness lead-read / HAZARD 2).\n */\n #forceLiveness(): void {\n // Reading #value() pulls every value/resource entry; explicitly read options\n // resource status too (options do not contribute to #value()).\n void this.#value();\n for (const entry of this.#derived.values()) {\n if (entry.kind === 'resource' || entry.kind === 'options') {\n void entry.resource.status();\n }\n }\n // Also read isBusy so its toObservable subscriber re-evaluates.\n void this.isBusyComputed();\n try {\n this.#appRef.tick();\n } catch {\n /* tick may be unavailable in some headless harnesses — lead-read above still activates */\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Tears the tower down. Fires `_destroyed$`, runs\n * {@link FormTowerControllerService.clearFormState} (which destroys resources\n * + effects), completes the `isBusy$` subscription, and clears pending\n * hint/error timers (HAZARD 7 / Blueprint §2.8).\n */\n ngOnDestroy(): void {\n this._destroyed$.next();\n this._destroyed$.complete();\n this.clearFormState();\n this.#isBusySub?.unsubscribe();\n Object.values(this._hintTimeoutIds).forEach(timeout => clearTimeout(timeout));\n this._hintTimeoutIds = {};\n Object.values(this._errorTimeoutIds).forEach(timeout => clearTimeout(timeout));\n this._errorTimeoutIds = {};\n }\n\n /**\n * Boots the tower against a form definition.\n *\n * Performs, in order:\n * 1. {@link FormTowerControllerService.clearFormState} — wipe prior state +\n * destroy any prior resources/effects.\n * 2. {@link prepPopulateForm} — merge `_initialFormValue` into the columns.\n * 3. {@link loadSystemInputs} — load financial cycle, current user, etc.\n * 4. {@link formGenerator} — build the nested `FormGroup` carrier.\n * 5. Re-open any `MultipleInput` that was open before re-init.\n * 6. Build the `#derived` signal graph + wire the projection/persist effects\n * — ALL inside `runInInjectionContext(this.#injector, …)` (HAZARD 1).\n *\n * @param form - The form definition to drive.\n * @param options - Optional behaviour flags.\n * @param options.skipInitialFunctions - **Documented no-op (parity).** The\n * old engine used this to suppress a premature change-monitor cycle in the\n * headless import path. The signal graph has no such race (resources fire\n * lazily once read; the liveness lead-read in\n * {@link FormTowerControllerService.initializeFormValues} +\n * {@link FormTowerControllerService.waitUntilSettled} activates them), so\n * the flag is accepted for signature parity and otherwise ignored.\n */\n initialize = async (form: FormInterface, options?: { skipInitialFunctions?: boolean }) => {\n void options?.skipInitialFunctions; // documented no-op (parity) — see TSDoc.\n\n // 1. Clean prior state (also destroys prior resources/effects).\n this.clearFormState();\n\n // 2/3. Prepopulate + system inputs.\n this.#definition.set({ ...(prepPopulateForm(form, this._initialFormValue)) });\n await loadSystemInputs(this);\n this.setFirstStepAsActive();\n\n // 4. Build the FormGroup carrier.\n const inputs = this.allFormInputs() || [];\n this._mainForm = formGenerator(inputs, this.getFormValue.bind(this));\n\n // 5. Re-open any MultipleInput that was open before re-initialization.\n inputs\n .filter(input => input.element === ElementTypes.MultipleInput && (input as { formIsOpen?: boolean }).formIsOpen === true)\n .forEach(input => toggleMultipleInput(this, this._mainForm, input.id, true));\n\n // 6. Build the signal graph + wire effects — all in injection context (HAZARD 1).\n runInInjectionContext(this.#injector, () => {\n for (const input of inputs) {\n if (input.element === ElementTypes.SectionTitle) continue;\n this.#buildDerivedForInput(input);\n }\n this.#wireProjectionEffect();\n this.#wirePersistEffect();\n });\n\n // 7. Seed `#model` from the prepopulated definition so authored initial\n // values (`column.value`) are visible to the signal graph — not just to\n // the projected FormControl. Without this, an input whose dependency's\n // value is authored in the form definition (rather than typed by the\n // user or passed via initializeFormValues) leaves the dependency absent\n // from `#model`, so the dependent's `params` stays `undefined` → the\n // resource sits `idle` and never fires (and `refresh`/`.reload()` no-ops\n // on an idle resource) until the user manually edits the dependency.\n this.#seedModelFromDefinition();\n }\n\n /**\n * Seeds `#model` with the prepopulated initial values carried on the form\n * definition's columns (`column.value`, already merged with any external\n * `_initialFormValue` by {@link prepPopulateForm}), so the signal graph sees\n * authored defaults on init — mirroring how `formGenerator` seeds the\n * projected `FormControl`s.\n *\n * Skips inputs the signal graph (not `#model`) owns or that are handled\n * elsewhere:\n * - **Derived** inputs (calc / value-API / sourced) — the derived entry owns\n * the value; writing `#model` would break the structural skip invariant\n * (§2.1) and shadow the resource result.\n * - **SectionTitle** — no value.\n * - **MultipleInput** / **DateRangePicker** — compound/array shapes handled by\n * their dedicated flows + `initializeFormValues` (Phase 2 fence).\n * - **MultipleInput sub-row inputs** (`multipleInputInEditId`).\n *\n * Ends with the liveness lead-read (§2.7) so any dependent resource whose\n * mapped dependency is now satisfied flips `idle → loading` and fires.\n */\n #seedModelFromDefinition(): void {\n const inputs = this.allFormInputs();\n if (!inputs.length) {\n this.#forceLiveness();\n return;\n }\n const seed: Record<string, unknown> = {};\n for (const input of inputs) {\n if (\n input.element === ElementTypes.SectionTitle ||\n input.element === ElementTypes.MultipleInput ||\n input.element === ElementTypes.DateRangePicker ||\n input.multipleInputInEditId\n ) {\n continue;\n }\n if (this.#isInputDerived(input.id)) continue;\n const value = (input as { value?: unknown }).value;\n if (value === undefined || value === null || value === '') continue;\n seed[input.id] = value;\n }\n if (Object.keys(seed).length > 0) {\n this.#model.update((m) => ({ ...m, ...seed }));\n }\n // Activate lazy resources so dependents with now-satisfied deps fire (§2.7).\n this.#forceLiveness();\n }\n\n /**\n * Marks the form's first slide as active. Called during\n * {@link FormTowerControllerService.initialize}.\n */\n setFirstStepAsActive = () => {\n const firstStep = this.selectFormSteps()?.[0];\n if (!firstStep) return;\n this.setSectionAsActive(firstStep.sectionId);\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // W8 — Dispatcher: build the #derived signal graph per input\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Builds + stores every `#derived` entry for an input, one per\n * {@link FunctionTypes} that `getAllFunctionTypes` reports true. Replaces the\n * old `getFunctionByType` + `createInputFunctionsCollection`. MUST be called\n * inside `runInInjectionContext(this.#injector, …)` (it creates\n * resources/computeds/linkedSignals/effects) — HAZARD 1.\n *\n * @param input - The column-input config to wire into the signal graph.\n */\n #buildDerivedForInput(input: FormColumnInputs): void {\n const types = getAllFunctionTypes(input);\n const ctx: DerivedBuildContext = {\n readDep: (depId: string) => this.#readDep(input.id, depId),\n utils: this.#buildUtils(),\n injector: this.#injector,\n // Label lookup is `untracked` so a diagnostic effect that names missing\n // dependencies does not take a reactive dependency on the definition —\n // otherwise the hint-write (which patches the definition) would re-trigger it.\n describeDep: (depId: string) => {\n const dep = untracked(() => this.#inputById().get(depId));\n const label = dep?.label?.trim();\n return label && label.length > 0 ? label : depId;\n },\n registerCleanup: (teardown: () => void) => { this.#derivedCleanups.push(teardown); },\n };\n const set = (t: FunctionTypes, entry: DerivedEntry): void => {\n this.#derived.set(`${input.id}:${t}`, entry);\n };\n\n if (types[FunctionTypes.ValueCalculation]) {\n set(FunctionTypes.ValueCalculation, buildValueCalculation(input, ctx));\n }\n if (types[FunctionTypes.InputSourcedValue]) {\n set(FunctionTypes.InputSourcedValue, buildInputSourcedValue(input, ctx));\n }\n if (types[FunctionTypes.ValueGetMethodAPI]) {\n set(FunctionTypes.ValueGetMethodAPI, buildValueApiResource(input, ctx));\n }\n if (types[FunctionTypes.ValuePostMethodAPIWithAllDefaultParams]) {\n set(FunctionTypes.ValuePostMethodAPIWithAllDefaultParams, buildValueApiResource(input, ctx));\n } else if (types[FunctionTypes.ValuePostMethodAPI]) {\n // Only build one value-POST resource (the all-defaults flag is a subtype).\n set(FunctionTypes.ValuePostMethodAPI, buildValueApiResource(input, ctx));\n }\n if (types[FunctionTypes.OptionsGetMethodAPI]) {\n set(FunctionTypes.OptionsGetMethodAPI, buildOptionsApiResource(input, ctx));\n }\n if (types[FunctionTypes.OptionsPostMethodAPIWithAllDefaultParams]) {\n set(FunctionTypes.OptionsPostMethodAPIWithAllDefaultParams, buildOptionsApiResource(input, ctx));\n } else if (types[FunctionTypes.OptionsPostMethodAPI]) {\n set(FunctionTypes.OptionsPostMethodAPI, buildOptionsApiResource(input, ctx));\n }\n if (types[FunctionTypes.ManualValueValidation]) {\n set(FunctionTypes.ManualValueValidation, buildManualValidation(input, ctx));\n }\n }\n\n /** Builds the {@link IFunctionUtils} bag handed to every builder + status helper. */\n #buildUtils(): IFunctionUtils {\n return {\n setTemporaryHint: this.setTemporaryHint.bind(this),\n updateValue: this.updateValue.bind(this),\n httpPostDataFunction: this.httpPostDataFunction.bind(this),\n setInputTemporaryError: this.setInputTemporaryError.bind(this),\n httpGetDataFunction: this.httpGetDataFunction.bind(this),\n updateFormInputConfig: this.updateFormInputConfig.bind(this),\n setInputStatus: this.setInputStatus.bind(this),\n removeInputStatus: this.removeInputStatus.bind(this),\n fileUpload: this.NGX_T_FORMS_CONFIG.formBuilder.fileUpload.bind(this),\n };\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // W11 — FormGroup projection effect (signals → FormGroup, zero signal writes)\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Wires the projection effect: whenever {@link FormTowerControllerService.value}\n * changes, patch the matching `FormControl`s with `{ emitEvent: false }`. The\n * effect performs ZERO signal writes (Blueprint §2.7 POST-PHASE-1 INVARIANT).\n * Also attaches the ManualValueValidation predicates as `ValidatorFn`s.\n */\n #wireProjectionEffect(): void {\n this.#attachValidators();\n this.#formProjection = effect(() => {\n const v = this.#value();\n const main = this._mainForm;\n if (!main) return;\n for (const [inputId, val] of Object.entries(v)) {\n this.#projectControl(inputId, val);\n }\n });\n }\n\n /**\n * Phase-3 seam: the SOLE place that writes the projected `FormGroup`. Patches\n * the control for `inputId` with `{ emitEvent: false }` so no `valueChanges`\n * feedback loop forms. Phase 3 swaps this for `form(model, schema)`.\n *\n * @param inputId - The input whose control to patch.\n * @param val - The signal-graph value to project.\n */\n #projectControl(inputId: string, val: unknown): void {\n const main = this._mainForm;\n const form = this.form;\n if (!main || !form) return;\n const input = this.#inputById().get(inputId);\n if (!input || !input.sectionId) return;\n const control = getSectionControl(main, input.sectionId, inputId);\n if (!control) return;\n if (!_isEqual(control.value, val)) {\n control.setValue(val, { emitEvent: false });\n }\n }\n\n /**\n * Attaches each ManualValueValidation predicate as an Angular `ValidatorFn` on\n * its projected control (Phase-3 seam — W6 builder returns a plain predicate;\n * only this adapter couples to `@angular/forms`).\n */\n #attachValidators(): void {\n const main = this._mainForm;\n if (!main) return;\n for (const [key, entry] of this.#derived) {\n if (entry.kind !== 'validation') continue;\n const inputId = idOf(key);\n const input = this.#inputById().get(inputId);\n if (!input || !input.sectionId) continue;\n const control = getSectionControl(main, input.sectionId, inputId);\n if (!control) continue;\n const validatorFn: ValidatorFn = (_control: AbstractControl): ValidationErrors | null =>\n entry.errorFn() as ValidationErrors | null;\n control.addValidators(validatorFn);\n control.updateValueAndValidity({ emitEvent: false });\n\n // Re-validate when an OBSERVED dependency changes. A ValidatorFn is not a\n // reactive consumer — Angular only re-runs it on this control's own\n // value/validity change. This effect reads the predicate's `readDep`\n // dependencies (by evaluating `errorFn()`), so it re-runs whenever any\n // `inputsObservedForChanges` input changes, then forces the control to\n // re-validate. `updateValueAndValidity` writes no signal (only control\n // state) and `{ emitEvent: false }` avoids a valueChanges feedback loop,\n // so there is no reactive cycle.\n const revalidate = effect(() => {\n entry.errorFn();\n control.updateValueAndValidity({ emitEvent: false });\n });\n this.#validationEffects.push(revalidate);\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // W12 — saveFormData persist effect (settled-gated + structural dedupe, D1-A)\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Wires the persist effect (Decision D1-A): on every settled, quiescent change\n * it calls `saveFormData(formId, getFormValueNames())` ONCE per distinct\n * settled value (structural dedupe via `_isEqual`). `saveFormData` is an\n * external sink — allowed inside `effect()` — and this effect performs ZERO\n * signal writes (history is appended imperatively elsewhere; Blueprint §5 / §2.5).\n */\n #wirePersistEffect(): void {\n this.#persistEffect = effect(() => {\n // Gate on settled() FIRST so non-quiescent ticks skip the (non-trivial)\n // value build. Dependency note: getFormValueNames() reads `this.form`\n // (#definition signal), which #appendHistory re-stamps on every\n // updateValue — that is what re-runs this effect on a user edit. On a\n // non-settled tick we return before reading it, but the next settled run\n // re-reads #definition and re-establishes the dependency, so no settled\n // change is ever missed (Decision D1-A).\n if (!this.settled()) return; // persist ONLY when quiescent\n const names = this.getFormValueNames();\n if (this.#lastPersisted && _isEqual(names, this.#lastPersisted)) return;\n this.#lastPersisted = names;\n this.NGX_T_FORMS_CONFIG.formBuilder.saveFormData(this.form?.formId, names);\n });\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // Value / input management\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Returns the form's settled values keyed by **formControlName** (the\n * canonical external shape). Reads {@link FormTowerControllerService.value}.\n */\n getFormValueNames = (): Record<string, any> => getFormValueAsFormControlBasedObject(this)\n\n /**\n * Memoized flatten of system inputs + the definition's inputs. A `computed`\n * (over `#systemInputs` + `#definition`) so the hot projection/validator paths\n * don't re-flatten the whole definition tree on every call.\n */\n readonly #allInputsMemo: Signal<FormColumnInputs[]> = computed(() => [...this.systemInputs, ...(allFormInputs(this.form!) ?? [])]);\n\n /**\n * All form inputs that participate in the form, including system inputs.\n * Returns a fresh outer array each call (preserves the prior contract that\n * callers may mutate the returned array), but the expensive flatten beneath it\n * is memoized by {@link FormTowerControllerService.#allInputsMemo}.\n */\n readonly allFormInputs = (): FormColumnInputs[] => [...this.#allInputsMemo()];\n\n /**\n * `inputId → input` index over {@link FormTowerControllerService.allFormInputs},\n * memoized as a `computed`. Replaces the per-iteration `Array.find` in\n * `#projectControl`/`#attachValidators` (O(n²) → O(n) per projection pass).\n * Rebuilds automatically when the definition/system inputs change.\n */\n readonly #inputById: Signal<Map<string, FormColumnInputs>> = computed(() => {\n const index = new Map<string, FormColumnInputs>();\n for (const input of this.#allInputsMemo()) index.set(input.id, input);\n return index;\n });\n\n /** @deprecated unused field, kept for backwards compatibility. */\n prevValue: any;\n\n /**\n * Mark a logical operation in flight for DOM badge rendering. Phase 1: no\n * longer affects {@link FormTowerControllerService.isBusy} (busy is\n * resource-derived) — forwards to the DOM-status helper only.\n */\n setInputStatus = (inputId: string, statusId: string, status: string) => {\n setInputStatus(this, inputId, statusId, status);\n }\n /** Companion to {@link FormTowerControllerService.setInputStatus} — clears the DOM badge. */\n removeInputStatus = (inputId: string, statusId: string) => {\n removeInputStatus(this, inputId, statusId);\n }\n\n /**\n * Programmatic write to a form input.\n *\n * - **Sourced inputs** (InputSourcedValue) → routes to the entry's writable\n * `linkedSignal.set(value)` (transient override; reset on next source change).\n * - **All other inputs** → writes `#model[inputId]`.\n *\n * Appends the change to history IMPERATIVELY (HAZARD 4). The projection effect\n * patches the FormControl from the signal graph — this does NOT touch the\n * FormGroup directly (no `valueChanges` feedback loop).\n *\n * @param inputId - The input to write.\n * @param value - The new value.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I-1 parity-frozen signature.\n updateValue = (inputId: string, value: any): void => {\n const sourced = this.#derived.get(`${inputId}:${FunctionTypes.InputSourcedValue}`);\n if (sourced && sourced.kind === 'sourced') {\n sourced.signal.set(value);\n } else {\n this.#model.update(m => ({ ...m, [inputId]: value }));\n }\n this.#appendHistory({ [inputId]: value });\n };\n\n /**\n * Apply an external values record onto the form (user prefill / import row).\n *\n * Per input:\n * - **Tower-owned non-MultipleInput** (calc/API/sourced) → SKIP structurally\n * (it never enters `#model`; the derived signal/resource owns the value).\n * - **MultipleInput** → ALWAYS apply the row array (its rows are user-authored\n * source data). The array-remap branch is UNCHANGED (Phase 2 fence).\n * - **Everything else** → write `#model` from the dotted-path or top-level value.\n *\n * Ends with a liveness lead-read so lazy resources start even in the headless\n * import path (no template reader) — HAZARD 2 / Blueprint §2.7.\n *\n * @param initialValues - The external values record (formControlName-keyed).\n */\n initializeFormValues = (initialValues: Record<string, any>): void => {\n this._initialFormValue = initialValues;\n if (this._mainForm === undefined) return;\n const allInputs = this.allFormInputs();\n if (!allInputs) return;\n\n const applyValue = (inputId: string, v: unknown): void => {\n try {\n this.updateValue(inputId, v);\n } catch {\n /* skip fields that cannot be bound (schema drift, nested edge cases) */\n }\n };\n\n for (const input of allInputs) {\n if (input.element === ElementTypes.SectionTitle || input.multipleInputInEditId) continue;\n\n // Tower-owned (derived) values: skip — the signal graph owns them.\n // Exception: MultipleInput rows are user-authored source data.\n if (input.element !== ElementTypes.MultipleInput && this.#isInputDerived(input.id)) {\n continue;\n }\n\n if (!input.formControlName) continue;\n\n const fromPath = safeReturnDeepProperty(initialValues, input.formControlName.split('.')).value;\n const value = fromPath ?? initialValues[input.formControlName];\n const isMultipleInput = input.element === ElementTypes.MultipleInput;\n\n if (value !== undefined && !isMultipleInput) {\n applyValue(input.id, value);\n continue;\n }\n if (isMultipleInput) {\n // ── Phase 2 fence: MultipleInput array-remap branch — UNCHANGED. ──\n const v = (value ?? []).map((item: any) => {\n return Object.entries(item).reduce((acc, [key, val]) => {\n const inp = allInputs.find((i) => i.formControlName === key);\n if (key === 'id') {\n acc[`${input.id}.id`] = val;\n } else {\n acc[`${inp?.id}`] = val;\n }\n return acc;\n }, {} as any);\n });\n v[`${input.id}.id`] = initialValues[input.id];\n applyValue(input.id, v);\n continue;\n }\n // Missing + not tower-owned → leave the existing value alone.\n }\n\n // Liveness lead-read (HAZARD 2): activate lazy resources for the headless path.\n this.#forceLiveness();\n }\n\n /** True iff `inputId` owns a derived (value-producing) `#derived` entry — replaces `_isInputValueOwnedByTower`. */\n #isInputDerived(inputId: string): boolean {\n for (const t of VALUE_PRODUCING_TYPES) {\n if (this.#derived.has(`${inputId}:${t}`)) return true;\n }\n return false;\n }\n\n /**\n * Snapshot of the inputId-keyed flat form value. Re-points to the merged\n * {@link FormTowerControllerService.value} computed (was the old `_formValue`).\n * Passed to legacy helpers (refresh) that expect a `() => Record` accessor.\n */\n getFormValue = (): Record<string, any> => this.#value();\n\n /**\n * Append a change snapshot to the history IMPERATIVELY (HAZARD 4 / Blueprint §2.5).\n *\n * Reproduces the pure `updateChangeHistory` semantics verbatim — append capped\n * at 20 entries and stamp `valueUpdatedAt` on every changed column — operating\n * directly on the `#private` backing array + definition signal (the legacy\n * helper mutated `self.changeHistory` + `self.form`, which we cannot expose to\n * it without leaking private state). Then mirrors the plain array into the\n * readonly `#changeHistory` signal so the public getter reflects the change.\n *\n * @param changes - The inputId-keyed change record to record.\n */\n #appendHistory(changes: Record<string, unknown>): void {\n if (Object.keys(changes).length === 0) return;\n if (this.#changeHistoryArr.length >= 20) this.#changeHistoryArr.shift();\n this.#changeHistoryArr.push({ date: new Date(), changes, id: this.#uuid() });\n this.#changeHistory.set([...this.#changeHistoryArr]);\n\n // Stamp valueUpdatedAt on changed columns (parity with updateChangeHistory).\n const def = this.#definition();\n if (!def) return;\n const changedIds = Object.keys(changes);\n this.#definition.set({\n ...def,\n slides: def.slides.map(slide => ({\n ...slide,\n columns: slide.columns.map(column => ({\n ...column,\n valueUpdatedAt: changedIds.includes(column.id) ? new Date() : column.valueUpdatedAt,\n })),\n })),\n });\n }\n\n /** UUID v4 generator (crypto when available, deterministic-shape fallback otherwise). */\n #uuid(): string {\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (c?.randomUUID) return c.randomUUID();\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, ch => {\n const r = (Math.random() * 16) | 0;\n const v = ch === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n /**\n * Resets all internal state — definition, FormGroup, signal graph (resources +\n * effects destroyed), busy/model/history — so the tower can be re-initialized.\n * Called at the start of {@link FormTowerControllerService.initialize} and from\n * {@link FormTowerControllerService.ngOnDestroy}.\n *\n * Explicitly `.destroy()`s every `ResourceRef` and the projection/persist\n * effects (HAZARD 7 / Blueprint §2.8 — per-row import towers are torn down by\n * manual `ngOnDestroy`, not injector destruction).\n */\n clearFormState = (): void => {\n // Destroy effects first so they stop reacting while we tear resources down.\n this.#formProjection?.destroy();\n this.#formProjection = undefined;\n this.#persistEffect?.destroy();\n this.#persistEffect = undefined;\n for (const e of this.#validationEffects) {\n try { e.destroy(); } catch { /* best-effort */ }\n }\n this.#validationEffects = [];\n // Drain builder-registered teardowns (missing-dependency diagnostic effects).\n for (const teardown of this.#derivedCleanups) {\n try { teardown(); } catch { /* best-effort */ }\n }\n this.#derivedCleanups = [];\n // Destroy every resource.\n for (const entry of this.#derived.values()) {\n if (entry.kind === 'resource' || entry.kind === 'options') {\n try { entry.resource.destroy(); } catch { /* best-effort */ }\n }\n }\n this.#derived.clear();\n // Drop any live MultipleInput sub-row valueChanges bridges (the takeUntil\n // anchor below also completes their inner subs; this clears the registry).\n for (const sub of this.#multipleInputRowSubs.values()) {\n try { sub.unsubscribe(); } catch { /* best-effort */ }\n }\n this.#multipleInputRowSubs.clear();\n\n this.#definition.set(undefined);\n this._mainForm = undefined;\n this.#model.set({});\n this.#submittingForm.set(false);\n this.#overrideReasons.set({});\n this.#rowOverrides.set({});\n this.#lastPersisted = undefined;\n this._destroyed$.next();\n };\n\n // ──────────────────────────────────────────────────────────────────────────\n // Status / feedback (DOM badges + hints — no busy-set bookkeeping)\n // ──────────────────────────────────────────────────────────────────────────\n\n _hintTimeoutIds: Record<string, any> = {};\n setTemporaryHint = (inputId: string, hint: string, type: HintType): void => setTemporaryHint(this, inputId, hint, type);\n\n _onFormInputConfigChange?: (inputId: string, config: FormColumnInputs) => void;\n registerFormInputConfigChangeFn = (fn: (inputId: string, config: FormColumnInputs) => void) => this._onFormInputConfigChange = fn;\n\n httpPostDataFunction = (url: string, data: any, options: any) => this.NGX_T_FORMS_CONFIG.formBuilder.httpPostDataFunction(url, data, options) || this._http.post(url, data);\n httpGetDataFunction = (url: string, options: any) => this.NGX_T_FORMS_CONFIG.formBuilder.httpGetDataFunction(url, options) || this._http.get(url);\n _errorTimeoutIds: Record<string, any> = {};\n setInputTemporaryError = (inputId: string, message: string) => setInputTemporaryError(this, inputId, message);\n setInputError = (err: Record<string, any>, inputId: string) => setInputError(this, err, inputId);\n updateFormInputConfig = (inputId: string, config: FormColumnInputs) => updateFormInputConfig(this, inputId, config);\n handleStepChange = (event: StepperSelectionEvent) => handleStepChange(this, event);\n selectFormSteps = () => selectFormSteps(this);\n selectAllFormTours = () => selectAllFormTours(this);\n setSectionAsSeen = (sectionId: string) => setSectionAsSeen(this, sectionId);\n setSectionAsActive = (sectionId: string) => setSectionAsActive(this, sectionId);\n setInputAsTouchedAndDirty = (inputId: string) => setInputAsTouchedAndDirty(this, inputId);\n formProgress = () => formProgress(this);\n formSubmissionMessage = () => formSubmissionMessage(this);\n setSubmissionStatusValue = (status: FormSubmissionStatus) => this.submittingStatus = status;\n\n // ──────────────────────────────────────────────────────────────────────────\n // D3 — inputFunctionsCollection adapter (legacy Observable-shaped registry)\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Legacy-shaped per-input function registry, reconstructed from `#derived`\n * (Decision D3). Each present `(inputId, functionType)` maps to an\n * `Observable<void>` that, on subscription, drives the underlying primitive:\n * - resource/options entries → `.reload()` then complete when status leaves\n * `'loading'`;\n * - value/sourced/validation entries → a synchronous read then complete.\n *\n * Kept so `refreshInputWithDependencies` / `refreshInput` /\n * `runMultipleInputPrepopulationFunctions` / `getTopologicalExecutionOrder`\n * compile + behave unchanged. The return TYPE is unchanged (api:check parity).\n */\n get inputFunctionsCollection(): Record<string, Partial<Record<FunctionTypes, Observable<void>>>> {\n const out: Record<string, Partial<Record<FunctionTypes, Observable<void>>>> = {};\n for (const [key, entry] of this.#derived) {\n const inputId = idOf(key);\n const t = key.slice(key.indexOf(':') + 1) as FunctionTypes;\n if (entry.kind === 'validation') continue; // not a refreshable \"function\"\n (out[inputId] ??= {})[t] = this.#entryToObservable(entry);\n }\n return out;\n }\n\n /**\n * Adapts a single `#derived` entry to the legacy `Observable<void>` shape used\n * by the refresh family. For resources this triggers `.reload()` and completes\n * once the resource leaves `'loading'`.\n *\n * @param entry - The derived entry to adapt.\n * @returns An `Observable<void>` that performs + completes the entry's work.\n */\n #entryToObservable(entry: DerivedEntry): Observable<void> {\n if (entry.kind === 'resource' || entry.kind === 'options') {\n const ref = entry.resource;\n return new Observable<void>(observer => {\n try {\n ref.reload();\n } catch {\n observer.next(); observer.complete(); return;\n }\n // Complete when status leaves 'loading'; poll via toObservable.\n runInInjectionContext(this.#injector, () => {\n const sub = toObservable(ref.status, { injector: this.#injector }).pipe(\n filter(s => s !== 'loading'),\n take(1),\n ).subscribe({\n next: () => { observer.next(); observer.complete(); },\n error: () => { observer.next(); observer.complete(); },\n });\n return () => sub.unsubscribe();\n });\n });\n }\n // value / sourced: reading the signal is the work; complete immediately.\n return new Observable<void>(observer => {\n try {\n if (entry.kind === 'value' || entry.kind === 'sourced') void entry.signal();\n } catch { /* ignore */ }\n observer.next();\n observer.complete();\n });\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // Submission\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Submits the form to the configured backend pipeline. Builds a payload by\n * un-flattening the settled values, delegates to {@link formHttpSubmissions},\n * and reports status. Errors surface as `FormSubmissionStatus.FAILED` — they\n * do not throw to the caller.\n *\n * @param passData - Extra context handed through to the submission pipeline.\n */\n submitForm = (passData: Record<string, any>) => {\n try {\n if (!this.form) return;\n // Honour the overridable-validation gate: a blocking error, or an\n // overridable error without a motivation, must never reach submission even\n // if a caller invokes this directly (the UI button is also disabled).\n if (!this.canSubmit()) return;\n const valueAsFormControlNames = this.getFormValueNames();\n const transformedForm = unFlattenFormValue(valueAsFormControlNames);\n\n // Attach the captured override motivations so the bypass is durable and\n // auditable. Each attachment is a FileData node, so the submission upload\n // pass resolves it to a `{ url }` like any other file input value.\n // Form-level (live) overrides + sub-row overrides captured at row-save\n // time (the latter self-healed against rows that still exist).\n const validationOverrides = [\n ...buildValidationOverrides(this, this.#overrideReasons()),\n ...this.#activeRowOverrides(),\n ];\n const payload = validationOverrides.length > 0\n ? { ...transformedForm, [VALIDATION_OVERRIDES_KEY]: validationOverrides }\n : transformedForm;\n\n const utils: InClassFormUtilsInterface = {\n fileUpload: this.NGX_T_FORMS_CONFIG.formBuilder.fileUpload.bind(this),\n httpGetDataFunction: this.httpGetDataFunction.bind(this),\n httpPostDataFunction: this.httpPostDataFunction.bind(this),\n setSubmissionStatusValue: this.setSubmissionStatusValue.bind(this),\n submitForm: function (): Observable<void> {\n throw new Error('Function not implemented.');\n },\n saveFormData: () => this.NGX_T_FORMS_CONFIG.formBuilder.saveFormData(this.form?.formId, this.getFormValueNames()),\n runPipeLine: this.NGX_T_FORMS_CONFIG.formBuilder.runMongoDbPipeLine.bind(this),\n getUserSignature: this.NGX_T_FORMS_CONFIG.formBuilder.getUserSignature.bind(this),\n saveUserSignature: this.NGX_T_FORMS_CONFIG.formBuilder.saveUserSignature.bind(this),\n }\n if (utils.httpGetDataFunction === undefined || utils.httpPostDataFunction === undefined) {\n this.NGX_T_FORMS_CONFIG.formBuilder.toastError(\"Http functions not defined\")\n return\n }\n formHttpSubmissions(this.form!, payload, passData, utils).pipe(\n take(1),\n takeUntil(this._destroyed$),\n tap(() => {\n this.setSubmissionStatusValue(FormSubmissionStatus.SUBMITTING);\n this.submittingForm = false;\n this.NGX_T_FORMS_CONFIG.formBuilder.formSubmittedSuccessfully(this.form?.formId);\n }),\n catchError(() => {\n this.submittingStatus = FormSubmissionStatus.FAILED;\n return of(null)\n })\n ).subscribe()\n } catch (error) {\n console.error(`Error submitting form:`, error);\n this.submittingStatus = FormSubmissionStatus.FAILED;\n this.submittingForm = false;\n }\n }\n\n // ──────────────────────────────────────────────────────────────────────────\n // MultipleInput (Phase 2 — wired to the projected FormGroup verbatim)\n // ──────────────────────────────────────────────────────────────────────────\n\n /** Toggle a MultipleInput element + its associated form controls. */\n toggleMultipleInput = (inputId: string, open: boolean, rowInEditId?: string): boolean => toggleMultipleInput(this, this._mainForm, inputId, open, rowInEditId);\n /** Persist the open MultipleInput sub-form back into the parent control's array value. */\n saveMultipleInputForm = (inputId: string): boolean => saveMultipleInputForm(this, this._mainForm, inputId);\n /** Open the MultipleInput sub-form prepopulated with `rowId`'s values. */\n multipleInputEditRow = (inputId: string, rowId: string) => multipleInputEditRow(this, this._mainForm, inputId, rowId);\n /** Duplicate `rowId` and open the sub-form on the new row. */\n multipleInputDuplicateRow = (inputId: string, rowId: string) => multipleInputDuplicateRow(this, this._mainForm, inputId, rowId);\n\n /**\n * Bridges live edits of an OPEN MultipleInput sub-row into the signal graph.\n *\n * Subscribes every sub-row control (`${inputId}.${childId}`) — except the\n * `${inputId}.id` row-bookkeeping control — to `updateValue(controlName, …)`,\n * so a sub-row field behaves exactly like a primary-form input: dependent\n * calculations / value-fetches / validators (whether they live in the same\n * row or in the primary form) re-fire the moment a dependency changes.\n *\n * Idempotent per `inputId` (re-binding tears down the prior subscription\n * first). Each inner subscription is `takeUntil(this._destroyed$)`-anchored so\n * a re-init also drops it. Called by `toggleMultipleInput` on open; mirrored\n * by {@link FormTowerControllerService.unbindMultipleInputRowControls} on close.\n *\n * @param inputId - The MultipleInput whose open sub-row controls to bridge.\n */\n bindMultipleInputRowControls = (inputId: string): void => {\n this.unbindMultipleInputRowControls(inputId);\n const input = this.allFormInputs()?.find(i => i.id === inputId);\n if (!input?.sectionId) return;\n const sectionGroup = this._mainForm?.get(input.sectionId) as FormGroup | null;\n if (!sectionGroup) return;\n\n const prefix = `${inputId}.`;\n const idControl = `${inputId}.id`;\n const sub = new Subscription();\n for (const [controlName, control] of Object.entries(sectionGroup.controls)) {\n // Only this row's sub-controls — never the parent array control or the\n // row-id bookkeeping control (which is internal plumbing, not a value).\n if (!controlName.startsWith(prefix) || controlName === idControl) continue;\n sub.add(\n control.valueChanges\n .pipe(takeUntil(this._destroyed$))\n .subscribe(value => this.updateValue(controlName, value)),\n );\n }\n this.#multipleInputRowSubs.set(inputId, sub);\n };\n\n /**\n * Tears down the live sub-row `valueChanges` bridge wired by\n * {@link FormTowerControllerService.bindMultipleInputRowControls}. Called by\n * `toggleMultipleInput` on close (and implicitly on re-open / re-init).\n *\n * @param inputId - The MultipleInput whose sub-row bridge to drop.\n */\n unbindMultipleInputRowControls = (inputId: string): void => {\n const existing = this.#multipleInputRowSubs.get(inputId);\n if (!existing) return;\n existing.unsubscribe();\n this.#multipleInputRowSubs.delete(inputId);\n };\n\n // ──────────────────────────────────────────────────────────────────────────\n // W13 — Refresh / revert family (resource .reload() + #derived membership)\n // ──────────────────────────────────────────────────────────────────────────\n\n /**\n * Re-runs every refreshable function for inputs in `sectionId` (resource\n * `.reload()` + dependency order). Returns an Observable that completes when\n * the section's refresh chain drains.\n *\n * @param sectionId - The section to refresh.\n * @returns An Observable completing when the section is refreshed.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I-1 parity-frozen signature.\n refreshSection = (sectionId: string): Observable<any> => refreshSectionInput(this, sectionId);\n\n /**\n * Fire-and-forget refresh of whichever slide is currently active. Returns\n * `void` (parity — the consumer-map row claiming `Observable<any>` is wrong).\n */\n refreshActiveSection = (): void => {\n const activeSectionId = this.form?.slides.find(s => s.isActive)?.sectionId;\n if (activeSectionId) {\n this.refreshSection(activeSectionId).pipe(take(1)).subscribe();\n }\n }\n\n /**\n * Refresh a single input plus everything it transitively depends on.\n *\n * @param inputId - The input to refresh.\n * @returns An Observable completing when the refresh drains.\n */\n refreshInput = (inputId: string): Observable<void> => refreshInputWithDependencies(this, inputId);\n\n /** True iff the input has at least one refreshable `#derived` entry. */\n canRefreshFn = (inputId: string): boolean => canRefresh(this, inputId);\n\n /**\n * True iff any input in the section is refreshable. The HTML refresh-button\n * gate (`user-form-stepper.component.html`) depends on this exact truth value\n * (Blueprint §4 / W13).\n */\n canRefreshSection = (sectionId: string): boolean => canRefreshSectionFn(this, sectionId);\n\n /**\n * Pop the last change-history entry and re-apply the PRIOR snapshot via\n * {@link FormTowerControllerService.updateValue} (restores to second-to-last,\n * matching the old semantics exactly). Decorates each restored input with a\n * transient hint. History append stays imperative (HAZARD 4).\n */\n revertBackHistory = (): void => {\n const lastChange = this.#changeHistoryArr.pop();\n if (!lastChange) {\n this.#changeHistory.set([...this.#changeHistoryArr]);\n return;\n }\n this.#changeHistory.set([...this.#changeHistoryArr]);\n const latestRecord = this.#changeHistoryArr[this.#changeHistoryArr.length - 1];\n if (!latestRecord) return;\n Object.entries(latestRecord.changes).forEach(([key, value]) => {\n this.updateValue(key, value);\n this.setTemporaryHint(key, 'Reverted back to previous value', HintType.HISTORY);\n });\n }\n\n /**\n * Hard reset: tear down current state and re-initialize from the same form\n * definition + originally supplied values.\n *\n * **D4 (deliberate, signed-off):** AWAITS `initialize(form)` BEFORE calling\n * `initializeFormValues(...)`, fixing the old unawaited mis-ordering where\n * `initializeFormValues` could run before `_mainForm` was rebuilt. The public\n * signature is unchanged.\n */\n reset(): void {\n const form = this.form;\n const initialFormValues = this._initialFormValue;\n this.clearFormState();\n if (!form) return;\n void this.initialize(form).then(() => {\n this.initializeFormValues(initialFormValues);\n });\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\n\nimport { FormTowerControllerService } from '../t-form-tower-controller/form-tower-controller.service';\n\n/**\n * Per-component runtime form engine.\n *\n * `TFormEngine` is the **composition seam** introduced by SIGNAL_FORMS migration\n * Phase 0 (see `docs/migration/SIGNAL_FORMS_MIGRATION_PLAN.md` §5.1/§6.0 and\n * DECISIONS.md D-023/D-025). Consumers previously **extended**\n * {@link FormTowerControllerService} directly; they now **hold** a `TFormEngine`\n * instance via `inject(TFormEngine)` (provided per-component, not\n * `providedIn: 'root'`) and reach the tower's surface through it.\n *\n * Phase 0 moves **no logic**: this façade is a thin subclass of the existing\n * tower so the full member surface is preserved verbatim and consumer behaviour\n * stays under the I-1 Parity invariant. Phase 1 will rewrite the tower internals\n * behind this same façade without touching the three consumers again.\n *\n * Internal to the library — not part of the public API. Provide it on the\n * component that needs it:\n *\n * @example\n * @Component({\n * // …\n * providers: [TFormEngine],\n * })\n * export class UserFormStepperComponent {\n * protected readonly engine = inject(TFormEngine);\n * }\n */\n@Injectable()\nexport class TFormEngine extends FormTowerControllerService {\n // Explicit super-delegating constructor mirroring the abstract base's\n // `@Inject(HttpClient)` parameter so DI resolves the tower's dependency\n // identically when this façade is constructed (per-component provider, or the\n // import controller's per-row child injector).\n constructor(@Inject(HttpClient) http: HttpClient) {\n super(http);\n }\n}\n","/**\r\n * @file Form Import Controller — drives a bulk import session by spinning up\r\n * one isolated {@link FormTowerControllerService} instance per row and\r\n * letting the tower's normal lifecycle (calculations, API fetches, custom\r\n * validators) settle against each row's data.\r\n *\r\n * **Mental model for one row:**\r\n * ```\r\n * rawRow ─► _preProcessRow (resolves SCOA codes, multi-selects, sub-rows)\r\n * │\r\n * ▼\r\n * _createTower (child injector, cache-aware http fns)\r\n * │\r\n * ▼\r\n * tower.initialize(form)\r\n * │\r\n * ▼\r\n * tower.initializeFormValues(resolvedRow)\r\n * │\r\n * ▼\r\n * waitUntilSettled ←── all async derivations drained (deterministic)\r\n * │\r\n * ▼\r\n * getFormValueNames + collectValidationErrors + collectColErrors\r\n * │\r\n * ▼\r\n * ImportRowState { status, settledValue, isValid, validationErrors, colErrors }\r\n * ```\r\n *\r\n * **Concurrency strategy:** every row processes in parallel via\r\n * `Promise.all(...)`. To avoid 26 rows hammering the same endpoint 26 times,\r\n * each tower's `httpGetDataFunction` / `httpPostDataFunction` is wrapped to\r\n * route through {@link TFormImportController._cachedGet} /\r\n * {@link TFormImportController._cachedPost}, which dedupe identical requests\r\n * via `shareReplay(1)` for the lifetime of the session.\r\n *\r\n * **Settle model (Phase 1.5):** the signal-graph engine settles by construction —\r\n * `waitUntilSettled` resolves once every value/options resource and calculation\r\n * has drained, with no debounce timer or race. The legacy `skipInitialFunctions`\r\n * flag (which existed to suppress a premature change-monitor cycle) is now a\r\n * documented no-op and is no longer passed. Validation is still recomputed\r\n * explicitly after settle — see {@link TFormImportController._recomputeAllValidationErrors}.\r\n */\r\nimport { inject, Injectable, Injector } from '@angular/core';\r\nimport { AbstractControl, FormArray, FormGroup } from '@angular/forms';\r\nimport { BehaviorSubject, catchError, filter, firstValueFrom, map, Observable, of, shareReplay } from 'rxjs';\r\nimport {\r\n ElementTypes,\r\n FormColumnInputs,\r\n FormInterface,\r\n IFinancialCycles,\r\n IIncludedSegmentConfig,\r\n IScoaAccount,\r\n IScoaInput,\r\n NgxTFormsConfig,\r\n} from 'ngx-t-forms-types';\r\nimport type { FormInputBasicOptionInterface, ImportProgress, ImportRowState, ImportRowStatus } from 'ngx-t-forms-types';\r\nimport { TFormEngine } from '../t-form-engine/t-form-engine';\r\nimport type { FormTowerControllerService } from '../t-form-tower-controller/form-tower-controller.service';\r\nimport { partitionFormErrors, type OverridableError } from '../t-form-tower-controller/functions/overrideValidation';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../injection-tokens';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\n/**\r\n * Result returned by every per-input pre-processor in\r\n * {@link TFormImportController}.\r\n *\r\n * - `value` is written to the resolved row under the input's\r\n * `formControlName` when defined.\r\n * - `errors` accumulates onto the row's `colErrors[formControlName]`.\r\n */\r\ninterface PreProcessResult {\r\n value?: unknown;\r\n errors: string[];\r\n /**\r\n * Index-prefixed overridable (`canOverride === true`) validation messages\r\n * surfaced from MultipleInput sub-rows — `\"[0].subField.<message>\"`. Unlike\r\n * `errors` (blocking), these do NOT invalidate the parent row; they flag it\r\n * as `overridable`.\r\n */\r\n overridableErrors?: string[];\r\n}\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Re-exports of the import lifecycle types, now upstreamed to\r\n * `ngx-t-forms-types` (see DECISIONS.md D-016). Consumers that previously\r\n * imported these from this file continue to resolve the same shapes.\r\n */\r\nexport type { ImportProgress, ImportRowState, ImportRowStatus };\r\n\r\n// ---------------------------------------------------------------------------\r\n// Service\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Public entry-point for bulk imports.\r\n *\r\n * Typical usage:\r\n * ```ts\r\n * const importController = inject(TFormImportController);\r\n * importController.progress$.subscribe(p => render(p)); // optional reactive UI\r\n * const results = await importController.runImport(form, rows);\r\n * const validRows = results.filter(r => r.isValid);\r\n * ```\r\n *\r\n * Singleton (`providedIn: 'root'`) because all import sessions share the same\r\n * caches/injector wiring. Call {@link TFormImportController.reset} between\r\n * runs only if you want to force consumers of `progress$` to see an empty\r\n * baseline; `runImport` already clears caches on entry and exit.\r\n *\r\n * @public\r\n * @deprecated Reachable for one minor cycle only as part of the Phase 1 public-surface\r\n * lockdown. Target removal: v3.0.0. Consumers should switch to wiring an import flow\r\n * through the `withImportTower()` feature; the controller will move under that\r\n * feature tree in Phase 2.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class TFormImportController {\r\n\r\n private readonly _injector = inject(Injector);\r\n private readonly _rows$ = new BehaviorSubject<ImportRowState[]>([]);\r\n\r\n /**\r\n * Per-session HTTP caches.\r\n * Key: serialized request identity → shared Observable (shareReplay).\r\n * Populated at the start of runImport and cleared when it finishes,\r\n * so every import session starts cold but identical in-flight requests\r\n * across concurrent rows reuse a single HTTP call.\r\n */\r\n private _getCache = new Map<string, Observable<unknown>>();\r\n private _postCache = new Map<string, Observable<unknown>>();\r\n\r\n /**\r\n * Registry of pre-processors keyed by ElementType.\r\n * Add an entry here to handle a new input type in _preProcessRow — no other\r\n * changes needed. Each processor receives the column definition and the raw\r\n * row and must return `{ value?, errors[] }`.\r\n * `value` is written to processedRow[formControlName] when defined;\r\n * `errors` accumulates in colErrors[formControlName].\r\n */\r\n private readonly _inputPreProcessors = new Map<\r\n ElementTypes,\r\n (input: FormColumnInputs, row: Record<string, unknown>) => Promise<PreProcessResult>\r\n >([\r\n [ElementTypes.MscoaSelection, (input, row) => this._processMscoaInput(input, row)],\r\n [ElementTypes.MultipleInput, (input, row) => this._processMultipleFormInput(input, row)],\r\n [ElementTypes.Select, (input, row) => this._processSelectInput(input, row)],\r\n [ElementTypes.PaginatedSelectionTable, (input, row) => this._processSelectInput(input, row)],\r\n \r\n\r\n ]);\r\n /**\r\n * Shared financial-cycles observable for the current import session.\r\n * loadSystemInputs calls getFinacialCycles() directly via NGX_T_FORMS_CONFIG\r\n * (not through utils), so HTTP-function patching alone cannot deduplicate it.\r\n * We intercept it at the config level by providing a wrapped token in each\r\n * tower's child injector that returns this shared observable instead.\r\n */\r\n private _financialCycles$: Observable<IFinancialCycles> | null = null;\r\n\r\n /**\r\n * Reactive progress stream — subscribe to track each row in real time.\r\n */\r\n readonly progress$: Observable<ImportProgress> = this._rows$.pipe(\r\n map(rows => this._toProgress(rows))\r\n );\r\n\r\n /**\r\n * Snapshot of the current progress (non-reactive).\r\n */\r\n get currentProgress(): ImportProgress {\r\n return this._toProgress(this._rows$.value);\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n // Public API\r\n // -------------------------------------------------------------------------\r\n\r\n /**\r\n * Runs an import session.\r\n *\r\n * For each row a fresh tower instance is spun up via a child injector,\r\n * prepopulated, and left to settle (calculations + API fetches) before\r\n * recording the final value and validation status.\r\n * All rows are processed concurrently.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const results = await importController.runImport(form, rows);\r\n * const valid = results.filter(r => r.isValid);\r\n * ```\r\n *\r\n * @param form The form definition every row is validated against.\r\n * @param rows Raw data objects — one per import row.\r\n */\r\n async runImport(\r\n form: FormInterface,\r\n rows: Record<string, unknown>[]\r\n ): Promise<ImportRowState[]> {\r\n // Fresh cache per session — previous responses must not bleed into a new run.\r\n this._getCache.clear();\r\n this._postCache.clear();\r\n this._financialCycles$ = null;\r\n\r\n this._rows$.next(\r\n rows.map((originalData, rowIndex) => ({ rowIndex, originalData, status: 'pending' }))\r\n );\r\n const hasPreProcessInputs = form.slides.some(slide =>\r\n slide.columns.some(col => this._inputPreProcessors.has(col.element))\r\n );\r\n\r\n try {\r\n console.error(\"Starting import with rows\", rows)\r\n await Promise.all(rows.map((row, i) => this._processRow(form, row, i, hasPreProcessInputs)));\r\n console.error(\"Final settled values\", this._rows$.value.map(r => r.settledValue)) \r\n \r\n } finally {\r\n // Always release cached Observables — even if an unexpected error escapes\r\n // _processRow's own try/catch (e.g. OOM, stack overflow).\r\n this._getCache.clear();\r\n this._postCache.clear();\r\n this._financialCycles$ = null;\r\n }\r\n return this._rows$.value;\r\n }\r\n\r\n /** Clears all row state. */\r\n reset(): void {\r\n this._getCache.clear();\r\n this._postCache.clear();\r\n this._financialCycles$ = null;\r\n this._rows$.next([]);\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n // Private\r\n // -------------------------------------------------------------------------\r\n\r\n /**\r\n * Creates an isolated tower instance through a short-lived child injector.\r\n *\r\n * The child injector delegates all token resolution to the parent, so\r\n * HttpClient, NGX_T_FORMS_CONFIG_TOKEN, and any other deps the tower needs\r\n * are found automatically — no manual wiring required here.\r\n *\r\n * After creation the tower's HTTP functions are replaced with cache-aware\r\n * wrappers so that identical requests fired by different rows share one\r\n * in-flight Observable instead of each issuing their own HTTP call.\r\n */\r\n private _createTower(): TFormEngine {\r\n // Build a wrapped config that routes getFinacialCycles through the shared\r\n // session observable so all 10 towers share one HTTP call instead of each\r\n // firing their own. loadSystemInputs calls this directly via the injected\r\n // config token, so HTTP-function patching alone cannot deduplicate it.\r\n const parentConfig: NgxTFormsConfig = this._injector.get(NGX_T_FORMS_CONFIG_TOKEN);\r\n const wrappedConfig: NgxTFormsConfig = {\r\n ...parentConfig,\r\n formBuilder: {\r\n ...parentConfig.formBuilder,\r\n getFinacialCycles: (): Observable<IFinancialCycles> => {\r\n if (!this._financialCycles$) {\r\n this._financialCycles$ = parentConfig.formBuilder.getFinacialCycles()\r\n .pipe(shareReplay({ bufferSize: 1, refCount: false }));\r\n }\r\n return this._financialCycles$;\r\n },\r\n },\r\n };\r\n\r\n const tower = Injector.create({\r\n providers: [\r\n { provide: TFormEngine },\r\n { provide: NGX_T_FORMS_CONFIG_TOKEN, useValue: wrappedConfig },\r\n ],\r\n parent: this._injector,\r\n }).get(TFormEngine);\r\n\r\n const originalGet = tower.httpGetDataFunction.bind(tower);\r\n const originalPost = tower.httpPostDataFunction.bind(tower);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): mirrors FormTowerControllerService.httpGetDataFunction signature; D-007 freezes the tower.\r\n tower.httpGetDataFunction = (url: string, options: any) =>\r\n this._cachedGet(url, options, originalGet);\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): mirrors FormTowerControllerService.httpPostDataFunction signature; D-007 freezes the tower.\r\n tower.httpPostDataFunction = (url: string, data: any, options: any) =>\r\n this._cachedPost(url, data, options, originalPost);\r\n\r\n return tower;\r\n }\r\n\r\n /**\r\n * Returns a shared Observable for a GET request.\r\n * On cache miss the original function is called once and its result is\r\n * multicasted via shareReplay(1) so every concurrent subscriber (row) that\r\n * asks for the same URL+options receives the same response without an\r\n * additional HTTP call.\r\n */\r\n /* eslint-disable @typescript-eslint/no-explicit-any -- TODO(phase-4): mirrors FormTowerControllerService.httpGetDataFunction signature; D-007 freezes the tower. */\r\n private _cachedGet(\r\n url: string,\r\n options: any,\r\n original: (url: string, options: any) => Observable<any>\r\n ): Observable<unknown> {\r\n const key = `GET::${url}::${JSON.stringify(options ?? null)}`;\r\n if (!this._getCache.has(key)) {\r\n this._getCache.set(key, original(url, options).pipe(shareReplay({ bufferSize: 1, refCount: false })));\r\n }\r\n return this._getCache.get(key)!;\r\n }\r\n /* eslint-enable @typescript-eslint/no-explicit-any */\r\n\r\n /**\r\n * Returns a shared Observable for a POST request.\r\n * Keyed by URL + serialised body + serialised options so only truly\r\n * identical requests are deduplicated.\r\n */\r\n /* eslint-disable @typescript-eslint/no-explicit-any -- TODO(phase-4): mirrors FormTowerControllerService.httpPostDataFunction signature; D-007 freezes the tower. */\r\n private _cachedPost(\r\n url: string,\r\n data: any,\r\n options: any,\r\n original: (url: string, data: any, options: any) => Observable<any>\r\n ): Observable<unknown> {\r\n const key = `POST::${url}::${JSON.stringify(data ?? null)}::${JSON.stringify(options ?? null)}`;\r\n if (!this._postCache.has(key)) {\r\n this._postCache.set(key, original(url, data, options).pipe(shareReplay({ bufferSize: 1, refCount: false })));\r\n }\r\n return this._postCache.get(key)!;\r\n }\r\n /* eslint-enable @typescript-eslint/no-explicit-any */\r\n\r\n /**\r\n * End-to-end pipeline for a single import row. Runs concurrently with every\r\n * other row in the session.\r\n *\r\n * Steps (any thrown error short-circuits to `status: 'error'`):\r\n * 1. Mark the row `processing`.\r\n * 2. Spin up an isolated tower via {@link TFormImportController._createTower}.\r\n * 3. `initialize(form, { skipInitialFunctions: true })` — see the flag's\r\n * docs; this avoids the timing race between the tower's initial async\r\n * work and our synchronous `initializeFormValues`.\r\n * 4. `_preProcessRow` resolves nested formats (SCOA codes, multi-select\r\n * strings, MultipleInput sub-rows) into the shape `initializeFormValues`\r\n * expects.\r\n * 5. Apply the resolved row → tower's changeMonitor cycle fires dependent\r\n * functions → busy=true.\r\n * 6. `waitUntilSettled()` blocks until every async op drains.\r\n * 7. `markAllAsTouched()` so required-field validators surface even on\r\n * untouched controls.\r\n * 8. {@link TFormImportController._recomputeAllValidationErrors} re-runs\r\n * sync validators across the whole tree (matches what\r\n * `getInputErrorMessage` reports in the interactive UI).\r\n * 9. Collect settled values + per-input + per-column errors and update the\r\n * row's state.\r\n *\r\n * `finally` always destroys the tower so child injectors / valueChanges\r\n * subscriptions don't leak across rows.\r\n */\r\n private async _processRow(\r\n form: FormInterface,\r\n rowData: Record<string, unknown>,\r\n rowIndex: number,\r\n hasPreProcessInputs: boolean\r\n ): Promise<void> {\r\n this._patchRow(rowIndex, { status: 'processing' });\r\n const tower = this._createTower();\r\n\r\n try {\r\n await tower.initialize(form);\r\n const { row: resolvedRowData, colErrors: preColErrors, overridableColErrors: preOverridable } = hasPreProcessInputs\r\n ? await this._preProcessRow(rowData, form)\r\n : { row: rowData, colErrors: {} as Record<string, string>, overridableColErrors: {} as Record<string, string[]> };\r\n tower.initializeFormValues(resolvedRowData);\r\n\r\n // Wait for every async derivation (API value/options, calculations) to drain.\r\n // The signal-graph engine settles deterministically, so this is a defined\r\n // boundary — not the old 500ms changeMonitor debounce race.\r\n await tower.waitUntilSettled();\r\n // Recompute control.errors across the whole tree so cross-field custom\r\n // validators (which read getFormValue() over OTHER fields) and disabled\r\n // controls are validated against the settled values — see\r\n // _recomputeAllValidationErrors for why this is still required (kept until\r\n // Phase 3 makes validation reactive over observed fields).\r\n this._recomputeAllValidationErrors(tower.mainForm);\r\n\r\n const settledValue = tower.getFormValueNames();\r\n\r\n const validationErrors = this._collectValidationErrors(tower);\r\n const colErrors = { ...this._collectColErrors(tower), ...preColErrors };\r\n\r\n // Partition the settled errors so a row whose only remaining failures are\r\n // overridable (canOverride === true) is flagged 'overridable' rather than\r\n // hard 'invalid'. Pre-process errors are always blocking.\r\n const { blocking, overridable } = partitionFormErrors(tower);\r\n // Merge top-level overridable errors with overridable sub-row errors\r\n // bubbled up from MultipleInput pre-processing (keyed by input id).\r\n const overridableErrors = this._groupOverridableByInput(overridable);\r\n for (const [inputId, msgs] of Object.entries(preOverridable)) {\r\n (overridableErrors[inputId] ??= []).push(...msgs);\r\n }\r\n const hasPreErrors = Object.keys(preColErrors).length > 0;\r\n const hasBlocking = blocking.length > 0 || hasPreErrors;\r\n const hasOverridable = Object.keys(overridableErrors).length > 0;\r\n\r\n const status: ImportRowStatus = hasBlocking\r\n ? 'invalid'\r\n : hasOverridable\r\n ? 'overridable'\r\n : 'valid';\r\n const isValid = !hasBlocking && !hasOverridable;\r\n this._patchRow(rowIndex, {\r\n status,\r\n settledValue,\r\n isValid,\r\n validationErrors,\r\n overridableErrors,\r\n colErrors,\r\n });\r\n \r\n } catch (err) {\r\n this._patchRow(rowIndex, {\r\n status: 'error',\r\n errorMessage: err instanceof Error ? err.message : String(err),\r\n });\r\n } finally {\r\n tower.ngOnDestroy();\r\n }\r\n }\r\n\r\n /**\r\n * Dispatches each column that has a registered pre-processor, collects\r\n * resolved values and errors, then returns the enriched row.\r\n *\r\n * To support a new input type add an entry to `_inputPreProcessors` —\r\n * nothing else needs to change here.\r\n */\r\n private async _preProcessRow(\r\n row: Record<string, unknown>,\r\n form: FormInterface,\r\n _multipleInputDepth = 0\r\n ): Promise<{ row: Record<string, unknown>; colErrors: Record<string, string>; overridableColErrors: Record<string, string[]> }> {\r\n const processedRow: Record<string, unknown> = { ...row };\r\n const preColErrors: Record<string, string[]> = {};\r\n // Keyed by the owning input's id (matches ImportRowState.overridableErrors keying).\r\n const overridableColErrors: Record<string, string[]> = {};\r\n\r\n const processableInputs = form.slides.flatMap(s =>\r\n s.columns.filter(c => this._inputPreProcessors.has(c.element))\r\n );\r\n\r\n await Promise.all(\r\n processableInputs.map(async input => {\r\n // MultipleInput is dispatched directly so the depth counter threads correctly.\r\n // All other processors go through the registry as normal.\r\n const { value, errors, overridableErrors } = input.element === ElementTypes.MultipleInput\r\n ? await this._processMultipleFormInput(input, row, _multipleInputDepth)\r\n : await this._inputPreProcessors.get(input.element)!(input, row);\r\n const fcn = input.formControlName as string;\r\n if (errors.length > 0) {\r\n (preColErrors[fcn] ??= []).push(...errors);\r\n }\r\n if (overridableErrors && overridableErrors.length > 0) {\r\n (overridableColErrors[input.id] ??= []).push(...overridableErrors);\r\n }\r\n if (value !== undefined) {\r\n processedRow[fcn] = value;\r\n }\r\n })\r\n );\r\n\r\n const colErrors: Record<string, string> = {};\r\n for (const [fcn, errs] of Object.entries(preColErrors)) {\r\n colErrors[fcn] = errs.join('.');\r\n }\r\n\r\n return { row: processedRow, colErrors, overridableColErrors };\r\n }\r\n\r\n /**\r\n * Pre-processor for MscoaSelection inputs.\r\n *\r\n * Resolves flat account codes into full IScoaAccount objects.\r\n * Column naming convention expected in the raw row:\r\n * {formControlName}.{basisKey}.{SEGMENT}.debit e.g. \"glAccount.accrual.FUND.debit\"\r\n * {formControlName}.{basisKey}.{SEGMENT}.credit e.g. \"glAccount.cash.COSTING.credit\"\r\n *\r\n * Returns the nested structure that `initializeFormValues` / the mscoa\r\n * component store expect:\r\n * { accrual: { FUND: { debit: IScoaAccount, credit: IScoaAccount } }, cash: { ... } }\r\n */\r\n private async _processMscoaInput(\r\n input: IScoaInput,\r\n row: Record<string, unknown>\r\n ): Promise<PreProcessResult> {\r\n const getSCOAAccountByKey =\r\n this._injector.get(NGX_T_FORMS_CONFIG_TOKEN).formBuilder.getSCOAAccountByKey;\r\n\r\n\r\n const fcn = input.formControlName;\r\n const basis = (input.mscoaConfig?.accountingBasis ?? '').toLowerCase();\r\n const isDual = basis === 'dual';\r\n const isCashOnly = basis === 'cash';\r\n\r\n const basesToProcess: Array<{\r\n basisKey: 'accrual' | 'cash';\r\n segments: IIncludedSegmentConfig[];\r\n accountValueLabel: string;\r\n }> = [];\r\n if (!isCashOnly || isDual) {\r\n basesToProcess.push({\r\n basisKey: 'accrual',\r\n segments: input.mscoaConfig?.segments ?? [],\r\n accountValueLabel: input.mscoaConfig?.accountValueLabel ?? 'SCOAAccount',\r\n });\r\n }\r\n if (isCashOnly || isDual) {\r\n basesToProcess.push({\r\n basisKey: 'cash',\r\n segments: input.mscoaConfig?.cashSegments ?? [],\r\n accountValueLabel: input.mscoaConfig?.accountValueLabel ?? 'SCOAAccount',\r\n });\r\n }\r\n\r\n type ScoaPair = { debit: IScoaAccount; credit: IScoaAccount };\r\n const mscoaValue: Partial<Record<'accrual' | 'cash', Record<string, ScoaPair>>> = {};\r\n const errors: string[] = [];\r\n\r\n await Promise.all(\r\n basesToProcess.map(async ({ basisKey, segments, accountValueLabel }) => {\r\n const basisValue: Record<string, ScoaPair> = {};\r\n\r\n await Promise.all(\r\n segments.map(async (segConfig: IIncludedSegmentConfig) => {\r\n const segKey = (segConfig.customSegment || segConfig.segment || '').toUpperCase();\r\n if (!segKey) return;\r\n\r\n const debitKey = `${fcn}.${basisKey}.${segKey}.debit`;\r\n const creditKey = `${fcn}.${basisKey}.${segKey}.credit`;\r\n const debitRaw = row[debitKey];\r\n const creditRaw = row[creditKey];\r\n const debitCode: string | undefined = typeof debitRaw === 'string' ? debitRaw : undefined;\r\n const creditCode: string | undefined = typeof creditRaw === 'string' ? creditRaw : undefined;\r\n\r\n if (!debitCode && !creditCode) return;\r\n\r\n if (!debitCode || !creditCode) {\r\n errors.push(`${basisKey}.${segKey}.${debitCode ? 'credit' : 'debit'}Missing`);\r\n return;\r\n }\r\n\r\n const [debit, credit] = await Promise.all([\r\n this._lookupScoaAccount(getSCOAAccountByKey, accountValueLabel, debitCode, segKey),\r\n this._lookupScoaAccount(getSCOAAccountByKey, accountValueLabel, creditCode, segKey),\r\n ]);\r\n\r\n if (!debit || !credit) {\r\n errors.push(`${basisKey}.${segKey}.${debit ? 'credit' : 'debit'}NotFound`);\r\n return;\r\n }\r\n\r\n basisValue[segKey] = { debit, credit };\r\n })\r\n );\r\n\r\n if (Object.keys(basisValue).length > 0) {\r\n mscoaValue[basisKey] = basisValue;\r\n }\r\n })\r\n );\r\n\r\n if (isDual) {\r\n const hasAccrual = 'accrual' in mscoaValue;\r\n const hasCash = 'cash' in mscoaValue;\r\n if (hasAccrual !== hasCash) {\r\n const missing = hasAccrual ? 'cash' : 'accrual';\r\n errors.push(`dual.${missing}BasisMissing`);\r\n }\r\n }\r\n\r\n return {\r\n value: Object.keys(mscoaValue).length > 0 ? mscoaValue : undefined,\r\n errors,\r\n };\r\n }\r\n\r\n /**\r\n * Pre-processor for MultipleInput inputs.\r\n *\r\n * Expects `row[input.formControlName]` to be an array of objects where each\r\n * object's keys are the formControlNames declared in `input.formInputs`.\r\n *\r\n * For each item the full tower lifecycle is run against a one-slide mock form\r\n * (the same sequence as _processRow on the main form), so Angular validators,\r\n * async validators, API calls, and calculated fields all fire and settle before\r\n * errors are collected. Pre-processors (e.g. MscoaSelection) are applied first\r\n * so resolved objects are in place when the tower initializes.\r\n *\r\n * Errors are prefixed with the item index: \"[0].subField.errorCode\".\r\n */\r\n private async _processMultipleFormInput(\r\n input: FormColumnInputs,\r\n row: Record<string, unknown>,\r\n _depth = 0\r\n ): Promise<PreProcessResult> {\r\n if (_depth > 5) {\r\n // Guard against pathologically deep or circular MultipleInput nesting.\r\n // Five levels covers any realistic form structure.\r\n return { value: row[input.formControlName], errors: [] };\r\n }\r\n\r\n const fcn = input.formControlName;\r\n const rawCandidate = row[fcn];\r\n const rawItems: Record<string, unknown>[] = Array.isArray(rawCandidate)\r\n ? (rawCandidate as Record<string, unknown>[])\r\n : [];\r\n\r\n if (rawItems.length === 0) {\r\n return { errors: [] };\r\n }\r\n\r\n const subFormInputs = input.formInputs ?? [];\r\n\r\n // One-slide mock form — reused across all items in this field.\r\n const mockForm: FormInterface = {\r\n slides: [{\r\n sectionId: input.sectionId,\r\n label: '',\r\n columns: subFormInputs.map(col=>({\r\n ...col,\r\n multipleInputInEditId: undefined, // Prevent nested MultipleInputs from trying to edit the same item in the same shared mock form\r\n })),\r\n }],\r\n } as FormInterface;\r\n\r\n const hasPreProcessableSubInputs = subFormInputs.some(\r\n subInput => this._inputPreProcessors.has(subInput.element)\r\n );\r\n\r\n const processedItems: Record<string, unknown>[] = new Array(rawItems.length);\r\n const errors: string[] = [];\r\n const overridableErrors: string[] = [];\r\n\r\n await Promise.all(\r\n rawItems.map(async (item, index) => {\r\n // Step 1: resolve raw codes (MSCOA etc.) before the tower sees the data.\r\n // Pass _depth + 1 so nested MultipleInputs increment the depth guard correctly.\r\n const { row: resolvedItem, colErrors: preColErrors, overridableColErrors: preOverridable } = hasPreProcessableSubInputs\r\n ? await this._preProcessRow(item, mockForm, _depth + 1)\r\n : { row: item, colErrors: {} as Record<string, string>, overridableColErrors: {} as Record<string, string[]> };\r\n\r\n // Step 2: full tower lifecycle — same sequence as _processRow — so that\r\n // required-field validators, async validators, and calculations all run\r\n // and settle before errors are collected.\r\n const tower = this._createTower();\r\n try {\r\n await tower.initialize(mockForm);\r\n tower.initializeFormValues(resolvedItem);\r\n await tower.waitUntilSettled();\r\n this._recomputeAllValidationErrors(tower.mainForm);\r\n\r\n processedItems[index] = {\r\n ...(tower.getFormValueNames() ?? resolvedItem),\r\n id: resolvedItem?.['id'] ?? uuidv4()\r\n }\r\n\r\n // Partition this sub-row's settled errors so overridable validations\r\n // flag (not invalidate) the parent row. Pre-process errors are always\r\n // blocking; nested overridable sub-errors bubble up index-prefixed.\r\n const byId = new Map((tower.allFormInputs() ?? []).map(i => [i.id, i]));\r\n const { blocking, overridable } = partitionFormErrors(tower);\r\n for (const b of blocking) {\r\n const fcn = byId.get(b.inputId)?.formControlName ?? b.inputId;\r\n errors.push(`[${index}].${fcn}.${b.key}`);\r\n }\r\n for (const [subFcn, errStr] of Object.entries(preColErrors)) {\r\n errors.push(`[${index}].${subFcn}.${errStr}`);\r\n }\r\n for (const o of overridable) {\r\n overridableErrors.push(`[${index}].${o.formControlName}.${o.message}`);\r\n }\r\n for (const [subId, msgs] of Object.entries(preOverridable)) {\r\n for (const msg of msgs) overridableErrors.push(`[${index}].${subId}.${msg}`);\r\n }\r\n } finally {\r\n tower.ngOnDestroy();\r\n }\r\n })\r\n );\r\n\r\n return {\r\n value: processedItems,\r\n errors,\r\n overridableErrors,\r\n };\r\n }\r\n\r\n\r\n /**\r\n * Resolves a single account code to an IScoaAccount.\r\n * Routed through `_cachedGet` so identical codes across concurrent rows share\r\n * one in-flight Observable (shareReplay) — the same mechanism used for all\r\n * other HTTP calls in this class.\r\n */\r\n private async _lookupScoaAccount(\r\n getSCOAAccountByKey: (key: string, keyValue: string) => Observable<{ account?: IScoaAccount }>,\r\n key: string,\r\n keyValue: string = 'SCOAId',\r\n segKey: string\r\n ): Promise<IScoaAccount | undefined> {\r\n\r\n return firstValueFrom(\r\n this._cachedGet(`scoa-account::${key.trim()}::${keyValue.trim()}`, null, () => getSCOAAccountByKey(key, keyValue)).pipe(\r\n map((r) => (r as { account?: IScoaAccount } | undefined)?.account),\r\n // Prevent Attaching accounts with non-matching SCOAFile (e.g. wrong segment value) — treat as not found\r\n filter((account): account is IScoaAccount => account?.SCOAFile === segKey),\r\n catchError(() => of(undefined))\r\n )\r\n ).catch(() => undefined);\r\n }\r\n\r\n\r\n /**\r\n * Pre-processor for `Select` and `PaginatedSelectionTable` inputs.\r\n *\r\n * Single-select inputs pass through unchanged.\r\n *\r\n * Multi-select inputs accept the value in any of:\r\n * - `string[]` — taken as-is, each entry trimmed.\r\n * - `'[\"a\",\"b\"]'` — JSON-stringified array.\r\n * - `'a, b, c'` — comma-separated string.\r\n * - `'[a, b]'` (malformed JSON) — fallback: strip brackets, split, strip quotes.\r\n *\r\n * If the input declares custom (in-config) options, every parsed value is\r\n * checked against the option set. Any mismatches are returned as errors of\r\n * the form `'invalidOption:<value>'` and `value` is omitted (so the parent\r\n * form control keeps its original/empty state and the row is flagged\r\n * invalid). API-fetched options are NOT validated here — see the comments\r\n * in {@link FormTowerControllerService.initialize} on why deferring those\r\n * lookups is safe in import mode.\r\n */\r\n private async _processSelectInput(\r\n input: FormColumnInputs,\r\n row: Record<string, unknown>\r\n ): Promise<PreProcessResult> {\r\n const fcn = input.formControlName;\r\n const rawValue = row[fcn];\r\n const isMulti = input.allowMultipleSelection === true;\r\n\r\n if (!isMulti) {\r\n return { errors: [], value: rawValue };\r\n }\r\n\r\n // Multi-select: normalize raw value to string[]\r\n // Accepted forms: string[] | JSON-stringified array | comma-separated string\r\n let parsedValues: string[];\r\n\r\n if (Array.isArray(rawValue)) {\r\n parsedValues = (rawValue as unknown[]).map(v => String(v).trim());\r\n } else if (typeof rawValue === 'string') {\r\n const trimmed = rawValue.trim();\r\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\r\n try {\r\n const parsed: unknown = JSON.parse(trimmed);\r\n parsedValues = Array.isArray(parsed)\r\n ? (parsed as unknown[]).map(v => String(v).trim())\r\n : [String(parsed).trim()];\r\n } catch {\r\n // Malformed JSON array — strip brackets, split by comma, strip surrounding quotes\r\n parsedValues = trimmed\r\n .slice(1, -1)\r\n .split(',')\r\n .map(v => v.trim().replace(/^[\"']|[\"']$/g, ''))\r\n .filter(Boolean);\r\n }\r\n } else {\r\n parsedValues = trimmed.split(',').map(v => v.trim()).filter(Boolean);\r\n }\r\n } else {\r\n parsedValues = [];\r\n }\r\n\r\n const isCustomOptions = input.matOptions?.fetch?.options?.source === 'customOptions';\r\n if (isCustomOptions && input.matOptions?.options) {\r\n const validOptionValues = new Set(\r\n input.matOptions.options.map((opt: FormInputBasicOptionInterface | Record<string, unknown>) =>\r\n String((opt as { value?: unknown }).value)\r\n )\r\n );\r\n const invalidValues = parsedValues.filter(v => !validOptionValues.has(v));\r\n if (invalidValues.length > 0) {\r\n return { errors: invalidValues.map(v => `invalidOption:${v}`) };\r\n }\r\n }\r\n\r\n return { value: parsedValues, errors: [] };\r\n }\r\n \r\n /**\r\n * Re-runs sync validation across the WHOLE form tree against the settled values.\r\n *\r\n * **Why this is still required after the signal-forms migration (Phase 1.5 finding;\r\n * kept until Phase 3):** it is NOT a settle-timing workaround — Phase 1 already made\r\n * `waitUntilSettled` deterministic. It compensates for two reactive-forms semantics\r\n * the signal-graph engine does not change:\r\n *\r\n * 1. **Cross-field validators.** Custom validators (commonFormOperations\r\n * `createCustomValidator`) read OTHER fields via `getFormValue()`. Angular only\r\n * re-runs a control's validators when ITS OWN value changes, and the engine's\r\n * projection effect likewise only `setValue`s controls whose value actually\r\n * changed — so a control whose value is unchanged keeps STALE cross-field errors\r\n * until a whole-tree `updateValueAndValidity` forces re-evaluation.\r\n * 2. **Disabled controls.** Angular never validates disabled controls (formGenerator\r\n * disables them from `input.disabled`); import temporarily enables the tree,\r\n * validates, then restores the disabled flags.\r\n *\r\n * Phase 3 (`@angular/forms/signals` `validate()`/`validateAsync()`) makes validation\r\n * reactive over observed fields and disabled-aware — at which point this method, its\r\n * enable/disable dance, and this call site can be deleted.\r\n */\r\n private _recomputeAllValidationErrors(mainForm: FormGroup | undefined): void {\r\n if (!mainForm) return;\r\n const disabledPostOrder: AbstractControl[] = [];\r\n const walkPostOrder = (c: AbstractControl): void => {\r\n if (c instanceof FormGroup) {\r\n Object.values(c.controls).forEach(walkPostOrder);\r\n } else if (c instanceof FormArray) {\r\n c.controls.forEach(walkPostOrder);\r\n }\r\n if (c.disabled) {\r\n disabledPostOrder.push(c);\r\n }\r\n };\r\n walkPostOrder(mainForm);\r\n mainForm.enable({ emitEvent: false });\r\n mainForm.updateValueAndValidity({ emitEvent: false });\r\n disabledPostOrder.forEach(ctrl => ctrl.disable({ emitEvent: false }));\r\n }\r\n\r\n /**\r\n * Walks `{ [sectionId]: FormGroup { [inputId]: FormControl } }` and\r\n * collects every control that has validation errors (from `control.errors`).\r\n */\r\n private _collectValidationErrors(\r\n tower: FormTowerControllerService\r\n ): Record<string, string[]> {\r\n const errors: Record<string, string[]> = {};\r\n if (!tower.mainForm) return errors;\r\n\r\n Object.values(tower.mainForm.controls).forEach(section => {\r\n if (!(section instanceof FormGroup)) return;\r\n Object.entries(section.controls).forEach(([inputId, control]) => {\r\n const result = control.errors;\r\n if (result && Object.keys(result).length > 0) {\r\n errors[inputId] = Object.keys(result);\r\n }\r\n });\r\n });\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * Groups the flat overridable-error list from {@link partitionFormErrors} into\r\n * an `inputId → messages[]` map for {@link ImportRowState.overridableErrors}.\r\n */\r\n private _groupOverridableByInput(overridable: OverridableError[]): Record<string, string[]> {\r\n const out: Record<string, string[]> = {};\r\n for (const err of overridable) {\r\n (out[err.inputId] ??= []).push(err.message);\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * Builds a formControlName-keyed error map from the settled form.\r\n * Multiple error keys on one control are joined with '.'.\r\n */\r\n private _collectColErrors(tower: FormTowerControllerService): Record<string, string> {\r\n const colErrors: Record<string, string> = {};\r\n if (!tower.mainForm) return colErrors;\r\n\r\n // Flatten sectionId → inputId → control into a single inputId → control map\r\n const controlMap: Record<string, AbstractControl> = {};\r\n Object.values(tower.mainForm.controls).forEach(section => {\r\n if (section instanceof FormGroup) {\r\n Object.assign(controlMap, section.controls);\r\n }\r\n });\r\n\r\n // Map inputId back to formControlName via allFormInputs()\r\n (tower.allFormInputs() ?? []).forEach(input => {\r\n if (!input.formControlName || !input.id) return;\r\n const control = controlMap[input.id];\r\n if (!control) return;\r\n const result = control.errors;\r\n if (result && Object.keys(result).length > 0) {\r\n colErrors[input.formControlName] = Object.keys(result).join('.');\r\n }\r\n });\r\n\r\n return colErrors;\r\n }\r\n\r\n /**\r\n * Immutable row update — clones the rows array and the targeted row before\r\n * pushing through `_rows$` so subscribers downstream of `progress$` always\r\n * receive a fresh reference (cheap change detection in components).\r\n */\r\n private _patchRow(index: number, patch: Partial<ImportRowState>): void {\r\n const rows = [...this._rows$.value];\r\n rows[index] = { ...rows[index], ...patch } as ImportRowState;\r\n this._rows$.next(rows);\r\n }\r\n\r\n /**\r\n * Compute the {@link ImportProgress} aggregate from the row array. Pure —\r\n * driven by `progress$` and `currentProgress`.\r\n */\r\n private _toProgress(rows: ImportRowState[]): ImportProgress {\r\n const count = (status: ImportRowStatus) => rows.filter(r => r.status === status).length;\r\n return {\r\n total: rows.length,\r\n pending: count('pending'),\r\n processing: count('processing'),\r\n complete: count('valid') + count('overridable') + count('invalid'),\r\n valid: count('valid'),\r\n overridable: count('overridable'),\r\n invalid: count('invalid'),\r\n error: count('error'),\r\n rows,\r\n };\r\n }\r\n}\r\n","import { catchError, EMPTY, map, Observable, of, switchMap, concat, concatMap, finalize,} from \"rxjs\";\r\nimport { FormsStoreService } from \"./forms-store.service\";\r\nimport { DatabaseFormInterface, FormInterface, FormInterfaceMigration } from \"ngx-t-forms-types\";\r\nimport { initFormConfigToV2 } from \"../../../services\";\r\nimport { FormListSection, FormStateErrors } from \"ngx-t-forms-types\";\r\nimport { HttpErrorResponse } from \"@angular/common/http\";\r\n\r\n\r\n\r\nfunction convertOldFormToNewForm(form: FormInterface): FormInterface {\r\n try {\r\n // `initFormConfigToV2` accepts the `FormInterfaceMigration` union\r\n // (`OLD_FormInterface | FormInterface`) — no `any` cast required.\r\n const migrationPayload: FormInterfaceMigration = { ...form };\r\n const newForm = initFormConfigToV2(migrationPayload)\r\n\r\n return newForm\r\n } catch {\r\n const fallback: FormInterface = {\r\n slides: [],\r\n submissionHandle: { submissionAPI: [] },\r\n formId: undefined,\r\n formTitle: ''\r\n }\r\n return fallback\r\n }\r\n}\r\n\r\nexport function formsStoreEffects(store: FormsStoreService) {\r\n const createForm$ = store.rxEffect((form$: Observable<FormInterface>) =>\r\n form$.pipe(\r\n concatMap((form) =>\r\n concat(\r\n of(store.actions.toggleFormBuilderBusy()),\r\n of(store.actions.setError({ error: undefined, type: FormStateErrors.CreateForm })),\r\n store.resourceFunctions?.createForm(form).pipe(\r\n map(() => {\r\n store.actions.toggleFormBuilderBusy();\r\n store.resourceFunctions?.toastSuccess('Form created successfully');\r\n store.resourceFunctions?.formBuilderCloseButton.onClick()\r\n return form;\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n store.actions.toggleFormBuilderBusy();\r\n const msg = error.message || error.error?.message || 'An error occurred while creating the form';\r\n store.resourceFunctions?.toastError(msg);\r\n store.actions.setError({ error: msg, type: FormStateErrors.CreateForm });\r\n return EMPTY;\r\n })\r\n ) || EMPTY\r\n )\r\n )\r\n )\r\n );\r\n\r\n const loadForms$ = store.rxEffect((trigger$: Observable<void>) =>\r\n trigger$.pipe(\r\n switchMap(() => store.selectors.selectFormListSection$),\r\n switchMap((section) => {\r\n store.actions.toggleLoadingForms({ loadingForms: true });\r\n store.actions.setError({ error: undefined, type: FormStateErrors.LoadForms });\r\n if (section === FormListSection.ARCHIVED) {\r\n return store.resourceFunctions?.loadArchivedForms().pipe(\r\n map((forms) => {\r\n store.actions.loadFormListSuccess({ forms });\r\n\r\n store.resourceFunctions?.toastSuccess('Forms loaded successfully');\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n const msg = error.message || error.error?.message || 'An error occurred while loading the forms';\r\n store.actions.setError({ error: msg, type: FormStateErrors.LoadForms });\r\n return EMPTY;\r\n }),\r\n finalize(() => store.actions.toggleLoadingForms({ loadingForms: false }))\r\n ) || EMPTY;\r\n }\r\n\r\n \r\n return store.resourceFunctions?.loadForms().pipe(\r\n map((forms) =>\r\n store.actions.loadFormListSuccess({ forms })\r\n\r\n ),\r\n catchError((error: HttpErrorResponse) => {\r\n const msg = error.message || error.error?.message || 'An error occurred while loading the forms';\r\n store.actions.setError({ error: msg, type: FormStateErrors.LoadForms });\r\n return EMPTY;\r\n }),\r\n finalize(() => store.actions.toggleLoadingForms({ loadingForms: false }))\r\n ) || EMPTY;\r\n })\r\n )\r\n );\r\n const setListSection$ = store.rxEffect((listSection$: Observable<FormListSection>): Observable<unknown> =>\r\n listSection$.pipe(\r\n switchMap((listSection) =>\r\n concat(\r\n of(store.actions.handleListSectionChange({ listSection })),\r\n of(loadForms$(of(undefined)))\r\n\r\n )\r\n )\r\n )\r\n );\r\n\r\n const loadForm$ = store.rxEffect((formId$: Observable<string>) =>\r\n formId$.pipe(\r\n switchMap((formId) => {\r\n store.actions.setError({ error: undefined, type: FormStateErrors.GetForm });\r\n store.actions.toggleLoadingForm();\r\n const placeholderForm: FormInterface = {\r\n slides: [],\r\n submissionHandle: { submissionAPI: [] },\r\n formId: undefined,\r\n formTitle: ''\r\n };\r\n const newForm: DatabaseFormInterface = {\r\n form: placeholderForm,\r\n systemDefault: false,\r\n archive: false,\r\n userId: '',\r\n defaultDepartment: '',\r\n _id: '',\r\n createdAt: new Date(0),\r\n updatedAt: new Date(0),\r\n __v: 0,\r\n }\r\n const form$: Observable<DatabaseFormInterface | null> = formId === 'newForm'\r\n ? of(newForm)\r\n : store.resourceFunctions?.getForm(formId) || EMPTY;\r\n\r\n return form$?.pipe(\r\n map((form) => {\r\n\r\n if (form !== null) {\r\n const newForm = {\r\n ...form,\r\n form: {\r\n ...convertOldFormToNewForm(form.form),\r\n \r\n }\r\n }\r\n // Mongo's `_id` can leak into the inner `form` payload after spread; strip it.\r\n // The field is not declared on `FormInterface`, so an indexed delete is required.\r\n delete (newForm.form as Record<string, unknown>)['_id']\r\n store.actions.loadFormSuccess({ form: newForm});\r\n \r\n store.createFormPlaceHolderFormGroups(form.form)\r\n // Defect-2: `newForm.form` is already v2 here, so re-running the\r\n // migration is a proven no-op (see migrationCheck.spec.ts). Use it directly.\r\n store.scheduleExternalRefresh(newForm.form)\r\n store.executeExternalRefreshNow()\r\n \r\n store.resourceFunctions?.toastSuccess('Form loaded successfully');\r\n }\r\n store.actions.toggleLoadingForm();\r\n store.actions.setFormId({ formId });\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n store.actions.toggleLoadingForm();\r\n const msg = error.message || error.error?.message || 'An error occurred while loading the form';\r\n store.resourceFunctions?.toastError(msg);\r\n store.actions.setError({ error: msg, type: FormStateErrors.GetForm });\r\n return EMPTY;\r\n })\r\n );\r\n })\r\n )\r\n );\r\n const updateForm$ = store.rxEffect((form$: Observable<{\r\n form:FormInterface,\r\n versionNumber:number\r\n }>) =>\r\n form$.pipe(\r\n concatMap(({form,versionNumber}) =>\r\n concat(\r\n of(store.actions.toggleFormBuilderBusy()),\r\n of(store.actions.setError({ error: undefined, type: FormStateErrors.UpdateForm })),\r\n store.resourceFunctions?.updateForm(form,versionNumber).pipe(\r\n map((newForm) => {\r\n store.actions.toggleFormBuilderBusy();\r\n store.actions.loadFormSuccess({ form: newForm });\r\n \r\n store.resourceFunctions?.toastSuccess('Form updated successfully');\r\n return form;\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n store.actions.toggleFormBuilderBusy();\r\n const msg = error.message || error.error?.message || 'An error occurred while updating the form';\r\n // D-B5a: real failure feedback on update (mirrors createForm$).\r\n store.resourceFunctions?.toastError(msg);\r\n store.actions.setError({ error: msg, type: FormStateErrors.UpdateForm });\r\n return EMPTY;\r\n })\r\n ) || EMPTY\r\n )\r\n )\r\n )\r\n );\r\n const archiveForm$ = store.rxEffect((formId$: Observable<string>) =>\r\n formId$.pipe(\r\n switchMap((formId) => {\r\n store.actions.setError({ error: undefined, type: FormStateErrors.ArchiveForm });\r\n store.actions.toggleFormBusy({ formId });\r\n return store.resourceFunctions?.archiveForm(formId).pipe(\r\n map((response) => {\r\n store.actions.archivedSuccess({ formId });\r\n store.actions.toggleLoadingForm();\r\n store.resourceFunctions?.toastSuccess(`Form archived successfully`);\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n store.actions.toggleFormBusy({ formId });\r\n const msg = error.message || error.error?.message || 'An error occurred while archiving the form';\r\n store.actions.setError({ error: msg, type: FormStateErrors.ArchiveForm });\r\n return EMPTY;\r\n })\r\n ) || EMPTY;\r\n })\r\n )\r\n );\r\n const unArchiveForm$ = store.rxEffect((formId$: Observable<string>) =>\r\n formId$.pipe(\r\n switchMap((formId) => {\r\n store.actions.setError({ error: undefined, type: FormStateErrors.ArchiveForm });\r\n store.actions.toggleFormBusy({ formId });\r\n return store.resourceFunctions?.unArchiveForm(formId).pipe(\r\n map((response) => {\r\n store.actions.archivedSuccess({ formId });\r\n store.actions.toggleLoadingForm();\r\n store.resourceFunctions?.toastSuccess(`Form restored successfully`);\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n store.actions.toggleFormBusy({ formId });\r\n const msg = error.message || error.error?.message || 'An error occurred while restoring the form';\r\n store.actions.setError({ error: msg, type: FormStateErrors.ArchiveForm });\r\n return EMPTY;\r\n })\r\n ) || EMPTY;\r\n })\r\n )\r\n );\r\n const deleteForm$ = store.rxEffect((formId$: Observable<string>) =>\r\n formId$.pipe(\r\n switchMap((formId) => {\r\n store.actions.setError({ error: undefined, type: FormStateErrors.ArchiveForm });\r\n store.actions.toggleFormBusy({ formId });\r\n return store.resourceFunctions?.deleteForm(formId).pipe(\r\n map((response) => {\r\n store.actions.archivedSuccess({ formId });\r\n store.actions.toggleLoadingForm();\r\n store.resourceFunctions?.toastSuccess(`Form deleted successfully`);\r\n }),\r\n catchError((error: HttpErrorResponse) => {\r\n store.actions.toggleFormBusy({ formId });\r\n const msg = error.message || error.error?.message || 'An error occurred while deleting the form';\r\n store.actions.setError({ error: msg, type: FormStateErrors.ArchiveForm });\r\n return EMPTY;\r\n })\r\n ) || EMPTY;\r\n })\r\n )\r\n );\r\n // const submitForm$ = store.rxEffect((passData$: Observable<any>) =>\r\n // passData$.pipe(\r\n // withLatestFrom(store.FormBuilderServiceInstance.asObservable()),\r\n // switchMap(([passData,formInstance]) => {\r\n // if (!formInstance) {\r\n // return EMPTY;\r\n // }\r\n // store.actions.handleSetSubmittingForm({ submittingForm: true });\r\n // return formHttpSubmissions(formInstance,passData).pipe(\r\n // tap(() => {\r\n // store.resourceFunctions?.formSubmittedSuccessfully(formInstance.form.formId);\r\n // store.actions.handleSetSubmittingForm({ submittingForm: false });\r\n // }),\r\n // catchError((error) => {\r\n // store.actions.handleSetSubmittingForm({ submittingForm: false });\r\n // console.error('Error in submitForm:', error);\r\n // return EMPTY;\r\n // })\r\n // )\r\n \r\n \r\n \r\n \r\n // })\r\n // )\r\n \r\n // )\r\n\r\n return {\r\n createForm$,\r\n loadForms$,\r\n loadForm$,\r\n updateForm$,\r\n archiveForm$,\r\n setListSection$,\r\n unArchiveForm$,\r\n deleteForm$,\r\n\r\n };\r\n}","import { MonoTypeOperatorFunction, shareReplay } from 'rxjs';\n\n/**\n * Multicasts a derived selector so overlapping subscribers share a single\n * upstream run instead of each re-running the `map`/`switchMap` chain\n * (FORM_BUILDER_SIGNAL_STORE_PLAN A-4 / P2).\n *\n * - `bufferSize: 1` replays the latest value to late subscribers, preserving\n * the synchronous \"current value on subscribe\" semantics of the underlying\n * ComponentStore selectors.\n * - `refCount: true` tears down the upstream when the last subscriber leaves\n * and re-runs it on the next subscription — so an idle selector holds no\n * live subscription.\n */\nexport function shareLatest<T>(): MonoTypeOperatorFunction<T> {\n return shareReplay<T>({ bufferSize: 1, refCount: true });\n}\n","import { catchError, distinctUntilChanged, map, of, switchMap } from \"rxjs\";\nimport { FormsStoreService } from \"./forms-store.service\";\n\nimport { DefaultInputConfig, DefaultInputConfigInterface, ElementTypes, validateForm } from 'ngx-t-forms-types';\nimport { validateFormColumnInputsWithRequired } from 'ngx-t-forms-types';\nimport type { AllFormInputPrimaryKeys, FormInputKeys, ValidationError } from 'ngx-t-forms-types';\nimport { missingConfig } from \"../../../services/core/t-form-builder/functions/formCanSave\";\nimport { inputElementEditorConfigs } from \"../../../services/core/t-form-builder/functions/inputElementEditorConfigs\";\nimport { validateFormSlide } from \"ngx-t-forms-types\";\nimport { returnAnyFormInputFromForm } from \"../functions/findFormInput\";\nimport { allFormInputs } from \"../../../services/core/t-form-tower-controller/functions/allFormInputs\";\nimport { generateSystemInputs } from \"../functions/generateSystemInputs\";\nimport { _isEqual } from \"../../../shared/functions/isEqual\";\nimport { shareLatest } from \"./share-latest\";\n\n/** Element keys actually present in `DefaultInputConfigInterface`. */\ntype ConfiguredElementType = keyof DefaultInputConfigInterface;\n/** Required-key list shape consumed by `validateFormColumnInputsWithRequired`. */\ntype RequiredKeyList = ReadonlyArray<FormInputKeys | AllFormInputPrimaryKeys>;\n\n\nexport function formsFormBuilderStoreSelectors(store: FormsStoreService) {\n const defaultInputs: DefaultInputConfigInterface = { ...DefaultInputConfig }\n\n // Shared upstream for ~12 derived selectors: multicast the `form?.form` map\n // so each consumer doesn't re-run the projection (A-4 / P2).\n const selectFormInEdit$ = store.selectors.selectFormInEdit$.pipe(map(form => form?.form), shareLatest())\n const selectFormSlides$ = selectFormInEdit$.pipe(map(form => [...form?.slides || []]), shareLatest())\n const selectFormSlideSections$ = selectFormSlides$.pipe(map(slides => slides.map(slide => ({\n ...slide,\n inputConfigErrors: validateFormSlide(slide)\n }))), shareLatest())\n const missingConfig$ = selectFormInEdit$.pipe(map(form => missingConfig(form)), shareLatest())\n const canSaveForm$ = store.selectors.selectFormBuilderIsBusy$.pipe(switchMap(isBusy => isBusy ? of(false) : selectFormInEdit$.pipe(\n map(form => form !== undefined ? validateForm(form).length === 0 : false)\n )), shareLatest())\n const hasMissingConfigs$ = canSaveForm$.pipe(map((canSave) => !canSave), shareLatest())\n const isNewForm$ = selectFormInEdit$.pipe(map((form) => !form?.formId), shareLatest())\n const formErrors$ = selectFormInEdit$.pipe(map(form => form === null ? [{\n message: 'Form is empty',\n key: 'form'\n }] : validateForm(form as Parameters<typeof validateForm>[0])), shareLatest())\n const formValidationErrorsMessages$ = formErrors$.pipe(map(formErrors => {\n const errors: ReadonlyArray<ValidationError> = formErrors || [];\n const errorCounts = errors.reduce<Record<string, number>>((acc, error) => {\n acc[error.message] = (acc[error.message] || 0) + 1;\n return acc;\n }, {});\n return Object.entries(errorCounts).map(([message, count]) =>\n count > 1 ? `${message} × ( ${count} )` : message\n );\n }), shareLatest())\n const inputInEdit$ = store.selectors.selectInputInEditId$.pipe(\n switchMap((inputInEditId) => {\n return selectFormInEdit$.pipe(\n map(form => form && inputInEditId !== null ? returnAnyFormInputFromForm(form, inputInEditId) : undefined),\n distinctUntilChanged((prev, curr) => _isEqual(prev, curr))\n )\n\n }),\n shareLatest()\n );\n const defaultInputInEdit$ = inputInEdit$.pipe(map((inputInEdit) => {\n if (!inputInEdit) return null;\n const element = inputInEdit.element as ConfiguredElementType;\n return defaultInputs[element] ?? null;\n }), shareLatest())\n const inputInEditValidationErrors$ = selectFormInEdit$.pipe(switchMap(form => {\n return inputInEdit$.pipe(map(inputInEdit => {\n\n const allInputs = form?.slides.flatMap(slide => slide.columns) || []\n const parentInput = allInputs.find(input => input.id === inputInEdit?.multipleInputInEditId)\n\n if (!inputInEdit || !inputInEdit.element) return []\n\n const editingNewInput = !inputInEdit?.id\n const elementKey = inputInEdit.element as ConfiguredElementType;\n // `requiredProperties` on the configured-element entry is `(FormInputKeys | AllFormInputPrimaryKeys | SpecialElementKeys)[]`,\n // but `RequiredKeyList` only narrows to the first two. The third (SpecialElementKeys) is filtered at the validator boundary.\n const requiredKeys = (defaultInputs[elementKey]?.requiredProperties ?? []) as RequiredKeyList;\n const inputAsRecord: Record<string, unknown> = { ...inputInEdit };\n if (!editingNewInput) {\n return validateFormColumnInputsWithRequired({\n data: inputAsRecord,\n requiredKeys: [...requiredKeys]\n })\n }\n\n // Improved duplicate check logic\n const isDuplicateFormControl = () => {\n if (!inputInEdit.formControlName) return false\n if (parentInput) {\n return parentInput.formInputs?.some(input =>\n input.formControlName === inputInEdit.formControlName\n ) || false\n }\n return allInputs.some(input =>\n input.formControlName === inputInEdit.formControlName\n )\n }\n\n const duplicateError = isDuplicateFormControl()\n ? [{ key: 'formControlName', message: 'Form control name must be unique' }]\n : []\n\n return [...duplicateError, ...validateFormColumnInputsWithRequired({\n data: inputAsRecord,\n requiredKeys: [...requiredKeys]\n })]\n }))\n\n }), shareLatest()\n )\n const selectFormTitle$ = selectFormInEdit$.pipe(map((form) => form?.formTitle), shareLatest())\n\n\n const getAllFormInputs$ = selectFormInEdit$.pipe(\n switchMap(form => {\n // Antifragile: Handle null form immediately\n if (!form) return of([]);\n\n const globalDates$ = store?.NGX_T_FORMS_CONFIG.formBuilder.getFinacialCycles() || of(null);\n\n return globalDates$.pipe(\n map(globalVariables => {\n const existingInputs = (allFormInputs(form) ?? []).filter(input => input.element !== ElementTypes.SectionTitle)\n\n // Safety: Centralize the fallback ID\n const firstSectionId = form?.slides?.[0]?.columns?.[0]?.sectionId\n ?? \"f5d2b4ad-f6e1-49d2-b7eb-00acab05eb76\";\n\n const systemDefaultInputs = generateSystemInputs(globalVariables, firstSectionId);\n return [...existingInputs, ...systemDefaultInputs];\n }),\n // Error Catching: Ensure the stream doesn't die if mapping fails\n catchError(() => {\n return of(allFormInputs(form) ?? []);\n })\n );\n }),\n // Performance: Only emit if the resulting input array actually changes\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\n catchError(() => {\n return of([]);\n }),\n shareLatest()\n );\n\n\n\n\n const inputElementEditorConfigs$ = inputInEdit$.pipe(switchMap((inputInEdit) => selectFormInEdit$.pipe(\n map(form => inputElementEditorConfigs(form, inputInEdit, store.NGX_T_FORMS_CONFIG, store.utils))\n )), shareLatest())\n\n\n return {\n\n\n selectFormSlides$,\n missingConfig$,\n canSaveForm$,\n isNewForm$,\n hasMissingConfigs$,\n formErrors$,\n formValidationErrorsMessages$,\n\n inputInEdit$,\n defaultInputInEdit$,\n inputInEditValidationErrors$,\n selectFormTitle$,\n getAllFormInputs$,\n\n inputElementEditorConfigs$,\n selectFormSlideSections$\n\n }\n\n}\n","import { CdkDragDrop, } from \"@angular/cdk/drag-drop\";\r\nimport { FormInterface } from \"ngx-t-forms-types\";\r\n\r\n\r\n// CdkDragDrop is invariant in T (container.dropped.emit). Callers pass concrete T;\r\n// internal helper keeps `any` to accept all caller shapes — preserved per cross-package CDK contract.\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function sectionDrop(event: CdkDragDrop<any>, form:FormInterface): FormInterface | undefined {\r\n try {\r\n let slides = form.slides;\r\n let temp = slides[event.previousIndex];\r\n let current = slides[event.currentIndex];\r\n if (temp && current) {\r\n slides[event.previousIndex] = current;\r\n slides[event.currentIndex] = temp;\r\n \r\n return {\r\n ...form,\r\n slides\r\n }\r\n }\r\n return form\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to drop section';\r\n throw new Error(message);\r\n }\r\n\r\n\r\n \r\n \r\n}","\r\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { FormInterface } from 'ngx-t-forms-types';\r\n\r\n// CdkDragDrop is invariant in T. Internal helper keeps `any` to accept all caller shapes.\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function moveFormInput(event: CdkDragDrop<any>, sectionId: string, form: FormInterface): FormInterface | undefined {\r\n try {\r\n let slide = form.slides.find((slide) => slide.sectionId === sectionId)\r\n if (!slide) return;\r\n let columns = [...[], ...slide.columns]\r\n if (!columns) return;\r\n\r\n moveItemInArray(columns, event.previousIndex, event.currentIndex);\r\n const newForm = {\r\n ...form,\r\n slides: form.slides.map((slide) => {\r\n if (slide.sectionId === sectionId) {\r\n return {\r\n ...slide,\r\n columns: columns\r\n }\r\n }\r\n return slide\r\n })\r\n }\r\n return form = {\r\n ...newForm\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to move form input';\r\n throw new Error(message);\r\n }\r\n\r\n\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport function moveMultipleInputInput(parentId: string, event: CdkDragDrop<any>, form: FormInterface): FormInterface | undefined {\r\n try {\r\n const parentInput = form.slides.flatMap(slide => slide.columns).find(column => column.id === parentId);\r\n\r\n if (!parentInput) return;\r\n const columns = [...(parentInput.formInputs || [])]\r\n moveItemInArray(columns, event.previousIndex, event.currentIndex);\r\n\r\n return {\r\n ...form,\r\n slides: form.slides.map((slide) => {\r\n if (slide.sectionId === parentInput.sectionId) {\r\n return {\r\n ...slide,\r\n columns: slide.columns.map((column) => {\r\n if (column.id === parentInput.id) {\r\n return {\r\n ...parentInput,\r\n formInputs: [...[], ...columns]\r\n }\r\n\r\n }\r\n return column\r\n })\r\n }\r\n }\r\n return slide\r\n })\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to move multiple input';\r\n throw new Error(message);\r\n\r\n }\r\n\r\n}","\r\n\r\nimport { FormInterface, FormSlideInterface } from 'ngx-t-forms-types';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nexport function addNewSection(form:FormInterface): FormInterface {\r\n\r\n try {\r\n const sectionID = uuidv4()\r\n let newSlide: FormSlideInterface= {\r\n sectionId: sectionID,\r\n columns: [],\r\n label: \"\",\r\n \r\n };\r\n\r\n \r\n return {\r\n ...form,\r\n slides: [...form.slides, newSlide]\r\n }\r\n \r\n \r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to add new section';\r\n throw new Error(message);\r\n }\r\n \r\n \r\n}\r\n\r\n","import { FormInterface } from \"ngx-t-forms-types\";\r\n\r\n\r\nexport function stepTitleChangeStepFn(sectionId: string, value: string,form:FormInterface) {\r\n try {\r\n\r\n return {\r\n ...form,\r\n slides: form.slides.map((step) => ({\r\n ...step,\r\n label: step.sectionId === sectionId ? value : step.label\r\n }))\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to change step title';\r\n throw new Error(message);\r\n }\r\n}","import { FormColumnInputs, FormInterface } from \"ngx-t-forms-types\";\r\n\r\nexport function removeItem(\r\n item: FormColumnInputs,\r\n form: FormInterface\r\n) {\r\n\r\n try {\r\n\r\n \r\n const newForm = {\r\n ...form,\r\n slides: form.slides.map((slide) => {\r\n if (slide.sectionId === item.sectionId) {\r\n return {\r\n ...slide,\r\n columns: slide.columns.map((column) => {\r\n if(column.id === item?.multipleInputInEditId){\r\n return {\r\n ...column,\r\n formInputs: column.formInputs?.filter((input) => input.id !== (item.originalId || item.id)) || []\r\n }\r\n }\r\n if(column.id === item.id){\r\n return undefined\r\n }\r\n return column\r\n }).filter((column) => column !== undefined)\r\n }\r\n }\r\n return slide\r\n })\r\n \r\n }\r\n \r\n return newForm\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to remove item';\r\n throw new Error(message);\r\n }\r\n\r\n}","import { FormColumnInputs, FormInterface } from \"ngx-t-forms-types\";\r\n\r\n\r\nexport function multipleInputToggleLabelFn(\r\n item: FormColumnInputs,\r\n form: FormInterface\t\r\n): FormInterface| undefined {\r\n // Get parent input that contains the target item\r\n if(!item.sectionId || !item.multipleInputInEditId) return form;\r\n\r\n try {\r\n \r\n return {\r\n ...form,\r\n slides: form.slides.map((slide) =>{\r\n if(slide.sectionId === item.sectionId){\r\n return ({\r\n ...slide,\r\n columns: slide.columns.map((column) => {\r\n if(column.id === item.multipleInputInEditId){\r\n return ({\r\n ...column,\r\n formInputs: column.formInputs?.map((input) => {\r\n if(input.id === (item.originalId || item.id)){\r\n return ({\r\n ...input,\r\n showAsLabel: !input.showAsLabel\r\n })\r\n }\r\n return input\r\n })\r\n })\r\n }\r\n return column\r\n })\r\n })\r\n\r\n }\r\n return slide\r\n\r\n }\r\n \r\n \r\n )\r\n }\r\n \r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n","import { ElementTypes, FormColumnInputs, FormInterface, IMultipleInputCal } from \"ngx-t-forms-types\";\r\nimport { returnAnyFormInputFromForm } from \"../../../../components/forms/functions/findFormInput\";\r\n\r\n\r\nexport function addMultipleInputFunction(\r\n calculationFunction: IMultipleInputCal, \r\n multipleInputId: string | undefined, \r\n form: FormInterface\r\n): FormInterface | undefined {\r\n if (!multipleInputId) {\r\n return form; \r\n }\r\n const parentInput = returnAnyFormInputFromForm(form, multipleInputId);\r\n if(!parentInput || parentInput.element !== ElementTypes.MultipleInput) return form;\r\n\r\n \r\n return {\r\n ...form,\r\n slides: form.slides.map((slide) => {\r\n if (slide.sectionId === parentInput?.sectionId) {\r\n return {\r\n ...slide,\r\n columns: slide.columns.map((column) => {\r\n if (column.id === multipleInputId) {\r\n return toggleCalculationFunction(calculationFunction, column);\r\n }\r\n return column;\r\n })\r\n }\r\n }\r\n return slide;\r\n })\r\n }\r\n}\r\n\r\n\r\nfunction toggleCalculationFunction(\r\n calculationFunction: IMultipleInputCal,\r\n parentInput: FormColumnInputs\r\n): FormColumnInputs {\r\n const existingFunction = findExistingCalculationFunction(\r\n calculationFunction,\r\n parentInput\r\n );\r\n\r\n if (existingFunction) {\r\n return removeCalculationFunction(calculationFunction, parentInput);\r\n } else {\r\n return addCalculationFunction(calculationFunction, parentInput);\r\n }\r\n\r\n \r\n}\r\n\r\nfunction findExistingCalculationFunction(\r\n calculationFunction: IMultipleInputCal,\r\n parentInput:FormColumnInputs\r\n): IMultipleInputCal | undefined {\r\n return parentInput.calculateListFunctions.find(\r\n (f) => f.inputId === calculationFunction.inputId && f.func === calculationFunction.func\r\n );\r\n}\r\n\r\nfunction removeCalculationFunction(\r\n calculationFunction: IMultipleInputCal,\r\n parentInput: FormColumnInputs\r\n): FormColumnInputs {\r\n\r\n return {\r\n ...parentInput,\r\n calculateListFunctions : parentInput.calculateListFunctions.filter(\r\n (f) => f.inputId !== calculationFunction.inputId && f.func !== calculationFunction.func\r\n )\r\n }\r\n}\r\n\r\nfunction addCalculationFunction(\r\n calculationFunction: IMultipleInputCal,\r\n parentInput: FormColumnInputs\r\n): FormColumnInputs {\r\n // Create a new array with the existing functions plus the new one\r\n\r\n return{\r\n ...parentInput,\r\n calculateListFunctions:[\r\n ...parentInput.calculateListFunctions,\r\n calculationFunction\r\n ]\r\n }\r\n}","import { FormInterface } from \"ngx-t-forms-types\";\r\n\r\n;\r\n\r\nexport function deleteActiveSection(form:FormInterface,sectionId:string):FormInterface {\r\n try {\r\n \r\n return {\r\n \r\n ...form,\r\n slides: form.slides.filter(slide => slide.sectionId !== sectionId && slide.columns.some(\r\n c=>c.systemDefault === true\r\n ) === false),\r\n }\r\n \r\n \r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to delete section';\r\n throw new Error(message);\r\n }\r\n\r\n}\r\nexport const deleteActiveSectionInputs = (form:FormInterface,sectionId:string):FormInterface => {\r\n try{\r\n const sectionInputsIds = form.slides\r\n .filter(slide => slide.sectionId === sectionId).flatMap(slide => slide.columns.map(col => col.id))\r\n return {\r\n ...form,\r\n slides: form.slides.map(slide => ({\r\n ...slide,\r\n columns: slide.columns.filter(col => !sectionInputsIds.includes(col.id))\r\n }))\r\n }\r\n\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to delete section inputs';\r\n throw new Error(message);\r\n }\r\n}","import { FormColumnInputs, FormInterface } from \"ngx-t-forms-types\";\r\n\r\n\r\nexport function moveInputToSectionFn(\r\n form: FormInterface,\r\n inputId: string,\r\n targetSection: string\r\n): FormInterface {\r\n try {\r\n const input = validateMoveOperation(targetSection, inputId, form);\r\n if(!input) return form;\r\n const sourceSection = input.sectionId;\r\n\r\n return createUpdatedForm(\r\n form,\r\n inputId,\r\n sourceSection,\r\n targetSection,\r\n input\r\n );\r\n \r\n } catch (error) {\r\n \r\n const msg = error instanceof Error ? error.message : 'Failed to move input to section';\r\n throw new Error(msg);\r\n }\r\n\r\n}\r\n\r\nfunction validateMoveOperation(\r\n targetSection: string,\r\n inputId: string,\r\n form: FormInterface\r\n): FormColumnInputs | undefined {\r\n if (!targetSection && !form.slides.find(slide => slide.sectionId === targetSection)) {\r\n throw new Error('Target section not found');\r\n }\r\n const input = form.slides.flatMap(slide => slide.columns).find(input => input.id === inputId);\r\n \r\n if (!input) {\r\n throw new Error('Input not found');\r\n }\r\n\r\n if (!input.sectionId) {\r\n throw new Error('Source section not found');\r\n }\r\n return input;\r\n}\r\n\r\nfunction createUpdatedForm(\r\n currentForm: FormInterface,\r\n inputId: string,\r\n sourceSection: string,\r\n targetSection: string,\r\n inputData: FormColumnInputs\r\n): FormInterface {\r\n return {\r\n ...currentForm,\r\n slides: currentForm.slides.map(slide => {\r\n if (slide.sectionId === sourceSection) {\r\n return {\r\n ...slide,\r\n columns: slide.columns.filter(col => col.id !== inputId)\r\n };\r\n }\r\n if (slide.sectionId === targetSection) {\r\n return {\r\n ...slide,\r\n columns: [...slide.columns, { \r\n ...inputData, \r\n sectionId: targetSection,\r\n formInputs: Array.isArray(inputData.formInputs) ? inputData.formInputs.map(\r\n i=>({\r\n ...i,\r\n sectionId: targetSection\r\n })\r\n ) : inputData.formInputs\r\n }]\r\n };\r\n }\r\n return slide;\r\n })\r\n };\r\n}\r\n\r\n","import { FormColumnInputs, FormInterface } from \"ngx-t-forms-types\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { returnAnyFormInputFromForm } from \"./findFormInput\";\r\n\r\nexport const cloneCopyFormInputFn = (form: FormInterface, inputId: string): FormInterface => {\r\n\r\n try {\r\n const inputToClone = form.slides.find(slide => slide.columns\r\n .find(column => column.id === inputId))\r\n ?.columns.find(column => column.id === inputId);\r\n if (!inputToClone) {\r\n return form;\r\n }\r\n const newInput = {\r\n ...inputToClone,\r\n label: inputToClone.label + '_copy',\r\n id: uuidv4()\r\n , formControlName: inputToClone.formControlName + '_copy'\r\n };\r\n return {\r\n ...form,\r\n slides: form.slides.map(slide => {\r\n if (slide.sectionId === inputToClone.sectionId) {\r\n return {\r\n ...slide,\r\n columns: [...slide.columns, newInput]\r\n }\r\n }\r\n return slide;\r\n })\r\n }\r\n\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to clone copy form input';\r\n throw new Error(message);\r\n\r\n }\r\n}\r\nexport const clearInputInEditFn = (form: FormInterface, inputId: string): FormInterface => {\r\n try {\r\n const input = returnAnyFormInputFromForm(form, inputId);\r\n if (!input) {\r\n return form;\r\n }\r\n const sectionId = input.sectionId;\r\n const isInnerInput = input.multipleInputInEditId;\r\n return {\r\n ...form,\r\n slides: form.slides.map(slide => {\r\n if (slide.sectionId !== sectionId) return slide;\r\n return {\r\n ...slide,\r\n columns: slide.columns.map(column => {\r\n if (isInnerInput && column.id === input.multipleInputInEditId) {\r\n return {\r\n ...column,\r\n formInputs: column.formInputs?.map(innerInput => {\r\n if (innerInput.id === inputId) {\r\n return {\r\n id: innerInput.id,\r\n sectionId: innerInput.sectionId,\r\n formControlName: innerInput.formControlName,\r\n multipleInputInEditId: innerInput.multipleInputInEditId,\r\n } as FormColumnInputs\r\n }\r\n return innerInput;\r\n }) || []\r\n }\r\n }\r\n if (column.id === inputId) {\r\n return {\r\n id: column.id,\r\n sectionId: column.sectionId,\r\n formControlName: column.formControlName,\r\n } as FormColumnInputs\r\n }\r\n return column;\r\n })\r\n }\r\n })\r\n }\r\n\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to clear input in edit';\r\n throw new Error(message);\r\n\r\n }\r\n}\r\n\r\n","import { AllFormInputPrimaryKeys, FormColumnInputs, FormInterface, MatDataOptionsInterface } from 'ngx-t-forms-types';\r\n\r\n// ── Cleaner type ───────────────────────────────────────────────────────────────\r\n\r\ntype InputCleaner = (input: FormColumnInputs) => FormColumnInputs;\r\n\r\n// ── 1. Top-level runtime keys ──────────────────────────────────────────────────\r\n\r\n/** Keys that live only in builder UI / runtime state and must never be persisted. */\r\nconst RUNTIME_KEYS: Array<keyof FormColumnInputs> = [\r\n 'formIsOpen', // IMultiple — whether nested form is expanded in builder\r\n 'temporaryHint', // transient hint shown during editing\r\n 'valueUpdatedAt', // runtime timestamp\r\n 'status', // runtime status record\r\n];\r\n\r\nconst cleanRuntimeKeys: InputCleaner = (input) => {\r\n const cleaned: Partial<FormColumnInputs> = { ...input };\r\n for (const key of RUNTIME_KEYS) {\r\n delete cleaned[key];\r\n }\r\n return cleaned as FormColumnInputs;\r\n};\r\n\r\n// ── 2. matOptions — strip runtime-fetched options data ─────────────────────────\r\n\r\nfunction hasFetchedOptionsData(options: MatDataOptionsInterface['options']): boolean {\r\n if (Array.isArray(options)) return options.length > 1;\r\n return !!options && typeof options === 'object' && Object.keys(options).length > 1;\r\n}\r\n\r\n/**\r\n * If matOptions.options was loaded from a datasource (API / MongoDB),\r\n * strip the resolved options array. Only the fetch config should persist —\r\n * not the data that was fetched into it at builder interaction time.\r\n * Custom options (user-typed) are left untouched.\r\n */\r\nconst cleanMatOptions: InputCleaner = (input) => {\r\n const matOptions = input[AllFormInputPrimaryKeys.MatOptions];\r\n if (!matOptions) return input;\r\n\r\n const source = matOptions.fetch?.options?.source;\r\n const isLoadedFromDatasource = !!source && source !== 'customOptions';\r\n\r\n if (!isLoadedFromDatasource || !hasFetchedOptionsData(matOptions.options)) return input;\r\n\r\n return {\r\n ...input,\r\n [AllFormInputPrimaryKeys.MatOptions]: { ...matOptions, options: undefined },\r\n } as FormColumnInputs;\r\n};\r\n\r\n// ── 3. workflowPickerConfig — strip runtime sampleDocument ────────────────────\r\n\r\n/**\r\n * sampleDocument is assembled at runtime by merging fetched workflow documents\r\n * (see elementConfigurationChanged — workflowPickerConfig.workflowId change path).\r\n * Only workflowId and column config should persist; the fetched document snapshot must not.\r\n */\r\nconst cleanWorkflowPickerConfig: InputCleaner = (input) => {\r\n if (!input.workflowPickerConfig?.sampleDocument) return input;\r\n\r\n return {\r\n ...input,\r\n workflowPickerConfig: {\r\n ...input.workflowPickerConfig,\r\n sampleDocument: undefined,\r\n },\r\n } as FormColumnInputs;\r\n};\r\n\r\n\r\n// ── Composition ────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Ordered list of cleaners applied to every input.\r\n * To add a new cleanup rule: implement an InputCleaner and push it here.\r\n */\r\nconst INPUT_CLEANERS: InputCleaner[] = [\r\n cleanRuntimeKeys,\r\n cleanMatOptions,\r\n cleanWorkflowPickerConfig,\r\n];\r\n\r\nfunction applyCleaners(input: FormColumnInputs): FormColumnInputs {\r\n return INPUT_CLEANERS.reduce((cleaned, cleaner) => cleaner(cleaned), input);\r\n}\r\n\r\nfunction cleanInput(input: FormColumnInputs): FormColumnInputs {\r\n const cleaned = applyCleaners(input);\r\n\r\n // Recursively clean nested inputs (multipleInput children)\r\n if (!cleaned.formInputs?.length) return cleaned;\r\n return { ...cleaned, formInputs: cleaned.formInputs.map(cleanInput) };\r\n}\r\n\r\nexport function cleanFormForSave(form: FormInterface): FormInterface {\r\n return {\r\n ...form,\r\n slides: form.slides.map(slide => ({\r\n ...slide,\r\n columns: slide.columns.map(cleanInput),\r\n })),\r\n };\r\n}\r\n","\r\nimport { FormColumnInputs, FormInterface } from 'ngx-t-forms-types';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n/**\r\n * Adds a form input to the form.\r\n * \r\n * @param FormBuilder - The `TFormBuilderService` instance.\r\n */\r\nexport function addFormInputToForm(form:FormInterface,sectionId:string):FormInterface {\r\ntry {\r\n\r\nif(!form ||!sectionId){\r\n throw new Error('Form and sectionId are required');\r\n}\r\n const newInput = {\r\n\r\n id: uuidv4(),\r\n sectionId,\r\n } as FormColumnInputs\r\n\r\nreturn {\r\n ...form,\r\n slides: form.slides.map((slide) => {\r\n if (slide.sectionId === sectionId) {\r\n return {\r\n ...slide,\r\n columns: [...slide.columns, newInput]\r\n }\r\n }\r\n return slide\r\n })\r\n}\r\n\r\n\r\n} catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to add form input to form';\r\n throw new Error(message);\r\n}\r\n}\r\n\r\nexport function addMultipleFormInputFn(form:FormInterface,sectionId:string,multipleInputInEditId:string):FormInterface {\r\n try {\r\n \r\n if(!form ||!sectionId || !multipleInputInEditId){\r\n throw new Error('Form, sectionId and multipleInputInEditId are required');\r\n }\r\n const newInput = {\r\n \r\n id: uuidv4(),\r\n sectionId, \r\n multipleInputInEditId,\r\n formControlName:\"\"\r\n \r\n } as FormColumnInputs\r\n \r\n return {\r\n ...form,\r\n slides: form.slides.map((slide) => {\r\n if (slide.sectionId === sectionId) {\r\n return {\r\n ...slide,\r\n columns: [...slide.columns].map((col)=>{\r\n if(col.id === multipleInputInEditId){\r\n return {\r\n ...col,\r\n formInputs: [...(col.formInputs||[]),newInput]\r\n }\r\n }\r\n return col\r\n })\r\n }\r\n }\r\n return slide\r\n })\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to add form input to form';\r\n throw new Error(message);\r\n }\r\n }","import { DefaultInputConfig, DefaultInputConfigInterface, ElementTypes, FormInterface } from \"ngx-t-forms-types\";\r\nimport { returnAnyFormInputFromForm } from \"./findFormInput\";\r\nconst defaultInputConfig = { ...DefaultInputConfig }\r\nexport const getElementTemplate = <E extends ElementTypes>(element: E): DefaultInputConfigInterface[E] => {\r\n try {\r\n if (!element) {\r\n throw new Error(`Failed to get element template, invalid function arguments provided`);\r\n }\r\n return defaultInputConfig[element];\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to get element template';\r\n throw new Error(message);\r\n }\r\n}\r\nexport const selectInputTemplateFn = (form: FormInterface, inputId: string, element: ElementTypes): FormInterface => {\r\n try {\r\n\r\n if (!form || !inputId) {\r\n throw new Error(`Failed to apply input template, invalid function arguments provided`);\r\n }\r\n const input = returnAnyFormInputFromForm(form, inputId);\r\n if (!input) {\r\n throw new Error(`Failed to apply input template, input with id ${inputId} not found`);\r\n }\r\n const config = defaultInputConfig[element];\r\n if (!config) {\r\n throw new Error(`Failed to apply input template, no default config registered for element ${element}`);\r\n }\r\n const elementTemplate = JSON.parse(JSON.stringify(config.elementTemplate))\r\n\r\n const sectionId = input.sectionId;\r\n\r\n\r\n return {\r\n ...form,\r\n slides: form.slides.map(slide => {\r\n if (slide.sectionId !== sectionId) return slide;\r\n return {\r\n ...slide,\r\n columns: slide.columns.map(column => {\r\n\r\n\r\n if (column.element === ElementTypes.MultipleInput) {\r\n\r\n return {\r\n ...column,\r\n formInputs: column.formInputs?.map(innerInput => {\r\n if (innerInput.id === inputId) {\r\n return {\r\n id: innerInput.id,\r\n formControlName: innerInput.formControlName,\r\n sectionId: innerInput.sectionId,\r\n label: innerInput.label,\r\n ...elementTemplate,\r\n multipleInputInEditId: innerInput.multipleInputInEditId\r\n }\r\n }\r\n return innerInput;\r\n }) || []\r\n }\r\n }\r\n if(column.element === ElementTypes.MscoaSelection) {\r\n return {\r\n ...column,\r\n mscoaConfig:{\r\n ...column.mscoaConfig,\r\n inputs: column.mscoaConfig.inputs.map(mscoaInput => {\r\n if(mscoaInput.id === inputId) {\r\n \r\n return {\r\n id: mscoaInput.id,\r\n formControlName: mscoaInput.formControlName,\r\n sectionId: mscoaInput.sectionId,\r\n label: mscoaInput.label,\r\n ...elementTemplate\r\n }\r\n }\r\n return mscoaInput\r\n })\r\n }\r\n }\r\n\r\n }\r\n if (column.id === inputId) {\r\n return {\r\n id: column.id,\r\n formControlName: column.formControlName,\r\n sectionId: column.sectionId,\r\n label: column.label,\r\n\r\n ...elementTemplate\r\n\r\n }\r\n }\r\n \r\n return column\r\n\r\n\r\n })\r\n }\r\n })\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to select input template';\r\n throw new Error(message);\r\n }\r\n}","import { ElementEditorInnerSectionElementInterface, ElementTypes, FormInterface } from 'ngx-t-forms-types';\r\nimport { returnAnyFormInputFromForm } from './findFormInput';\r\nimport { assignDeepPropertyToObject } from '../../../shared';\r\nexport const elementConfigurationChangedFn = (form: FormInterface, inputId: string, configuration: ElementEditorInnerSectionElementInterface, value: unknown): FormInterface => {\r\n try {\r\n if (!form || !inputId || !configuration) {\r\n throw new Error(`Failed to update element configuration, invalid function arguments provided`);\r\n }\r\n const input = {\r\n ...returnAnyFormInputFromForm(form, inputId)\r\n\r\n }\r\n if (!input) {\r\n throw new Error(`Failed to update element configuration, input with id ${inputId} not found`);\r\n }\r\n \r\n if (configuration.clearOnChange) {\r\n configuration.clearOnChange.forEach((clearOnChange) => {\r\n assignDeepPropertyToObject(\r\n input,\r\n clearOnChange,\r\n undefined\r\n );\r\n });\r\n\r\n }\r\n if (configuration.deepBind) {\r\n assignDeepPropertyToObject(\r\n input,\r\n configuration.deepBind,\r\n value\r\n );\r\n }\r\n\r\n const sectionId = input.sectionId;\r\n\r\n const isInnerInput = input.multipleInputInEditId;\r\n return {\r\n ...form,\r\n slides:form.slides.map(slide => {\r\n if(slide.sectionId !== sectionId) return slide;\r\n return {\r\n ...slide,\r\n columns: slide.columns.map(column => {\r\n if(isInnerInput && column.id === input.multipleInputInEditId) {\r\n return {\r\n ...column,\r\n formInputs: column.formInputs?.map(innerInput => {\r\n if(innerInput.id === inputId) {\r\n return {\r\n ...innerInput,\r\n ...input\r\n }\r\n }\r\n return innerInput;\r\n }) || []\r\n }\r\n }\r\n if(column.id === inputId) {\r\n return {\r\n ...column,\r\n ...input\r\n }\r\n }\r\n if(column.element === ElementTypes.MscoaSelection){\r\n return {\r\n ...column,\r\n mscoaConfig: {\r\n ...column.mscoaConfig,\r\n inputs: column.mscoaConfig.inputs?.map(mscoaInput => {\r\n if(mscoaInput.id === inputId) {\r\n return {\r\n ...mscoaInput,\r\n ...input\r\n }\r\n }\r\n return mscoaInput;\r\n }) || []\r\n }\r\n }\r\n }\r\n return column;\r\n })\r\n }\r\n })\r\n }\r\n\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Error updating element configuration';\r\n throw new Error(message);\r\n\r\n }\r\n}","/**\r\n * Converts a string to camel case.\r\n * @param str - The string to be camelized.\r\n * @returns The camelized string.\r\n */\r\nexport function camelize(str: string) {\r\n if (!!str) {\r\n return str\r\n .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, function (word: string, index: number) {\r\n return index === 0 ? word.toLowerCase() : word.toUpperCase();\r\n })\r\n .replace(/\\s+/g, '');\r\n } else {\r\n return;\r\n }\r\n }\r\n ","import { AllFormInputPrimaryKeys, BlurHandleTypes, ElementEditorInnerSectionElementInterface, FormInterface } from \"ngx-t-forms-types\";\r\nimport { returnAnyFormInputFromForm } from \"./findFormInput\";\r\nimport { returnDeepProperty } from \"../../../shared/functions/getDeepObject\";\r\nimport { elementConfigurationChangedFn } from \"./elementConfigurationChanged\";\r\nimport { camelize } from \"../../../shared/functions/camelize\";\r\n\r\nexport const elementBlurFn = (form: FormInterface, inputId: string, event: unknown, element: ElementEditorInnerSectionElementInterface): FormInterface => {\r\n try {\r\n if (!form || !inputId || !element) {\r\n return form;\r\n }\r\n const { blurHandle } = element\r\n if (!blurHandle) {\r\n return form;\r\n }\r\n const input = {\r\n ...returnAnyFormInputFromForm(form, inputId)\r\n }\r\n if (!input) {\r\n throw new Error(`Failed to update element configuration, input with id ${inputId} not found`);\r\n }\r\n\r\n if (blurHandle === BlurHandleTypes.CleanFormControl) {\r\n let v\r\n\r\n const formControlName = String(returnDeepProperty(input, element.deepBind) ?? '')\r\n const dotNotationRegex = /^[^.]+(\\.[^.]+)+$/;\r\n const isDotNotation = dotNotationRegex.test(formControlName);\r\n if(!!isDotNotation){\r\n return form\r\n }\r\n v = camelize(formControlName)?.replace(\r\n /[^a-zA-Z]/g,\r\n ''\r\n );\r\n return elementConfigurationChangedFn(form,inputId,element, v)\r\n }\r\n\r\n if (blurHandle === BlurHandleTypes.PrePopulateFormControl) {\r\n\r\n let v\r\n\r\n const target = (event as Event | undefined)?.target as HTMLInputElement | null;\r\n const targetValue = target?.value ?? '';\r\n const newForm= elementConfigurationChangedFn(form,inputId,element,targetValue)\r\n if (!!input?.id && !!input.formControlName) return newForm;\r\n\r\n v = camelize(input?.label || '')?.replace(\r\n /[^a-zA-Z]/g,\r\n ''\r\n );\r\n return elementConfigurationChangedFn(newForm,inputId, { deepBind: [AllFormInputPrimaryKeys.FormControlName] } as ElementEditorInnerSectionElementInterface,v)\r\n\r\n }\r\n return form;\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Error on element blur';\r\n throw new Error(message);\r\n\r\n }\r\n\r\n}","import { FormInterface, ScoaInnerInput } from \"ngx-t-forms-types\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\nexport function addScoaExtensionInput(form: FormInterface, sectionId: string, scoaInputId: string): FormInterface {\r\n try {\r\n if (!form || !sectionId || !scoaInputId) {\r\n throw new Error('Form, sectionId and scoaExtensionInputInEditId are required');\r\n }\r\n // ScoaInnerInput is the actual element type stored in `mscoaConfig.inputs`.\r\n // A stubbed extension entry carries only id + sectionId until the user fills it.\r\n const newInput = {\r\n id: uuidv4(),\r\n sectionId,\r\n } as Partial<ScoaInnerInput> as ScoaInnerInput;\r\n return {\r\n ...form,\r\n slides: form.slides.map((slide) => {\r\n if (slide.sectionId === sectionId) {\r\n return {\r\n ...slide,\r\n columns: [...slide.columns].map((col) => {\r\n if (col.id === scoaInputId) {\r\n return {\r\n ...col,\r\n mscoaConfig:{\r\n ...col.mscoaConfig,\r\n inputs:[...col.mscoaConfig.inputs,newInput]\r\n }\r\n };\r\n }\r\n return col;\r\n })\r\n };\r\n }\r\n return slide;\r\n })\r\n };\r\n }\r\n catch (error) {\r\n const message = error instanceof Error ? error.message : 'Failed to add scoa extension input to form';\r\n throw new Error(message);\r\n }\r\n}","import { of } from \"rxjs\";\nimport type { Observable } from \"rxjs\";\nimport { FormsStoreService } from \"./forms-store.service\";\nimport { CdkDragDrop } from \"@angular/cdk/drag-drop\";\nimport { DatabaseFormInterface, FormColumnInputs, } from 'ngx-t-forms-types';\nimport { APIDataFetchingConfigurationInterface, ElementTypes, IMultipleInputCal } from 'ngx-t-forms-types';\n\nimport { FormInterface } from 'ngx-t-forms-types';\nimport type { FormSlideInterface } from 'ngx-t-forms-types';\n\nimport { ElementEditorInnerSectionElementInterface } from 'ngx-t-forms-types';\nimport { assignDeepPropertyToObject } from \"../../../shared\";\n\n/**\n * Generic drag-drop event whose container payload is not load-bearing for the\n * wrapper. Downstream `sectionDrop` / `moveFormInput` only read indexes.\n */\ntype AnyDragDropEvent<TData = unknown> = CdkDragDrop<TData, TData, unknown>;\n\nimport { sectionDrop } from \"../../../services/core/t-form-builder/functions/sectionDrop\";\nimport { moveFormInput, moveMultipleInputInput } from \"../../../services/core/t-form-builder/functions/moveFormInput\";\nimport { addNewSection } from \"../../../services/core/t-form-builder/functions/addNewSection\";\nimport { stepTitleChangeStepFn } from \"../../../services/core/t-form-builder/functions/stepTitleChangeStep\";\nimport { removeItem } from \"../../../services/core/t-form-builder/functions/removeItem\";\nimport { multipleInputToggleLabelFn } from \"../../../services/core/t-form-builder/functions/multipleInputToggleLabel\";\nimport { addMultipleInputFunction } from \"../../../services/core/t-form-builder/functions/addMultipleInputFunction\";\nimport { deleteActiveSection, deleteActiveSectionInputs } from \"../../../services/core/t-form-builder/functions/deleteSection\";\nimport { moveInputToSectionFn } from \"../../../services/core/t-form-builder/functions/moveInputToDiffSection\";\nimport { clearInputInEditFn, cloneCopyFormInputFn } from \"../functions/cloneCopyFormInput\";\nimport { cleanFormForSave } from \"../functions/cleanFormForSave\";\nimport { addFormInputToForm, addMultipleFormInputFn } from \"../../../services/core/t-form-builder/functions/addFormInputToForm\";\nimport { selectInputTemplateFn } from \"../functions/selectInputTemplate\";\nimport { elementConfigurationChangedFn } from \"../functions/elementConfigurationChanged\";\nimport { elementBlurFn } from \"../functions/elementBlur\";\nimport { FormControl } from '@angular/forms';\nimport { HintType } from \"../../../shared/functions/textIconsForUserHints\";\nimport { addScoaExtensionInput } from \"../../../services/core/t-form-builder/functions/addScoaExtensionInput\";\nimport { deepMerge } from \"../../../services/core/t-form-tower-controller/functions/updateFormInputConfig\";\n\nexport function formBuilderStoreActions(store: FormsStoreService) {\n\n /**\n * Single writer for every form-mutating builder command (plan §2 A-1 / §5.3).\n *\n * Reproduces the historical `handleEditorUpdateFormInEdit → scheduleExternalRefresh\n * → executeExternalRefreshNow → showMessage` sequence. `flush` defaults to `true`;\n * the five schedule-only commands pass `flush: false`. The optional `message`\n * tuple fires after the refresh, matching the original ordering.\n */\n const applyForm = (\n next: FormInterface | undefined,\n opts?: { flush?: boolean; message?: readonly [string, HintType] }\n ): void => {\n if (!next) return;\n store.actions.handleEditorUpdateFormInEdit({ form: next });\n store.scheduleExternalRefresh(next);\n if (opts?.flush !== false) store.executeExternalRefreshNow();\n if (opts?.message) store.showMessage(opts.message[0], opts.message[1]);\n };\n\n const handelSaveForm = () => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const _id = form._id;\n // D-B5a: no optimistic success message — the real success/error feedback\n // is emitted from the create/update effect's HTTP result.\n if (_id) {\n store.effects.updateForm$(of({ form: cleanFormForSave({ ...form.form, formId: _id }), versionNumber: form.__v || 0 }));\n } else {\n store.effects.createForm$(of(cleanFormForSave(form.form)));\n }\n };\n const setFormTitle = (title: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = { ...form.form, formTitle: title } as FormInterface;\n applyForm(newForm, { flush: false });\n };\n const handleSectionDragDrop = (event: AnyDragDropEvent<FormSlideInterface[]>) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = sectionDrop(event, form.form);\n applyForm(newForm);\n };\n const handleInputDragDrop = (event: AnyDragDropEvent<FormColumnInputs[]>, sectionId: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = moveFormInput(event, sectionId, form.form);\n applyForm(newForm);\n };\n const handleAddSection = () => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = addNewSection(form.form);\n if (!newForm) return;\n const newSection = newForm.slides[newForm.slides.length - 1]?.sectionId;\n if (newSection === undefined) return;\n store.sectionPlaceholder[newSection] = new FormControl();\n applyForm(newForm, { message: ['Section added, proceed to add section inputs', HintType.DOCUMENT] });\n };\n const stepTitleChangeStep = (sectionId: string, title: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = stepTitleChangeStepFn(sectionId, title, form.form);\n applyForm(newForm);\n };\n\n const formDeleteInput = (item: FormColumnInputs) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = removeItem(item, form.form);\n applyForm(newForm, { message: ['Input deleted. Add new inputs.', HintType.CRITICAL] });\n };\n const multipleInputToggleLabel = (item: FormColumnInputs) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = multipleInputToggleLabelFn(item, form.form);\n applyForm(newForm, { flush: false });\n };\n const editInput = (item: FormColumnInputs) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n // Because the originalId is the id of the input before it was cloned\n store.actions.setInputInEditId({ inputInEdit: item.originalId || item.id });\n store.showMessage('Configure input settings in the edit panel', HintType.SUCCESS);\n };\n const addMultipleInputValueCalculationFunction = (item: IMultipleInputCal, multipleInputId: string | undefined) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = addMultipleInputFunction(item, multipleInputId, form.form);\n applyForm(newForm);\n };\n const formDeleteSection = (sectionId: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = deleteActiveSection(form.form, sectionId);\n if (!newForm) return;\n delete store.sectionPlaceholder[sectionId];\n applyForm(newForm, { message: ['Section deleted', HintType.CRITICAL] });\n };\n const formDeleteSectionInputs = (sectionId: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = deleteActiveSectionInputs(form.form, sectionId);\n applyForm(newForm, { message: ['Section inputs deleted', HintType.CRITICAL] });\n };\n\n\n const moveInputToSection = (inputId: string, targetSectionId: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = moveInputToSectionFn(form.form, inputId, targetSectionId);\n applyForm(newForm);\n };\n const reorderMultipleInputItems = (event: AnyDragDropEvent<FormColumnInputs[]>, multipleInputId: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = moveMultipleInputInput(multipleInputId, event, form.form);\n applyForm(newForm);\n };\n const cloneCopyFormInput = (inputId: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = cloneCopyFormInputFn(form.form, inputId);\n applyForm(newForm, { message: ['Input cloned, proceed to configure the new input', HintType.SUCCESS] });\n };\n\n const saveInput = (sectionId: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = addFormInputToForm(form.form, sectionId);\n applyForm(newForm, { message: ['Input added! Complete the configuration below.', HintType.CRITICAL] });\n };\n const addMultipleFormInput = (sectionId: string, multipleInputInEditId: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = addMultipleFormInputFn(form.form, sectionId, multipleInputInEditId);\n applyForm(newForm);\n };\n const addInputToScoaSelection = (sectionId: string, scoaInputId: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = addScoaExtensionInput(form.form, sectionId, scoaInputId);\n applyForm(newForm);\n };\n const applyFormTemplate = (form: FormInterface) => {\n if (!form) return;\n const newForm = {\n systemDefault: false,\n defaultDepartment: \"\",\n form: {\n formId: undefined,\n formTitle: `${form?.formTitle} - Copy`,\n slides: [...[], ...form.slides],\n },\n } as DatabaseFormInterface;\n store.actions.loadFormSuccess({ form: newForm });\n // Refresh external form states\n store.scheduleExternalRefresh(form);\n store.executeExternalRefreshNow();\n };\n const selectInputTemplate = (inputId: string, element: ElementTypes) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = selectInputTemplateFn(form.form, inputId, element);\n applyForm(newForm);\n };\n const formInputChange = (ele: ElementEditorInnerSectionElementInterface, value: unknown) => {\n //REVIEW - This method changes inputs by changing the form object directly. This wont work for nested inputs\n const form = store.formInEditSnapshot();\n if (!form) return;\n const applyTo: FormInterface = { ...form.form };\n if (ele.clearOnChange) {\n ele.clearOnChange.forEach((clear: string[]) => {\n assignDeepPropertyToObject(\n applyTo,\n clear,\n undefined\n );\n });\n }\n if (ele.deepBind) {\n assignDeepPropertyToObject(\n applyTo,\n ele.deepBind,\n value\n );\n }\n const newForm: FormInterface = { ...applyTo };\n applyForm(newForm, { flush: false });\n };\n const saveSubmitApi = (dataPlaceholder: undefined | {\n data: APIDataFetchingConfigurationInterface\n }, keyInEdit: 'submissionAPI' | 'canSubmitAPI' | undefined) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const formClone: FormInterface = {\n ...form.form,\n // `submissionHandle` is optional upstream (D-018b); preserve the\n // existing object (or leave undefined) so we don't synthesize a\n // partial that violates `FormSubmissionHandleInterface`.\n submissionHandle: form.form.submissionHandle\n ? { ...form.form.submissionHandle }\n : undefined\n };\n\n const old: APIDataFetchingConfigurationInterface[] = formClone.submissionHandle?.[keyInEdit || 'submissionAPI'] || [];\n // Check if API with same _id already exists\n const isDuplicate = old.some(api =>\n api._id === dataPlaceholder?.data._id\n );\n if (isDuplicate) {\n // Update existing API instead of adding new one\n const newApis = old.map(api =>\n api._id === dataPlaceholder?.data._id\n ? dataPlaceholder?.data\n : api\n );\n\n assignDeepPropertyToObject(\n formClone,\n ['submissionHandle', keyInEdit || 'submissionAPI'],\n newApis\n );\n } else {\n // Add new API\n const newApis = [...old, dataPlaceholder?.data];\n assignDeepPropertyToObject(\n formClone,\n ['submissionHandle', keyInEdit || 'submissionAPI'],\n newApis\n );\n }\n applyForm(formClone, { message: [\"API configuration saved. Test your integration when ready\", HintType.SUCCESS] });\n };\n const removeSubmissionApi = (api: APIDataFetchingConfigurationInterface, keyInEdit: 'submissionAPI' | 'canSubmitAPI' | undefined) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const formClone = form.form;\n const key = keyInEdit || 'submissionAPI';\n const old: APIDataFetchingConfigurationInterface[] = formClone.submissionHandle?.[key] || [];\n const newApis = old.filter((a) => a._id !== api._id);\n assignDeepPropertyToObject(\n formClone,\n ['submissionHandle', key],\n newApis\n );\n applyForm(formClone, { message: [\"API configuration removed. Update your integrations accordingly.\", HintType.CRITICAL] });\n };\n const elementConfigurationChanged = (\n inputId: string,\n value: unknown,\n ele: ElementEditorInnerSectionElementInterface\n ) => {\n const form = store.formInEditSnapshot();\n const isWorkflowPickerConfigWkIdChange = ele.deepBind.join('.') === 'workflowPickerConfig.workflowId';\n const getWorkflowDocuments = store.NGX_T_FORMS_CONFIG.formBuilder.getWorkflowDocuments;\n type WorkflowDocs = NonNullable<typeof getWorkflowDocuments> extends (...args: never[]) => Observable<infer D> ? D : never;\n // The workflow-documents branch fires only when the edited key is the\n // workflow id AND the host supplied a fetcher — matching the original\n // payload flag (a deepBind match alone keeps the plain config path).\n const shouldFetchWorkflowDocs = isWorkflowPickerConfigWkIdChange && typeof getWorkflowDocuments === 'function';\n const documents$: Observable<WorkflowDocs | undefined> =\n (isWorkflowPickerConfigWkIdChange && typeof getWorkflowDocuments === 'function')\n ? getWorkflowDocuments(\n value as string,\n 1,\n 10,\n { 'createdAt': -1 },\n undefined,\n {}\n )\n : of(undefined);\n store.subscribeBound(documents$, (documents) => {\n if (!form) return;\n let newForm: FormInterface;\n if (shouldFetchWorkflowDocs) {\n const sampleDocument = documents?.formValues.reduce((acc, curr) => {\n\n return {\n ...deepMerge(curr, curr)\n };\n }, {} as Record<string, unknown>);\n newForm = elementConfigurationChangedFn(form.form, inputId, {\n ...ele,\n deepBind: ['workflowPickerConfig']\n }, {\n sampleDocument,\n workflowId: value as string\n });\n } else {\n newForm = elementConfigurationChangedFn(form.form, inputId, ele, value);\n }\n applyForm(newForm, { flush: false });\n });\n };\n const elementBlur = (inputId: string, event: unknown, element: ElementEditorInnerSectionElementInterface) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const { blurHandle } = element;\n if (!blurHandle) {\n return;\n }\n const newForm = elementBlurFn(form.form, inputId, event, element);\n applyForm(newForm, { flush: false });\n };\n const clearInputInEdit = (inputId: string) => {\n const form = store.formInEditSnapshot();\n if (!form) return;\n const newForm = clearInputInEditFn(form.form, inputId);\n applyForm(newForm, { message: [\"Input configuration cleared. Start fresh with new settings\", HintType.CRITICAL] });\n };\n return {\n handelSaveForm,\n setFormTitle,\n handleSectionDragDrop,\n handleInputDragDrop,\n handleAddSection,\n stepTitleChangeStep,\n formDeleteInput,\n multipleInputToggleLabel,\n editInput,\n addMultipleInputValueCalculationFunction,\n formDeleteSection,\n formDeleteSectionInputs,\n moveInputToSection,\n reorderMultipleInputItems,\n cloneCopyFormInput,\n saveInput,\n applyFormTemplate,\n selectInputTemplate,\n formInputChange,\n saveSubmitApi,\n removeSubmissionApi,\n elementConfigurationChanged,\n elementBlur,\n addMultipleFormInput,\n clearInputInEdit,\n addInputToScoaSelection,\n\n }\n\n\n}\n","import { computed, DestroyRef, inject, Injectable, Injector, signal } from '@angular/core';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { FormListSection, FormsStoreSelectorsInterface, FormSubmissionStatus, IFormsInitStateInterface, InClassFormUtilsInterface, IStoreFunctions } from \"ngx-t-forms-types\";;\r\nimport { formsStoreSelectors } from './Forms-selectors';\r\nimport { formsStoreSignalSelectors } from './Forms-signal-selectors';\r\nimport { formsFormBuilderStoreSignalSelectors } from './Form-signal-selectors-FormBuilder';\r\nimport { formsStoreActions } from './Forms-Actions';\r\nimport { BehaviorSubject, isObservable, Observable, Subject, timer } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\nimport { DatabaseFormInterface, FormInterface, NgxTFormsConfig } from \"ngx-t-forms-types\";;\r\n\r\nimport { formsStoreEffects } from './Forms-Effects';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../injection-tokens';\r\n\r\nimport { formsFormBuilderStoreSelectors } from './Form-selectors-FormBuilder';\r\n\r\nimport { IUserSignature } from \"ngx-t-forms-types\";\r\nimport { PointGroup } from 'signature_pad';\r\nimport { formBuilderStoreActions } from './Form-actions-formBuilder';\r\nimport { AbstractControl, FormControl } from '@angular/forms';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { HintType, textIconsForUserHints } from '../../../shared/functions/textIconsForUserHints';\r\n\r\n\r\n\r\nexport interface ActionButton {\r\n\r\n icon: string,\r\n color: string,\r\n onClick: () => void\r\n\r\n}\r\n\r\nexport const initialUIState: IFormsInitStateInterface = {\r\n initialFormValues: null,\r\n\r\n forms: [],\r\n editForm: null,\r\n formBuilderBusy: false,\r\n loadingForm: false,\r\n loadingForms: false,\r\n formId: null,\r\n loadFormsError: null,\r\n errors: null,\r\n listSection: FormListSection.ALL,\r\n routerState: null,\r\n submittingForm: false,\r\n inputInEdit: null\r\n};\r\n\r\n\r\n@Injectable()\r\nexport class FormsStoreService {\r\n\r\n /** Single source of truth — replaces `@ngrx/component-store` (plan D-B1 / P4). */\r\n readonly #state = signal<IFormsInitStateInterface>(initialUIState);\r\n /**\r\n * Read-only signal view of the whole state. The pull-based surface consumers\r\n * read directly (plan P4): `signalSelectors`/`formBuilderSignalSelectors` are\r\n * memoised `computed()` graphs derived from this, replacing per-component\r\n * `toSignal`/`combineLatest` re-wraps.\r\n */\r\n readonly state = this.#state.asReadonly();\r\n readonly #injector = inject(Injector);\r\n\r\n snackBar = inject(MatSnackBar)\r\n readonly #destroyRef = inject(DestroyRef)\r\n sectionPlaceholder: Record<string, AbstractControl> = {}\r\n public readonly NGX_T_FORMS_CONFIG!: NgxTFormsConfig\r\n\r\n /** Synchronous state read (compat shim for the former `ComponentStore.get`). */\r\n get(): IFormsInitStateInterface;\r\n get<R>(projector: (state: IFormsInitStateInterface) => R): R;\r\n get<R>(projector?: (state: IFormsInitStateInterface) => R): IFormsInitStateInterface | R {\r\n const snapshot = this.#state();\r\n return projector ? projector(snapshot) : snapshot;\r\n }\r\n\r\n /**\r\n * Reactive selector (compat shim for `ComponentStore.select`). Returns an\r\n * Observable adapter over a memoised `computed()`, so the shared\r\n * `FormsStoreSelectorsInterface` contract and every existing Observable\r\n * consumer are untouched (plan A-8). Emits on the microtask — safe because the\r\n * synchronous `take(1)` readers were already removed in P3 (A-5).\r\n */\r\n select<R>(projector: (state: IFormsInitStateInterface) => R): Observable<R> {\r\n const derived = computed(() => projector(this.#state()));\r\n return toObservable(derived, { injector: this.#injector });\r\n }\r\n\r\n /**\r\n * Updater factory (compat shim for `ComponentStore.updater`). Accepts a bare\r\n * value or an `Observable` of values, mirroring the original call signature\r\n * (`handleRouterStateChange(of(route))`, `loadFormSuccess({ form })`, …).\r\n */\r\n updater<V = void>(\r\n reducer: (state: IFormsInitStateInterface, value: V) => IFormsInitStateInterface,\r\n ): (value: V | Observable<V>) => void {\r\n return (value: V | Observable<V>): void => {\r\n if (isObservable(value)) {\r\n value\r\n .pipe(takeUntilDestroyed(this.#destroyRef))\r\n .subscribe((v) => this.#state.update((state) => reducer(state, v)));\r\n } else {\r\n this.#state.update((state) => reducer(state, value));\r\n }\r\n };\r\n }\r\n\r\n constructor() {\r\n const config = inject(NGX_T_FORMS_CONFIG_TOKEN, { optional: true });\r\n if (!config) {\r\n throw new Error(\r\n '[ngx-t-forms] FormsStoreService requires provideNgxTForms() in the application providers. ' +\r\n 'See the migration plan for the new wiring (§6.2 Step 0.B).'\r\n );\r\n }\r\n this.NGX_T_FORMS_CONFIG = config;\r\n this._formChange$\r\n .pipe(switchMap(form => timer(300).pipe(map(() => form))), takeUntilDestroyed(this.#destroyRef))\r\n .subscribe(form => this._formChangeFn?.(form));\r\n this.#destroyRef.onDestroy(() => {\r\n if (this._pendingRefreshTimer) clearTimeout(this._pendingRefreshTimer);\r\n });\r\n }\r\n utils: InClassFormUtilsInterface = {\r\n httpGetDataFunction: (url: string, options: unknown) => this.NGX_T_FORMS_CONFIG.formBuilder.httpGetDataFunction(url, options),\r\n httpPostDataFunction: (url: string, data: unknown, options: unknown) => this.NGX_T_FORMS_CONFIG.formBuilder.httpPostDataFunction(url, data, options),\r\n submitForm: () => new Observable<void>(subscriber => { subscriber.complete(); }),\r\n setSubmissionStatusValue: (_status: FormSubmissionStatus) => { /* no-op placeholder; overridden by tower controller */ },\r\n saveFormData: function (): Observable<void> {\r\n throw new Error('Function not implemented.');\r\n },\r\n runPipeLine: function (_pipeline: unknown, _workflowId: string): Observable<{ results: unknown; message: string; }> {\r\n throw new Error('Function not implemented.');\r\n },\r\n fileUpload: function (_file: string, _fileName: string, _fileType: string): Observable<{ url: string; }> {\r\n throw new Error('Function not implemented.');\r\n },\r\n getUserSignature: function (): Observable<IUserSignature> {\r\n throw new Error('Function not implemented.');\r\n },\r\n saveUserSignature: function (_signature: PointGroup[]): Observable<void> {\r\n throw new Error('Function not implemented.');\r\n }\r\n }\r\n showMessage(message: string, type: HintType): void {\r\n this.snackBar.open(textIconsForUserHints(message, type), 'close', {\r\n duration: 2000,\r\n panelClass: type\r\n });\r\n\r\n }\r\n /**\r\n * Lifecycle-bound effect runner that replaces `ComponentStore.effect`.\r\n *\r\n * The projection pipeline is built and subscribed once, tied to this\r\n * service's {@link DestroyRef}. The returned trigger accepts either a bare\r\n * value or an `Observable` of values, preserving the original call signature\r\n * (`loadForm$(of(id))`, `createForm$(of(form))`, …).\r\n *\r\n * @param project - Builds the effect pipeline from the source stream.\r\n * @returns A trigger that feeds a value (or observable of values) into the effect.\r\n */\r\n rxEffect<T>(project: (source$: Observable<T>) => Observable<unknown>): (value: Observable<T> | T) => void {\r\n const subject = new Subject<T>();\r\n project(subject).pipe(takeUntilDestroyed(this.#destroyRef)).subscribe();\r\n return (value: Observable<T> | T): void => {\r\n if (isObservable(value)) {\r\n value.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((v) => subject.next(v));\r\n } else {\r\n subject.next(value);\r\n }\r\n };\r\n }\r\n get resourceFunctions(): IStoreFunctions | null {\r\n return this.NGX_T_FORMS_CONFIG?.formBuilder\r\n }\r\n\r\n /**\r\n * Synchronous snapshot of the form currently being edited.\r\n *\r\n * Replaces the builder thunks' `selectFormInEdit$.pipe(take(1), …)` reads\r\n * (P3) so the write/refresh sequence stays on the same tick — a prerequisite\r\n * for the later `toObservable` selector swap (plan A-5).\r\n */\r\n formInEditSnapshot(): DatabaseFormInterface | null {\r\n return this.get((state) => state.editForm);\r\n }\r\n\r\n /**\r\n * Subscribes to a one-shot async source and tears the subscription down with\r\n * this store's lifecycle. Used by the one genuinely-async builder command\r\n * (`elementConfigurationChanged` → `getWorkflowDocuments`).\r\n */\r\n subscribeBound<T>(source$: Observable<T>, next: (value: T) => void): void {\r\n source$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(next);\r\n }\r\n\r\n\r\n readonly selectors: FormsStoreSelectorsInterface = formsStoreSelectors(this)\r\n readonly formBuilderSelectors = formsFormBuilderStoreSelectors(this)\r\n /** Signal-native mirror of {@link selectors} — direct pull reads (plan P4). */\r\n readonly signalSelectors = formsStoreSignalSelectors(this)\r\n /** Signal-native mirror of {@link formBuilderSelectors} — direct pull reads (plan P4). */\r\n readonly formBuilderSignalSelectors = formsFormBuilderStoreSignalSelectors(this)\r\n readonly actions = formsStoreActions(this)\r\n readonly actionsFormBuilder = formBuilderStoreActions(this)\r\n readonly effects = formsStoreEffects(this)\r\n private readonly _formChange$ = new Subject<FormInterface>();\r\n private _formChangeFn?: (form: FormInterface) => void;\r\n private _pendingRefreshTimer?: ReturnType<typeof setTimeout>;\r\n readonly pendingExternalRefresh$ = new BehaviorSubject<{ form: FormInterface; timestamp: Date } | null>(null);\r\n /**\r\n * Triggers an external state refresh for the given form.\r\n *\r\n * Calls are debounced via a `switchMap(timer(300ms))` pipeline — rapid successive\r\n * calls cancel any pending emission and restart the 300ms window, ensuring only\r\n * the last form value is forwarded to the registered callback.\r\n *\r\n * Register the callback with {@link registerFormChangeFn} before calling this.\r\n *\r\n * @param form - The form whose external state should be refreshed.\r\n */\r\n refreshExternalFormStates: (form: FormInterface) => void = (form) => this._formChange$.next(form);\r\n\r\n /**\r\n * Queues a form refresh that auto-executes after 10 seconds if the user\r\n * does not trigger it manually first. Resets the timer on every call so\r\n * rapid successive edits coalesce into a single refresh.\r\n */\r\n scheduleExternalRefresh(form: FormInterface): void {\r\n this.pendingExternalRefresh$.next({ form, timestamp: new Date() });\r\n if (this._pendingRefreshTimer) clearTimeout(this._pendingRefreshTimer);\r\n this._pendingRefreshTimer = setTimeout(() => this.executeExternalRefreshNow(), 5_000);\r\n }\r\n\r\n /** Executes the pending refresh immediately and clears the queued state. */\r\n executeExternalRefreshNow(): void {\r\n const pending = this.pendingExternalRefresh$.getValue();\r\n if (!pending) return;\r\n if (this._pendingRefreshTimer) {\r\n clearTimeout(this._pendingRefreshTimer);\r\n this._pendingRefreshTimer = undefined;\r\n }\r\n this.pendingExternalRefresh$.next(null);\r\n this.refreshExternalFormStates(pending.form);\r\n }\r\n\r\n /**\r\n * Registers the callback invoked after the debounce window elapses.\r\n *\r\n * The pipeline is wired once at construction — calling this method only updates\r\n * the target function reference, with no re-subscription overhead.\r\n *\r\n * @param fn - Callback to invoke with the debounced {@link FormInterface} value.\r\n */\r\n registerFormChangeFn(fn: (form: FormInterface) => void): void {\r\n this._formChangeFn = fn;\r\n }\r\n\r\n deregisterFormChangeFn(): void {\r\n this._formChangeFn = undefined;\r\n if (this._pendingRefreshTimer) {\r\n clearTimeout(this._pendingRefreshTimer);\r\n this._pendingRefreshTimer = undefined;\r\n }\r\n this.pendingExternalRefresh$.next(null);\r\n }\r\n createFormPlaceHolderFormGroups(form: FormInterface): void {\r\n form.slides.forEach(slide => {\r\n this.sectionPlaceholder[slide.sectionId] = new FormControl()\r\n })\r\n }\r\n}\r\n","import { Injectable,inject } from '@angular/core';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../injection-tokens';\r\nimport { NgxTFormsConfig } from 'ngx-t-forms-types';\r\n\r\n@Injectable()\r\nexport class TFormEnvironmentInjectionService {\r\n private readonly config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n\r\n \r\n getConfig(): NgxTFormsConfig {\r\n return this.config;\r\n }\r\n get getFormBuilderFunctions(){\r\n return this.config.formBuilder\r\n }\r\n constructor() { }\r\n}\r\n/*!SECTION\r\nHere's a step-by-step plan for implementing environment configuration in a standalone-components library:\r\n\r\nCreate the environment token and interfaces\r\nCreate a library configuration service\r\nCreate a provider function for the configuration\r\nSet up the public API exports\r\nImplement in the host application\r\nStep-by-Step Implementation:\r\n1) First, create the environment tokens folder:\r\n```bash \r\n\r\nimport { InjectionToken } from '@angular/core';\r\n\r\nexport interface NgxTFormsEnvironment {\r\n apiUrl?: string;\r\n postmanCollectionUrl?: string;\r\n postmanCollectionKey?: string;\r\n}\r\n\r\nexport const NGX_T_FORMS_ENVIRONMENT = new InjectionToken<NgxTFormsEnvironment>('NGX_T_FORMS_ENVIRONMENT');\r\n```\r\n2. Create the configuration service:\r\n```bash\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { NGX_T_FORMS_ENVIRONMENT, NgxTFormsEnvironment } from './environment.token';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FormsConfigService {\r\n private readonly config = inject(NGX_T_FORMS_ENVIRONMENT);\r\n\r\n getConfig(): NgxTFormsEnvironment {\r\n return this.config;\r\n }\r\n}\r\n ```\r\n3. Create the provider function:\r\n```bash\r\nimport { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { NGX_T_FORMS_ENVIRONMENT, NgxTFormsEnvironment } from './environment.token';\r\n\r\nexport function provideNgxTForms(config: NgxTFormsEnvironment): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n { provide: NGX_T_FORMS_ENVIRONMENT, useValue: config }\r\n ]);\r\n}\r\n```\r\n4. Update the public API:\r\n```bash\r\nexport * from './lib/config/environment.token';\r\nexport * from './lib/config/forms-config.service';\r\nexport * from './lib/config/forms-providers';\r\n```\r\n5. Implement in the host application (ngx-t-forms):\r\n```bash \r\n import { ApplicationConfig } from '@angular/core';\r\nimport { provideNgxTForms } from 'ngx-t-forms';\r\n\r\nconst formsConfig = {\r\n apiUrl: 'your-api-url',\r\n postmanCollectionUrl: 'your-postman-url',\r\n postmanCollectionKey: 'your-key'\r\n};\r\n\r\nexport const appConfig: ApplicationConfig = {\r\n providers: [\r\n // ...existing providers\r\n provideNgxTForms(formsConfig)\r\n ]\r\n};\r\n```\r\n6. Usage in standalone components:\r\n```bash\r\nimport { Component, inject } from '@angular/core';\r\nimport { FormsConfigService } from '../config/forms-config.service';\r\n\r\n@Component({\r\n selector: 'lib-example',\r\n standalone: true,\r\n template: '<div>Example Component</div>'\r\n})\r\nexport class ExampleComponent {\r\n private configService = inject(FormsConfigService);\r\n \r\n someMethod() {\r\n const config = this.configService.getConfig();\r\n // Use configuration here\r\n }\r\n}\r\n```\r\n*/\r\n","import { IAccountSegmentTreeKeys, IScoaAccount, ScoaAccountTree, ScoaInnerInput, ScoaInterface } from \"ngx-t-forms-types\";\n\n/**\n * Local shape describing the per-segment value bag that flows through this\n * selector pipeline. Upstream `IAccountSegmentTreeKeys.segmentValue` is typed\n * as `Record<string, any>` in `ngx-t-forms-types`, so we narrow defensively\n * here without widening the public surface.\n * TODO[phase-4]: tighten `IAccountSegmentTreeKeys.segmentValue` in\n * `ngx-t-forms-types` and drop this local shape.\n */\ninterface SegmentValueBag {\n debit?: IScoaAccount | Record<string, IScoaAccount | undefined> | undefined;\n credit?: IScoaAccount | Record<string, IScoaAccount | undefined> | undefined;\n vat?: Record<string, unknown> | undefined;\n vatApplicableTo?: string;\n VATStatus?: string;\n [key: string]: unknown;\n}\n\nexport const noneVatableStatus = [\"Exempt\", \"N/A\", \"n/A\", \"N/a\", \"exempt\",]\n\n/**\n * Pure projection functions for the MSCOA signal store.\n *\n * These were previously wrapped by `mscoaStoreSelectors(store)` which built\n * `@ngrx/component-store` observables. The bodies are unchanged — the signal\n * store now derives `computed()` selectors (and `toObservable` views) directly\n * from these pure functions, so view output is identical.\n */\n\nexport const extractTreeFromState = (state: ScoaInterface, isCash: boolean = false) => {\n\n const { segments, inputs } = state;\n\n const inputSegments: IAccountSegmentTreeKeys[] = [...inputs].filter(i => !i.linkedSegmentId).map(input => ({\n segment: input.formControlName,\n innerInput: {\n ...input,\n id: `${state.inputId}.${input.id}`,\n originalId: input.id\n },\n additionalAccounts: [],\n readOnly: input.readonly ?? false,\n label: input.label,\n formInput: true,\n singleSelect: true,\n id: input.id,\n segmentTree: {} as ScoaAccountTree,\n inputs: [] as ScoaInnerInput[],\n segmentValue: (state.segmentValues?.[isCash ? 'cash' : 'accrual']?.[input.formControlName] || {}) as Record<string, unknown>,\n segmentExtension: false,\n customSegment: undefined\n }))\n\n\n\n\n const standardSegments: IAccountSegmentTreeKeys[] = [...(segments || [])].map(segment => {\n const segmentName = segment.segmentExtension ? segment.customSegment : segment.segment\n const segmentValue = state.segmentValues?.[isCash ? 'cash' : 'accrual']?.[segmentName || '']\n return ({\n ...segment,\n segment: segmentName || '',\n singleSelect: Boolean(segment?.singleSelect),\n segmentTree: state.accountTree[segment.segment || ''] || {},\n inputs: state.inputs || [],\n segmentValue: segmentValue || {},\n innerInput: {} as ScoaInnerInput,\n formInput: false\n })\n })\n\n return [...standardSegments, ...inputSegments]\n}\n\nexport const transformSegment = (segment: IAccountSegmentTreeKeys, accountValueLabel: string) => {\n const bag = segment.segmentValue as SegmentValueBag;\n const label = accountValueLabel || 'SCOAAccount';\n const pickAccountField = (\n side: SegmentValueBag['debit'] | SegmentValueBag['credit'],\n ): unknown => {\n if (side && typeof side === 'object' && label in side) {\n return (side as Record<string, IScoaAccount | undefined>)[label];\n }\n return side;\n };\n // ScoaInnerInput in `ngx-t-forms-types` does not declare a `segment`\n // field, but transformer code stamps one on at runtime. Read via the\n // index signature to avoid an `any` cast.\n type InnerInputWithSegment = ScoaInnerInput & { segment?: string };\n return {\n ...segment,\n ...getSegmentCounterAccountValues(segment, accountValueLabel),\n accountInputs: segment.inputs.filter(\n (input): boolean => (input as InnerInputWithSegment).segment === segment.segment,\n ),\n input: segment.inputs.find(input => input.formControlName?.toLocaleUpperCase() === segment.segment),\n vat: bag?.vat?.[label],\n debit: pickAccountField(bag?.debit),\n credit: pickAccountField(bag?.credit),\n };\n};\n\nfunction getSegmentCounterAccountValues(segment: IAccountSegmentTreeKeys, accountValueLabel: string) {\n const bag = segment.segmentValue as Record<string, Record<string, unknown> | undefined>;\n const label = accountValueLabel || 'SCOAAccount';\n return (segment.additionalAccounts || []).reduce((acc, account) => {\n const newEntry: Record<string, unknown> = {\n [`${account}Credit`]: bag?.[`${account}Credit`]?.[label],\n [`${account}Debit`]: bag?.[`${account}Debit`]?.[label],\n };\n return {\n ...acc,\n ...newEntry,\n };\n }, {} as Record<string, unknown>);\n}\n\nexport const checkhasVat = (rows: {\n accountInputs: ScoaInnerInput[];\n input: ScoaInnerInput | undefined;\n vat: unknown;\n debit: unknown;\n credit: unknown;\n segment: string;\n innerInput: ScoaInnerInput;\n label: string;\n formInput: boolean;\n segmentTree: ScoaAccountTree;\n inputs: ScoaInnerInput[];\n segmentValue: Record<string, unknown>;\n customSegment?: string | undefined;\n readOnly: boolean;\n singleSelect: boolean;\n inheritValueFromAccrual?: boolean;\n vatSelectonActive?: boolean;\n additionalAccounts: string[];\n segmentExtension: boolean;\n id: string;\n}[]) => {\n // VAT selection is limited to the item segment\n // 1) look up the item segment\n\n const itemSegmentValue = rows.find(row => row.segment.toLocaleLowerCase() === 'ITEM'.toLocaleLowerCase())\n const vatSelectonActive = itemSegmentValue?.vatSelectonActive === true\n if (!vatSelectonActive) {\n return false\n }\n // 2) Check vat status on both the credit and the debit || credit\n const vatStatusOf = (side: unknown): string => {\n if (side && typeof side === 'object' && 'VATStatus' in side) {\n const status = (side as { VATStatus?: unknown }).VATStatus;\n return typeof status === 'string' ? status : '';\n }\n return '';\n };\n const creditSide = itemSegmentValue?.segmentValue?.['credit'];\n const debitSide = itemSegmentValue?.segmentValue?.['debit'];\n const vatCredit = !!creditSide && !noneVatableStatus.includes(vatStatusOf(creditSide))\n const vatDebit = !!debitSide && !noneVatableStatus.includes(vatStatusOf(debitSide))\n\n // 3) Return a record of each\n return Boolean(vatCredit || vatDebit)\n\n}","\nimport { AccountingBasis, IIncludedSegmentConfig, IScoaAccount, IScoaInputConfig, ScoaInterface, ScoaSegmentValue } from \"ngx-t-forms-types\";\nimport { initialMscoaState } from \"./mscoa-component-store.service\";\nimport { noneVatableStatus } from \"./mscoa-selectors\";\nimport { _isEqual } from \"../../../../../shared/functions/isEqual\";\n\n/**\n * Per-segment record stored under `state.segmentValues[basis][SEGMENT_KEY]`.\n * Mirrors the value-type half of `ScoaSegmentValue` from `ngx-t-forms-types`.\n * TODO[phase-4]: export this shape from `ngx-t-forms-types` so action/reducer\n * code does not need to re-declare it locally.\n */\ninterface SegmentRecord {\n debit: IScoaAccount | undefined;\n credit: IScoaAccount | undefined;\n vatApplicableTo?: string;\n vat?: IScoaAccount | undefined;\n}\n\n/**\n * Pure state reducers for the MSCOA signal store.\n *\n * Every function here is a `(state, payload) => state` transformation with no\n * Angular/RxJS dependency. The bodies are migrated verbatim from the previous\n * `@ngrx/component-store` updaters so behaviour is identical; only the harness\n * (a signal store, see {@link MscoaComponentStore}) changed. Keeping them pure\n * makes them trivially unit-testable and removes the store-bound closure layer.\n */\n\n/** Resets the store to its initial state. */\nexport function resetStore(): ScoaInterface {\n return initialMscoaState;\n}\n\n/** Merges an MSCOA input config into state (config IS part of state). */\nexport function setConfig(state: ScoaInterface, config: IScoaInputConfig | undefined | null): ScoaInterface {\n return { ...state, ...(config || {}) };\n}\n\n/** Marks the tree as initiated. */\nexport function setInitiated(state: ScoaInterface): ScoaInterface {\n return { ...state, initiated: true };\n}\n\n/**\n * Normalises incoming segment values into the canonical `{ accrual, cash }`\n * shape and re-keys segment names against the loaded account-tree keys.\n */\nexport function setSegmentValues(\n state: ScoaInterface,\n segmentValues: {\n [AccountingBasis.Accrual]?: ScoaSegmentValue;\n [AccountingBasis.Cash]?: ScoaSegmentValue;\n } | undefined,\n): ScoaInterface {\n // 1. Safety check for null/undefined inputs\n if (!segmentValues) return state;\n\n // 2. Determine Input Format\n // The log shows the \"Old\" format is a flat object (e.g., { COSTING:..., FUND:... }).\n // The \"New\" format wraps them (e.g., { accrual: {...}, cash: {...} }).\n const hasWrapperKeys = 'accrual' in segmentValues || 'cash' in segmentValues;\n\n // If it DOESN'T have wrapper keys, but has data, it's the flat (old) structure.\n const isFlatStructure = !hasWrapperKeys && Object.keys(segmentValues).length > 0;\n\n // 3. Normalize Inputs\n // If flat, we assign the whole object to accrual\n const rawAccrual: ScoaSegmentValue | undefined = isFlatStructure\n ? (segmentValues as ScoaSegmentValue)\n : segmentValues.accrual;\n const rawCash: ScoaSegmentValue | undefined = isFlatStructure ? undefined : segmentValues.cash;\n\n // 4. Helper to map keys based on state.accountTreeKeys\n // This removes the duplicate reduce logic\n const accountTreeKeys = ((state.accountTreeKeys && state.accountTreeKeys.length > 0)\n ? state.accountTreeKeys\n : (state.segments?.map(s => s.segment) || [])) as string[];\n const mapSegments = (source: ScoaSegmentValue | undefined): ScoaSegmentValue => {\n if (!source || !accountTreeKeys) return {} as ScoaSegmentValue;\n\n return accountTreeKeys.reduce((acc, key) => {\n // Matches 'costing' -> 'COSTING' from your log\n const upperKey = key.toUpperCase();\n const v = source[upperKey] ?? source[key];\n if (v !== undefined) acc[key] = v;\n return acc;\n }, {} as ScoaSegmentValue);\n };\n\n // 5. Generate Values\n const accrualValue = mapSegments(rawAccrual);\n const cashValue = mapSegments(rawCash);\n\n const newSegmentValues = {\n ...state.segmentValues,\n accrual: accrualValue,\n cash: cashValue,\n };\n\n // Idempotency guard: if normalisation produced a value deep-equal to what we\n // already hold, return the SAME state reference so the signal does not emit.\n // This is what lets the form ⇄ store ⇄ form graph quiesce in a single pass\n // instead of oscillating (the previous JSON.stringify gates disagreed about\n // key order/undefined and could keep the cycle alive).\n if (_isEqual(newSegmentValues, state.segmentValues)) return state;\n\n return { ...state, segmentValues: newSegmentValues };\n}\n\n/** Sets the asynchronous-validation in-flight flag. */\nexport function setValidatingValue(state: ScoaInterface, validatingValue: boolean): ScoaInterface {\n return { ...state, validatingValue };\n}\n\n/** Stores the latest business-rule validation errors. */\nexport function setValidationErrors(state: ScoaInterface, validationErrors: ScoaInterface['validationErrors']): ScoaInterface {\n return { ...state, validationErrors };\n}\n\n/** Toggles the account-tree loading flag. */\nexport function setLoadingTree(state: ScoaInterface, loading: boolean): ScoaInterface {\n return { ...state, loadingTree: loading };\n}\n\n/** Records the active segment (used by the selection UI). */\nexport function setActiveSegment(state: ScoaInterface, activeSegment: string | null): ScoaInterface {\n return { ...state, activeSegment } as ScoaInterface;\n}\n\n/** Assigns the selected account to a segment/column for the given basis. */\nexport function setSegmentAccount(\n state: ScoaInterface,\n { segment, account, accountType, isCash }: {\n segment: string;\n account: IScoaAccount | undefined;\n accountType: string;\n isCash: boolean;\n },\n): ScoaInterface {\n // 1. Determine the Accounting Basis Key (matching setSegmentValues structure)\n // Assuming the state keys are explicitly 'cash' and 'accrual' based on your comparison function\n const basisKey = isCash ? 'cash' : 'accrual';\n const segmentKey = segment.toUpperCase();\n\n // 2. Retrieve the current group of values for this basis (e.g., all accrual values)\n const currentBasisGroup = state.segmentValues?.[basisKey] || {};\n\n // 3. Retrieve the specific existing segment data (e.g., the existing COSTING object)\n const oldSegmentData = currentBasisGroup[segmentKey] || {\n debit: undefined,\n credit: undefined\n };\n\n // 4. Create the new segment data with the updated account\n const newSegmentData = {\n ...oldSegmentData,\n [accountType]: account\n };\n\n // 5. Apply \"Item\" specific logic (VAT calculation)\n // We modify newSegmentData only if specific conditions are met\n if (segment.toLowerCase() === 'item') {\n const vatApplicableTo = checkVatApplicableTo(newSegmentData);\n // Merge the calculated VAT status into the object\n Object.assign(newSegmentData, { vatApplicableTo });\n }\n // 6. Return the immutable state update\n return {\n ...state,\n segmentValues: {\n ...state.segmentValues, // Keep existing basis (e.g., keep 'cash' if we are updating 'accrual')\n [basisKey]: {\n ...currentBasisGroup, // Keep other segments in this basis (e.g., keep FUND if updating COSTING)\n [segmentKey]: newSegmentData // Update the specific segment\n }\n }\n };\n}\n\n/** Recomputes VAT + cash-from-accrual inheritance across all segment values. */\nexport function auditStateValues(state: ScoaInterface): ScoaInterface {\n // 1. Safe access to state data\n const { cash = {}, accrual = {} } = state.segmentValues || {};\n const cashSegmentConfigs = state.cashSegments || [];\n\n // 2. Pre-calculate \"Has VAT Applicable\" flags for both bases\n // (Checks if any segment in the group has a 'vatApplicableTo' flag set)\n const hasVatApplicableTo = (val: SegmentRecord | undefined): boolean =>\n val?.vatApplicableTo !== undefined;\n const itemSegment = state.segments?.find(s => s?.segment?.toLowerCase() === 'item')\n const hasAccrualVat = itemSegment?.vatSelectonActive === true\n ? Object.values(accrual).some(val => hasVatApplicableTo(val as SegmentRecord))\n : false;\n const cashItemSegment = cashSegmentConfigs.find(s => s?.segment?.toLowerCase() === 'item')\n const hasCashVat = cashItemSegment?.vatSelectonActive\n ? Object.values(cash).some(val => hasVatApplicableTo(val as SegmentRecord))\n : false;\n\n // 3. Helper: VAT Calculation Logic\n const calculateVat = (key: string, data: SegmentRecord, isGlobalVatActive: boolean): SegmentRecord['vat'] => {\n // A. If no VAT applicable account exists globally in this basis -> Clear VAT\n if (!isGlobalVatActive) return undefined;\n\n const { credit, debit, vat } = data;\n const hasAmount = credit || debit;\n\n // B. If not an 'ITEM' segment and has an amount -> Set VAT to the Amount\n // (Logic: If we have a VAT Item, all other lines become VAT lines matching their amount)\n if (key.toUpperCase() !== 'ITEM' && hasAmount) {\n return debit || credit;\n }\n\n // C. Otherwise -> Preserve existing VAT (or undefined)\n return vat;\n };\n\n // 4. Optimization: Create a Set or Map for Cash Inheritance\n // Allows O(1) lookup instead of finding inside the loop\n const inheritMap = cashSegmentConfigs.reduce<Record<string, boolean>>((acc, seg: IIncludedSegmentConfig) => {\n if (seg.inheritValueFromAccrual) {\n // Store true for the segment name (normalized to upper case to match store keys)\n const segKey = (seg.customSegment || seg.segment || '').toUpperCase();\n if (segKey) acc[segKey] = true;\n }\n return acc;\n }, {});\n\n\n // 5. Process Accrual First (Source of Truth)\n const newAccrual = Object.entries(accrual).reduce<Record<string, SegmentRecord>>((acc, [key, data]) => {\n const record = data as SegmentRecord;\n acc[key] = {\n ...record,\n vat: calculateVat(key, record, hasAccrualVat)\n };\n return acc;\n }, {});\n\n // 6. Process Cash (With Inheritance)\n const newCash = Object.entries(cash).reduce<Record<string, SegmentRecord>>((acc, [key, data]) => {\n const record = data as SegmentRecord;\n const shouldInherit = inheritMap[key];\n\n // A. Determine the Source Data\n // If inheriting, grab the account details from the NEW Accrual object we just built.\n // Otherwise, use the existing Cash data.\n let workingData: SegmentRecord = record;\n\n if (shouldInherit && newAccrual[key]) {\n workingData = {\n ...workingData, // Keep existing cash props (like ID, etc) if needed\n debit: newAccrual[key].debit,\n credit: newAccrual[key].credit,\n // Note: We do NOT inherit 'vatApplicableTo' or 'vat' blindly,\n // because Cash might have its own VAT context. We recalculate VAT below.\n };\n }\n\n // B. Apply Cash-Specific VAT Logic\n acc[key] = {\n ...workingData,\n vat: calculateVat(key, workingData, hasCashVat)\n };\n\n return acc;\n }, {});\n\n // 7. Return Final State\n const newSegmentValues = {\n ...state.segmentValues,\n accrual: newAccrual,\n cash: newCash\n };\n\n // Idempotency guard (see setSegmentValues): a re-audit of already-audited\n // values is a no-op, so return the same reference and stop the graph here.\n if (_isEqual(newSegmentValues, state.segmentValues)) return state;\n\n return { ...state, segmentValues: newSegmentValues };\n}\n\nfunction checkVatApplicableTo(segmentValue: {\n debit?: IScoaAccount,\n credit?: IScoaAccount,\n vatApplicableTo?: string\n}): string | undefined {\n try {\n const itemCreditIsVatApplicable = !!segmentValue.credit?.VATStatus && !noneVatableStatus.includes(segmentValue.credit.VATStatus);\n const itemDebitIsVatApplicable = !!segmentValue.debit?.VATStatus && !noneVatableStatus.includes(segmentValue.debit.VATStatus);\n if (itemCreditIsVatApplicable && !itemDebitIsVatApplicable) {\n return 'credit'\n }\n if (itemDebitIsVatApplicable && !itemCreditIsVatApplicable) {\n return 'debit'\n }\n return segmentValue.vatApplicableTo\n\n } catch (error) {\n return undefined\n\n }\n\n\n}","import { catchError, debounceTime, distinctUntilChanged, EMPTY, filter, map, Observable, of, switchMap, tap } from \"rxjs\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { DestroyRef } from \"@angular/core\";\nimport { IGetTreeResponse, MscoaValuetValidationErrors, ScoaSegmentValue } from \"ngx-t-forms-types\";\nimport { _isEqual } from \"../../../../../shared/functions/isEqual\";\n\n/**\n * Side-effect orchestration for the MSCOA signal store.\n *\n * These were `@ngrx/component-store` effects; they are now plain RxJS pipelines\n * driven by signal-derived observables and wired through small callback\n * contexts so the signal store stays the single owner of state mutation. The\n * pipelines (debounce → audit → validate, and tree load) are unchanged.\n */\n\n/** Context for the debounced audit + async validation pipeline. */\nexport interface MscoaReactivityContext {\n /** Emits the current `{ accrual, cash }` segment values whenever they change. */\n readonly segmentValues$: Observable<ScoaSegmentValue>;\n /** Runs the synchronous VAT/inheritance audit reducer over current state. */\n readonly audit: () => void;\n /** Flips the async-validation in-flight flag. */\n readonly setValidating: (validating: boolean) => void;\n /** Stores the resolved business-rule validation errors. */\n readonly setValidationErrors: (errors: MscoaValuetValidationErrors) => void;\n /** Asynchronous business-rule validator supplied by the host config. */\n readonly validate: (values: ScoaSegmentValue) => Observable<MscoaValuetValidationErrors>;\n readonly destroyRef: DestroyRef;\n}\n\n/**\n * Audits then validates whenever segment values change. Mirrors the legacy\n * `auditOnSegmentValuesChange$`: debounce 300ms, run the (synchronous) audit,\n * mark validating, then resolve business-rule errors. `switchMap` cancels an\n * in-flight validation when newer values arrive.\n */\nexport function registerMscoaReactivity(ctx: MscoaReactivityContext): void {\n ctx.segmentValues$.pipe(\n filter((segmentValues): segmentValues is ScoaSegmentValue => segmentValues !== undefined),\n distinctUntilChanged((prev, curr) => _isEqual(prev, curr)),\n debounceTime(300),\n switchMap((values) => {\n ctx.audit();\n ctx.setValidating(true);\n return ctx.validate(values).pipe(\n map((validationErrors) => {\n ctx.setValidating(false);\n ctx.setValidationErrors(validationErrors);\n return validationErrors;\n }),\n catchError(() => {\n ctx.setValidating(false);\n return EMPTY;\n }),\n );\n }),\n takeUntilDestroyed(ctx.destroyRef),\n ).subscribe();\n}\n\n/** Context for the one-shot account-tree load. */\nexport interface MscoaLoadContext {\n readonly alreadyInitiated: () => boolean;\n readonly getLatestAccountTree: (() => Observable<IGetTreeResponse>) | undefined;\n readonly setLoadingTree: (loading: boolean) => void;\n readonly patchTree: (response: IGetTreeResponse) => void;\n readonly setInitiated: () => void;\n readonly destroyRef: DestroyRef;\n}\n\n/**\n * Loads the account tree once (no-op if already initiated). Mirrors the legacy\n * `initLoadMscoa$`: set loading, fetch (or fall back to an empty tree), patch\n * state, mark initiated, clear loading; swallow errors after clearing loading.\n */\nexport function runLoadMscoa(ctx: MscoaLoadContext): void {\n if (ctx.alreadyInitiated()) return;\n ctx.setLoadingTree(true);\n const source$ = ctx.getLatestAccountTree?.() ?? of<IGetTreeResponse>({\n message: '',\n accountTree: {},\n accountTreeKeys: [],\n });\n source$.pipe(\n map((mscoa) => {\n if (!mscoa) {\n throw new Error('Invalid MSCOA data received');\n }\n return mscoa;\n }),\n tap((mscoa) => {\n ctx.patchTree(mscoa);\n ctx.setInitiated();\n ctx.setLoadingTree(false);\n }),\n catchError(() => {\n ctx.setLoadingTree(false);\n return EMPTY;\n }),\n takeUntilDestroyed(ctx.destroyRef),\n ).subscribe();\n}\n","import { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\n\nimport {\n FormBuilderFunctions,\n IGetTreeResponse,\n IScoaInputConfig,\n MscoaValuetValidationErrors,\n NgxTFormsConfig,\n ScoaInterface,\n ScoaSegmentValue,\n} from 'ngx-t-forms-types';\n\nimport { checkhasVat, extractTreeFromState, transformSegment } from './mscoa-selectors';\nimport * as reducers from './mscoa-actions';\nimport { registerMscoaReactivity, runLoadMscoa } from './mscoa-effects';\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../injection-tokens';\nimport { _isEqual } from '../../../../../shared/functions/isEqual';\n\nexport const initialMscoaState: ScoaInterface = {\n accountTreeKeys: [],\n inputs: [],\n initiated: false,\n accountTree: {},\n loadingTree: false,\n segmentValues: {},\n segments: [],\n cashSegments: [],\n showAllSegments: false,\n getTreeResponse: null,\n inputId: '',\n label: '',\n accountValueLabel: '',\n validatingValue: false,\n validationErrors: {}\n};\n\n/**\n * Signal-backed store for a single MSCOA form field.\n *\n * Replaces the previous `@ngrx/component-store` implementation (which the\n * library rule book bars from shipping — see angular-library-principles.md\n * §\"What you must not ship\"). State lives in one `signal`; every view value is\n * a `computed` derived from the verbatim pure projections in `mscoa-selectors`.\n * Reducers (`mscoa-actions`) and side-effects (`mscoa-effects`) are unchanged in\n * behaviour; only the harness moved from RxJS to signals.\n *\n * `selectors` exposes `toObservable` views so the chart's existing RxJS\n * view-model pipeline keeps working unchanged while the field consumes signals\n * directly. The field owns the down-path (config / value / load); user\n * interaction in the chart drives the up-path through the mutator methods.\n */\n@Injectable()\nexport class MscoaComponentStore {\n readonly #destroyRef = inject(DestroyRef);\n readonly #configToken = inject(NGX_T_FORMS_CONFIG_TOKEN, { optional: true });\n\n /** Host config (validators etc). Public for parity with the previous field name. */\n NGX_T_FORMS_CONFIG_TOKEN!: NgxTFormsConfig;\n\n readonly #state = signal<ScoaInterface>(initialMscoaState);\n /** Read-only view of the full state (rarely needed; prefer the selectors). */\n readonly state = this.#state.asReadonly();\n\n // --- Signal selectors (single source of truth for derived view state) ---\n\n /** Canonical `{ accrual, cash }` segment values. */\n readonly segmentValues = computed(() => this.#state().segmentValues ?? {}, { equal: _isEqual });\n readonly loadingTree = computed(() => this.#state().loadingTree);\n readonly validatingValue = computed(() => this.#state().validatingValue);\n readonly validationErrors = computed(() => this.#state().validationErrors, { equal: _isEqual });\n readonly inputs = computed(() => this.#state().inputs);\n readonly initiated = computed(() => this.#state().initiated);\n\n readonly accountTreeKeys = computed(() => extractTreeFromState(this.#state()), { equal: _isEqual });\n readonly cashAccountTreeKeys = computed(\n () => extractTreeFromState({ ...this.#state(), segments: this.#state().cashSegments }, true),\n { equal: _isEqual },\n );\n readonly table = computed(\n () => this.accountTreeKeys().map((segment) => transformSegment(segment, this.#state().accountValueLabel)),\n { equal: _isEqual },\n );\n readonly cashTable = computed(\n () => this.cashAccountTreeKeys().map((segment) => transformSegment(segment, this.#state().accountValueLabel)),\n { equal: _isEqual },\n );\n readonly hasVat = computed(() => checkhasVat(this.table()));\n readonly cashHasVat = computed(() => checkhasVat(this.cashTable()));\n\n // --- Observable views (RxJS surface for the chart view-model) ---\n\n readonly selectors = {\n accountTreeKeys$: toObservable(this.accountTreeKeys),\n cashAccountTreeKeys$: toObservable(this.cashAccountTreeKeys),\n loadingTree$: toObservable(this.loadingTree),\n validationErrors$: toObservable(this.validationErrors),\n validatingValue$: toObservable(this.validatingValue),\n table$: toObservable(this.table),\n cashTable$: toObservable(this.cashTable),\n hasVATApplicableAccount$: toObservable(this.hasVat),\n cashHasVATApplicableAccount$: toObservable(this.cashHasVat),\n segmentValues$: toObservable(this.segmentValues),\n inputs$: toObservable(this.inputs),\n };\n\n constructor() {\n if (!this.#configToken) {\n throw new Error(\n '[ngx-t-forms] MscoaComponentStore requires provideNgxTForms() in the application providers. ' +\n 'See the migration plan for the new wiring (§6.2 Step 0.B).'\n );\n }\n this.NGX_T_FORMS_CONFIG_TOKEN = this.#configToken;\n\n // Debounced audit + async validation, driven by the segment-values signal.\n registerMscoaReactivity({\n segmentValues$: toObservable(this.segmentValues),\n audit: () => this.#state.update(reducers.auditStateValues),\n setValidating: (validating) => this.setValidatingValue(validating),\n setValidationErrors: (errors) => this.setValidationErrors(errors),\n validate: (values) => this.NGX_T_FORMS_CONFIG_TOKEN.formBuilder.validateMscoaSelection(values),\n destroyRef: this.#destroyRef,\n });\n }\n\n // --- Mutators (down-path from the field, up-path from chart interaction) ---\n\n /** Merges an MSCOA input config into state. */\n setConfig(config: IScoaInputConfig | undefined | null): void {\n this.#state.update((state) => reducers.setConfig(state, config));\n }\n\n /** Normalises and stores incoming segment values (idempotent). */\n setSegmentValues(values: ScoaSegmentValue | undefined): void {\n this.#state.update((state) => reducers.setSegmentValues(state, values));\n }\n\n /** Assigns the selected account to a segment/column for a basis. */\n setSegmentAccount(payload: {\n segment: string;\n account: Parameters<typeof reducers.setSegmentAccount>[1]['account'];\n accountType: string;\n isCash: boolean;\n }): void {\n this.#state.update((state) => reducers.setSegmentAccount(state, payload));\n }\n\n /** Records the active segment. */\n setActiveSegment(activeSegment: string | null): void {\n this.#state.update((state) => reducers.setActiveSegment(state, activeSegment));\n }\n\n setLoadingTree(loading: boolean): void {\n this.#state.update((state) => reducers.setLoadingTree(state, loading));\n }\n\n setValidatingValue(validating: boolean): void {\n this.#state.update((state) => reducers.setValidatingValue(state, validating));\n }\n\n setValidationErrors(errors: MscoaValuetValidationErrors): void {\n this.#state.update((state) => reducers.setValidationErrors(state, errors));\n }\n\n setInitiated(): void {\n this.#state.update(reducers.setInitiated);\n }\n\n resetStore(): void {\n this.#state.set(initialMscoaState);\n }\n\n /** Loads the account tree once via the host's `getLatestAccountTree`. */\n loadMscoa(functions: FormBuilderFunctions | undefined): void {\n const getLatestAccountTree = functions\n ? (): Observable<IGetTreeResponse> => functions.getLatestAccountTree()\n : undefined;\n runLoadMscoa({\n alreadyInitiated: () => this.initiated(),\n getLatestAccountTree,\n setLoadingTree: (loading) => this.setLoadingTree(loading),\n patchTree: (response: IGetTreeResponse) => this.#state.update((state) => ({ ...state, ...response })),\n setInitiated: () => this.setInitiated(),\n destroyRef: this.#destroyRef,\n });\n }\n}\n","import { inject, Provider } from '@angular/core';\nimport { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router';\nimport { EMPTY, map, type Observable } from 'rxjs';\nimport { FORM_ROUTE_SOURCE } from '../tokens/form-route-source.token';\nimport { NgxTFormsFeature, NgxTFormsFeatureKind } from './provide-ngx-t-forms';\n\n/**\n * Factory for {@link FORM_ROUTE_SOURCE}: the activated route's `formId` param\n * (read from `route.data['route'].params`, matching the historical builder\n * loading). Injects `ActivatedRoute` optionally so a router-free build resolves\n * to `EMPTY` and the builder falls back to its `formId` input.\n *\n * @internal\n */\nexport function routeFormIdSourceFactory(): Observable<string | undefined> {\n const route = inject(ActivatedRoute, { optional: true });\n if (!route) return EMPTY;\n return route.data.pipe(\n map((data) => (data['route'] as ActivatedRouteSnapshot | undefined)?.params?.['formId']),\n );\n}\n\n/** Provider binding {@link FORM_ROUTE_SOURCE} to the route `formId`. @internal */\nexport const ROUTER_FORM_ID_PROVIDER: Provider = {\n provide: FORM_ROUTE_SOURCE,\n useFactory: routeFormIdSourceFactory,\n};\n\n/**\n * Feeds {@link FormBuilderComponent} its `formId` from the activated route,\n * preserving the historical route-driven form loading. Shipped by default in\n * `provideNgxTForms`, so existing consumers see identical behaviour (D-B2 / §5.5);\n * a router-free build resolves {@link FORM_ROUTE_SOURCE} to `EMPTY` and the\n * builder loads from its `formId` input only.\n *\n * @example\n * provideNgxTForms(config, withRouterFormId())\n *\n * @public\n */\nexport function withRouterFormId(): NgxTFormsFeature {\n return { kind: NgxTFormsFeatureKind.RouterFormId, providers: [ROUTER_FORM_ID_PROVIDER] };\n}\n","import { EnvironmentProviders, Provider, makeEnvironmentProviders } from '@angular/core';\r\nimport { NgxTFormsConfig } from 'ngx-t-forms-types';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../injection-tokens';\r\nimport { FormsStoreService } from '../components/forms/store/forms-store.service';\r\nimport { TFormEnvironmentInjectionService } from '../services/core/t-form-environment-injection/t-form-environment-injection.service';\r\nimport { MscoaComponentStore } from '../components/t-form-input/elements/mscoa-form-input/store/mscoa-component-store.service';\r\nimport { ROUTER_FORM_ID_PROVIDER } from './with-router-form-id';\r\n\r\n/** @internal */\r\nexport const enum NgxTFormsFeatureKind {\r\n SilencedConsole,\r\n FormBuilder,\r\n ImportTower,\r\n HttpPipeline,\r\n InputSecret,\r\n RouterFormId,\r\n}\r\n\r\nexport interface NgxTFormsFeature {\r\n readonly kind: NgxTFormsFeatureKind;\r\n readonly providers: Provider[];\r\n}\r\n\r\n/**\r\n * Registers ngx-t-forms with the application injector.\r\n *\r\n * @param config Runtime configuration (form actions, builder, etc.).\r\n * @param features Optional with*() extension features.\r\n * @returns EnvironmentProviders ready to drop into `bootstrapApplication`.\r\n *\r\n * @example\r\n * bootstrapApplication(AppComponent, {\r\n * providers: [\r\n * provideNgxTForms(myConfig, withSilencedConsole(), withFormBuilder()),\r\n * ],\r\n * });\r\n */\r\nexport function provideNgxTForms(\r\n config: NgxTFormsConfig,\r\n ...features: NgxTFormsFeature[]\r\n): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n { provide: NGX_T_FORMS_CONFIG_TOKEN, useValue: config },\r\n FormsStoreService,\r\n TFormEnvironmentInjectionService,\r\n MscoaComponentStore,\r\n // Route-driven form-id loading, shipped on by default (parity, D-B2/§5.5).\r\n // Router-safe: resolves to EMPTY when no ActivatedRoute is present.\r\n ROUTER_FORM_ID_PROVIDER,\r\n ...features.flatMap(f => f.providers),\r\n ]);\r\n}\r\n","// Phase 1 — Step 1.D: moved to src/lib/config/provide-ngx-t-forms.ts.\r\n// This re-export shim preserves the old import path for one minor cycle\r\n// (target removal v3.0.0).\r\nexport {\r\n provideNgxTForms,\r\n type NgxTFormsFeature,\r\n NgxTFormsFeatureKind,\r\n} from '../../../../config/provide-ngx-t-forms';\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Observable, catchError, take, throwError } from 'rxjs';\r\nimport type { PipelineStage } from 'mongoose';\r\nimport type {\r\n IPipelineGenerationResponse,\r\n IRunPipelineResponse,\r\n} from 'ngx-t-forms-types';\r\n\r\nimport { PipelineRepository } from '../domain/pipeline.repository';\r\n\r\n/**\r\n * @public\r\n *\r\n * Default HTTP-backed implementation of {@link PipelineRepository}. Bound by\r\n * {@link withHttpPipeline}; consumers needing a different transport should\r\n * provide their own implementation against {@link PIPELINE_REPOSITORY}.\r\n *\r\n * The endpoint host (`http://localhost:5000`) is preserved from the pre-Phase-2\r\n * `PipelineService` for I-1 parity. Configurable endpoints are tracked for a\r\n * later phase — do not widen this surface ad-hoc.\r\n */\r\n@Injectable()\r\nexport class HttpPipelineRepository implements PipelineRepository {\r\n readonly #http = inject(HttpClient);\r\n\r\n runPipeline(\r\n pipeline: PipelineStage[],\r\n workflowId: string,\r\n ): Observable<IRunPipelineResponse> {\r\n const url =\r\n 'http://localhost:5000/api/v1/pipelineBuilder/runPipeline';\r\n return this.#http\r\n .post<IRunPipelineResponse>(url, { pipeline, workflowId })\r\n .pipe(take(1), catchError(this.#handleError));\r\n }\r\n\r\n generatePipeline(\r\n query: string,\r\n schema: object,\r\n threadId: string | undefined,\r\n existingPipeline: PipelineStage[],\r\n previousError: string,\r\n ): Observable<IPipelineGenerationResponse> {\r\n if (!schema) {\r\n throw new Error('Schema is required');\r\n }\r\n const payload = {\r\n query,\r\n schema,\r\n threadId,\r\n existingPipeline,\r\n previousError,\r\n };\r\n const url =\r\n 'http://localhost:5000/api/v1/pipelineBuilder/generatePipeline';\r\n return this.#http\r\n .post<IPipelineGenerationResponse>(url, payload)\r\n .pipe(take(1), catchError(this.#handleError));\r\n }\r\n\r\n getSchema(workflowId: string): Observable<{ schema: object }> {\r\n if (!workflowId) {\r\n throw new Error('WorkflowId is required');\r\n }\r\n const url =\r\n 'http://localhost:5000/api/v1/pipelineBuilder/getSchema';\r\n return this.#http\r\n .get<{ schema: object }>(url, { params: { workflowId } })\r\n .pipe(take(1), catchError(this.#handleError));\r\n }\r\n\r\n #handleError(_error: unknown): Observable<never> {\r\n return throwError(\r\n () =>\r\n new Error(\r\n 'Something went wrong with the pipeline generation; please try again later.',\r\n ),\r\n );\r\n }\r\n}\r\n","import { NgxTFormsFeature, NgxTFormsFeatureKind } from './provide-ngx-t-forms';\r\nimport { PIPELINE_REPOSITORY } from '../tokens/pipeline-repository.token';\r\nimport { HttpPipelineRepository } from '../infrastructure/http-pipeline.repository';\r\n\r\n/**\r\n * @public\r\n *\r\n * Binds the default HTTP-backed {@link HttpPipelineRepository} to\r\n * {@link PIPELINE_REPOSITORY}. Required when the consumer uses any\r\n * pipeline-running feature (e.g. the pipeline-generator UI) and wants the\r\n * built-in HTTP transport.\r\n *\r\n * Consumers that supply their own {@link PipelineRepository} implementation\r\n * should bind it directly to {@link PIPELINE_REPOSITORY} instead of (or after)\r\n * calling this — provider order resolution applies.\r\n *\r\n * @example\r\n * bootstrapApplication(AppComponent, {\r\n * providers: [\r\n * provideHttpClient(),\r\n * provideNgxTForms(config, withHttpPipeline()),\r\n * ],\r\n * });\r\n */\r\nexport function withHttpPipeline(): NgxTFormsFeature {\r\n return {\r\n kind: NgxTFormsFeatureKind.HttpPipeline,\r\n providers: [\r\n { provide: PIPELINE_REPOSITORY, useClass: HttpPipelineRepository },\r\n ],\r\n };\r\n}\r\n","import { INPUT_SECRET_TOKEN } from '../tokens/input-secret.token';\r\nimport { NgxTFormsFeature, NgxTFormsFeatureKind } from './provide-ngx-t-forms';\r\n\r\n/**\r\n * Registers the HMAC secret used to derive per-input encryption keys for the\r\n * signature input. Required only when the signature input is in use — if the\r\n * token is unbound at the point of encryption/decryption the library throws a\r\n * clear error rather than silently falling back to a baked-in default.\r\n *\r\n * @param secret High-entropy string supplied by the consumer (e.g. read from\r\n * their own `environment.ts` or a runtime config endpoint).\r\n *\r\n * @example\r\n * provideNgxTForms(\r\n * myConfig,\r\n * withInputSecret(environment.ngxTFormsInputSecret),\r\n * )\r\n */\r\nexport function withInputSecret(secret: string): NgxTFormsFeature {\r\n if (!secret) {\r\n throw new Error(\r\n '[ngx-t-forms] withInputSecret() requires a non-empty secret string.',\r\n );\r\n }\r\n return {\r\n kind: NgxTFormsFeatureKind.InputSecret,\r\n providers: [{ provide: INPUT_SECRET_TOKEN, useValue: secret }],\r\n };\r\n}\r\n","import { Observable } from 'rxjs';\r\nimport type { PipelineStage } from 'mongoose';\r\nimport type {\r\n IPipelineGenerationResponse,\r\n IRunPipelineResponse,\r\n} from 'ngx-t-forms-types';\r\n\r\n/**\r\n * @public\r\n *\r\n * Abstract repository for MongoDB-aggregation-pipeline operations used by the\r\n * library's pipeline-generator UI. The default HTTP-backed implementation is\r\n * {@link HttpPipelineRepository}, bound by {@link withHttpPipeline}.\r\n *\r\n * Consumers may bind a custom implementation against\r\n * {@link PIPELINE_REPOSITORY} (e.g. for offline / mocked environments) by\r\n * providing an alternative `useClass` against the same token instead of (or\r\n * after) `withHttpPipeline()`.\r\n *\r\n * Only the methods that cross the HTTP boundary are abstracted here; pipeline\r\n * orchestration state (`pipeline$`, `chatHistory$`, etc.) remains inside the\r\n * adapter / generator UI per LP §9 (the repository owns I/O, not UI state).\r\n */\r\nexport abstract class PipelineRepository {\r\n /**\r\n * Execute the given aggregation pipeline against the configured backend for\r\n * the supplied workflow.\r\n *\r\n * @param pipeline - Validated MongoDB aggregation stages to run.\r\n * @param workflowId - Identifier of the workflow whose schema the pipeline\r\n * targets.\r\n * @returns An observable that emits exactly one {@link IRunPipelineResponse}\r\n * then completes. Errors surface as a typed Error.\r\n */\r\n abstract runPipeline(\r\n pipeline: PipelineStage[],\r\n workflowId: string,\r\n ): Observable<IRunPipelineResponse>;\r\n\r\n /**\r\n * Ask the configured backend to generate (or refine) an aggregation pipeline\r\n * from a natural-language query plus the workflow's document schema.\r\n *\r\n * @param query - The user's prompt.\r\n * @param schema - Document schema the generator should target.\r\n * @param threadId - Optional generator-session id (continues an in-flight\r\n * chat).\r\n * @param existingPipeline - The pipeline-so-far, for incremental refinement.\r\n * @param previousError - The last execution error to feed back into the\r\n * model, when applicable.\r\n */\r\n abstract generatePipeline(\r\n query: string,\r\n schema: object,\r\n threadId: string | undefined,\r\n existingPipeline: PipelineStage[],\r\n previousError: string,\r\n ): Observable<IPipelineGenerationResponse>;\r\n\r\n /**\r\n * Fetch the document schema for the supplied workflow.\r\n *\r\n * @param workflowId - Identifier of the workflow whose schema to load.\r\n */\r\n abstract getSchema(workflowId: string): Observable<{ schema: object }>;\r\n}\r\n","export function getAvatar(name: string): string {\r\n return `https://ui-avatars.com/api/?font-size=0.36&bold=true&name=${encodeURIComponent(name)}&background=random`;\r\n}","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'daysAgo',\r\n standalone: true,\r\n})\r\nexport class DaysAgoPipe implements PipeTransform {\r\n /**\r\n * Angular's `PipeTransform` contract types `value` as `any`. We mirror that and\r\n * coerce to a date-like input internally.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- PipeTransform contract: value is `any` per Angular.\r\n transform(value: any, args?: unknown): string | unknown {\r\n void args;\r\n if (value) {\r\n const seconds = Math.floor((+new Date() - +new Date(value)) / 1000);\r\n if (seconds < 15)\r\n // less than 30 seconds ago will show as 'Just now'\r\n return 'Just now';\r\n const intervals: Record<string, number> = {\r\n year: 31536000,\r\n month: 2592000,\r\n week: 604800,\r\n day: 86400,\r\n hr: 3600,\r\n min: 60,\r\n sec: 1,\r\n };\r\n let counter;\r\n for (const i in intervals) {\r\n counter = Math.floor(seconds / (intervals[i] ?? 1));\r\n if (counter > 0)\r\n if (counter === 1) {\r\n return counter + ' ' + i + ' ago'; // singular (1 day ago)\r\n } else {\r\n return counter + ' ' + i + 's ago'; // plural (2 days ago)\r\n }\r\n }\r\n }\r\n return value;\r\n }\r\n}\r\n\r\n\r\n\r\n@Pipe({\r\n name: 'unCamelCase',\r\n standalone: true,\r\n})\r\nexport class ConvertCamelCasePipe implements PipeTransform {\r\n /**\r\n * Angular's `PipeTransform` contract types `value` as `any`.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- PipeTransform contract: value is `any` per Angular.\r\n transform(value: any, args?: unknown): unknown {\r\n void args;\r\n if (value) {\r\n return value.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/([A-Z])([A-Z][a-z])/g, '$1 $2');\r\n }\r\n return value;\r\n }\r\n}\r\n","/**\r\n * Escapes special characters in a string to be used in a regex.\r\n * e.g. \"C++\" -> \"C\\+\\+\"\r\n */\r\nfunction escapeRegExp(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\n/**\r\n * Converts a string into a fuzzy regex pattern.\r\n * e.g. \"ts\" -> /t.*s/i\r\n */\r\nfunction createFuzzyRegExp(query: string): RegExp {\r\n // 1. Escape the query to prevent invalid regex errors\r\n const escapedQuery = escapeRegExp(query);\r\n\r\n // 2. Insert \".*\" between every character\r\n // \"ts\" -> ['t', 's'] -> \"t.*s\"\r\n const pattern = escapedQuery.split('').join('.*');\r\n\r\n // 3. Create the RegExp (case-insensitive)\r\n return new RegExp(pattern, 'i');\r\n}\r\n\r\n/**\r\n * Performs the fuzzy search against a target string.\r\n * Returns false for blank queries instead of matching everything.\r\n */\r\nexport function fuzzySearch(query: string, text: string): boolean {\r\n if (!query?.trim()) return false;\r\n const regex = createFuzzyRegExp(query);\r\n return regex.test(text);\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n OnInit,\r\n PLATFORM_ID,\r\n inject,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nimport { CommonModule, DOCUMENT, isPlatformBrowser } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ActivatedRoute, ActivatedRouteSnapshot, Router, RouterModule } from '@angular/router';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { FormListSection, LocalFormStateSelectorInterface } from 'ngx-t-forms-types';\r\nimport type { FormsStoreSelectorsInterface } from 'ngx-t-forms-types';\r\nimport { BehaviorSubject, combineLatest, map, Observable, of } from 'rxjs';\r\n\r\nimport { FormsStoreService } from './store/forms-store.service';\r\nimport { getAvatar } from '../../shared/functions/getAvatar';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../injection-tokens';\r\nimport { DaysAgoPipe } from '../../shared/pipes/date/days-ago.pipe';\r\nimport { fuzzySearch } from '../../shared/functions/fuzzyTextSearch';\r\n\r\n\r\n/**\r\n * Renders the list of forms a user can open, edit, or build, with search,\r\n * grouping (system vs custom), and section switching (active / archived /\r\n * deleted) wired through the consumer-supplied `formBuilder` config.\r\n *\r\n * @remarks\r\n * The component reads its data from `FormsStoreService` (provided locally)\r\n * and reads the consumer's `NgxTFormsConfig` from {@link NGX_T_FORMS_CONFIG_TOKEN}\r\n * to discover the close-button template and form CRUD callbacks\r\n * (`editForm`, `addNewForm`).\r\n *\r\n * Inputs:\r\n * - _None._ The component is driven entirely by the activated route and\r\n * the injected forms store.\r\n *\r\n * Outputs:\r\n * - _None._ User intents (archive / unarchive / delete / edit / add) are\r\n * delegated to the store and to the consumer's `formBuilder` config.\r\n */\r\n@Component({\r\n selector: 'lib-forms, app-forms',\r\n templateUrl: './forms.component.html',\r\n styleUrl: './forms.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n RouterModule,\r\n DaysAgoPipe,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatProgressSpinnerModule,\r\n MatToolbarModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n ],\r\n providers: [\r\n FormsStoreService,\r\n ],\r\n})\r\nexport class FormsComponent implements OnInit {\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #route = inject(ActivatedRoute);\r\n readonly #store = inject(FormsStoreService);\r\n readonly #document = inject(DOCUMENT);\r\n readonly #platformId = inject(PLATFORM_ID);\r\n\r\n selectFormsList$: Observable<LocalFormStateSelectorInterface[]> = this.#store.selectors.selectForms$;\r\n selectGroupedForms$ = this.selectFormsList$.pipe(\r\n map(forms => forms.reduce((acc, curr) => {\r\n const key = curr.systemDefault ? 'system' : 'custom';\r\n\r\n if (!acc[key]) acc[key] = [];\r\n acc[key].push(curr);\r\n\r\n return acc;\r\n }, { system: [], custom: [] } as Record<string, LocalFormStateSelectorInterface[]>))\r\n );\r\n\r\n #searchQuerySubject = new BehaviorSubject<string>('');\r\n searchQuery$ = this.#searchQuerySubject.asObservable();\r\n selectHasActiveSearch$ = this.searchQuery$.pipe(map(q => !!(q?.trim())));\r\n selectFilteredGroupedForms$ = combineLatest([\r\n this.selectGroupedForms$,\r\n this.#searchQuerySubject,\r\n ]).pipe(\r\n map(([groups, query]) => {\r\n if (!groups) return groups;\r\n const q = (query ?? '').trim();\r\n if (!q) return groups;\r\n return {\r\n custom: (groups['custom'] ?? []).filter(f => fuzzySearch(q, f.formTitle ?? '')),\r\n system: (groups['system'] ?? []).filter(f => fuzzySearch(q, f.formTitle ?? '')),\r\n };\r\n })\r\n );\r\n selectLoadingForms$ = this.#store.selectors.selectLoadingForms$;\r\n selectErrors$: FormsStoreSelectorsInterface['selectErrors$'] = this.#store.selectors.selectErrors$;\r\n selectFormListSection$ = this.#store.selectors.selectFormListSection$;\r\n NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n closeButton = this.NGX_T_FORMS_CONFIG?.formBuilder?.formsCloseButton;\r\n\r\n get formListSections(): Array<{ value: FormListSection; label: string }> {\r\n return Object.values(FormListSection).map((section) => ({ value: section, label: section.charAt(0) + section.slice(1).toLowerCase() }));\r\n }\r\n viewportWidth = 0;\r\n ngOnInit(): void {\r\n this.#route.data\r\n .pipe(takeUntilDestroyed(this.#destroyRef))\r\n .subscribe(data => {\r\n const routeState: ActivatedRouteSnapshot = data['route'];\r\n\r\n const params = routeState.queryParams;\r\n this.#store.actions.handleRouterStateChange(of(data['route']));\r\n this.#store.effects.setListSection$(of(params['section'] as FormListSection));\r\n });\r\n\r\n if (isPlatformBrowser(this.#platformId)) {\r\n this.viewportWidth = this.#document.documentElement.clientWidth;\r\n }\r\n }\r\n\r\n labels = [\r\n {\r\n label: 'Form Name',\r\n formControlName: '',\r\n },\r\n ];\r\n activeForm: string | null = null;\r\n getCols(): number {\r\n if (this.viewportWidth < 576 || this.viewportWidth === 576) {\r\n return 1;\r\n }\r\n if (this.viewportWidth > 576 && this.viewportWidth < 768 || this.viewportWidth === 768) {\r\n return 2;\r\n }\r\n if (this.viewportWidth > 768 && this.viewportWidth < 992) {\r\n return 3;\r\n }\r\n if (this.viewportWidth > 992) {\r\n return 4;\r\n }\r\n return 1;\r\n }\r\n getFormAvatar(formTitle: string): string {\r\n return getAvatar(formTitle);\r\n }\r\n async archive(form: LocalFormStateSelectorInterface, event: Event): Promise<void> {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!isPlatformBrowser(this.#platformId)) return;\r\n const win = this.#document.defaultView;\r\n if (!win) return;\r\n const userConfirmed = win.confirm(\r\n `WARNING: You are about to archive \"${form.formTitle}\". Press Cancel to stop, or OK to archive.`\r\n );\r\n\r\n if (userConfirmed) {\r\n this.#store.effects.archiveForm$(form._id);\r\n }\r\n }\r\n\r\n async unarchive(form: LocalFormStateSelectorInterface, event: Event): Promise<void> {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!isPlatformBrowser(this.#platformId)) return;\r\n const win = this.#document.defaultView;\r\n if (!win) return;\r\n const userConfirmed = win.confirm(\r\n `ALERT: You are about to Restore \"${form.formTitle}\". Press Cancel to stop, or OK to unarchive.`\r\n );\r\n\r\n if (userConfirmed) {\r\n this.#store.effects.unArchiveForm$(form._id);\r\n }\r\n }\r\n async delete(form: LocalFormStateSelectorInterface, event: Event): Promise<void> {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n if (!isPlatformBrowser(this.#platformId)) return;\r\n const win = this.#document.defaultView;\r\n if (!win) return;\r\n const userConfirmed = win.confirm(\r\n `⚠️ CRITICAL WARNING\\n\\nYou are about to permanently delete \"${form.formTitle}\".\\n\\nThis action cannot be undone. All form data will be permanently lost.\\n\\nClick 'Cancel' to keep the form\\nClick 'OK' to permanently delete`\r\n );\r\n\r\n if (userConfirmed) {\r\n this.#store.effects.deleteForm$(form._id);\r\n }\r\n }\r\n loadForms(): void {\r\n this.#store.effects.loadForms$();\r\n }\r\n router = inject(Router);\r\n activatedRoute = inject(ActivatedRoute);\r\n setSection(value: FormListSection): void {\r\n this.#store.effects.setListSection$(of(value));\r\n\r\n this.router.navigate([], {\r\n relativeTo: this.activatedRoute,\r\n queryParams: { section: value },\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n\r\n editForm(form: LocalFormStateSelectorInterface): void {\r\n this.NGX_T_FORMS_CONFIG.formBuilder.editForm(form._id);\r\n }\r\n addNewForm(): void {\r\n this.NGX_T_FORMS_CONFIG.formBuilder.addNewForm();\r\n }\r\n\r\n clearSearch(): void {\r\n this.#searchQuerySubject.next('');\r\n }\r\n\r\n get searchQuery(): string {\r\n return this.#searchQuerySubject.value;\r\n }\r\n set searchQuery(v: string) {\r\n this.#searchQuerySubject.next(v ?? '');\r\n }\r\n}\r\n","<header style=\"position: fixed;left: 0px;top:0px;width:100%;z-index: 1;\">\r\n <mat-toolbar class=\"forms-toolbar\" color=\"primary\">\r\n @if (closeButton) {\r\n <button mat-mini-fab class=\"close-button\" (click)=\"closeButton.onClick()\" aria-label=\"Close\">\r\n <mat-icon>{{ closeButton.icon }}</mat-icon>\r\n </button>\r\n }\r\n <span class=\"spacer\"></span>\r\n\r\n <div class=\"section-switcher\" role=\"tablist\">\r\n @for (section of formListSections; track section.value) {\r\n @if(section.value === (selectFormListSection$ | async)){\r\n <button \r\n mat-raised-button (click)=\"setSection(section.value)\">\r\n {{ section.label }}\r\n </button>\r\n } @else{\r\n <button \r\n\r\n role=\"tab\" \r\n mat-button (click)=\"setSection(section.value)\">\r\n {{ section.label }}\r\n </button>\r\n }\r\n\r\n }\r\n </div>\r\n <span class=\"spacer\"></span>\r\n <button mat-flat-button color=\"primary\" (click)=\"addNewForm()\" class=\"add-form-button\" aria-label=\"Create new form\">\r\n <mat-icon>add</mat-icon>\r\n <span>Add Form</span>\r\n </button>\r\n\r\n\r\n </mat-toolbar>\r\n</header>\r\n<div class=\"forms-wrapper\">\r\n\r\n <br>\r\n <div class=\"content-container\">\r\n <div class=\"search-container\">\r\n\r\n\r\n <mat-form-field appearance=\"outline\" class=\"search-field toolbar-search\" subscriptSizing=\"dynamic\">\r\n <mat-label>Search forms</mat-label>\r\n <input matInput type=\"search \" [(ngModel)]=\"searchQuery\" placeholder=\"Type to filter by form name...\"\r\n aria-label=\"Search forms by name\" autocomplete=\"off\" />\r\n <mat-icon matPrefix aria-hidden=\"true\">search</mat-icon>\r\n @if (searchQuery.trim()) {\r\n <button mat-icon-button matSuffix (click)=\"clearSearch()\" aria-label=\"Clear search\" type=\"button\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n </mat-form-field>\r\n\r\n\r\n </div>\r\n\r\n @if ((selectErrors$ | async)?.['LoadForms']) {\r\n <div class=\"error-container mat-elevation-z2\" role=\"alert\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"error-icon\" color=\"warn\">error_outline</mat-icon>\r\n <span class=\"error-message\">{{ (selectErrors$ | async)?.['LoadForms'] }}</span>\r\n <button mat-icon-button class=\"refresh-button\" (click)=\"loadForms()\" aria-label=\"Retry loading forms\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (selectLoadingForms$ | async) {\r\n <div class=\"loading-container\">\r\n <mat-spinner diameter=\"48\"></mat-spinner>\r\n <span class=\"loading-text\">Loading forms...</span>\r\n </div>\r\n } @else {\r\n @if (selectFilteredGroupedForms$ | async; as groups) {\r\n <div class=\"form-sections\">\r\n <section class=\"form-section\" aria-labelledby=\"local-forms-heading\">\r\n <div class=\"section-header\">\r\n <h2 id=\"local-forms-heading\" class=\"section-title\">Local Forms</h2>\r\n <span class=\"section-subtitle\">Forms created by you</span>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"formListOptions\"\r\n [ngTemplateOutletContext]=\"{ forms: groups['custom'], hasActiveSearch: (selectHasActiveSearch$ | async) }\"></ng-container>\r\n </section>\r\n\r\n <section class=\"form-section\" aria-labelledby=\"global-forms-heading\">\r\n <div class=\"section-header\">\r\n <h2 id=\"global-forms-heading\" class=\"section-title\">Global Forms</h2>\r\n <span class=\"section-subtitle\">Standard system templates</span>\r\n </div>\r\n <ng-container [ngTemplateOutlet]=\"formListOptions\"\r\n [ngTemplateOutletContext]=\"{ forms: groups['system'], hasActiveSearch: (selectHasActiveSearch$ | async) }\"></ng-container>\r\n </section>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #formListOptions let-forms=\"forms\" let-hasActiveSearch=\"hasActiveSearch\">\r\n @if ((forms)?.length === 0) {\r\n <div class=\"empty-container\">\r\n <img src=\"https://res.cloudinary.com/glick/image/upload/v1738529610/ngx-t-forms/Blank_canvas-cuate_v7rpe0.svg\"\r\n alt=\"\" class=\"empty-illustration\" />\r\n <p class=\"empty-message\">\r\n @if (hasActiveSearch) {\r\n <strong>No forms match your search.</strong>\r\n <br />\r\n <span class=\"empty-hint\">Try a different search term.</span>\r\n } @else {\r\n <strong>No forms available.</strong>\r\n }\r\n </p>\r\n </div>\r\n }\r\n\r\n <mat-nav-list class=\"forms-list\">\r\n @for (form of forms ?? []; track form._id) {\r\n <mat-list-item (click)=\"editForm(form)\" [disabled]=\"form.busy\" [class.archived]=\"form.archived\"\r\n [class.has-errors]=\"form.errors.length > 0\" [class.elevated]=\"activeForm === form._id\"\r\n (mouseover)=\"activeForm = form._id\" (mouseleave)=\"activeForm = null\" class=\"form-list-item\"\r\n [attr.aria-busy]=\"form.busy\">\r\n @if (form.busy) {\r\n <mat-spinner matListItemAvatar [diameter]=\"48\" class=\"form-item-spinner\"></mat-spinner>\r\n }\r\n\r\n <img [class.error]=\"form.errors.length > 0\" matListItemAvatar [src]=\"getFormAvatar(form.formTitle)\"\r\n [alt]=\"'Form preview: ' + form.formTitle\" />\r\n <div matListItemTitle class=\"form-item-content\" [class.has-errors]=\"form.errors.length > 0\">\r\n <div class=\"form-title-row\">\r\n <span class=\"form-title\">{{ form.formTitle | titlecase }}</span>\r\n\r\n </div>\r\n <div class=\"form-metadata\">\r\n <span class=\"metadata-item\">\r\n <mat-icon aria-hidden=\"true\">add_circle_outline</mat-icon>\r\n <small>Created {{ form.createdAt | daysAgo }}</small>\r\n </span>\r\n <span class=\"metadata-divider\" aria-hidden=\"true\">·</span>\r\n <span class=\"metadata-item\">\r\n <mat-icon aria-hidden=\"true\">update</mat-icon>\r\n <small>Updated {{ form.updatedAt | daysAgo }}</small>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <span class=\"form-actions\" matListItemMeta>\r\n @if (form.errors.length > 0) {\r\n <span class=\"error-badge\" [matTooltip]=\"form.errors.length + ' error(s) found in this form'\">\r\n <mat-icon>error</mat-icon>\r\n <span>{{ form.errors.length }}</span>\r\n </span>\r\n }\r\n <button mat-icon-button [matMenuTriggerFor]=\"formActionsMenu\" [matMenuTriggerData]=\"{ form: form }\"\r\n class=\"form-actions-trigger\" aria-label=\"Form actions\" (click)=\"$event.stopPropagation()\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </span>\r\n </mat-list-item>\r\n }\r\n </mat-nav-list>\r\n</ng-template>\r\n\r\n<mat-menu #formActionsMenu=\"matMenu\" xPosition=\"before\">\r\n <ng-template matMenuContent let-form=\"form\">\r\n @if (!form.archived) {\r\n <button mat-menu-item (click)=\"archive(form, $event)\" aria-label=\"Archive form\">\r\n <mat-icon>archive</mat-icon>\r\n <span>Archive</span>\r\n </button>\r\n } @else {\r\n <button mat-menu-item (click)=\"unarchive(form, $event)\" aria-label=\"Restore form\">\r\n <mat-icon>unarchive</mat-icon>\r\n <span>Restore</span>\r\n </button>\r\n <button mat-menu-item class=\"menu-item-destructive\" (click)=\"delete(form, $event)\"\r\n aria-label=\"Permanently delete form\">\r\n <mat-icon>delete_forever</mat-icon>\r\n <span>Delete permanently</span>\r\n </button>\r\n }\r\n </ng-template>\r\n</mat-menu>","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n linkedSignal,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport { distinctUntilChanged, EMPTY, filter, merge, of } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsStoreService } from '../forms/store/forms-store.service';\r\nimport { FormsBuilderMenuComponent } from './elements/forms-builder-menu/forms-builder-menu.component';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { InputEditorComponent } from './elements/input-editor/input-editor.component';\r\nimport { FormSectionStepperComponent } from './elements/form-section-stepper/form-section-stepper.component';\r\nimport { MissingFormConfigsComponent } from './elements/missing-form-configs/missing-form-configs.component';\r\nimport { RouterModule } from '@angular/router';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../injection-tokens';\r\nimport { FORM_ROUTE_SOURCE } from '../../tokens';\r\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRippleModule } from '@angular/material/core';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\n/**\r\n * Editor surface for authoring a form definition — sections, steps, and\r\n * the individual inputs in each step. Hosts the section stepper, input\r\n * editor, builder menu, and missing-config diagnostics.\r\n *\r\n * @remarks\r\n * The component reads its state and effects from a locally provided\r\n * `FormsStoreService` and pulls the consumer-supplied close-button template\r\n * from {@link NGX_T_FORMS_CONFIG_TOKEN}. Form loading is driven either by\r\n * the `formId` input or by the activated route's `formId` param.\r\n *\r\n * Inputs:\r\n * - `formId: string` (optional) — when set, triggers `loadForm$` on the store.\r\n *\r\n * Outputs:\r\n * - _None._ All save/refresh intents are dispatched through the local store.\r\n *\r\n * @public\r\n * @deprecated Migrating to the strict library mandates. Public surface is\r\n * preserved verbatim; internal authoring is being refactored.\r\n */\r\n@Component({\r\n selector: 'lib-form-builder, app-form-builder',\r\n templateUrl: './form-builder.component.html',\r\n styleUrl: './form-builder.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n MatToolbarModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatRippleModule,\r\n DragDropModule,\r\n FormsBuilderMenuComponent,\r\n InputEditorComponent,\r\n FormSectionStepperComponent,\r\n FormsModule,\r\n MissingFormConfigsComponent,\r\n RouterModule,\r\n ],\r\n providers: [FormsStoreService],\r\n})\r\nexport class FormBuilderComponent {\r\n readonly #store = inject(FormsStoreService);\r\n /** Optional route-driven form-id source (bound by `withRouterFormId()`, default-on). */\r\n readonly #routeFormId = inject(FORM_ROUTE_SOURCE, { optional: true });\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n /** Form-load spinner. */\r\n readonly selectLoadingForm = this.#store.signalSelectors.selectLoadingForm;\r\n /** Builder busy (saving / mutating). */\r\n readonly selectFormBuilderIsBusy = this.#store.signalSelectors.selectFormBuilderIsBusy;\r\n /** \"Updated N days ago\" label, or null. */\r\n readonly selectFormUpdated = this.#store.signalSelectors.selectFormUpdated;\r\n /** Whether the current form passes validation and can be saved. */\r\n readonly canSaveForm = this.#store.formBuilderSignalSelectors.canSaveForm;\r\n /** Whether the form in edit is unsaved (no formId yet). */\r\n readonly isNewForm = this.#store.formBuilderSignalSelectors.isNewForm;\r\n\r\n /** Optional form identifier. When set, triggers `loadForm$` on the local store. */\r\n readonly formId = input<string>();\r\n\r\n /** Whether a form id is present in the store. */\r\n readonly selectHasFormId = computed(() => !!this.#store.signalSelectors.selectFormId());\r\n /** Whether the form has missing/invalid configuration. */\r\n readonly hasMissingConfigs = this.#store.formBuilderSignalSelectors.hasMissingConfigs;\r\n\r\n /** Whether an input editor panel is currently open. */\r\n readonly elementEditorOpen = computed(() => !!this.#store.formBuilderSignalSelectors.inputInEdit());\r\n\r\n pendingExternalRefresh = toSignal(this.#store.pendingExternalRefresh$, { initialValue: null });\r\n refreshCountdown = signal(10);\r\n #countdownInterval?: ReturnType<typeof setInterval>;\r\n\r\n constructor() {\r\n effect(() => {\r\n const pending = this.pendingExternalRefresh();\r\n if (pending) {\r\n this.refreshCountdown.set(5);\r\n if (this.#countdownInterval) clearInterval(this.#countdownInterval);\r\n this.#countdownInterval = setInterval(() => {\r\n this.refreshCountdown.update((v) => Math.max(0, v - 1));\r\n }, 1000);\r\n } else {\r\n if (this.#countdownInterval) {\r\n clearInterval(this.#countdownInterval);\r\n this.#countdownInterval = undefined;\r\n }\r\n }\r\n });\r\n\r\n // Unified, de-duplicated load path: the `formId` input plus the optional\r\n // route source (FORM_ROUTE_SOURCE, bound by withRouterFormId() — shipped by\r\n // default). Replaces the former direct ActivatedRoute injection (D-B2 / §5.5).\r\n merge(toObservable(this.formId), this.#routeFormId ?? EMPTY)\r\n .pipe(\r\n filter((id): id is string => id != null && id !== ''),\r\n distinctUntilChanged(),\r\n takeUntilDestroyed(this.#destroyRef),\r\n )\r\n .subscribe((id) => this.#store.effects.loadForm$(of(id)));\r\n\r\n this.#destroyRef.onDestroy(() => {\r\n if (this.#countdownInterval) clearInterval(this.#countdownInterval);\r\n });\r\n }\r\n\r\n triggerRefreshNow(): void {\r\n this.#store.executeExternalRefreshNow();\r\n }\r\n readonly NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n readonly closeButton = this.NGX_T_FORMS_CONFIG?.formBuilder?.formBuilderCloseButton;\r\n\r\n saveForm: () => void = () => this.#store.actionsFormBuilder.handelSaveForm();\r\n\r\n /** Live form title from the store; seeds the editable field. */\r\n readonly #titleFromStore = this.#store.formBuilderSignalSelectors.selectFormTitle;\r\n\r\n /** Editable form title — seeded from the store, overridable by local edits. */\r\n protected readonly titleValue = linkedSignal<string>(() => this.#titleFromStore() ?? '');\r\n\r\n /** Pushes a title edit to the store (schedule-only refresh, matching `setFormTitle`). */\r\n protected setTitleValue(value: string): void {\r\n this.titleValue.set(value);\r\n this.#store.actionsFormBuilder.setFormTitle(value);\r\n }\r\n}\r\n","<header style=\"position:fixed;width:100%;left:0px;top:0px\">\r\n <mat-toolbar color=\"primary\">\r\n @if (closeButton) {\r\n <button mat-icon-button [style.color]=\"closeButton.color\" (click)=\"closeButton.onClick()\">\r\n <mat-icon>{{closeButton.icon}}</mat-icon>\r\n </button>\r\n }\r\n\r\n <!-- Navigation group -->\r\n <div class=\"nav-group\">\r\n <button mat-button routerLink=\"/\">Forms</button>\r\n <mat-icon>navigate_next</mat-icon>\r\n </div>\r\n\r\n <!-- Title input with optimized binding -->\r\n @if (selectHasFormId()) {\r\n <input [ngModel]=\"titleValue()\" (ngModelChange)=\"setTitleValue($event)\" class=\"section-title-input\" placeholder=\"Enter Form Title\">\r\n }\r\n\r\n <span class=\"spacer\"></span>\r\n\r\n @defer (on viewport) {\r\n <lib-forms-builder-menu />\r\n } @placeholder {\r\n <div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"20\" />\r\n </div>\r\n\r\n }\r\n\r\n <span class=\"divider\">|</span>\r\n\r\n <!-- Persist to server: visible once local preview is in sync -->\r\n @if (!pendingExternalRefresh()) {\r\n <button mat-raised-button color=\"accent\" class=\"save-button\" [disabled]=\"!(canSaveForm())\" (click)=\"saveForm()\">\r\n <mat-icon style=\"width: 24px;\">cloud_upload</mat-icon>\r\n @if (selectFormBuilderIsBusy()) {\r\n <span class=\"save-text\">\r\n <span class=\"save-label\">{{(isNewForm()) ? 'Creating form...' : 'Saving changes...'}}</span>\r\n </span>\r\n } @else {\r\n <span class=\"save-text\">\r\n <span class=\"save-label\">{{(isNewForm()) ? 'Save New Form' : 'Save Changes'}}</span>\r\n @if (canSaveForm()) {\r\n <span class=\"save-sub\">Not saved to server yet</span>\r\n }\r\n </span>\r\n }\r\n </button>\r\n }\r\n\r\n <!-- Local sync: applies your changes to the builder preview · does NOT save to server -->\r\n @if (pendingExternalRefresh()) {\r\n <button class=\"refresh-button\" matRipple matRippleColor=\"rgba(255,255,255,0.12)\" (click)=\"triggerRefreshNow()\">\r\n <span class=\"countdown-ring\">\r\n <mat-progress-spinner\r\n diameter=\"34\"\r\n mode=\"determinate\"\r\n [value]=\"refreshCountdown() * 20\">\r\n </mat-progress-spinner>\r\n <span class=\"countdown-number\">{{refreshCountdown()}}</span>\r\n </span>\r\n <span class=\"refresh-text\">\r\n <span class=\"refresh-label\">Apply Now</span>\r\n <span class=\"refresh-sub\">Preview updates in {{refreshCountdown()}}s</span>\r\n </span>\r\n <mat-icon class=\"refresh-chevron\">chevron_right</mat-icon>\r\n </button>\r\n }\r\n\r\n </mat-toolbar>\r\n</header>\r\n\r\n<!-- Main content with optimized loading -->\r\n@defer (on viewport) {\r\n<div class=\"container\">\r\n <div class=\"middle\">\r\n <br>\r\n @if (selectLoadingForm()) {\r\n <div class=\"loading-container\">\r\n <mat-spinner />\r\n </div>\r\n } @else {\r\n <lib-form-section-stepper />\r\n }\r\n <br>\r\n @if ((hasMissingConfigs()) && !(selectLoadingForm())) {\r\n <lib-missing-form-configs />\r\n }\r\n <!-- Updated time info -->\r\n @if (!(isNewForm())) {\r\n <div class=\"updated-time\">\r\n <mat-icon>update</mat-icon>\r\n <span>Updated {{ selectFormUpdated() }}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (elementEditorOpen()) {\r\n <lib-input-editor style=\"max-width:480px;height:calc(100vh - 76px);\r\n position:sticky;\r\n top:76px;\r\n z-index:1\" cdkDrag cdkDragBoundary=\"container\" class=\"middle editor-container\" />\r\n }\r\n <!-- Missing fields section -->`\r\n\r\n\r\n</div>\r\n}@placeholder {\r\n<div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"50\" />\r\n</div>\r\n}","import { inject, Injectable } from '@angular/core';\r\nimport { IStepOption, TourService } from 'ngx-ui-tour-md-menu';\r\n\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TourManagerService {\r\n\r\n\r\n private readonly tourService = inject(TourService);\r\n userProfile = this\r\n constructor() { }\r\n\r\n startTourByOption(steps: IStepOption[]) {\r\n\r\n this.tourService.end()\r\n this.tourService.initialize(steps, {\r\n enableBackdrop: true,\r\n showProgress: true,\r\n backdropConfig: {\r\n offset: 10,\r\n },\r\n });\r\n this.tourService.start();\r\n return {\r\n stepShow$: this.tourService.stepShow$,\r\n stepHide$: this.tourService.stepHide$,\r\n initialize$: this.tourService.initialize$,\r\n start$: this.tourService.start$,\r\n end$: this.tourService.end$,\r\n pause$: this.tourService.pause$,\r\n resume$: this.tourService.resume$,\r\n }\r\n\r\n }\r\n\r\n\r\n}\r\n","interface FileInputEvent {\r\n target: { files: FileList | null } | null;\r\n}\r\n\r\ninterface FileUploadedResult {\r\n fileName: string;\r\n type: string | undefined;\r\n base64: string | ArrayBuffer | null;\r\n blob: File;\r\n}\r\n\r\nexport default (event: Event | FileInputEvent, fileType?: string): Promise<FileUploadedResult> => {\r\n const target = (event as FileInputEvent).target;\r\n const file = target?.files?.[0];\r\n if (!file) {\r\n return Promise.reject(new Error('No file selected'));\r\n }\r\n const reader = new FileReader();\r\n return new Promise<FileUploadedResult>((resolve) => {\r\n reader.addEventListener(\r\n 'load',\r\n () => {\r\n // convert image file to base64 string'\r\n\r\n const fileUploaded: FileUploadedResult = {\r\n fileName: file.name,\r\n type: fileType,\r\n base64: reader.result,\r\n blob: file,\r\n };\r\n resolve(fileUploaded);\r\n\r\n },\r\n\r\n );\r\n // addEventListener('progress', (event: ProgressEvent<EventTarget>) => {\r\n // this.loading = event.loaded / event.total;\r\n // });\r\n reader.readAsDataURL(file);\r\n })\r\n\r\n }\r\n","import { ChangeDetectionStrategy, Component, DestroyRef, PLATFORM_ID, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatStepper, MatStepperModule } from '@angular/material/stepper';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport { StepState } from '@angular/cdk/stepper';\r\nimport { TourMatMenu } from 'ngx-ui-tour-md-menu';\r\n\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { DatabaseFormInterface, FormBuilderFunctions, FormColumnInputs, ITowerFormSteps } from 'ngx-t-forms-types';\r\nimport { catchError, take, tap } from 'rxjs';\r\nimport { TFormEngine } from '../../services/core/t-form-engine/t-form-engine';\r\nimport { getSubmissionStatusFn } from '../../services/core/t-form-tower-controller/functions/getSubmissionStatus';\r\nimport { IFormTour } from '../../services/core/t-form-tower-controller/functions/selectFormSteps';\r\nimport { _isEqual } from '../../shared/functions/isEqual';\r\nimport { TourManagerService } from '../../services/core/tour/tour-manager.service';\r\nimport { TFormInputComponent } from '../t-form-input/t-form-input.component';\r\nimport { TitleCasePipe, isPlatformBrowser } from '@angular/common';\r\nimport type { FileData } from 'ngx-t-forms-types';\r\nimport type { OverridableError } from '../../services/core/t-form-tower-controller/functions/overrideValidation';\r\nimport onFileSelectEventInput from '../../shared/functions/onFileSelectEventInput';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\n/**\r\n * End-user surface for filling out a form. Extends `FormTowerControllerService`\r\n * to drive a `MatStepper` of form sections and renders each section's inputs\r\n * via `TFormInputComponent`. Loads the form definition through the consumer's\r\n * `formBuilder.getForm` hook on `NgxTFormsConfig`, supports undo (Ctrl+Z),\r\n * initial values, and per-instance global system inputs.\r\n *\r\n * Inputs:\r\n * - `formId: string | undefined` — when set, fetches the form\r\n * definition and initialises the tower controller.\r\n * - `initialValues: Record<string, unknown> | undefined` — seed the form\r\n * with previously captured values; only re-initialises when the value\r\n * actually changes.\r\n * - `globalSystemInputs: FormColumnInputs[]` — system-level inputs\r\n * merged into every step of the form; re-initialises the form when set.\r\n * - `passParamsOnSubmit: Record<string, unknown> | undefined` — extra params\r\n * passed through to the consumer's submit handler.\r\n *\r\n * Outputs:\r\n * - _None._ Submission and lifecycle events are dispatched through the\r\n * inherited `FormTowerControllerService` and the consumer's\r\n * `formActions` / `formBuilder` callbacks.\r\n */\r\n@Component({\r\n selector: 'lib-user-form-stepper',\r\n imports: [\r\n TitleCasePipe,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatStepperModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n TFormInputComponent,\r\n ReactiveFormsModule,\r\n ...TourMatMenu,\r\n ],\r\n templateUrl: './user-form-stepper.component.html',\r\n styleUrl: './user-form-stepper.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '(document:keydown)': 'onKeyDown($event)',\r\n },\r\n providers: [TFormEngine],\r\n})\r\nexport class UserFormStepperComponent {\r\n\r\n /**\r\n * Runtime form engine, held by composition (SIGNAL_FORMS Phase 0, D-025).\r\n * Provided per-component instance; the component reaches the former\r\n * inherited tower surface through this façade.\r\n */\r\n protected readonly engine = inject(TFormEngine);\r\n\r\n /** Form definition id; when set, the component fetches and initialises the form. */\r\n readonly formId = input<string | undefined>();\r\n\r\n /**\r\n * Seed values applied to the form once it is initialised.\r\n *\r\n * A keyed record of previously captured values (raw API payloads, partial\r\n * form values, nested objects). The downstream `initializeFormValues`\r\n * consumes the entries defensively; callers narrow specific value shapes.\r\n */\r\n readonly initialValues = input<Record<string, unknown> | undefined>(undefined);\r\n\r\n /** System-level inputs merged into every step of the form. */\r\n readonly globalSystemInputs = input<FormColumnInputs[]>([]);\r\n\r\n /**\r\n * Extra params forwarded to the consumer's submit handler.\r\n *\r\n * A keyed record merged into the submission payload; only meaningful to the\r\n * consumer's own submit handler, which narrows the individual values.\r\n */\r\n readonly passParamsOnSubmit = input<Record<string, unknown> | undefined>(undefined);\r\n\r\n /** Underlying Material stepper instance (may be undefined before first CD pass). */\r\n readonly stepper = viewChild<MatStepper>('stepper');\r\n\r\n /** Whether the form is editable / can be navigated freely. */\r\n isEditable = true;\r\n\r\n /** True while the form definition is being fetched. */\r\n readonly loading = signal<boolean>(false);\r\n\r\n protected readonly tourManagerService = inject(TourManagerService);\r\n\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n /**\r\n * Mirrors the last applied `initialValues` so we only re-apply on change.\r\n * Same shape as the `initialValues` input.\r\n */\r\n readonly #initialFormValuesLocal = signal<Record<string, unknown> | undefined>(undefined);\r\n\r\n protected readonly formIdBridge = effect(() => {\r\n const value = this.formId();\r\n // Preserve original guard against the tower's form definition verbatim — see migration notes.\r\n // `engine.form` is read via `untracked` so this effect depends ONLY on `formId()`:\r\n // `loadForm` → `engine.initialize` writes the `#definition` signal that backs `engine.form`,\r\n // and tracking that read here would re-trigger the effect → re-fetch → infinite loop.\r\n if (_isEqual(untracked(() => this.engine.form), value)) return;\r\n this.loadForm(value);\r\n });\r\n\r\n protected readonly initialValuesBridge = effect(() => {\r\n const initialFormValues = this.initialValues();\r\n if (\r\n !!initialFormValues &&\r\n typeof initialFormValues === 'object' &&\r\n !_isEqual(this.#initialFormValuesLocal(), initialFormValues)\r\n ) {\r\n this.#initialFormValuesLocal.set(initialFormValues);\r\n this.engine.initializeFormValues(initialFormValues);\r\n }\r\n });\r\n\r\n protected readonly globalSystemInputsBridge = effect(() => {\r\n const inputs = this.globalSystemInputs();\r\n if (!Array.isArray(inputs)) return;\r\n this.engine.systemInputs = inputs;\r\n // Read `engine.form` untracked: this effect must depend ONLY on `globalSystemInputs()`.\r\n // `initialize` writes the `#definition` signal behind `engine.form`, so a tracked read\r\n // would re-trigger the effect and re-initialise in a loop.\r\n const form = untracked(() => this.engine.form);\r\n if (form) {\r\n this.engine.initialize(form);\r\n }\r\n });\r\n\r\n /**\r\n * Handles the key down event and reverts the form's last history entry on Ctrl+Z.\r\n * @param event The keyboard event object.\r\n */\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (event.ctrlKey && event.key === 'z') {\r\n this.engine.revertBackHistory();\r\n }\r\n }\r\n\r\n loadForm(formId: string | undefined): void {\r\n if (!formId) return;\r\n this.loading.set(true);\r\n this.engine.NGX_T_FORMS_CONFIG.formBuilder.getForm(formId).pipe(\r\n take(1),\r\n tap({\r\n next: (form: DatabaseFormInterface | null) => {\r\n this.loading.set(false);\r\n if (!form?._id) return;\r\n this.engine.initialize(form?.form);\r\n },\r\n error: () => {\r\n this.loading.set(false);\r\n },\r\n }),\r\n catchError((error) => {\r\n this.loading.set(false);\r\n return error;\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Builder-function shim passed to inputs that need callbacks (e.g.\r\n * MultipleInput, MSCOA). The user form surface only implements the subset\r\n * relevant to runtime input editing; builder-only members (`editInput`,\r\n * `deleteInput`, `addFunction`, `reorderItems`, `multipleInputToggleLabel`)\r\n * are stubbed because they have no meaning outside the form builder.\r\n */\r\n get formBuilderFunctions(): FormBuilderFunctions {\r\n const noopBuilderOnly = (): void => { /* builder-only callback — not used in user form context */ };\r\n return {\r\n getLatestAccountTree: () => this.engine.NGX_T_FORMS_CONFIG.formBuilder.getScoaTree(),\r\n getSCOAAccount: (SCOAAccount: string) => this.engine.NGX_T_FORMS_CONFIG.formBuilder.getSCOAAccount(SCOAAccount),\r\n multipleInputToggleForm: this.engine.toggleMultipleInput.bind(this.engine),\r\n multipleInputSaveForm: this.engine.saveMultipleInputForm.bind(this.engine),\r\n multipleInputEditRow: this.engine.multipleInputEditRow.bind(this.engine),\r\n multipleInputDuplicateRow: this.engine.multipleInputDuplicateRow.bind(this.engine),\r\n multipleInputToggleLabel: noopBuilderOnly,\r\n editInput: noopBuilderOnly,\r\n deleteInput: noopBuilderOnly,\r\n addFunction: noopBuilderOnly,\r\n reorderItems: noopBuilderOnly,\r\n };\r\n }\r\n\r\n getStepState(step: ITowerFormSteps, index: number): StepState {\r\n const activeStep = this.stepper()?.selectedIndex === index;\r\n if (activeStep) return 'edit';\r\n if (step.sectionForm?.touched && !step.sectionForm.valid) return 'error';\r\n if (step.sectionForm?.valid) return 'done';\r\n return 'number';\r\n }\r\n\r\n getPreviousStepLabel(): string | undefined {\r\n const stepper = this.stepper();\r\n if (stepper === undefined) return '';\r\n const currentIndex = stepper.selectedIndex;\r\n if (currentIndex > 0) {\r\n return this.engine.selectFormSteps()?.[currentIndex - 1]?.label;\r\n }\r\n return '';\r\n }\r\n\r\n getNextStepLabel(): string | undefined {\r\n const stepper = this.stepper();\r\n if (stepper === undefined) return '';\r\n const currentIndex = stepper.selectedIndex;\r\n const steps = this.engine.selectFormSteps();\r\n if (!steps) return '';\r\n if (currentIndex < steps.length - 1) {\r\n return steps[currentIndex + 1]?.label;\r\n }\r\n return '';\r\n }\r\n\r\n canProceedToNextStep(step: ITowerFormSteps): boolean {\r\n return step.sectionForm?.valid === true;\r\n }\r\n\r\n get getSubmissionStatus(): string {\r\n const progress = this.engine.formProgress() || 0;\r\n const steps = this.engine.selectFormSteps();\r\n return getSubmissionStatusFn(this.stepper(), this.engine.mainForm, progress, steps, this.loading());\r\n }\r\n\r\n handleSubmit(): void {\r\n this.engine.submitForm(this.passParamsOnSubmit() ?? {});\r\n }\r\n\r\n // ──────────────────────────────────────────────────────────────────────────\r\n // Overridable-validation gate\r\n // ──────────────────────────────────────────────────────────────────────────\r\n\r\n readonly #platformId = inject(PLATFORM_ID);\r\n\r\n /** Still-failing overridable validations the user may motivate to submit. */\r\n get overridableErrors(): OverridableError[] {\r\n return this.engine.overridableErrors();\r\n }\r\n\r\n /** True while a blocking (non-overridable) error keeps submission impossible. */\r\n get hasBlockingErrors(): boolean {\r\n return this.engine.hasBlockingErrors();\r\n }\r\n\r\n /** True once every blocking error is resolved and every override is motivated. */\r\n get canSubmit(): boolean {\r\n return this.engine.canSubmit();\r\n }\r\n\r\n /** Current motivation text for one overridable validation (for two-way display). */\r\n overrideComment(validatorId: string): string {\r\n return this.engine.overrideReasons[validatorId]?.comment ?? '';\r\n }\r\n\r\n /** File name of the attachment captured for one overridable validation, if any. */\r\n overrideAttachmentName(validatorId: string): string | undefined {\r\n return this.engine.overrideReasons[validatorId]?.attachment?.fileName;\r\n }\r\n\r\n /** Records the motivation comment as the user types. */\r\n onOverrideComment(validatorId: string, event: Event): void {\r\n const value = (event.target as HTMLTextAreaElement).value;\r\n this.engine.setOverrideComment(validatorId, value);\r\n }\r\n\r\n /**\r\n * Reads the chosen supporting file into a base64 {@link FileData} and attaches\r\n * it to the override; clearing the picker removes the attachment. Browser-only\r\n * (FileReader) — a no-op under SSR.\r\n */\r\n async onOverrideAttachment(validatorId: string, event: Event): Promise<void> {\r\n if (!isPlatformBrowser(this.#platformId)) return;\r\n const file = (event.target as HTMLInputElement).files?.[0];\r\n if (!file) {\r\n this.engine.setOverrideAttachment(validatorId, undefined);\r\n return;\r\n }\r\n const result = await onFileSelectEventInput(event, file.type);\r\n const attachment: FileData = {\r\n base64: typeof result.base64 === 'string' ? result.base64 : '',\r\n fileName: result.fileName,\r\n type: file.type,\r\n id: uuidv4(),\r\n fileExtension: result.fileName.includes('.') ? result.fileName.split('.').pop() ?? '' : '',\r\n };\r\n this.engine.setOverrideAttachment(validatorId, attachment);\r\n }\r\n\r\n get hasTour(): boolean {\r\n return this.engine.selectAllFormTours().length > 0;\r\n }\r\n\r\n /**\r\n * Initiates and configures a dynamic, multi-step tutorial tour for the form.\r\n * The tour guides the user through the form's title, sections, and individual fields.\r\n */\r\n startTour(): void {\r\n const tourOptions = this.engine.selectAllFormTours();\r\n\r\n const formTitle = this.engine.form?.formTitle || 'this Form';\r\n const firstSectionTitle = this.engine.selectFormSteps()[0]?.label || 'First Section';\r\n\r\n const fullTourOptions: IFormTour[] = [\r\n {\r\n anchorId: 'form-title',\r\n title: `👋 Welcome to the ${formTitle} Guide!`,\r\n popoverClass: 'ngx-t-forms-tour-popover',\r\n content: 'This quick tour will show you how to complete this form. Let\\'s get started!',\r\n sectionId: tourOptions[0]?.sectionId || '',\r\n },\r\n {\r\n anchorId: tourOptions[0]?.sectionId,\r\n title: '➡️ Go to the First Section',\r\n popoverClass: 'ngx-t-forms-tour-popover',\r\n content: 'Click here to begin filling out the form.',\r\n sectionId: tourOptions[0]?.sectionId || '',\r\n nextOnAnchorClick: true,\r\n },\r\n {\r\n anchorId: 'content-' + tourOptions[0]?.sectionId,\r\n title: '📍 You are here!',\r\n popoverClass: 'ngx-t-forms-tour-popover',\r\n content: `Great! We're now in the **${firstSectionTitle}** section. Follow the prompts to see what's needed.`,\r\n sectionId: tourOptions[0]?.sectionId || '',\r\n delayBeforeStepShow: 500,\r\n },\r\n ];\r\n\r\n tourOptions.forEach((option, index) => {\r\n fullTourOptions.push(option);\r\n\r\n const nextOption = tourOptions[index + 1];\r\n\r\n if (!nextOption) return;\r\n\r\n if (nextOption.sectionId === option.sectionId) return;\r\n\r\n const nextSectionTitle = this.engine.selectFormSteps().find(step => step.sectionId === nextOption.sectionId)?.label || 'Next Section';\r\n\r\n fullTourOptions.push({\r\n anchorId: nextOption.sectionId,\r\n title: '➡️ Continue to the Next Section',\r\n popoverClass: 'ngx-t-forms-tour-popover',\r\n content: `Click here to proceed to the **${nextSectionTitle}** section.`,\r\n sectionId: option.sectionId,\r\n nextOnAnchorClick: true,\r\n });\r\n\r\n fullTourOptions.push({\r\n anchorId: 'content-' + nextOption.sectionId,\r\n title: `📍 We're in a New Section!`,\r\n popoverClass: 'ngx-t-forms-tour-popover',\r\n content: `Excellent! Now let's look at what's needed in the **${nextSectionTitle}** section.`,\r\n sectionId: nextOption.sectionId,\r\n delayBeforeStepShow: 800,\r\n });\r\n });\r\n\r\n fullTourOptions.push({\r\n anchorId: 'form-submit-button',\r\n title: '🎉 You\\'re All Set!',\r\n popoverClass: 'ngx-t-forms-tour-popover',\r\n content: 'You have completed the guide. You can now fill out the form. Click the submit button when you are finished!',\r\n sectionId: tourOptions[tourOptions.length - 1]?.sectionId || '',\r\n });\r\n\r\n this.tourManagerService.startTourByOption(fullTourOptions);\r\n }\r\n\r\n refreshASection(sectionId: string): void {\r\n this.engine.refreshSection(sectionId).pipe(\r\n take(1),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe();\r\n }\r\n}\r\n","@if (loading()) {\r\n<div class=\"loading-container\">\r\n <mat-spinner diameter=\"48\" aria-label=\"Loading form\" />\r\n</div>\r\n}\r\n\r\n <mat-toolbar [tourAnchor]=\"'form-title'\" style=\" background: none;\r\n height: 28px;\">\r\n <span class=\"spacer\"></span>\r\n <span style=\"font-size: small;\">\r\n help\r\n </span>\r\n<button \r\n[matTooltip]=\"'Start guided tour for this form'\"\r\n mat-icon-button (click)=\"startTour()\">\r\n <mat-icon>\r\n help\r\n </mat-icon>\r\n</button>\r\n</mat-toolbar>\r\n\r\n<mat-stepper \r\n\r\n[style.display]=\"loading()?'none':'block'\" #stepper class=\"form-stepper\" orientation=\"vertical\"\r\n [linear]=\"!isEditable\" aria-label=\"Form sections stepper\" [animationDuration]=\"'300'\"\r\n (selectionChange)=\"engine.handleStepChange($event)\">\r\n\r\n @for (step of engine.selectFormSteps(); track step.sectionId) {\r\n @if (!!step.sectionForm ) {\r\n <mat-step [stepControl]=\"step.sectionForm\" [completed]=\"step.sectionIsSeen && !step.sectionIsInvalid\"\r\n\r\n [editable]=\"isEditable\" [errorMessage]=\"step.sectionFormErrorMessage||''\" [state]=\"getStepState(step,$index)\"\r\n [hasError]=\"!step.sectionForm.valid && !!step.sectionForm.touched\">\r\n <ng-template matStepLabel >\r\n <div [tourAnchor]=\"step.sectionId\" class=\"step-label-container\" [attr.aria-label]=\"'Section ' + step.label\">\r\n <span class=\"step-label-text\">{{step.label|titlecase}}</span>\r\n @if (step.sectionIsSeen) {\r\n <mat-icon [class.error]=\"step.sectionIsInvalid\"\r\n [attr.aria-label]=\"step.sectionIsInvalid ? 'Section has errors' : 'Section completed'\">\r\n {{step.sectionIsSeen}}\r\n </mat-icon>\r\n }\r\n @if(engine.canRefreshSection(step.sectionId) && step.isActive){\r\n <button mat-icon-button\r\n style=\"margin-right: 8px;\"\r\n matTooltip=\"Click to refresh this section.\"\r\n class=\"input-sync-button\"\r\n (click)=\"refreshASection(step.sectionId)\" >\r\n <mat-icon style=\"color:var(--mat-sys-primary)\">sync</mat-icon>\r\n </button>\r\n }\r\n\r\n \r\n </div>\r\n </ng-template>\r\n @if(!!step.isActive){\r\n @defer (on viewport; prefetch on idle) {\r\n <div [tourAnchor]=\"'content-'+step.sectionId\" class=\"step-content\">\r\n <div class=\"row form-section\">\r\n @for (col of step.columns; track col.id) {\r\n <div [class]=\"'col-md-'+col.colSize + ' box'\">\r\n <lib-t-form-input \r\n [tourAnchor]=\"col.id\" (valueChange)=\"engine.updateValue(col.id,$event)\" [editorMode]=\"false\"\r\n [formBuilderFunctions]=\"formBuilderFunctions\" [inputConfig]=\"col\" [formGroup]=\"step.sectionForm\"\r\n [attr.aria-label]=\"col?.label || ''\">\r\n </lib-t-form-input>\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"step-actions\">\r\n @if(!$first) {\r\n <button\r\n \r\n mat-button matStepperPrevious type=\"button\" class=\"navigation-button\"\r\n [attr.aria-label]=\"'Go back to ' + getPreviousStepLabel()\">\r\n\r\n Back\r\n </button>\r\n }\r\n @if (!$last) {\r\n <button\r\n \r\n mat-flat-button matStepperNext color=\"primary\" type=\"button\" class=\"navigation-button\"\r\n [attr.aria-label]=\"'Continue to ' + getNextStepLabel()\">\r\n Next\r\n </button>\r\n }\r\n @if (!!$last) {\r\n <button mat-button (click)=\"stepper.reset();engine.reset()\">Reset</button>\r\n }\r\n </div>\r\n </div>\r\n } @placeholder {\r\n <div style=\"padding: 50px;display:flex;justify-content:center;align-items:center; text-align: center;\">\r\n <mat-spinner diameter=\"24\" />\r\n </div>\r\n }\r\n\r\n }\r\n\r\n </mat-step>\r\n }\r\n }\r\n</mat-stepper>\r\n\r\n<!-- Defer the footer toolbar until after the main form is loaded -->\r\n@defer (on idle; prefetch on viewport) {\r\n<footer>\r\n <!-- Override-reason panel: shown only when the form's sole remaining failures\r\n are overridable validations. Each requires a motivation (and optionally a\r\n supporting file) before the continue button unlocks. -->\r\n @if (overridableErrors.length > 0) {\r\n <section class=\"override-panel\" aria-label=\"Provide override reasons\">\r\n <header class=\"override-panel__header\">\r\n <mat-icon class=\"override-panel__icon\" aria-hidden=\"true\">flag</mat-icon>\r\n <div>\r\n <p class=\"override-panel__title\">Provide override reason</p>\r\n <p class=\"override-panel__hint\">\r\n @if (hasBlockingErrors) {\r\n Resolve the remaining required errors above, then motivate each override below to continue.\r\n } @else {\r\n Motivate each flagged validation below to enable submission.\r\n }\r\n </p>\r\n </div>\r\n </header>\r\n\r\n @for (err of overridableErrors; track err.validatorId) {\r\n <div class=\"override-item\">\r\n <p class=\"override-item__label\">{{ err.label | titlecase }}</p>\r\n <p class=\"override-item__message\">{{ err.message }}</p>\r\n <textarea\r\n class=\"override-item__comment\"\r\n rows=\"2\"\r\n [attr.aria-label]=\"'Override reason for ' + err.label\"\r\n [value]=\"overrideComment(err.validatorId)\"\r\n (input)=\"onOverrideComment(err.validatorId, $event)\"\r\n placeholder=\"Motivate why this can be overridden…\"></textarea>\r\n <div class=\"override-item__attach\">\r\n <label class=\"override-item__attach-label\">\r\n <mat-icon aria-hidden=\"true\">attach_file</mat-icon>\r\n <span>{{ overrideAttachmentName(err.validatorId) || 'Attach supporting file (optional)' }}</span>\r\n <input type=\"file\" hidden (change)=\"onOverrideAttachment(err.validatorId, $event)\"\r\n [attr.aria-label]=\"'Attach a supporting file for ' + err.label\" />\r\n </label>\r\n </div>\r\n </div>\r\n }\r\n </section>\r\n }\r\n\r\n <mat-toolbar class=\"submission-toolbar\" role=\"toolbar\" aria-label=\"Form submission actions\">\r\n <span class=\"submission-status\" style=\"font-size: 0.625em\" role=\"status\">\r\n {{getSubmissionStatus}}\r\n </span>\r\n <button [tourAnchor]=\"'form-submit-button'\" mat-raised-button color=\"primary\" [disabled]=\"!canSubmit || engine.submittingForm\" (click)=\"handleSubmit()\"\r\n aria-label=\"Submit form\">\r\n <span>\r\n {{ engine.formSubmissionMessage()}}\r\n </span>\r\n @if(engine.submittingForm){\r\n <mat-spinner diameter=\"10\"></mat-spinner>\r\n }\r\n\r\n </button>\r\n </mat-toolbar>\r\n</footer>\r\n} @placeholder {\r\n<!-- Simple placeholder for the footer that maintains layout -->\r\n<footer>\r\n <div class=\"submission-toolbar-placeholder\"></div>\r\n</footer>\r\n}","import { ElementEditorTypes, InputDataTypes, InputTypes } from \"ngx-t-forms-types\";\r\n\r\nexport const convertElementEditorTypesToInputType = (editType: ElementEditorTypes | undefined): InputTypes |undefined => {\r\n switch (editType) {\r\n case ElementEditorTypes.Input:\r\n return InputTypes.Text;\r\n case ElementEditorTypes.Range:\r\n return InputTypes.Number;\r\n default:\r\n return undefined\r\n }\r\n}\r\nexport const convertElementEditorTypesToInputDataType = (editType: ElementEditorTypes | undefined): InputDataTypes => {\r\n switch (editType) {\r\n case ElementEditorTypes.ListLabelConfigEditor:\r\n return InputDataTypes.Array;\r\n case ElementEditorTypes.Range:\r\n return InputDataTypes.Number;\r\n case ElementEditorTypes.DataSourcePicker:\r\n return InputDataTypes.Object;\r\n case ElementEditorTypes.ChipOptionsCreator:\r\n return InputDataTypes.Array;\r\n case ElementEditorTypes.DecisionGateSettings:\r\n return InputDataTypes.Object;\r\n case ElementEditorTypes.RecordListManager:\r\n return InputDataTypes.Array;\r\n \r\n \r\n\r\n default:\r\n return InputDataTypes.String;\r\n }\r\n }","import { InjectionToken, Type } from '@angular/core';\nimport type { TDynamicDataEditComponent } from './t-dynamic-data-edit.component';\n\n/**\n * The component used to render a nested editor surface (the dynamic-data editor\n * itself) inside editors that recurse — e.g. the record-list-manager's\n * per-record portal. Provided by {@link TDynamicDataEditComponent}.\n *\n * Injecting the type through a token (rather than importing the component as a\n * value) breaks the otherwise-circular `record-list-manager` ↔\n * `t-dynamic-data-edit` module dependency that trips a module-init TDZ when a\n * leaf editor is loaded first (e.g. by its own spec).\n */\nexport const NESTED_EDITOR_COMPONENT = new InjectionToken<Type<TDynamicDataEditComponent>>(\n 'NESTED_EDITOR_COMPONENT',\n);\n","import { ChangeDetectionStrategy, Component, DestroyRef, NgZone, effect, inject, input, output } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { AllFormInputPrimaryKeys, BlurHandleTypes, ElementEditorInnerSectionElementInterface, ElementEditorTypes, ElementTypes, IGetTreeResponse, ITowerStepColumn, IWorkflowOption } from \"ngx-t-forms-types\";\r\n\r\nimport {\r\n BehaviorSubject,\r\n combineLatest,\r\n debounceTime,\r\n distinctUntilChanged,\r\n map,\r\n Observable,\r\n of,\r\n Subscription,\r\n switchMap,\r\n take,\r\n tap,\r\n withLatestFrom,\r\n} from 'rxjs';\r\nimport { assignDeepPropertyToObject } from '../../shared';\r\nimport { AsyncPipe } from '@angular/common';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { testAgainstItem } from './functions/testData';\r\nimport { SelectionOptionsEditorComponent } from './elements/selection-options-editor/selection-options-editor.component';\r\nimport { FormInputSelectorComponent } from './elements/form-input-selector/form-input-selector.component';\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { RestApiCallSetupComponent } from './elements/rest-api-call-setup/rest-api-call-setup.component';\r\nimport { ApiValueAccessRulesComponent } from './elements/api-value-access-rules/api-value-access-rules.component';\r\nimport { RequiredInputsComponent } from './elements/required-inputs/required-inputs.component';\r\nimport { PipelineGeneratorComponent } from './elements/pipeline-generator/pipeline-generator.component';\r\nimport { CalculatedFieldRulesComponent } from './elements/calculated-field-rules/calculated-field-rules.component';\r\nimport { ValidatorsConfigComponent } from './elements/validators-config/validators-config.component';\r\nimport { ConfigMscoaAdditionalInputsComponent } from './elements/config-mscoa-additional-inputs/config-mscoa-additional-inputs.component';\r\nimport { MscoaSegmentConfigComponent } from './elements/mscoa-segment-config/mscoa-segment-config.component';\r\nimport { MatSliderEditorComponent } from './elements/mat-slider-editor/mat-slider-editor.component';\r\nimport { MatSliderToggleEditorComponent } from './elements/mat-slider-toggle-editor/mat-slider-toggle-editor.component';\r\nimport { MatChipListEditorComponent } from './elements/mat-chip-list-editor/mat-chip-list-editor.component';\r\n\r\nimport { safeReturnDeepProperty } from '../../shared/functions/getDeepObject';\r\nimport { _isEqual } from '../../shared/functions/isEqual';\r\n\r\nimport { ChipOptionsCreatorEditorComponent } from './elements/chip-options-creator-editor/chip-options-creator-editor.component';\r\nimport { DataSourcePickerComponent } from './elements/data-source-picker/data-source-picker.component';\r\nimport { DocumentListLabelConfigEditorComponent } from './elements/document-list-label-config-editor/document-list-label-config-editor.component';\r\nimport { TWorkflowPickerComponent } from './elements/t-workflow-picker/t-workflow-picker.component';\r\nimport { EditorJsInputComponent } from '../t-form-input/elements/editor-input-element/core/editor-js-input/editor-js-input.component';\r\nimport { RecordListManagerComponent } from './elements/record-list-manager/record-list-manager.component';\r\nimport { FormPayloadProjectionComponent } from './elements/form-payload-projection/form-payload-projection.component';\r\nimport { InputCustomComponent } from '../t-form-input/elements/basic-input-input-element/core/input-custom/input-custom.component';\r\nimport { convertElementEditorTypesToInputDataType, convertElementEditorTypesToInputType } from '../../shared/functions/convertElementEditorTypesToInputType';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MapMatOptionsKeys } from './elements/map-mat-options-keys/map-mat-options-keys';\r\nimport { NESTED_EDITOR_COMPONENT } from './nested-editor.token';\r\n\r\n\r\nexport interface IConfigElementError {\r\n\r\n key: string;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Builder-side editor for a single configurable property on a form input —\r\n * dispatches to the correct editor (selection options, REST API setup,\r\n * value-access rules, pipeline, validators, MSCOA segment config, slider,\r\n * chip list, data source picker, document list label config, workflow\r\n * picker, EditorJS, record list manager, etc.) based on the supplied\r\n * `ElementEditorInnerSectionElementInterface`.\r\n *\r\n * @remarks\r\n * Emits debounced value changes (and a separate `blur` event when the\r\n * editor is a free-text expression) so the form builder can persist edits\r\n * without re-reading the underlying form on every keystroke.\r\n *\r\n * Inputs:\r\n * - `editorConfig: ElementEditorInnerSectionElementInterface | undefined`\r\n * — descriptor of the editor to render.\r\n * - `formInputs: FormColumnInputs[]` — the set of inputs the\r\n * editor can reference (used by expression / value-access editors).\r\n * - `data: unknown` — current value being edited; resets the value\r\n * pipeline when changed by reference.\r\n * - `validationErrors: IConfigElementError[] | null` — validation errors\r\n * surfaced by the parent for display.\r\n *\r\n * Outputs:\r\n * - `valueChange` — fires when the edited value changes (debounced).\r\n * - `blur` — fires when an inner editor loses focus\r\n * (used for expression-style editors).\r\n */\r\n@Component({\r\n selector: 'lib-t-dynamic-data-edit',\r\n imports: [\r\n AsyncPipe,\r\n SelectionOptionsEditorComponent,\r\n FormInputSelectorComponent,\r\n RestApiCallSetupComponent,\r\n ApiValueAccessRulesComponent,\r\n RequiredInputsComponent,\r\n PipelineGeneratorComponent,\r\n CalculatedFieldRulesComponent,\r\n ValidatorsConfigComponent,\r\n ConfigMscoaAdditionalInputsComponent,\r\n MatSliderEditorComponent,\r\n MscoaSegmentConfigComponent,\r\n MatSliderToggleEditorComponent,\r\n MatChipListEditorComponent,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n MatCardModule,\r\n ChipOptionsCreatorEditorComponent,\r\n DataSourcePickerComponent,\r\n DocumentListLabelConfigEditorComponent,\r\n TWorkflowPickerComponent,\r\n EditorJsInputComponent,\r\n RecordListManagerComponent,\r\n FormPayloadProjectionComponent,\r\n InputCustomComponent,\r\n FormsModule,\r\n MapMatOptionsKeys,\r\n ],\r\n templateUrl: './t-dynamic-data-edit.component.html',\r\n styleUrl: './t-dynamic-data-edit.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [{ provide: NESTED_EDITOR_COMPONENT, useValue: TDynamicDataEditComponent }],\r\n})\r\nexport class TDynamicDataEditComponent {\r\n readonly #ngZone = inject(NgZone);\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n #editorInitiated = false;\r\n #valueChanges: BehaviorSubject<unknown> | undefined = new BehaviorSubject<unknown>('');\r\n #subscription = new Subscription();\r\n\r\n protected readonly elementEditorTypes = ElementEditorTypes;\r\n\r\n /**\r\n * Editor types whose editor component is a plain (signal-based) component\r\n * rather than a `MatFormFieldControl`. These must render OUTSIDE\r\n * `<mat-form-field>`; wrapping them throws\r\n * `mat-form-field must contain a MatFormFieldControl`. Every other editor\r\n * type resolves to a custom control and stays inside the field.\r\n */\r\n readonly #nonFormFieldControlEditTypes = new Set<ElementEditorTypes>([\r\n ElementEditorTypes.ChipSelect,\r\n ElementEditorTypes.SelectionOptions,\r\n ElementEditorTypes.ApiCall,\r\n ElementEditorTypes.ApiValueAccessRules,\r\n ElementEditorTypes.FormInputSelector,\r\n ElementEditorTypes.RequiredInputs,\r\n ElementEditorTypes.ConfigMscoaSegments,\r\n ElementEditorTypes.ChipOptionsCreator,\r\n ElementEditorTypes.FormPayloadProjection,\r\n ]);\r\n\r\n #isFormFieldControl(editType: ElementEditorTypes | undefined): boolean {\r\n if (!editType) return true;\r\n return !this.#nonFormFieldControlEditTypes.has(editType);\r\n }\r\n\r\n #editorConfig$ = new BehaviorSubject<ElementEditorInnerSectionElementInterface | undefined>(undefined);\r\n #data$ = new BehaviorSubject<Record<string, unknown> | undefined>(undefined);\r\n\r\n /** Descriptor of the editor to render. */\r\n readonly editorConfig = input<ElementEditorInnerSectionElementInterface | undefined>(undefined);\r\n\r\n /** The set of inputs the editor can reference (used by expression / value-access editors). */\r\n readonly formInputs = input<Array<FormColumnInputs>>([]);\r\n\r\n /**\r\n * Current value being edited; resets the value pipeline when changed by reference.\r\n * @remarks Heterogeneous across consumers (ITowerStepColumn, plain records, etc.),\r\n * so it is typed as a keyed record; the editor pipeline reads individual fields\r\n * via `deepBind` paths and callers narrow specific value shapes.\r\n */\r\n readonly data = input<unknown>(undefined);\r\n\r\n /** Validation errors surfaced by the parent for display. */\r\n readonly validationErrors = input<IConfigElementError[] | null>(null);\r\n\r\n /** Fires when the edited value changes (debounced). */\r\n readonly valueChange = output<unknown>();\r\n\r\n /** Fires when an inner editor loses focus (used for expression-style editors). */\r\n readonly blur = output<unknown>();\r\n\r\n protected readonly editorConfigBridge = effect(() => {\r\n const config = this.editorConfig();\r\n // Guard against an unstable parent binding handing us a new-but-equal\r\n // reference each CD pass: re-pushing it re-emits through editorConfigValue$,\r\n // re-renders the vm$ async pipe, and re-schedules CD — an infinite refresh\r\n // (NG0103). Mirrors the dataBridge guard below.\r\n if (_isEqual(this.#editorConfig$.getValue(), config)) return;\r\n this.#editorConfig$.next(config);\r\n });\r\n\r\n protected readonly dataBridge = effect(() => {\r\n const data = this.data();\r\n if (_isEqual(this.#data$.getValue(), data)) return;\r\n this.#data$.next(data as Record<string, unknown> | undefined);\r\n if (!this.#editorInitiated) {\r\n this.#editorInitiated = true;\r\n this.#initializeValueChanges(data);\r\n }\r\n });\r\n\r\n protected readonly editorConfigValue$ = this.#editorConfig$.asObservable();\r\n protected readonly dataValue$ = this.#data$.asObservable();\r\n\r\n protected get getMscoaTree$(): Observable<IGetTreeResponse | undefined> {\r\n return this.editorConfigValue$.pipe(switchMap(\r\n (config) => config?.getMscoaTree || of(undefined),\r\n ));\r\n }\r\n\r\n protected get getWorkflowOptions$(): Observable<IWorkflowOption[] | undefined> {\r\n return this.editorConfigValue$?.pipe(\r\n switchMap((config) => config?.getWorkflowOptions || []),\r\n );\r\n }\r\n\r\n // Optimized value$ getter\r\n protected get value$() {\r\n return this.editorConfigValue$.pipe(\r\n switchMap((config) => this.dataValue$.pipe(\r\n map((data) => {\r\n const { value } = safeReturnDeepProperty(data, config?.deepBind || []);\r\n const dotNotationRegex = /^[^.]+(\\.[^.]+)+$/;\r\n if (\r\n config?.deepBind[0] === AllFormInputPrimaryKeys.FormControlName\r\n && typeof value === 'string'\r\n && !!dotNotationRegex.test(value)\r\n && config?.editType === ElementEditorTypes.ChipOptionsCreator\r\n ) {\r\n // If the value is a dot notation string, split it into an array\r\n return value ? value.split('.') : [];\r\n }\r\n\r\n // Prevent undefined values\r\n if (value === undefined) return value || '';\r\n return value;\r\n }),\r\n )),\r\n );\r\n }\r\n\r\n protected get dataOptions$() {\r\n return this.editorConfigValue$.pipe(\r\n switchMap((config) => this.dataValue$.pipe(\r\n map((data) => {\r\n const dataBindTo = config?.fetchOptions;\r\n if (!dataBindTo) return undefined;\r\n if (dataBindTo.length === 0) return data;\r\n const { value } = safeReturnDeepProperty(data, dataBindTo);\r\n return value;\r\n }))));\r\n }\r\n\r\n protected get disabled$() {\r\n return this.editorConfigValue$.pipe(\r\n switchMap((config) => this.dataValue$.pipe(\r\n map((data) => {\r\n const isSystemDefault = data?.['systemDefault'] === true;\r\n if (!!isSystemDefault && !config?.deepBind.includes('systemDefault')) {\r\n return true;\r\n }\r\n if (!config) {\r\n return true;\r\n }\r\n return config.disabled?.every((test) => (testAgainstItem(test, data)));\r\n }))));\r\n }\r\n\r\n #initializeValueChanges(data: unknown): void {\r\n // Run subscription setup outside NgZone for better performance\r\n this.#ngZone.runOutsideAngular(() => {\r\n // Use withLatestFrom instead of combineLatest to prevent emission loops\r\n this.#subscription.add(\r\n this.#valueChanges?.pipe(\r\n // Only compare relevant properties instead of deep equality when possible\r\n distinctUntilChanged((a, b) => {\r\n return _isEqual(a, b);\r\n }),\r\n\r\n debounceTime(500),\r\n // Use withLatestFrom instead of switchMap+combineLatest to avoid multiple emissions\r\n withLatestFrom(\r\n this.dataValue$,\r\n this.editorConfigValue$,\r\n ),\r\n\r\n // Apply distinctUntilChanged after combining streams\r\n distinctUntilChanged(([prevValueData, prevData, prevConfig], [currValueData, currData, currConfig]) =>\r\n _isEqual(prevValueData, currValueData) &&\r\n _isEqual(prevData, currData) &&\r\n _isEqual(prevConfig, currConfig),\r\n ),\r\n\r\n // Process the combined data stream - carefully handle each parameter\r\n tap(([value, dataLatest, config]) => {\r\n // Guard against invalid inputs\r\n if (config === undefined) {\r\n return; // Skip processing if any input is undefined\r\n }\r\n\r\n const result = this.#computeValueChange(value, dataLatest, config);\r\n\r\n // Only emit if result is valid\r\n const defaultValue = config.defaultValue;\r\n\r\n // Re-enter zone only for UI updates\r\n this.#ngZone.run(() => {\r\n const emitted = result ?? defaultValue;\r\n this.valueChange.emit(emitted);\r\n });\r\n return;\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe(),\r\n );\r\n\r\n // Initialize with initial value\r\n const editorConfig = this.#editorConfig$.getValue();\r\n const initValue = safeReturnDeepProperty(data, editorConfig?.deepBind || []).value;\r\n const result = this.#computeValueChange(initValue, data, editorConfig);\r\n this.#valueChanges?.next(result);\r\n });\r\n }\r\n\r\n // Expensive computation moved outside zone\r\n #computeValueChange(\r\n value: unknown,\r\n data: unknown,\r\n config: ElementEditorInnerSectionElementInterface | undefined,\r\n ): unknown {\r\n if (!data || !config) {\r\n return undefined;\r\n }\r\n\r\n // Deep clone the data object to ensure it and all nested objects are extensible\r\n const updated = JSON.parse(JSON.stringify(data));\r\n\r\n try {\r\n // Ensure config.deepBind is an array before proceeding\r\n const deepBindPath = config.deepBind || [];\r\n assignDeepPropertyToObject(updated, deepBindPath, value);\r\n return safeReturnDeepProperty(updated, deepBindPath).value;\r\n } catch {\r\n return undefined; // Return undefined if assignment fails\r\n }\r\n }\r\n\r\n inputChange(event: unknown): void {\r\n // The template binds both a DOM `(input)` Event and a `(valueChange)` value to\r\n // this handler; extract `target.value` when present, otherwise use the raw value.\r\n const targetValue =\r\n typeof event === 'object' && event !== null && 'target' in event\r\n ? (event.target as { value?: unknown } | null)?.value\r\n : undefined;\r\n const value = targetValue ?? event;\r\n this.#valueChanges?.next(value);\r\n }\r\n\r\n // Optimize value changes\r\n valueChanged(value: unknown): void {\r\n if (this.#editorConfig$.getValue()?.deepBind[0] === AllFormInputPrimaryKeys.FormControlName && Array.isArray(value)) {\r\n // If the value is an array, join it into a string\r\n this.#valueChanges?.next(value.join('.'));\r\n return;\r\n }\r\n this.#valueChanges?.next(value);\r\n }\r\n\r\n manualValueChange(event: { value: unknown, deepBind: Array<string> }): void {\r\n const { value, deepBind } = event;\r\n this.dataValue$.pipe(\r\n take(1),\r\n tap((dataLatest) => {\r\n if (!dataLatest) return;\r\n const updated = { ...dataLatest };\r\n assignDeepPropertyToObject(updated, deepBind || [], value);\r\n this.valueChange.emit(updated);\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n ).subscribe();\r\n }\r\n\r\n // Optimize blur handling\r\n blurOff = false;\r\n elementBlur(event: unknown): void {\r\n if (this.blurOff) return;\r\n this.#ngZone.run(() => this.blur.emit(event));\r\n }\r\n\r\n protected get inputHasBlurFunction$(): Observable<BlurHandleTypes | undefined> {\r\n return this.editorConfigValue$.pipe(\r\n map((config) => config?.blurHandle),\r\n );\r\n }\r\n\r\n blurFunctionTooltip(blurHandle: BlurHandleTypes | undefined): string {\r\n switch (blurHandle) {\r\n case BlurHandleTypes.PrePopulateFormControl:\r\n return 'Enable/disable pre-populating of the form control name from the label';\r\n case BlurHandleTypes.CleanFormControl:\r\n return 'Enable/disable auto conversion of control name to camel case';\r\n default:\r\n return 'Toggle blur function';\r\n }\r\n }\r\n\r\n /** Slider label formatter — Mat slider's `displayWith` accepts `string | number`. */\r\n formatLabel: (value: number) => string | number = (value: number) => value;\r\n\r\n protected vm$ = combineLatest(\r\n [\r\n this.editorConfigValue$,\r\n this.value$,\r\n this.dataOptions$,\r\n this.disabled$,\r\n this.inputHasBlurFunction$,\r\n this.dataValue$,\r\n ],\r\n ).pipe(\r\n map(([editorConfigValue, value, dataOptions, disabled, inputHasBlurFunction, dataValue]) => {\r\n // Preview-only inputConfig for the embedded `<lib-input-custom [inputConfig]>`.\r\n // Only the fields the preview consumes are populated; the remaining required\r\n // ITowerStepColumn fields are filled by the editor pipeline at runtime.\r\n const inputConfig = {\r\n id: editorConfigValue?.id || '',\r\n label: editorConfigValue?.label || '',\r\n placeholder: editorConfigValue?.placeholder || '',\r\n formControlName: editorConfigValue?.deepBind.join('.') || '',\r\n type: convertElementEditorTypesToInputType(editorConfigValue?.editType),\r\n dataType: convertElementEditorTypesToInputDataType(editorConfigValue?.editType),\r\n\r\n inputConfigErrors: [],\r\n sectionId: '',\r\n element: ElementTypes.Input,\r\n appearance: 'fill',\r\n required: editorConfigValue?.required || false,\r\n colSize: 0,\r\n onlySetTempErrorOnTouch: false,\r\n isCalculatedField: false,\r\n validators: [],\r\n readonly: editorConfigValue?.readonly || false,\r\n handleLabel: '',\r\n calculateListFunctions: [],\r\n\r\n workflowFormForScoreSheet: '',\r\n\r\n adjudicationPointTypes: [],\r\n adjudicationReviewFeedbackTemplate: undefined,\r\n } satisfies Partial<ITowerStepColumn>;\r\n // The preview populates only a subset of ITowerStepColumn, so it is typed\r\n // `Partial<ITowerStepColumn>` (no `any`, no `as unknown as`). The template\r\n // binds it to `[inputConfig]` via `$any()` because the child declares the\r\n // full contract while the embedded preview tolerates the unset fields.\r\n const widenedInputConfig: Partial<ITowerStepColumn> = inputConfig;\r\n return {\r\n editorConfigValue,\r\n isFormFieldControl: this.#isFormFieldControl(editorConfigValue?.editType),\r\n value,\r\n // `dataOptions` is the polymorphic deep-bound editor-options value: the same\r\n // field is bound in the template to differently-typed child inputs\r\n // (boolean `showAllSegments`, `FormColumnInputs`/`string[]` `mapToData`,\r\n // option arrays). It is therefore `any` internally (a documented LIB-03\r\n // internal residual — §13 negotiable). The PUBLIC `data` input stays\r\n // strictly typed (`unknown`); only this internal view-model field is loose.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n dataOptions: dataOptions as any,\r\n disabled,\r\n inputHasBlurFunction,\r\n dataValue,\r\n inputConfig: widenedInputConfig,\r\n };\r\n }),\r\n );\r\n}\r\n","@defer {\n@if (( vm$ |async); as vm) {\n\n @if (vm.isFormFieldControl) {\n <!-- Editor types that resolve to a MatFormFieldControl render inside the field. -->\n <mat-form-field appearance=\"outline\" [color]=\"((validationErrors())||[]).length>0 ? 'warn' : 'primary'\"\n [floatLabel]=\"'always'\" [subscriptSizing]=\"'dynamic'\" [hintLabel]=\"vm.editorConfigValue?.hint||''\">\n <mat-label> {{ (vm. editorConfigValue)?.label }} </mat-label>\n @switch ((vm. editorConfigValue)?.editType) {\n @default {\n <lib-input-custom\n [id]=\"((vm.editorConfigValue)?.id)\"\n [inputConfig]=\"$any(vm.inputConfig)\"\n [placeholder]=\"(vm. editorConfigValue)?.placeholder ||'Enter value'\"\n [required]=\"!!(vm. editorConfigValue)?.required\"\n [disabled]=\"!!(vm.disabled)\"\n [ngModel]=\"(vm.value)\"\n (blur)=\"elementBlur($event)\"\n (input)=\"inputChange($event)\" ></lib-input-custom>\n\n\n }\n @case ( elementEditorTypes.Toggle) {\n <lib-mat-slider-toggle-editor\n [id]=\"((vm.editorConfigValue)?.id)\"\n [name]=\"((vm. editorConfigValue)?.name||'') \"\n [label]=\"((vm. editorConfigValue)?.label||'')\" [disabled]=\"(vm.disabled)||false\"\n (valueChange)=\"valueChanged(!!$event)\" [value]=\"$any(vm.value)\" [errors]=\"(validationErrors())||[]\">\n </lib-mat-slider-toggle-editor>\n\n }\n\n @case (elementEditorTypes.Range) {\n\n\n <lib-mat-slider-editor\n [id]=\"((vm.editorConfigValue)?.id)\"\n [format]=\"( vm.editorConfigValue)?.format \" [formatLabel]=\" formatLabel\"\n [disabled]=\"(vm.disabled)||false\" [max]=\"( vm.editorConfigValue)?.max || 100\" [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\" [min]=\"( vm.editorConfigValue)?.min || 0\"\n (valueChange)=\"inputChange($event)\" [step]=\"( vm.editorConfigValue)?.step || 1\">\n\n\n </lib-mat-slider-editor>\n\n\n\n }\n\n @case (elementEditorTypes.OptionSelect) {\n\n <mat-select\n\n [value]=\"$any(vm.value)\" (selectionChange)=\"valueChanged($event.value)\"\n [disabled]=\"(vm.disabled)||false\">\n @for(option of ( vm.editorConfigValue)?.options || vm.dataOptions;track option.value){\n <mat-option [value]=\"option.value\">{{option.label}}</mat-option>\n }\n </mat-select>\n\n }\n\n @case (elementEditorTypes.RichTextEditor) {\n <lib-editor-js-input\n\n [id]=\"((vm.editorConfigValue)?.id)\"\n [value]=\"$any(vm.value)\" (valueChanged)=\"valueChanged($event)\"\n [disabled]=\"(vm.disabled)||false\" [inputConfig]=\"$any(data())\">\n </lib-editor-js-input>\n }\n\n @case (elementEditorTypes.MongoPipelineBuilder) {\n\n <lib-pipeline-generator [disabled]=\"(vm.disabled)||false\"\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\" [getWorkflowOptions]=\"getWorkflowOptions$\"\n (valueChanged)=\"valueChanged($event)\"></lib-pipeline-generator>\n\n }\n @case (elementEditorTypes.MapMatOptionsKeys) {\n <lib-map-mat-options-keys [disabled]=\"(vm.disabled)||false\"\n [value]=\"$any(vm.value)\"\n [formInputs]=\"formInputs() || []\"\n [mapToData]=\"vm.dataOptions\"\n [errors]=\"(validationErrors())||[]\"\n (valueChanged)=\"valueChanged($event)\">\n </lib-map-mat-options-keys>\n\n }\n\n @case(elementEditorTypes.CalculatedFieldRules){\n\n <lib-calculated-field-rules [formInputs]=\"formInputs() ||[]\" [disabled]=\"(vm.disabled)||false\"\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\" (valueChanged)=\"valueChanged($event)\"\n [mapToData]=\"vm.dataOptions\"></lib-calculated-field-rules>\n }\n\n @case(elementEditorTypes.Validators){\n\n <lib-validators-config [disabled]=\"(vm.disabled)||false\"\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\" (valueChanged)=\"valueChanged($event)\" [formInputs]=\"formInputs() ||[]\"\n [mapToData]=\"vm.dataOptions\">\n </lib-validators-config>\n\n }\n @case(elementEditorTypes.ConfigMscoaAdditionalInputs){\n\n <lib-config-mscoa-additional-inputs [disabled]=\"(vm.disabled)||false\"\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\" [getMscoaTree]=\"getMscoaTree$\" [mapToData]=\"vm.dataOptions\"\n (valueChanged)=\"valueChanged($event)\">\n </lib-config-mscoa-additional-inputs>\n\n }\n @case (elementEditorTypes.DataSourcePicker) {\n <lib-data-source-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [editorConfig]=\"vm. editorConfigValue\"\n (valueChange)=\"valueChanged($event)\" [formInputs]=\"formInputs() ||[]\" [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\">\n </lib-data-source-picker>\n }\n @case (elementEditorTypes.ListLabelConfigEditor) {\n <lib-document-list-label-config-editor\n [id]=\"((vm.editorConfigValue)?.id)\"\n [formInputs]=\"formInputs() ||[]\"\n [disabled]=\"(vm.disabled)||false\"\n [editorConfig]=\"vm. editorConfigValue\"\n (valueChange)=\"valueChanged($event)\"\n [value]=\"$any(vm.value)\" [mapToData]=\"vm.dataOptions\"\n [errors]=\"(validationErrors())||[]\">\n\n </lib-document-list-label-config-editor>\n }\n @case(\n elementEditorTypes.WorkflowPicker\n ){\n <lib-t-workflow-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [getWorkflowOptions]=\"getWorkflowOptions$\"\n (valueChanged)=\"valueChanged($event)\" [value]=\"$any(vm.value)\" [errors]=\"(validationErrors())||[]\"></lib-t-workflow-picker>\n }\n @case (\n elementEditorTypes.RecordListManager\n ) {\n <lib-record-list-manager\n [id]=\"((vm.editorConfigValue)?.id)\"\n [editorConfig]=\"vm.editorConfigValue\" [disabled]=\"(vm.disabled)||false\"\n [formInputs]=\"formInputs() ||[]\" [mapToData]=\"vm.dataOptions\" (valueChange)=\"valueChanged($event)\"\n\n [value]=\"$any(vm.value)\" [errors]=\"(validationErrors())||[]\"></lib-record-list-manager>\n }\n }\n\n @if (vm.inputHasBlurFunction) {\n <button [matTooltip]=\"blurFunctionTooltip((vm.editorConfigValue)?.blurHandle)\"\n [disabled]=\"(vm.disabled)\" [color]=\"blurOff?'':'primary'\" (click)=\"blurOff=!blurOff\" matSuffix\n mat-icon-button>\n <mat-icon>{{\n blurOff?'blur_off':'blur_on'\n }}\n\n\n </mat-icon>\n </button>\n }\n </mat-form-field>\n } @else {\n <!-- Editor types backed by plain (signal-based) components render outside\n the field, since they are not MatFormFieldControls. They are wrapped to\n mirror the outline mat-form-field appearance: the fieldset draws the\n outline, its legend is the notched floating label, and the hint renders\n as a subscript below the box. -->\n <div class=\"non-control-editor\">\n <fieldset class=\"non-control-editor__field\">\n @if ((vm. editorConfigValue)?.label) {\n <legend class=\"non-control-editor__label\">{{ (vm. editorConfigValue)?.label }}</legend>\n }\n @switch ((vm. editorConfigValue)?.editType) {\n\n @case (elementEditorTypes.ChipSelect) {\n\n <lib-mat-chip-list-editor\n [id]=\"((vm.editorConfigValue)?.id)\"\n [multiple]=\"!!vm.editorConfigValue?.multipleSelection\"\n [disabled]=\"(vm.disabled)||false\"\n [options]=\"(vm.editorConfigValue)?.options || vm.dataOptions\"\n [required]=\"!!( vm.editorConfigValue)?.required\" [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\"\n (valueChange)=\" valueChanged($event)\"></lib-mat-chip-list-editor>\n\n\n }\n\n @case (elementEditorTypes.SelectionOptions) {\n\n <lib-selection-options-editor\n [id]=\"((vm.editorConfigValue)?.id)\"\n [errors]=\"(validationErrors())||[]\" [disabled]=\"(vm.disabled)||false\"\n [options]=\"$any(vm.value) || []\" (valueChanged)=\"valueChanged($event)\"></lib-selection-options-editor>\n }\n\n @case (\n elementEditorTypes.ApiCall) {\n\n <lib-rest-api-call-setup\n [id]=\"((vm.editorConfigValue)?.id)\"\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\"\n [httpGetDataFunction]=\"(vm.editorConfigValue)?.httpGetDataFunction\" [disabled]=\"(vm.disabled)||false\"\n [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\" (valueChanged)=\"valueChanged($event)\">\n\n </lib-rest-api-call-setup>\n\n }\n\n @case (elementEditorTypes.ApiValueAccessRules) {\n\n\n\n <lib-api-value-access-rules [disabled]=\"(vm.disabled)||false\"\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\"\n [formInputs]=\"formInputs() ||[]\"\n\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\" [mapToData]=\"vm.dataOptions\"\n (valueChanged)=\"valueChanged($event)\">\n </lib-api-value-access-rules>\n\n }\n\n @case (elementEditorTypes.FormInputSelector)\n {\n\n <lib-form-input-selector [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [formInputs]=\"formInputs() ||[]\"\n [errors]=\"(validationErrors())||[]\" [value]=\"$any(vm.value) || []\" (change)=\"valueChanged($event)\">\n </lib-form-input-selector>\n }\n\n @case (\n elementEditorTypes.RequiredInputs\n ){\n\n <lib-required-inputs [formInputs]=\"formInputs() ||[]\" [disabled]=\"(vm.disabled)||false\"\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\" (valueChanged)=\"valueChanged($event)\">\n </lib-required-inputs>\n }\n\n @case(elementEditorTypes.ConfigMscoaSegments){\n\n <lib-mscoa-segment-config [disabled]=\"(vm.disabled)||false\" [id]=\"((vm.editorConfigValue)?.id)\" [value]=\"$any(vm.value)\"\n [errors]=\"(validationErrors())||[]\" [getMscoaTree]=\"getMscoaTree$\" [dataValue]=\"$any(vm.dataValue)\"\n [isCashSegmentConfig]=\"vm.editorConfigValue?.deepBind?.at(-1) === 'cashSegments'\"\n [showAllSegments]=\"vm.dataOptions\" (valueChanged)=\"valueChanged($event)\"></lib-mscoa-segment-config>\n }\n @case (elementEditorTypes.ChipOptionsCreator) {\n <lib-chip-options-creator-editor [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" (valueChange)=\"valueChanged($event)\"\n [value]=\"$any(vm.value)\" [errors]=\"(validationErrors())||[]\">\n\n </lib-chip-options-creator-editor>\n\n }\n @case (elementEditorTypes.FormPayloadProjection) {\n <lib-form-payload-projection [disabled]=\"(vm.disabled)||false\" [value]=\"$any(vm.value)\"\n [formInputs]=\"formInputs() ||[]\" [errors]=\"(validationErrors())||[]\"\n (valueChanged)=\"valueChanged($event)\">\n </lib-form-payload-projection>\n\n }\n }\n </fieldset>\n\n @if ((vm. editorConfigValue)?.hint) {\n <small class=\"non-control-editor__hint\">{{ (vm. editorConfigValue)?.hint }}</small>\n }\n </div>\n }\n\n @if (!(vm.value) && (vm. editorConfigValue)?.required ) {\n <mat-error>\n {{ (vm. editorConfigValue)?.label }}'s is required\n </mat-error>}\n\n @for (error of (validationErrors())||[]; track error.key) {\n <mat-error style=\" font-size: 0.75em;\n margin-left: 14px;\n \">\n\n {{error.message}}</mat-error>\n }\n\n}\n\n}@error {\n<mat-card>\n <mat-card-content>\n\n <span>\n Failed to load form inputs\n </span>\n </mat-card-content>\n</mat-card>\n}\n\n\n\n<!-- -\n `TableConfigSetup`\n- `ConditionalInputConfig`\n- `MatrixTable`-->\n","import { TreeNode } from 'ngx-t-forms-types';\r\n\r\n\r\n\r\n\r\nconst isEmptyPath = (path: readonly string[]): boolean => path.length === 0;\r\nconst isEmptyTree = (tree: readonly TreeNode[]): boolean => tree.length === 0;\r\n\r\nconst findNodeByKey = (tree: readonly TreeNode[], key: string): TreeNode | undefined =>\r\n tree.find(node => node.key === key);\r\n\r\nconst extractNode = (tree: readonly TreeNode[], path: readonly string[]): TreeNode | null => {\r\n if (isEmptyPath(path) || isEmptyTree(tree)) {\r\n return null;\r\n }\r\n\r\n const [currentKey, ...remainingPath] = path;\r\n if(!currentKey){\r\n return null\r\n }\r\n const currentNode = findNodeByKey(tree, currentKey);\r\n\r\n if (!currentNode) {\r\n return null;\r\n }\r\n\r\n if (remainingPath.length === 0) {\r\n return currentNode;\r\n }\r\n\r\n return currentNode.children \r\n ? extractNode(currentNode.children, remainingPath)\r\n : null;\r\n};\r\n\r\nexport {extractNode};","import { FlatTreeControl } from '@angular/cdk/tree';\r\nimport { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';\r\nimport { extractNode } from './extractNodeFromTree';\r\nimport { IArrayFunction, TreeNode, FlatNode } from 'ngx-t-forms-types';\r\nimport { returnMappedPathValue } from '../../../../../services/core/t-form-section-controller/Functions/getValueFromPathMap';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nexport interface ObjectTreeNode {\r\n name: string;\r\n children?: ObjectTreeNode[];\r\n path: string[]\r\n\r\n}\r\nexport interface ObjectTreeFlatNode {\r\n expandable: boolean;\r\n name: string;\r\n level: number;\r\n\r\n path: string[]\r\n\r\n}\r\n\r\n\r\n\r\nexport function convertToTree(obj: unknown, parentPath: string[] = []): TreeNode[] {\r\n\r\n function handleArray(value: unknown[], currentPath: string[]): TreeNode[] {\r\n try {\r\n // If the array is an array of objects, we can just convert it to a tree with\r\n return value.map((item, index) => ({\r\n key: index.toString(),\r\n value: item,\r\n name: index.toString(),\r\n functions: [] as IArrayFunction[],\r\n keyIsArrayIndex: true,\r\n path: [...currentPath, index.toString()],\r\n children: convertToTree(item, [...currentPath, index.toString()])\r\n }));\r\n } catch {\r\n return [];\r\n }\r\n }\r\n //Trees are recursive data structures, so we expect the input to be an object or an array\r\n if (typeof obj !== 'object' || obj === null) {\r\n //If the input is not an object or an array, we don't have a tree to build\r\n return [];\r\n\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n // If the input is an array, we need to handle it differently\r\n return handleArray(obj, parentPath);\r\n }\r\n\r\n\r\n return Object.entries(obj as Record<string, unknown>).map(([key, value]) => {\r\n const currentPath = [...parentPath, key];\r\n const node: TreeNode = { key, value, name: key, path: currentPath, functions: [] as IArrayFunction[] };\r\n\r\n if (Array.isArray(value)) {\r\n node.children = handleArray(value, currentPath);\r\n }\r\n\r\n if (typeof value === 'object' && value !== null) {\r\n node.children = convertToTree(value, currentPath);\r\n }\r\n\r\n return node;\r\n });\r\n}\r\nexport class TreeComponent {\r\n activePath: TreeNode[] = [];\r\n pathInEdit: TreeNode | null = null\r\n get activeLevel() {\r\n return this.activePath.length - 1\r\n }\r\n private _transformer = (node: TreeNode, level: number): FlatNode => {\r\n return {\r\n expandable: this.nodeIsExpandable(node),\r\n key: node.key,\r\n value: node.value,\r\n path: node.path,\r\n level: level,\r\n name: node.key,\r\n\r\n\r\n\r\n };\r\n };\r\n\r\n setupPath(node: TreeNode) {\r\n this.activePath = [...this.activePath.map((pathPart, index) => {\r\n if (pathPart.key === node.key && pathPart.path.join('.') === node.path.join('.') && !pathPart.inEdit) {\r\n return {\r\n ...pathPart,\r\n inEdit: true\r\n }\r\n }\r\n return {\r\n ...pathPart,\r\n inEdit: false\r\n }\r\n })]\r\n this.pathInEdit = node\r\n\r\n }\r\n updateStateFromPath(path: TreeNode[]) {\r\n this.activePath = path\r\n \r\n\r\n }\r\n selectNode(node: FlatNode) {\r\n const sameAsActive = this.activePath.map(a => a.key).join('.') === node.path.join('.')\r\n\r\n if (sameAsActive) {\r\n this.activePath = this.activePath.slice(0, (node.level))\r\n\r\n return\r\n }\r\n this.activePath = node.path.map((pathPart, index) => {\r\n return extractNode(this.dataSource.data, node.path.slice(0, index + 1))\r\n }).filter((node): node is TreeNode => !!node)\r\n\r\n\r\n return this.activePath\r\n }\r\n saveNodeInEdit() {\r\n\r\n\r\n if (this.pathInEdit) {\r\n // Update the activePath with new functions\r\n this.activePath = this.activePath.map((pathPart) => {\r\n if (pathPart.inEdit) {\r\n return {\r\n ...pathPart,\r\n functions: this.pathInEdit?.functions || [],\r\n inEdit: false\r\n }\r\n }\r\n return pathPart\r\n });\r\n this.pathInEdit = null;\r\n // Emit the updated path without children and value properties\r\n return this.activePath.map(p => ({\r\n ...p,\r\n children: undefined,\r\n value: undefined\r\n }));\r\n }\r\n return\r\n }\r\n resetNode() {\r\n if (!this.pathInEdit) return\r\n this.pathInEdit.functions = (this.pathInEdit.functions || []).map(f => ({\r\n ...f,\r\n expression: '',\r\n // FunctionTypes is a string enum; '' is a transient \"unset\" state preserved\r\n // from legacy behaviour. Cast through `as IArrayFunction['function']` keeps\r\n // call sites contract-stable without widening to `any`.\r\n function: '' as IArrayFunction['function'],\r\n inEdit: false\r\n }))\r\n this.activePath = this.activePath.map((pathPart) => {\r\n if (pathPart.inEdit) {\r\n return {\r\n ...pathPart,\r\n functions: this.pathInEdit?.functions || [],\r\n inEdit: true\r\n }\r\n }\r\n return {\r\n ...pathPart,\r\n inEdit: false\r\n }\r\n })\r\n\r\n }\r\n removeFunction(id: string) {\r\n if (!this.pathInEdit) return\r\n this.pathInEdit.functions = (this.pathInEdit.functions || []).filter(f => f.id !== id)\r\n this.activePath = this.activePath.map((pathPart) => {\r\n const isInEdit = pathPart.inEdit\r\n if (isInEdit) {\r\n return {\r\n ...pathPart,\r\n functions: this.pathInEdit?.functions || [],\r\n\r\n }\r\n }\r\n return {\r\n ...pathPart,\r\n inEdit: false\r\n }\r\n })\r\n }\r\n closeEdit() {\r\n if (!this.pathInEdit) return\r\n this.pathInEdit.functions = (this.pathInEdit.functions || []).map(f => ({ ...f, inEdit: false }))\r\n this.activePath = this.activePath.map((pathPart) => {\r\n const isInEdit = pathPart.inEdit\r\n if (isInEdit) {\r\n return {\r\n ...pathPart,\r\n functions: this.pathInEdit?.functions || [],\r\n\r\n }\r\n }\r\n return {\r\n ...pathPart,\r\n inEdit: false\r\n }\r\n })\r\n\r\n }\r\n nodeIsExpandable(node: TreeNode) {\r\n return !!node.children && node.children.length > 0\r\n }\r\n\r\n showNode(node: FlatNode) {\r\n const checked = this.nodeIsChecked(node)\r\n if (checked) {\r\n return true\r\n }\r\n const levelHasPath = !!this.activePath[node.level]\r\n if (levelHasPath) {\r\n return false\r\n }\r\n\r\n const hasSameLevel = node.level === this.activeLevel\r\n if (hasSameLevel) {\r\n return true\r\n }\r\n const isActiveNodeChild = this.activePath.map(a => a.key).every((pathPart, index) => pathPart === node.path[index])\r\n return isActiveNodeChild\r\n\r\n }\r\n hasANodeInEdit() {\r\n return this.activePath.some(a =>\r\n a.inEdit\r\n )\r\n }\r\n nodeIsChecked(node: FlatNode) {\r\n // The active path's keys must form a prefix of (or equal) this node's path.\r\n // (A previous `node.path.join('.') === this.activePath.join('.')` short-circuit\r\n // was dead: joining the TreeNode[] yields `[object Object]` and never matched.)\r\n const activePath = this.activePath.map(a => a.key)\r\n return node.path.every((pathPart, index) => pathPart === activePath[index])\r\n }\r\n\r\n treeControl = new FlatTreeControl<FlatNode>(\r\n node => node.level,\r\n node => node.expandable\r\n );\r\n\r\n\r\n treeFlattener = new MatTreeFlattener(\r\n this._transformer,\r\n node => node.level,\r\n node => node.expandable,\r\n\r\n node => node.children\r\n );\r\n\r\n dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);\r\n private dynamicObject: unknown\r\n constructor() {\r\n\r\n }\r\n\r\n computeTreeData(dynamicObject: unknown) {\r\n this.dynamicObject = dynamicObject\r\n\r\n const treeData = convertToTree(dynamicObject);\r\n this.dataSource.data = treeData;\r\n }\r\n assignDataSourceData(tree: TreeNode[]) {\r\n this.dataSource.data = tree\r\n }\r\n\r\n hasChild = (_: number, node: FlatNode) => node.expandable;\r\n\r\n getValue() {\r\n\r\n return returnMappedPathValue(this.activePath, this.dynamicObject)\r\n\r\n }\r\n\r\n addNewFunction() {\r\n\r\n if (!this.pathInEdit) return\r\n if (!this.pathInEdit.functions) {\r\n this.pathInEdit = { ...this.pathInEdit, functions: [] }\r\n }\r\n this.pathInEdit.functions = this.pathInEdit.functions?.map(f => ({ ...f, inEdit: false })) || []\r\n const newFunction: IArrayFunction = {\r\n expression: '',\r\n id: uuidv4(),\r\n inEdit: true,\r\n // Transient \"unset\" state preserved from legacy behaviour; widened via\r\n // IArrayFunction['function'] rather than `any`.\r\n function: '' as IArrayFunction['function'],\r\n }\r\n\r\n this.pathInEdit = {\r\n ...this.pathInEdit,\r\n functions: [\r\n ...(this.pathInEdit.functions ?? []),\r\n newFunction\r\n ]\r\n }\r\n\r\n\r\n }\r\n functionChanged(value: string) {\r\n if (!this.pathInEdit) return\r\n const functionInEdit = this.pathInEdit.functions.find(f => f.inEdit)\r\n if (!functionInEdit) return\r\n functionInEdit.function = value as IArrayFunction['function']\r\n }\r\n}","import { ChangeDetectionStrategy, Component, effect, input } from '@angular/core';\r\nimport { MatTreeModule } from '@angular/material/tree';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { TreeComponent } from '../t-dynamic-data-edit/elements/api-value-access-rules/functions/convertDataToTree';\r\n\r\n/**\r\n * Read-only tree view for an arbitrary JSON-shaped value. Converts the input\r\n * into a flat tree (via `TreeComponent`) and renders each leaf with a typed\r\n * style class (`value-string`, `value-number`, `value-boolean`, `value-null`).\r\n */\r\n@Component({\r\n selector: 'lib-t-dynamic-data-view',\r\n templateUrl: './t-dynamic-data-view.component.html',\r\n styleUrl: './t-dynamic-data-view.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatTreeModule, MatIconModule, MatButtonModule],\r\n})\r\nexport class TDynamicDataViewComponent {\r\n /** Arbitrary JSON-shaped value to render. Recomputes the tree on structural change. */\r\n readonly data = input<unknown>();\r\n\r\n protected readonly treeClass = new TreeComponent();\r\n\r\n constructor() {\r\n let lastSerialized: string | undefined;\r\n effect(() => {\r\n const value = this.data();\r\n if (value === undefined) return;\r\n const serialized = JSON.stringify(value);\r\n if (serialized === lastSerialized) return;\r\n lastSerialized = serialized;\r\n this.treeClass.computeTreeData(value);\r\n });\r\n }\r\n\r\n protected formatKey(key: string): string {\r\n if (!key) return '';\r\n const formatted = key.replace(/([A-Z])/g, ' $1').replace(/_/g, ' ');\r\n return formatted.charAt(0).toUpperCase() + formatted.slice(1).trim();\r\n }\r\n\r\n protected getDisplayValue(value: unknown): string {\r\n if (value === null) return 'null';\r\n if (value === undefined) return 'undefined';\r\n if (value === '') return '\"\"';\r\n return String(value);\r\n }\r\n\r\n protected getValueClass(value: unknown): string {\r\n if (value === null || value === undefined) return 'value-null';\r\n if (typeof value === 'string') return 'value-string';\r\n if (typeof value === 'number') return 'value-number';\r\n if (typeof value === 'boolean') return 'value-boolean';\r\n return 'value-default';\r\n }\r\n\r\n protected getLevelArray(node: unknown): readonly number[] {\r\n const lvl =\r\n (node as { level?: number })?.level ??\r\n this.treeClass?.treeControl?.getLevel?.(node as never) ??\r\n 0;\r\n return new Array(Math.max(0, lvl)).fill(0);\r\n }\r\n}\r\n","<mat-tree [dataSource]=\"treeClass.dataSource\" [treeControl]=\"treeClass.treeControl\" class=\"premium-tree\">\r\n\r\n <mat-tree-node *matTreeNodeDef=\"let node\" class=\"premium-node\">\r\n @for (i of getLevelArray(node); track $index) {\r\n <div class=\"guide-line\"></div>\r\n }\r\n\r\n <div class=\"node-wrapper\">\r\n <div class=\"icon-spacer\"></div>\r\n <span class=\"node-key\" [title]=\"node.key\">{{ formatKey(node.key) }}</span>\r\n <span class=\"leader-line\"></span>\r\n <span class=\"node-value\" [class]=\"getValueClass(node.value)\" [title]=\"getDisplayValue(node.value)\">\r\n {{ getDisplayValue(node.value) }}\r\n </span>\r\n </div>\r\n </mat-tree-node>\r\n\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: treeClass.hasChild\" class=\"premium-node parent-node\">\r\n @for (i of getLevelArray(node); track $index) {\r\n <div class=\"guide-line\"></div>\r\n }\r\n\r\n <div class=\"node-wrapper parent-wrapper\" (click)=\"treeClass.treeControl.toggle(node)\">\r\n <button mat-icon-button class=\"toggle-btn\" tabindex=\"-1\">\r\n <mat-icon class=\"toggle-icon\">\r\n {{ treeClass.treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n <span class=\"node-key parent-key\" [title]=\"node.key\">{{ formatKey(node.key) }}</span>\r\n </div>\r\n </mat-tree-node>\r\n\r\n</mat-tree>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { CurrencyPipe, DatePipe } from '@angular/common';\r\nimport { DocumentLitsLabelConfigInterfaceValueType, FormColumnInputs, InputDataTypes, InputPipeTypes } from 'ngx-t-forms-types'; // Assuming this path is correct relative to your pipe file\r\n\r\n@Pipe({\r\n name: 'formatData',\r\n standalone: true, // For Angular 14+ standalone components/pipes. Remove if not applicable.\r\n})\r\nexport class FormatDataPipe implements PipeTransform {\r\n\r\n /**\r\n * Formats an arbitrary input value for display according to `dataType`.\r\n *\r\n * `value` is typed `unknown` (a pipe can be handed any binding) and each\r\n * branch narrows it to the shape it needs. The return is the set of\r\n * display-primitive types (`string | number | null | undefined`) so it\r\n * binds cleanly to interpolation and `matTooltip`; \"passthrough\" branches\r\n * return the original value (asserted to the display-primitive union — its\r\n * runtime value is unchanged and Angular string-coerces it for display).\r\n *\r\n * @param value - The raw value to format.\r\n * @param dataType - Which formatting branch to apply.\r\n * @param pipeConfig - Optional pipe configuration (currency code, nested pipe type).\r\n * @returns The formatted representation, or the original value when no formatting applies.\r\n */\r\n transform(\r\n value: unknown,\r\n dataType: DocumentLitsLabelConfigInterfaceValueType | InputDataTypes | undefined |InputPipeTypes ,\r\n pipeConfig?: FormColumnInputs['pipe'] | undefined\r\n ): string | number | null | undefined {\r\n try {\r\n switch (dataType) {\r\n case 'date':\r\n const datePipe = new DatePipe('en-US'); // You might want to inject this or make locale configurable\r\n return datePipe.transform(value as string | number | Date, 'mediumDate');\r\n case 'currency':\r\n // The 'R' for ZAR is hardcoded here as per the original function.\r\n // Consider making the currency code and locale configurable if needed.\r\n const currencyPipeForCurrencyType = new CurrencyPipe('en-US', pipeConfig?.param || 'ZAR');\r\n const numberValueForCurrency = parseFloat(String(value));\r\n return currencyPipeForCurrencyType.transform(numberValueForCurrency, pipeConfig?.param);\r\n case 'number':\r\n if (pipeConfig?.pipeType === 'currency') {\r\n const currencyPipeForNumberType = new CurrencyPipe('en-US'); // Locale hardcoded\r\n const currencyCode = pipeConfig?.param;\r\n const numberValueForNumber = parseFloat(String(value));\r\n return currencyPipeForNumberType.transform(numberValueForNumber, currencyCode);\r\n } else {\r\n return value as string | number | null | undefined;\r\n }\r\n case InputDataTypes.Array:\r\n return (Array.isArray(value) ? value.length : 0) + ' items'\r\n case InputDataTypes.Object:\r\n return `{item}`\r\n case InputDataTypes.Boolean:\r\n return value ? 'Yes' : 'No';\r\n case 'daysAgo':\r\n if (value) {\r\n const seconds = Math.floor((+new Date() - +new Date(value as string | number | Date)) / 1000);\r\n if (seconds < 15)\r\n // less than 30 seconds ago will show as 'Just now'\r\n return 'Just now';\r\n const intervals: Record<string, number> = {\r\n year: 31536000,\r\n month: 2592000,\r\n week: 604800,\r\n day: 86400,\r\n hr: 3600,\r\n min: 60,\r\n sec: 1,\r\n };\r\n let counter;\r\n for (const i in intervals) {\r\n counter = Math.floor(seconds / (intervals[i] ?? 1));\r\n if (counter > 0)\r\n if (counter === 1) {\r\n return counter + ' ' + i + ' ago'; // singular (1 day ago)\r\n } else {\r\n return counter + ' ' + i + 's ago'; // plural (2 days ago)\r\n }\r\n }\r\n }\r\n return value as string | number | null | undefined;\r\n default:\r\n return value as string | number | null | undefined;\r\n }\r\n } catch {\r\n return value as string | number | null | undefined; // Return original value in case of an error\r\n }\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * @public\r\n * @deprecated Reachable for one minor cycle only as part of the Phase 1 public-surface\r\n * lockdown. Target removal: v3.0.0. No replacement — this is the empty\r\n * `ng generate library` stub and will be deleted in Phase 2.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NgxTFormsService {\r\n\r\n constructor() { \r\n \r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n/**\r\n * @public\r\n * @deprecated Reachable for one minor cycle only as part of the Phase 1 public-surface\r\n * lockdown. Target removal: v3.0.0. No replacement — this is the empty\r\n * `ng generate library` stub and will be deleted in Phase 2.\r\n */\r\n@Component({\r\n selector: 'lib-ngx-t-forms',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <p>\r\n ngx-t-forms works!\r\n </p>\r\n `,\r\n styles: ``,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class NgxTFormsComponent {\r\n\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Provides a unique identifier for each tower instance created during an\r\n * import run — one id per imported row. The form import controller uses this\r\n * to disambiguate concurrent tower contexts when materialising rows into\r\n * form submissions.\r\n *\r\n * @see provideNgxTForms\r\n *\r\n * @public\r\n * @deprecated Internal token used by `TFormImportController`. Will be relocated\r\n * under the `withImportTower()` feature tree in Phase 2; the token (or its\r\n * renamed/improved successor) will remain callable. See DECISIONS.md D-014.\r\n */\r\nexport const IMPORT_TOWER_INSTANCE_ID = new InjectionToken<string>('IMPORT_TOWER_INSTANCE_ID');\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport type { ITowerStepColumn } from 'ngx-t-forms-types';\r\n\r\n/**\r\n * Renders a non-input section heading inside a form (label + optional HTML hint).\r\n */\r\n@Component({\r\n selector: 'lib-section-title',\r\n templateUrl: './section-title.component.html',\r\n styleUrl: './section-title.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SectionTitleComponent {\r\n /** Configuration for the section heading column. */\r\n readonly inputConfig = input.required<ITowerStepColumn>();\r\n}\r\n","<br>\r\n<h3>{{ inputConfig().label }}</h3>\r\n<div [innerHTML]=\"inputConfig().hintLabel\"></div>\r\n<br>\r\n","import type { Type } from '@angular/core';\nimport { ElementTypes } from 'ngx-t-forms-types';\n\n/**\n * One entry in the polymorphic-input registry. Maps an `ElementTypes` value to\n * a lazily-loaded renderer plus the metadata the host needs to wire it.\n *\n * Each `load()` is a dynamic `import()`, so every renderer is code-split out of\n * the host bundle — a form with only text fields never downloads the editor,\n * camera, signature pad, MSCOA charts, etc. The dynamic boundary also breaks\n * the otherwise-circular import between the host and `ImageCapture`.\n */\nexport interface ElementEntry {\n /** Lazy loader for the concrete renderer component. */\n readonly load: () => Promise<Type<unknown>>;\n /**\n * `true` when the renderer also accepts `editorMode` and\n * `formBuilderFunctions` inputs. The host only forwards those two inputs to\n * builder-aware entries, so `NgComponentOutlet` never tries to set an input\n * the target component does not declare.\n */\n readonly builderAware?: boolean;\n}\n\n/**\n * Renderer registry for {@link ElementTypes} that flow through the gated\n * (form-control-backed) branch of the polymorphic host. `SectionTitle` is\n * intentionally absent: it renders through its own un-gated branch and is\n * loaded eagerly so it paints synchronously.\n */\nexport const ELEMENT_REGISTRY: Partial<Record<ElementTypes, ElementEntry>> = {\n [ElementTypes.Location]: {\n builderAware: true,\n load: () => import('./elements/Geo-location-form-input/geo-location.component').then(m => m.GeoLocationComponent),\n },\n [ElementTypes.AutoCompleteInput]: {\n load: () => import('./elements/auto-complete-input-element/auto-complete-input-element.component').then(m => m.AutoCompleteInputElementComponent),\n },\n [ElementTypes.Toggle]: {\n load: () => import('./elements/toggle-input-element/toggle-input-element.component').then(m => m.ToggleInputElementComponent),\n },\n [ElementTypes.Select]: {\n load: () => import('./elements/select-input-element/select-input-element.component').then(m => m.SelectInputElementComponent),\n },\n [ElementTypes.Textarea]: {\n load: () => import('./elements/textarea-input-element/textarea-input-element.component').then(m => m.TextareaInputElementComponent),\n },\n [ElementTypes.DateRangePicker]: {\n load: () => import('./elements/date-range-picker-input-element/date-range-picker-input-element.component').then(m => m.DateRangePickerInputElementComponent),\n },\n [ElementTypes.DatePicker]: {\n load: () => import('./elements/date-picker-input-element/date-picker-input-element.component').then(m => m.DatePickerInputElementComponent),\n },\n [ElementTypes.FileUpload]: {\n load: () => import('./elements/file-upload-input-element/file-upload-input-element.component').then(m => m.FileUploadInputElementComponent),\n },\n [ElementTypes.ImageCapture]: {\n load: () => import('./elements/image-capture-input-element/image-capture-input-element.component').then(m => m.ImageCaptureInputElementComponent),\n },\n [ElementTypes.Editor]: {\n load: () => import('./elements/editor-input-element/editor-input-element.component').then(m => m.EditorInputElementComponent),\n },\n [ElementTypes.Signature]: {\n load: () => import('./elements/signature-input-element/signature-input-element.component').then(m => m.SignatureInputElementComponent),\n },\n [ElementTypes.MultipleInput]: {\n builderAware: true,\n load: () => import('./elements/multiple-input-input-element/multiple-input-input-element.component').then(m => m.MultipleInputInputElementComponent),\n },\n [ElementTypes.MscoaSelection]: {\n builderAware: true,\n load: () => import('./elements/mscoa-form-input/mscoa-form-input.component').then(m => m.MscoaFormInputComponent),\n },\n [ElementTypes.WorkflowDocumentPicker]: {\n builderAware: true,\n load: () => import('./elements/document-picker/document-picker.component').then(m => m.DocumentPickerComponent),\n },\n [ElementTypes.WorkflowAdjudication]: {\n builderAware: true,\n load: () => import('./elements/workflow-adjudication/workflow-adjudication.component').then(m => m.WorkflowAdjudicationComponent),\n },\n [ElementTypes.PaginatedSelectionTable]: {\n load: () => import('./elements/paginated-selection-table/paginated-selection-table').then(m => m.PaginatedSelectionTable),\n },\n};\n\n/**\n * Renderer for any element type without a registry entry — mirrors the former\n * `@default` switch branch (a basic input).\n */\nexport const FALLBACK_ELEMENT: ElementEntry = {\n load: () => import('./elements/basic-input-input-element/basic-input-input-element.component').then(m => m.BasicInputInputElementComponent),\n};\n\n/**\n * Resolves the renderer entry for a given element type, falling back to the\n * basic input when the type is unknown.\n */\nexport function resolveElementEntry(element: ElementTypes): ElementEntry {\n return ELEMENT_REGISTRY[element] ?? FALLBACK_ELEMENT;\n}\n","import { ChangeDetectionStrategy, Component, DestroyRef, Inject, Optional, Type, ViewEncapsulation, computed, effect, inject, model, output } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { AsyncPipe, NgComponentOutlet } from '@angular/common';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\n\r\n\r\nimport { ElementTypes, ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { SectionTitleComponent } from './elements/section-title/section-title.component';\r\nimport { FormBuilderFunctions } from 'ngx-t-forms-types';\r\nimport { resolveElementEntry } from './element-registry';\r\n\r\ntype TFormInputFormGroup = FormGroup<{\r\n [sectionId: string]: FormGroup<{\r\n [inputId: string]: FormControl<string | null>\r\n }>\r\n}> | undefined | null;\r\n\r\n/**\r\n * Polymorphic input host — given an `ITowerStepColumn` descriptor, selects\r\n * and renders the correct concrete input component (text, select, date,\r\n * file upload, signature, geo-location, MSCOA, document picker, workflow\r\n * adjudication, etc.) and wires it to the parent reactive `FormGroup`.\r\n *\r\n * @remarks\r\n * Accepts portal-style prop injection via the optional `'COMPONENT_PROPS'`\r\n * token so it can be rendered through `ComponentPortal` with inputs supplied\r\n * dynamically.\r\n *\r\n * Inputs:\r\n * - `inputConfig: ITowerStepColumn | undefined` — descriptor of the input\r\n * to render; the `element` field selects the concrete renderer.\r\n * - `formGroup: FormGroup<{...}> | undefined | null` — the parent reactive\r\n * form group keyed by section id then input id.\r\n * - `editorMode: boolean` — default `false`; when `true`, renders the\r\n * builder-side variant.\r\n * - `formBuilderFunctions: FormBuilderFunctions | undefined` — builder\r\n * hooks passed through to inputs that need them (e.g., MSCOA).\r\n *\r\n * Outputs:\r\n * - `valueChange: unknown` — emits the input's new value whenever the user\r\n * edits the bound `FormControl`. Concrete child inputs are rendered through\r\n * `NgComponentOutlet` (which forwards inputs only, never outputs) and write\r\n * their value through the shared `FormGroup` via `ControlValueAccessor`, so\r\n * this host bridges those control edits into a single output the tower wires\r\n * to `engine.updateValue(col.id, $event)`. Without this bridge user edits\r\n * reach the projected `FormGroup` (so submission works) but never reach the\r\n * engine's `#model`, leaving the signal graph blind to user input — no\r\n * dependent calculation, value-fetch, or options-fetch ever re-fires.\r\n *\r\n * @public\r\n */\r\n@Component({\r\n selector: 'lib-t-form-input',\r\n imports: [\r\n SectionTitleComponent,\r\n NgComponentOutlet,\r\n AsyncPipe,\r\n ],\r\n templateUrl: './t-form-input.component.html',\r\n styleUrl: './t-form-input.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n})\r\nexport class TFormInputComponent {\r\n /**\r\n * Descriptor of the input to render. `element` selects the concrete renderer.\r\n *\r\n * Modeled as a `model()` (not `input()`) so that portal-style injection via\r\n * `'COMPONENT_PROPS'` can write into the signal at construction time — signal\r\n * inputs are read-only at runtime, but model signals are writable via `.set()`.\r\n */\r\n readonly inputConfig = model<ITowerStepColumn | undefined>(undefined);\r\n\r\n /** Parent reactive `FormGroup` keyed by section id then input id. */\r\n readonly formGroup = model<TFormInputFormGroup>(undefined);\r\n\r\n /** When `true`, renders the builder-side variant. */\r\n readonly editorMode = model<boolean>(false);\r\n\r\n /** Builder hooks passed through to inputs that need them (e.g., MSCOA). */\r\n readonly formBuilderFunctions = model<FormBuilderFunctions | undefined>(undefined);\r\n\r\n /**\r\n * Emits the input's new value on every user-originated edit of the bound\r\n * control. The tower binds this to `engine.updateValue(col.id, $event)`,\r\n * which is the ONLY path user input takes into the engine's `#model` (and\r\n * therefore the signal-graph dependency reactivity). The projection effect\r\n * patches controls with `{ emitEvent: false }`, so signal→control writes do\r\n * NOT echo back here — only genuine user edits emit.\r\n */\r\n readonly valueChange = output<unknown>();\r\n\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n /**\r\n * Map of model-signal setters exposed to the portal-injection bridge.\r\n * Keys mirror the public input names; each value is a typed setter the\r\n * constructor loop calls to honour `'COMPONENT_PROPS'`. Wrapping the\r\n * `.set` calls in lambdas erases the per-signal generic, keeping the\r\n * map index signature uniform.\r\n */\r\n readonly #modelInputSetters: Record<string, (value: unknown) => void> = {\r\n inputConfig: (v) => this.inputConfig.set(v as ITowerStepColumn | undefined),\r\n formGroup: (v) => this.formGroup.set(v as TFormInputFormGroup),\r\n editorMode: (v) => this.editorMode.set(v as boolean),\r\n formBuilderFunctions: (v) => this.formBuilderFunctions.set(v as FormBuilderFunctions | undefined),\r\n };\r\n\r\n protected readonly elementTypes = ElementTypes;\r\n\r\n /**\r\n * Polymorphic-host control flag — true when the bound `FormGroup` already\r\n * has a `FormControl` (or, for `DateRangePicker`, both start/end controls)\r\n * matching the descriptor's `id`.\r\n */\r\n protected readonly hasFormControlInstance = computed(() => {\r\n const formGroup = this.formGroup();\r\n const inputConfig = this.inputConfig();\r\n // Early return if basic requirements aren't met\r\n if (!formGroup || !inputConfig) return false;\r\n\r\n const { id } = inputConfig;\r\n const isDateRangePicker = inputConfig.element === ElementTypes.DateRangePicker;\r\n if (isDateRangePicker) {\r\n return !!formGroup.controls[`${inputConfig.id}.${inputConfig.startDateControl}`]\r\n && !!formGroup.controls[`${inputConfig.id}.${inputConfig.endDateControl}`];\r\n }\r\n\r\n // Handle standard form control case\r\n return !!formGroup.controls[id];\r\n });\r\n\r\n /**\r\n * Registry entry for the current descriptor's element type. Resolves to the\r\n * basic-input fallback for unknown types, mirroring the former `@default`\r\n * switch branch. `undefined` only while no descriptor is bound.\r\n */\r\n protected readonly elementEntry = computed(() => {\r\n const inputConfig = this.inputConfig();\r\n return inputConfig ? resolveElementEntry(inputConfig.element) : undefined;\r\n });\r\n\r\n /**\r\n * Lazily-loaded renderer component for the current element type, unwrapped in\r\n * the template via the `async` pipe. The promise is re-created only when the\r\n * resolved entry changes, so editing other descriptor fields does not reload\r\n * the component.\r\n */\r\n protected readonly elementComponent = computed<Promise<Type<unknown>> | null>(() => {\r\n const entry = this.elementEntry();\r\n return entry ? entry.load() : null;\r\n });\r\n\r\n /**\r\n * Inputs forwarded to the resolved renderer. Builder-aware renderers also\r\n * receive `editorMode` and `formBuilderFunctions`; every other renderer gets\r\n * only `inputConfig` and `formGroup`, so `NgComponentOutlet` never sets an\r\n * input the target component does not declare.\r\n */\r\n protected readonly elementInputs = computed<Record<string, unknown>>(() => {\r\n const base: Record<string, unknown> = {\r\n inputConfig: this.inputConfig(),\r\n formGroup: this.formGroup(),\r\n };\r\n if (this.elementEntry()?.builderAware) {\r\n base['editorMode'] = this.editorMode();\r\n base['formBuilderFunctions'] = this.formBuilderFunctions();\r\n }\r\n return base;\r\n });\r\n\r\n // Portal-style prop injection: when this component is rendered through a\r\n // ComponentPortal, inputs may be supplied via the `'COMPONENT_PROPS'` string\r\n // token. Signal inputs are read-only at runtime, so each prop is routed\r\n // through the matching writable `model()` setter in `#modelInputSetters`.\r\n // Constructor-parameter `@Inject` is used because `inject()` does not accept\r\n // string tokens — keeping the original consumer-side contract intact.\r\n constructor(@Optional() @Inject('COMPONENT_PROPS') props: Record<string, unknown> | null) {\r\n if (props) {\r\n Object.keys(props).forEach((key) => {\r\n const setter = this.#modelInputSetters[key];\r\n if (setter) {\r\n setter(props[key]);\r\n } else {\r\n (this as Record<string, unknown>)[key] = props[key];\r\n }\r\n });\r\n }\r\n\r\n // Bridge user edits → `valueChange` output. Concrete inputs (rendered via\r\n // NgComponentOutlet, which does not forward outputs) write only through the\r\n // shared FormGroup's ControlValueAccessor, so this host subscribes to its\r\n // own control's `valueChanges` and re-emits. Re-subscribes when the bound\r\n // group or descriptor changes (both are model signals); the effect's\r\n // `onCleanup` tears down the prior subscription. Signal→control projection\r\n // patches with `{ emitEvent: false }`, so this never sees programmatic\r\n // writes — only real user edits, which the tower routes to `#model`.\r\n effect((onCleanup) => {\r\n const formGroup = this.formGroup();\r\n const cfg = this.inputConfig();\r\n if (!formGroup || !cfg) return;\r\n // SectionTitle has no control. MultipleInput IS bridged: its sub-row\r\n // save flow (saveMultipleInputForm → mainInput.setValue) and row removal\r\n // (CVA onChange) mutate the parent array control directly but never touch\r\n // `#model`, so without this bridge any calculation aggregating the column\r\n // (e.g. sum-of-rows via parentInputId + applyFunctionToCol) never re-fires.\r\n // Routing the array control's valueChanges → updateValue keeps `#model` in\r\n // sync; the projection patches back with { emitEvent: false }, so there is\r\n // no echo / double-update.\r\n if (cfg.element === ElementTypes.SectionTitle) return;\r\n // DateRangePicker stores its value across `${id}.${startDateControl}` /\r\n // `${id}.${endDateControl}` controls, so `get(cfg.id)` is null and this\r\n // naturally no-ops for it (also Phase 2).\r\n const control = formGroup.get(cfg.id);\r\n if (!control) return;\r\n const sub = control.valueChanges\r\n .pipe(takeUntilDestroyed(this.#destroyRef))\r\n .subscribe((value) => this.valueChange.emit(value));\r\n onCleanup(() => sub.unsubscribe());\r\n });\r\n }\r\n}\r\n","@if (inputConfig(); as cfg) {\n\n@if (cfg.element === elementTypes.SectionTitle) {\n<lib-section-title [inputConfig]=\"cfg\"></lib-section-title>\n}\n\n@if (cfg.element !== elementTypes.SectionTitle && formGroup()) {\n@if (hasFormControlInstance()) {\n<ng-container [ngComponentOutlet]=\"elementComponent() | async\" [ngComponentOutletInputs]=\"elementInputs()\">\n</ng-container>\n}\n}\n\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport type { ITowerStepColumn } from 'ngx-t-forms-types';\r\n\r\n/**\r\n * Compact visual status indicator (recently-updated icon, busy spinner,\r\n * read-only icon) for a single form-input column inside a stepper or\r\n * dynamic-data view.\r\n */\r\n@Component({\r\n selector: 'lib-t-form-input-status',\r\n templateUrl: './t-form-input-status.component.html',\r\n styleUrl: './t-form-input-status.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [MatIconModule, MatTooltipModule, MatProgressSpinnerModule],\r\n})\r\nexport class TFormInputStatusComponent {\r\n /** Form-input column whose status this component reflects. */\r\n readonly inputConfig = input.required<ITowerStepColumn>();\r\n\r\n protected readonly recentlyUpdated = computed<boolean>(() => {\r\n const valueUpdatedAt = this.inputConfig().valueUpdatedAt;\r\n if (!valueUpdatedAt) return false;\r\n const diffInSeconds = Math.floor(\r\n (Date.now() - new Date(valueUpdatedAt).getTime()) / 1000,\r\n );\r\n return diffInSeconds < 30;\r\n });\r\n\r\n protected readonly busy = computed<boolean>(() => {\r\n const statusObj = this.inputConfig().status ?? {};\r\n return Object.values(statusObj).some(value => Boolean(value));\r\n });\r\n\r\n protected readonly busyMessage = computed<string>(() => {\r\n const statusObj = this.inputConfig().status ?? {};\r\n return Object.entries(statusObj)\r\n .filter(([, value]) => Boolean(value))\r\n .map(([, value]) => String(value))\r\n .join(', ');\r\n });\r\n\r\n protected readonly isReadOnly = computed<boolean>(() =>\r\n Boolean(this.inputConfig().readonly),\r\n );\r\n}\r\n","@if (!busy() && recentlyUpdated()) {\r\n <mat-icon color=\"primary\" matTooltip=\"recently updated\">update</mat-icon>\r\n}\r\n\r\n@if (isReadOnly()) {\r\n <mat-icon style=\"opacity:0.5;\" matTooltip=\"Read only\">edit_off</mat-icon>\r\n}\r\n\r\n@if (busy()) {\r\n <mat-spinner\r\n [matTooltip]=\"busyMessage()\"\r\n [diameter]=\"12\"\r\n style=\"display: inline-block;\"\r\n ></mat-spinner>\r\n}\r\n","export const MIN_ACCOUNT_DETAILS = [\r\n 'AccountNumberShortened',\r\n 'ShortDescription',\r\n // 'SCOAAccount',\r\n 'BreakDownAllowed',\r\n 'PostingLevel',\r\n 'selection'\r\n];\r\nexport const SCOA_ACCOUNT_COLUMNS = [\r\n { key: 'SCOAid', label: 'SCOA ID' },\r\n { key: 'AccountNumber', label: 'Full Account Number' },\r\n { key: 'AccountNumberShortened', label: 'Account Number' },\r\n { key: 'ShortDescription', label: 'Short Description' },\r\n { key: 'DefinitionDescription', label: 'Definition Description' },\r\n { key: 'SCOAAccount', label: 'SCOA Account' },\r\n\r\n { key: 'AccountNumberPrefix', label: 'Account Prefix' },\r\n { key: 'ApplicableTo', label: 'Applicable To' },\r\n { key: 'BreakDownAllowed', label: 'BreakDown Allowed' },\r\n { key: 'ParentSCOAId', label: 'Parent SCOA ID' },\r\n { key: 'PostingLevel', label: 'Posting Level' },\r\n { key: 'Principle', label: 'Principle' },\r\n { key: 'SCOAFile', label: 'SCOA File' },\r\n { key: 'SCOALevel', label: 'SCOA Level' },\r\n { key: 'VATStatus', label: 'VAT Status' },\r\n { key: 'A2A', label: 'A2A' },\r\n { key: 'A4', label: 'A4' },\r\n { key: 'A4F', label: 'A4F' },\r\n { key: 'A5', label: 'A5' },\r\n { key: 'A6', label: 'A6' },\r\n { key: 'A6F', label: 'A6F' },\r\n { key: 'A7', label: 'A7' },\r\n { key: 'A8', label: 'A8' },\r\n { key: 'A9', label: 'A9' },\r\n { key: 'IUDF', label: 'IUDF' },\r\n { key: 'MTSF', label: 'MTSF' },\r\n { key: 'NATGRANT', label: 'NATGRANT' },\r\n { key: 'SA1', label: 'SA1' },\r\n { key: 'SA3', label: 'SA3' },\r\n { key: 'SA30', label: 'SA30' },\r\n { key: 'SA34A', label: 'SA34A' },\r\n { key: 'SA34B', label: 'SA34B' },\r\n { key: 'SA34C', label: 'SA34C' },\r\n { key: 'SA34D', label: 'SA34D' },\r\n { key: 'SA34E', label: 'SA34E' },\r\n { key: 'createdAt', label: 'Created At' },\r\n { key: 'updatedAt', label: 'Updated At' },\r\n { key: 'selection', label: 'Select',system:true }\r\n \r\n];\r\n\r\n// { key: 'AccountNumber1', label: 'Account Number 1' },\r\n// { key: 'AccountNumber2', label: 'Account Number 2' },\r\n// { key: 'AccountNumber3', label: 'Account Number 3' },\r\n// { key: 'AccountNumber4', label: 'Account Number 4' },\r\n// { key: 'AccountNumber5', label: 'Account Number 5' },\r\n// { key: 'AccountNumber6', label: 'Account Number 6' },\r\n// { key: 'AccountNumber7', label: 'Account Number 7' },\r\n// { key: 'AccountNumber8', label: 'Account Number 8' },\r\n// { key: 'AccountNumber9', label: 'Account Number 9' },\r\n// { key: 'AccountNumber10', label: 'Account Number 10' },\r\n// { key: 'AccountNumber11', label: 'Account Number 11' },\r\n// { key: 'AccountNumber12', label: 'Account Number 12' },","import { NgModule } from '@angular/core';\r\n\r\nimport { CdkAccordionModule } from '@angular/cdk/accordion';\r\nimport { ClipboardModule } from '@angular/cdk/clipboard';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { CdkStepperModule } from '@angular/cdk/stepper';\r\nimport { CdkTableModule } from '@angular/cdk/table';\r\nimport { CdkTreeModule } from '@angular/cdk/tree';\r\nimport { MatBadgeModule } from '@angular/material/badge';\r\nimport { MatBottomSheetModule } from '@angular/material/bottom-sheet';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatStepperModule } from '@angular/material/stepper';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatGridListModule } from '@angular/material/grid-list';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatMenuModule, } from '@angular/material/menu';\r\nimport { MatNativeDateModule, MatRippleModule } from '@angular/material/core';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatTreeModule } from '@angular/material/tree';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\n\r\n\r\n/**\r\n * @deprecated Phase 2 layering: consumers should import only the specific\r\n * `@angular/material` / `@angular/cdk` modules they need (all are standalone\r\n * since Angular 19). Phase 3 codemod sweep replaces internal callsites.\r\n * Target removal: v3.0.0.\r\n */\r\n@NgModule({\r\n exports: [\r\n CdkAccordionModule,\r\n ClipboardModule,\r\n CdkStepperModule,\r\n CdkTableModule,\r\n CdkTreeModule,\r\n DragDropModule,\r\n MatAutocompleteModule,\r\n MatBadgeModule,\r\n MatBottomSheetModule,\r\n MatButtonModule,\r\n MatButtonToggleModule,\r\n MatCardModule,\r\n MatCheckboxModule,\r\n MatChipsModule,\r\n MatStepperModule,\r\n MatDatepickerModule,\r\n MatDialogModule,\r\n MatDividerModule,\r\n MatExpansionModule,\r\n MatGridListModule,\r\n MatIconModule,\r\n MatListModule,\r\n MatMenuModule,\r\n MatNativeDateModule,\r\n MatPaginatorModule,\r\n MatProgressBarModule,\r\n MatProgressSpinnerModule,\r\n MatRadioModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatSidenavModule,\r\n MatSliderModule,\r\n MatSlideToggleModule,\r\n MatSnackBarModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatTabsModule,\r\n MatToolbarModule,\r\n MatTooltipModule,\r\n MatTreeModule,\r\n OverlayModule,\r\n PortalModule,\r\n ScrollingModule,\r\n MatFormFieldModule,\r\n MatInputModule\r\n \r\n ],\r\n})\r\nexport class MatModulesModule {}\r\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject } from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { TourMatMenu } from 'ngx-ui-tour-md-menu';\r\n\r\n\r\nimport { Observable, of } from 'rxjs';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\n\r\nimport type { FormColumnInputs, FormInterface } from 'ngx-t-forms-types';\r\n\r\nimport { DataSources } from 'ngx-t-forms-types';\r\n\r\ninterface ScoaInputDialogData {\r\n readonly input: FormColumnInputs;\r\n readonly formGroup: FormGroup;\r\n readonly value: unknown;\r\n readonly heading: string;\r\n readonly subHeading: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-scoa-input',\r\n imports: [CommonModule, MatModulesModule, ReactiveFormsModule, ...TourMatMenu],\r\n templateUrl: './scoa-input.component.html',\r\n styleUrl: './scoa-input.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n 'class': 'app-scoa-input',\r\n },\r\n})\r\nexport class ScoaInputComponent {\r\n readonly #dialogData = inject<ScoaInputDialogData>(MAT_DIALOG_DATA);\r\n\r\n /** Reference to this dialog instance. Used by template `mat-dialog-close`. */\r\n readonly dialogRef = inject<MatDialogRef<ScoaInputComponent>>(MatDialogRef);\r\n\r\n protected readonly inputConfig: FormColumnInputs = this.#dialogData.input;\r\n protected readonly formGroup: FormGroup = this.#dialogData.formGroup;\r\n protected readonly value: FormColumnInputs['value'] = this.#dialogData.value as FormColumnInputs['value'];\r\n protected readonly heading: string = this.#dialogData.heading;\r\n protected readonly subHeading: string = this.#dialogData.subHeading;\r\n\r\n protected activeFormClass: undefined = undefined;\r\n\r\n constructor() {\r\n this.createForm();\r\n }\r\n\r\n protected get hasError(): boolean {\r\n const isRequired =\r\n this.inputConfig.validators.includes('required') || this.inputConfig.required;\r\n return Boolean(isRequired && !this.value);\r\n }\r\n\r\n protected saveFormData = (data: unknown): Observable<unknown> => {\r\n return of(data);\r\n };\r\n\r\n protected createForm(): FormInterface {\r\n return {\r\n formId: this.inputConfig.id,\r\n submissionHandle: {\r\n submissionAPI: [\r\n {\r\n _id: '',\r\n name: '',\r\n httpEndPoint: '',\r\n inputSourceId: '',\r\n httpMethod: 'GET',\r\n postFormData: false,\r\n backEndConfig: {\r\n minimumInputRequired: [],\r\n },\r\n valueAccessRules: [],\r\n source: DataSources.Local,\r\n },\r\n ],\r\n submissionMessage: '',\r\n },\r\n formTitle: 'Default Title',\r\n slides: [\r\n {\r\n sectionId: 'section1',\r\n label: 'Default Section',\r\n columns: [\r\n {\r\n ...this.inputConfig,\r\n value: this.value,\r\n },\r\n ],\r\n },\r\n ],\r\n };\r\n }\r\n\r\n protected getContentInput(): readonly unknown[] {\r\n return [];\r\n }\r\n\r\n protected trackByFn(_index: number, item: { input: { id: string } }): string {\r\n return item.input.id;\r\n }\r\n\r\n protected save(_data: unknown): Observable<void> {\r\n return of();\r\n }\r\n}\r\n","<h2 mat-dialog-title style=\"font-weight: 500;\"> {{heading|titlecase}}</h2>\r\n<p style=\" padding-left: 28px;padding-right:24px;margin-top:0px\">\r\n {{subHeading}}\r\n</p>\r\n<mat-dialog-content>\r\n\r\n <ng-container>\r\n<!-- \r\n <lib-t-form-input \r\n [formGroup]=\"formGroup\" \r\n [inputConfig]=\"inputConfig\"></lib-t-form-input> \r\n -->\r\n\r\n \r\n\r\n \r\n\r\n </ng-container>\r\n</mat-dialog-content>\r\n<mat-dialog-actions align=\"end\">\r\n <button mat-button mat-dialog-close>Close</button>\r\n <button mat-flat-button color=\"primary\" (click)=\"save({})\" cdkFocusInitial>Save</button>\r\n</mat-dialog-actions>","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, output, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { take } from 'rxjs';\r\nimport { IScoaAccount, FormColumnInputs } from 'ngx-t-forms-types';\r\n\r\nimport { SCOA_ACCOUNT_COLUMNS } from '../../store/accountConstants';\r\nimport { ScoaInputComponent } from '../scoa-input/scoa-input.component';\r\n\r\ninterface AccountDetailItem {\r\n label: string;\r\n value: unknown;\r\n formControlName?: string;\r\n input: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-account-value',\r\n imports: [MatButtonModule, MatIconModule, MatToolbarModule, MatTooltipModule],\r\n templateUrl: './account-value.component.html',\r\n styleUrl: './account-value.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AccountValueComponent {\r\n readonly mscoaAccount = input<IScoaAccount | undefined>(undefined);\r\n readonly accountInputs = input<FormColumnInputs[]>([]);\r\n readonly userCanClearAccount = input<boolean>(false);\r\n\r\n readonly clearSelectedAccount = output<void>();\r\n readonly updateAccount = output<IScoaAccount>();\r\n\r\n // Internal mutable mirror of the incoming account (component reassigns after edit).\r\n protected readonly currentAccount = signal<IScoaAccount | undefined>(undefined);\r\n\r\n readonly #dialog = inject(MatDialog);\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n // Bridge: keep internal signal in sync with parent-bound input.\r\n effect(() => {\r\n this.currentAccount.set(this.mscoaAccount());\r\n });\r\n }\r\n\r\n protected readonly accountDetails = computed<AccountDetailItem[]>(() => {\r\n const acc = this.currentAccount();\r\n if (!acc) return [];\r\n const descriptions = Object.keys(acc)\r\n .filter(key => key.includes('_description'))\r\n .map(key => ({ label: key.replace('_', ' '), key }));\r\n\r\n const li: AccountDetailItem[] = [...SCOA_ACCOUNT_COLUMNS, ...descriptions]\r\n .map(col => ({\r\n label: col.label,\r\n value: (acc || {})[col.key as keyof IScoaAccount],\r\n input: false,\r\n }))\r\n .filter(item => item.value !== undefined);\r\n\r\n const inputs: AccountDetailItem[] = this.accountInputs().map(inp => ({\r\n label: inp.label,\r\n value: acc?.[inp.formControlName as keyof IScoaAccount],\r\n formControlName: inp.formControlName,\r\n input: true,\r\n }));\r\n\r\n const version: AccountDetailItem = {\r\n label: 'Scoa Version',\r\n value: acc?.version?.versionNumber,\r\n formControlName: 'versionNumber',\r\n input: false,\r\n };\r\n\r\n return [...li, version, ...inputs];\r\n });\r\n\r\n /**\r\n * Checks if a value is a long text (like IDs or account numbers)\r\n */\r\n protected isLongText(value: unknown): boolean {\r\n if (!value || typeof value !== 'string') return false;\r\n return value.length > 30;\r\n }\r\n\r\n /**\r\n * Checks if a value is a long description\r\n */\r\n protected isLongDescription(value: unknown): boolean {\r\n if (!value || typeof value !== 'string') return false;\r\n return value.length > 100 && (value.includes('Description') || value.includes('description'));\r\n }\r\n\r\n protected asString(value: unknown): string {\r\n return value == null ? '' : String(value);\r\n }\r\n\r\n protected clearAccount(): void {\r\n this.clearSelectedAccount.emit();\r\n }\r\n\r\n protected openValueEdit(inpu: AccountDetailItem): void {\r\n const acc = this.currentAccount();\r\n const input = this.accountInputs().find(i => i.formControlName === inpu.formControlName);\r\n const dialogRef = this.#dialog.open(ScoaInputComponent, {\r\n data: {\r\n input: {\r\n ...input,\r\n value: acc?.[inpu.formControlName as keyof IScoaAccount],\r\n },\r\n heading: `${acc?.SCOAAccount} - ${inpu.label}`,\r\n value: acc?.[inpu.formControlName as keyof IScoaAccount],\r\n subHeading: `Enter ${inpu.label} for the account`,\r\n },\r\n minWidth: '368px',\r\n minHeight: 'fit-content',\r\n maxHeight: 'fit-content',\r\n height: 'fit-content',\r\n panelClass: 'mscoa-input-dialog',\r\n });\r\n dialogRef\r\n .afterClosed()\r\n .pipe(take(1), takeUntilDestroyed(this.#destroyRef))\r\n .subscribe(result => {\r\n if (result && inpu.formControlName) {\r\n const next = {\r\n ...this.currentAccount(),\r\n [inpu.formControlName]: result,\r\n } as IScoaAccount;\r\n this.currentAccount.set(next);\r\n this.updateAccount.emit(next);\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"account-card\">\r\n <mat-toolbar class=\"compact-toolbar\">\r\n <span>Account Details</span>\r\n </mat-toolbar>\r\n <div class=\"account-grid\">\r\n @for (item of accountDetails(); track $index; let last = $last) {\r\n <div class=\"detail-item\" [class.full-width]=\"isLongText(item.value) || isLongDescription(item.value)\">\r\n <span class=\"label\">{{ item.label }}</span>\r\n <span class=\"value\">\r\n @if (item.input) {\r\n <button \r\n mat-button \r\n [color]=\"item.value ? 'primary' : ''\"\r\n [class.empty-state-btn]=\"!item.value\"\r\n (click)=\"openValueEdit(item)\"\r\n [attr.aria-label]=\"item.value ? 'Edit ' + item.label : 'Set ' + item.label\">\r\n <span class=\"btn-text\">{{ item.value || 'Set ' + item.label }}</span>\r\n @if (!item.value) {\r\n <mat-icon iconPositionEnd>edit</mat-icon>\r\n }\r\n </button>\r\n } @else {\r\n @if (isLongText(item.value)) {\r\n <span \r\n class=\"read-only-text long-value\" \r\n [matTooltip]=\"asString(item.value)\"\r\n [matTooltipPosition]=\"'above'\"\r\n [matTooltipShowDelay]=\"500\">\r\n {{ item.value || '-' }}\r\n </span>\r\n } @else if (isLongDescription(item.value)) {\r\n <span class=\"read-only-text long-description\">{{ item.value || '-' }}</span>\r\n } @else {\r\n <span class=\"read-only-text\">{{ item.value || '-' }}</span>\r\n }\r\n }\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n</div>","import { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, output, signal, viewChild } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatSort, MatSortModule } from '@angular/material/sort';\r\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { IScoaAccount } from 'ngx-t-forms-types';\r\n\r\nimport { MIN_ACCOUNT_DETAILS, SCOA_ACCOUNT_COLUMNS } from '../../store/accountConstants';\r\n\r\nexport interface ColumnConfig<T> {\r\n key: keyof T | string;\r\n header: string;\r\n sortable?: boolean;\r\n cell?: (element: T) => string;\r\n}\r\n\r\ninterface ScoaAccountColumn {\r\n key: string;\r\n label: string;\r\n system?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-scoa-account-table',\r\n imports: [\r\n MatTableModule,\r\n MatSortModule,\r\n MatPaginatorModule,\r\n MatCheckboxModule,\r\n MatMenuModule,\r\n MatToolbarModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n ReactiveFormsModule,\r\n ],\r\n templateUrl: './scoa-account-table.component.html',\r\n styleUrl: './scoa-account-table.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ScoaAccountTableComponent {\r\n readonly data = input<{ accounts: IScoaAccount[]; account: string } | undefined>(undefined);\r\n readonly selectedAccount = input<IScoaAccount | null>(null);\r\n readonly segment = input<string | undefined>(undefined);\r\n\r\n readonly accountSelected = output<IScoaAccount | null>();\r\n\r\n protected readonly sort = viewChild.required(MatSort);\r\n protected readonly paginator = viewChild.required(MatPaginator);\r\n\r\n protected readonly dataSource = new MatTableDataSource<IScoaAccount>([]);\r\n protected readonly searchControl = new FormControl('');\r\n\r\n protected readonly minViewCol = signal<string[]>(MIN_ACCOUNT_DETAILS);\r\n protected readonly showFullAccountDetails = signal<boolean>(false);\r\n protected readonly showMinMal = signal<boolean>(true);\r\n protected readonly scoaAccountColumns = signal<ScoaAccountColumn[]>(SCOA_ACCOUNT_COLUMNS as ScoaAccountColumn[]);\r\n\r\n protected readonly displayColumns = computed<string[]>(() => {\r\n const cols = this.scoaAccountColumns().map(h => h.key);\r\n if (!this.showFullAccountDetails()) {\r\n const min = this.minViewCol();\r\n return cols.filter(c => min.includes(c));\r\n }\r\n return [...cols, 'selected'];\r\n });\r\n\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n // Wire up sort/paginator once they're available, and react to data input changes.\r\n effect(() => {\r\n const sort = this.sort();\r\n const paginator = this.paginator();\r\n this.dataSource.sort = sort;\r\n this.dataSource.paginator = paginator;\r\n\r\n const d = this.data();\r\n if (d) {\r\n this.dataSource.data = this.mapAccounts(d.accounts);\r\n if (this.dataSource.paginator !== paginator) {\r\n this.dataSource.paginator = paginator;\r\n }\r\n }\r\n });\r\n\r\n this.searchControl.valueChanges\r\n .pipe(takeUntilDestroyed(this.#destroyRef))\r\n .subscribe(value => {\r\n this.applyFilter(value || '');\r\n });\r\n }\r\n\r\n protected colDisplayChanged(event: MatCheckboxChange, col: string): void {\r\n if (event.checked) {\r\n this.minViewCol.update(cols => [...cols, col]);\r\n return;\r\n }\r\n this.minViewCol.update(cols => cols.filter(d => d !== col));\r\n }\r\n\r\n protected colIsChecked(col: string): boolean {\r\n return this.minViewCol().includes(col);\r\n }\r\n\r\n /**\r\n * Checks if paginator should be shown\r\n */\r\n protected readonly shouldShowPaginator = computed<boolean>(() => {\r\n return this.dataSource && this.dataSource.data && this.dataSource.data.length > 0;\r\n });\r\n\r\n private mapAccounts(accounts: IScoaAccount[]): IScoaAccount[] {\r\n return accounts.map(acc => ({\r\n ...acc,\r\n AccountNumberShortened: this.removeTrailingZeros(acc.AccountNumber),\r\n }));\r\n }\r\n\r\n private removeTrailingZeros(str: string): string {\r\n return str.replace(/0+$/, '');\r\n }\r\n\r\n private applyFilter(filterValue: string): void {\r\n this.dataSource.filter = filterValue.trim().toLowerCase();\r\n if (this.dataSource.paginator) {\r\n this.dataSource.paginator.firstPage();\r\n }\r\n }\r\n\r\n protected selectAccount(account: IScoaAccount): void {\r\n const isActive = this.rowIsActivated(account);\r\n if (!isActive) {\r\n return;\r\n }\r\n const current = this.selectedAccount();\r\n if (current && current.SCOAid === account.SCOAid) {\r\n this.accountSelected.emit(null);\r\n return;\r\n }\r\n this.accountSelected.emit(account);\r\n }\r\n\r\n protected clearSearch(): void {\r\n this.searchControl.setValue('');\r\n }\r\n\r\n protected rowIsActivated(row: IScoaAccount): boolean {\r\n const isProject = this.segment()?.toUpperCase() === 'PROJECT';\r\n if (!isProject) {\r\n return row.PostingLevel === 'Y';\r\n }\r\n return row.PostingLevel === 'Y' || row.BreakDownAllowed === 'Y';\r\n }\r\n\r\n protected toogleDetails(): void {\r\n this.showMinMal.update(v => !v);\r\n if (this.showMinMal()) {\r\n this.minViewCol.set(MIN_ACCOUNT_DETAILS);\r\n return;\r\n }\r\n this.minViewCol.set(SCOA_ACCOUNT_COLUMNS.map(h => h.key));\r\n }\r\n}\r\n","<div>\r\n <mat-toolbar class=\"search\" style=\"background:var(--mat-sys-surface-container) !important\">\r\n <span style=\"font-size:14px\">\r\n Select account from the options below:\r\n </span>\r\n\r\n\r\n <span class=\"spacer\"></span>\r\n\r\n <mat-menu #menu=\"matMenu\">\r\n <div style=\" padding-left: 16px;\r\n margin-top: 8px;\" mat-subheader>Account list headers</div>\r\n <br>\r\n\r\n <section style=\"padding-left: 16px; padding-right:16px\">\r\n <button style=\"width: 100%;\" (click)=\"toogleDetails()\" class=\"cols\" color=\"primary\" mat-flat-button>\r\n {{showMinMal() ? 'show all details' : 'Show less details'}}\r\n </button>\r\n </section>\r\n <p style=\"\r\n padding-left: 16px;\r\n padding-right:16px;\r\n\r\n font-size:14px\">Only selected headers will be shown.</p>\r\n @for (col of scoaAccountColumns(); track $index) {\r\n <button (click)=\"$event.stopPropagation()\" class=\"cols\" mat-menu-item>\r\n\r\n <mat-checkbox [checked]=\"colIsChecked(col.key)\" (change)=\"colDisplayChanged($event,col.key)\"\r\n class=\"cols\">\r\n {{col.label}}</mat-checkbox>\r\n </button>\r\n }\r\n </mat-menu>\r\n </mat-toolbar>\r\n\r\n @if (dataSource.filteredData.length === 0) {\r\n <div class=\"no-results\">\r\n No accounts match your search criteria.\r\n </div>\r\n }\r\n <div class=\"table-wrapper\" [hidden]=\"dataSource.filteredData.length === 0\">\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"dataSource\" matSort>\r\n @for (column of scoaAccountColumns(); track column.key) {\r\n <ng-container [matColumnDef]=\"column.key\" [stickyEnd]=\"column.system\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\r\n @if (column.system) {\r\n <button\r\n matTooltip=\"Show more or less columns\"\r\n mat-icon-button\r\n [matMenuTriggerFor]=\"menu\"\r\n [attr.aria-label]=\"'Column options'\">\r\n <mat-icon>view_column</mat-icon>\r\n </button>\r\n } @else {\r\n {{ column.label }}\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n @if (column.system) {\r\n <button\r\n mat-flat-button\r\n color=\"primary\"\r\n [attr.aria-label]=\"'Select account ' + (element.SCOAAccount || element.AccountNumber)\">\r\n Select\r\n </button>\r\n } @else {\r\n <span class=\"cell-content\">{{ element[column.key] }}</span>\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayColumns()\"></tr>\r\n <tr\r\n mat-row\r\n *matRowDef=\"let row; columns: displayColumns();\"\r\n class=\"account-row\"\r\n (click)=\"selectAccount(row)\"\r\n [class.deactivated-row]=\"rowIsActivated(row) === false\"\r\n [class.selected-row]=\"selectedAccount() && selectedAccount()?.SCOAid === row.SCOAid\"\r\n [attr.aria-label]=\"'Account row: ' + (row.SCOAAccount || row.AccountNumber)\"\r\n [attr.aria-selected]=\"selectedAccount() && selectedAccount()?.SCOAid === row.SCOAid\"\r\n role=\"row\">\r\n </tr>\r\n </table>\r\n </div>\r\n <mat-paginator [pageSizeOptions]=\"[5, 10, 20]\" [pageSize]=\"10\" showFirstLastButtons></mat-paginator>\r\n </div>\r\n</div>\r\n","import { AsyncPipe, DOCUMENT, UpperCasePipe, isPlatformBrowser } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, DestroyRef, OnInit, PLATFORM_ID, ViewEncapsulation, computed, inject, signal } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Observable, of } from 'rxjs';\r\nimport { catchError, debounceTime, distinctUntilChanged, finalize, map, shareReplay, startWith, tap } from 'rxjs/operators';\r\n\r\nimport { FlatTreeControl } from '@angular/cdk/tree';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatDialogActions, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule } from '@angular/material/tree';\r\n\r\nimport _ from 'lodash';\r\n\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { FormColumnInputs, IIncludedSegmentConfig, IScoaAccount, ScoaAccountTree, TreeNode } from 'ngx-t-forms-types';\r\nimport { fuzzySearch } from '../../../../../../shared/functions/fuzzyTextSearch';\r\nimport { convertToTree, ObjectTreeFlatNode, ObjectTreeNode } from '../../../../../t-dynamic-data-edit/elements/api-value-access-rules/functions/convertDataToTree';\r\nimport { AccountValueComponent } from '../account-value/account-value.component';\r\nimport { ScoaAccountTableComponent } from '../scoa-account-table/scoa-account-table.component';\r\n\r\nexport interface IMscoaComputationComponentData {\r\n data: ScoaAccountTree;\r\n segment: string;\r\n value: IScoaAccount | undefined;\r\n accountInputs: FormColumnInputs[];\r\n activeColumn: string | undefined;\r\n segmentConfig: IIncludedSegmentConfig | undefined;\r\n readonly: boolean;\r\n isCashSelection: boolean;\r\n getSCOAAccount: (account: string) => Observable<{ accounts: IScoaAccount[] }>;\r\n}\r\n\r\n/**\r\n * Component for selecting SCOA (Standard Chart of Accounts) accounts from a hierarchical tree structure.\r\n * Opens as a dialog and allows users to browse, search, and select accounts.\r\n */\r\n@Component({\r\n selector: 'lib-mscoa-computation',\r\n templateUrl: './mscoa-computation.component.html',\r\n styleUrl: './mscoa-computation.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n '(keydown)': 'onKeydown($event)',\r\n },\r\n imports: [\r\n AsyncPipe,\r\n UpperCasePipe,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatDialogActions,\r\n MatDividerModule,\r\n MatExpansionModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatListModule,\r\n MatProgressSpinnerModule,\r\n MatSidenavModule,\r\n MatToolbarModule,\r\n MatTreeModule,\r\n AccountValueComponent,\r\n ScoaAccountTableComponent,\r\n ],\r\n})\r\nexport class MscoaComputationComponent implements OnInit {\r\n // Injected dependencies\r\n readonly #dataInjected = inject<IMscoaComputationComponentData>(MAT_DIALOG_DATA, { optional: true });\r\n readonly #sanitizer = inject(DomSanitizer);\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #platformId = inject(PLATFORM_ID);\r\n readonly #document = inject(DOCUMENT);\r\n protected readonly dialogRef = inject<MatDialogRef<MscoaComputationComponent>>(MatDialogRef);\r\n\r\n // Component data from injection\r\n protected readonly data: ScoaAccountTree | undefined;\r\n protected readonly segment: string | undefined;\r\n protected readonly value: IScoaAccount | undefined;\r\n protected readonly accountInputs: FormColumnInputs[];\r\n protected readonly activeColumn: string | undefined;\r\n protected readonly isCashSelection: boolean;\r\n protected readonly readonly: boolean;\r\n protected readonly segmentConfig: IIncludedSegmentConfig | undefined;\r\n\r\n // Tree structure\r\n protected readonly treeControl: FlatTreeControl<ObjectTreeFlatNode>;\r\n readonly #treeFlattener: MatTreeFlattener<ObjectTreeNode, ObjectTreeFlatNode>;\r\n protected readonly dataSource: MatTreeFlatDataSource<ObjectTreeNode, ObjectTreeFlatNode>;\r\n\r\n // State management (signals for OnPush reactivity)\r\n protected readonly selectedTreeNode = signal<ObjectTreeFlatNode | undefined>(undefined);\r\n protected readonly selectedAccount = signal<IScoaAccount | null>(null);\r\n protected readonly searchAccounts = signal<IScoaAccount[]>([]);\r\n protected readonly searchingAccounts = signal<boolean>(false);\r\n protected readonly currentAccountPath = signal<string | undefined>(undefined);\r\n protected readonly showSearchBar = signal<boolean>(false);\r\n\r\n // Form controls\r\n protected readonly accountSearchTextControl = new FormControl('');\r\n protected readonly searchedPaths$: Observable<string[][]>;\r\n\r\n // API result cache to prevent redundant calls\r\n readonly #accountCache = new Map<string, IScoaAccount[]>();\r\n\r\n // Error state\r\n protected readonly errorMessage = signal<string | null>(null);\r\n protected readonly hasError = signal<boolean>(false);\r\n\r\n constructor() {\r\n const injected = this.#dataInjected ?? ({} as Partial<IMscoaComputationComponentData>);\r\n // Initialize component data (guard against undefined MAT_DIALOG_DATA)\r\n this.data = injected.data;\r\n this.segment = injected.segment;\r\n this.value = injected.value;\r\n this.accountInputs = injected.accountInputs ?? [];\r\n this.activeColumn = injected.activeColumn;\r\n this.isCashSelection = injected.isCashSelection ?? false;\r\n this.readonly = injected.readonly ?? false;\r\n this.segmentConfig = injected.segmentConfig;\r\n\r\n // Initialize tree structure\r\n this.treeControl = new FlatTreeControl<ObjectTreeFlatNode>(\r\n node => node.level,\r\n node => node.expandable,\r\n );\r\n\r\n this.#treeFlattener = new MatTreeFlattener(\r\n this.#transformer,\r\n node => node.level,\r\n node => node.expandable,\r\n node => node.children,\r\n );\r\n\r\n this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.#treeFlattener);\r\n\r\n // Initialize search observable with proper unsubscription\r\n this.searchedPaths$ = this.accountSearchTextControl.valueChanges.pipe(\r\n startWith(''),\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n map(text => this.searchTree(text ?? '')),\r\n shareReplay(1),\r\n takeUntilDestroyed(this.#destroyRef),\r\n );\r\n }\r\n\r\n ngOnInit(): void {\r\n this.selectedAccount.set(this.value ?? null);\r\n // convertToTree returns TreeNode[], which is a structural superset of\r\n // ObjectTreeNode (name/path/children all present). A single widening cast\r\n // to the supertype shape is sufficient; no double cast required.\r\n this.dataSource.data = convertToTree(this.data) as ObjectTreeNode[];\r\n }\r\n\r\n /**\r\n * Checks if a tree node has children (is expandable)\r\n */\r\n protected readonly hasChild = (_index: number, node: ObjectTreeFlatNode): boolean => node.expandable;\r\n\r\n /**\r\n * Transforms a tree node into a flat node for the Material tree\r\n */\r\n readonly #transformer = (node: ObjectTreeNode, level: number): ObjectTreeFlatNode => {\r\n return {\r\n expandable: !!node.children && node.children.length > 0,\r\n name: node.name,\r\n level,\r\n path: node.path,\r\n };\r\n };\r\n\r\n /**\r\n * Searches the tree for nodes matching the search text using fuzzy search.\r\n * Returns empty when no term is provided. Scores and caps results to avoid\r\n * flooding the UI with low-relevance matches on large datasets.\r\n */\r\n protected searchTree(searchText: string | null): string[][] {\r\n if (!this.dataSource?.data) return [];\r\n\r\n const term = (searchText ?? '').trim().toLowerCase();\r\n // No term → show nothing, not everything\r\n if (!term) return [];\r\n\r\n const MAX_RESULTS = 50;\r\n const scored: Array<{ path: string[]; score: number }> = [];\r\n\r\n const traverse = (nodes: TreeNode[]): void => {\r\n for (const node of nodes) {\r\n if (!node) continue;\r\n\r\n const path = node.path;\r\n const nodeName = path?.at(-1)?.toLowerCase() ?? '';\r\n\r\n if (path && fuzzySearch(term, nodeName)) {\r\n scored.push({ path, score: this.#scoreMatch(term, nodeName) });\r\n }\r\n\r\n if (Array.isArray(node.children) && node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n }\r\n };\r\n\r\n traverse(this.dataSource.data as TreeNode[]);\r\n\r\n return scored\r\n .sort((a, b) => b.score - a.score)\r\n .slice(0, MAX_RESULTS)\r\n .map(r => r.path);\r\n }\r\n\r\n /**\r\n * Scores how well a term matches a text string.\r\n * Higher score = more relevant. Priorities: exact > prefix > substring > fuzzy-tight > fuzzy-loose.\r\n */\r\n #scoreMatch(term: string, text: string): number {\r\n if (text === term) return 100;\r\n if (text.startsWith(term)) return 80;\r\n if (text.includes(term)) return 60;\r\n // Fuzzy: score inversely by the character span (tighter = better)\r\n let pos = 0;\r\n let first = -1;\r\n let last = -1;\r\n for (let i = 0; i < text.length && pos < term.length; i++) {\r\n if (text[i] === term[pos]) {\r\n if (first === -1) first = i;\r\n last = i;\r\n pos++;\r\n }\r\n }\r\n if (pos < term.length) return 0;\r\n return Math.max(1, 40 - (last - first));\r\n }\r\n\r\n /**\r\n * Checks if a path is the currently selected path or a parent of it\r\n * @param path - The path to check\r\n * @returns True if the path is active or a parent of the selected path\r\n */\r\n protected isActivePathOrParent(path: string[]): boolean {\r\n const selected = this.selectedTreeNode();\r\n if (!selected) {\r\n return false;\r\n }\r\n if (path.length > selected.path.length) {\r\n return false;\r\n }\r\n const samePath = selected.path?.every((p, i) => p === path[i]);\r\n if (samePath) {\r\n return true;\r\n }\r\n return path.every((p, i) => p === selected.path[i]);\r\n }\r\n\r\n /**\r\n * Toggles the expansion state of a tree node.\r\n * Does not collapse siblings (like Windows Explorer / VS Code) for better context.\r\n */\r\n protected toggleNode(node: ObjectTreeFlatNode): void {\r\n if (node.expandable) {\r\n if (this.treeControl.isExpanded(node)) {\r\n this.treeControl.collapse(node);\r\n } else {\r\n this.treeControl.expand(node);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Checks if any tree nodes are currently expanded\r\n */\r\n protected readonly noneIsExpanded = computed(() => {\r\n // Recompute when selection changes (proxy for tree expansion changes)\r\n this.selectedTreeNode();\r\n return !this.treeControl.dataNodes?.some(node => this.treeControl.isExpanded(node));\r\n });\r\n\r\n /**\r\n * Selects a tree node and loads its associated accounts\r\n * @param node - The node to select\r\n */\r\n protected selectNode(node: ObjectTreeFlatNode): void {\r\n const current = this.selectedTreeNode();\r\n const isSamePath = node.path.every((p, i) => p === current?.path[i]);\r\n if (isSamePath) {\r\n this.cancel();\r\n return;\r\n }\r\n this.selectedTreeNode.set(node);\r\n this.#loadAccountsForNode();\r\n }\r\n\r\n /**\r\n * Loads accounts for the currently selected tree node\r\n * Uses caching to prevent redundant API calls\r\n */\r\n #loadAccountsForNode(): void {\r\n const accountPath = this.selectedTreeNode()?.path.join(':');\r\n if (!accountPath) {\r\n return;\r\n }\r\n\r\n // Check cache first\r\n if (this.#accountCache.has(accountPath)) {\r\n this.searchAccounts.set(this.#accountCache.get(accountPath)!);\r\n this.currentAccountPath.set(accountPath);\r\n this.#clearError();\r\n return;\r\n }\r\n\r\n this.searchingAccounts.set(true);\r\n this.#clearError();\r\n\r\n const getAccounts = this.#dataInjected?.getSCOAAccount;\r\n if (!getAccounts) {\r\n this.searchAccounts.set([]);\r\n this.searchingAccounts.set(false);\r\n this.#setError('Account loader not configured.');\r\n return;\r\n }\r\n\r\n getAccounts(accountPath).pipe(\r\n takeUntilDestroyed(this.#destroyRef),\r\n tap(res => {\r\n this.searchAccounts.set(res.accounts);\r\n this.currentAccountPath.set(accountPath);\r\n // Cache the result\r\n this.#accountCache.set(accountPath, res.accounts);\r\n this.#clearError();\r\n }),\r\n catchError(() => {\r\n // Handle error gracefully\r\n this.searchAccounts.set([]);\r\n this.currentAccountPath.set(undefined);\r\n this.#setError('Failed to load accounts. Please try again or select a different category.');\r\n return of({ accounts: [] });\r\n }),\r\n finalize(() => {\r\n this.searchingAccounts.set(false);\r\n }),\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Sets an error message to display to the user\r\n * @param message - The error message to display\r\n */\r\n #setError(message: string): void {\r\n this.errorMessage.set(message);\r\n this.hasError.set(true);\r\n }\r\n\r\n /**\r\n * Clears the current error state\r\n */\r\n #clearError(): void {\r\n this.errorMessage.set(null);\r\n this.hasError.set(false);\r\n }\r\n\r\n /**\r\n * Retries loading accounts for the current node\r\n */\r\n protected retryLoadAccounts(): void {\r\n const selected = this.selectedTreeNode();\r\n if (selected) {\r\n // Clear cache for this path to force reload\r\n const accountPath = selected.path.join(':');\r\n this.#accountCache.delete(accountPath);\r\n this.#loadAccountsForNode();\r\n }\r\n }\r\n\r\n /**\r\n * Cancels the current selection and resets the component state\r\n */\r\n protected cancel(): void {\r\n this.selectedTreeNode.set(undefined);\r\n this.searchAccounts.set([]);\r\n this.selectedAccount.set(null);\r\n this.currentAccountPath.set(undefined);\r\n }\r\n\r\n /**\r\n * Saves the selected account and closes the dialog\r\n */\r\n protected saveAccount(): void {\r\n const account = this.selectedAccount();\r\n if (account) {\r\n this.closeAndPassData(account);\r\n } else {\r\n this.closeAndPassData(undefined);\r\n }\r\n }\r\n\r\n /**\r\n * Closes the dialog and passes the selected account back\r\n * @param account - The account to return, or undefined if cancelled\r\n */\r\n protected closeAndPassData(account: IScoaAccount | undefined): void {\r\n this.dialogRef.close(account);\r\n }\r\n\r\n /**\r\n * Selects an account from the account table\r\n * @param account - The account to select, or null to deselect\r\n */\r\n protected selectAccount(account: IScoaAccount | null): void {\r\n this.selectedAccount.set(account);\r\n }\r\n\r\n /**\r\n * Finds a tree node by its path (from tree data)\r\n * @param targetPath - The path to search for\r\n * @returns The found node or null if not found\r\n */\r\n protected getNodeByPath(targetPath: string[]): TreeNode | null {\r\n if (!targetPath?.length || !this.dataSource?.data) {\r\n return null;\r\n }\r\n\r\n const recursiveLookUp = (nodes: TreeNode[]): TreeNode | null => {\r\n for (const node of nodes) {\r\n if (!node) {\r\n continue;\r\n }\r\n\r\n // Check for exact match\r\n const isSameLength = node.path?.length === targetPath.length;\r\n const isMatch = isSameLength && node.path && targetPath.every((p, i) => p === node.path![i]);\r\n\r\n if (isMatch) {\r\n return node;\r\n }\r\n\r\n // Check children if this node is a potential parent\r\n const isPotentialParent = node.path &&\r\n node.path.length < targetPath.length &&\r\n node.path.every((p, i) => p === targetPath[i]);\r\n\r\n if (isPotentialParent && node.children?.length) {\r\n const foundInChildren = recursiveLookUp(node.children);\r\n if (foundInChildren) {\r\n return foundInChildren;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n\r\n return recursiveLookUp(this.dataSource.data as TreeNode[]);\r\n }\r\n\r\n /**\r\n * Finds the flat node (from treeControl.dataNodes) by path.\r\n * Required for expand/select operations since Material tree uses flat nodes.\r\n */\r\n protected getFlatNodeByPath(targetPath: string[]): ObjectTreeFlatNode | null {\r\n if (!targetPath?.length || !this.treeControl.dataNodes?.length) {\r\n return null;\r\n }\r\n return this.treeControl.dataNodes.find(\r\n n => n.path && n.path.length === targetPath.length && n.path.every((p, i) => p === targetPath[i]),\r\n ) ?? null;\r\n }\r\n\r\n /**\r\n * Expands all ancestor nodes so the target node is visible in the tree.\r\n * Does not collapse siblings (user keeps context of other branches).\r\n */\r\n protected expandPathToNode(flatNode: ObjectTreeFlatNode): void {\r\n const targetLevel = flatNode.level;\r\n for (const node of this.treeControl.dataNodes) {\r\n if (node.level < targetLevel && flatNode.path && node.path &&\r\n node.path.every((p, i) => p === flatNode.path![i])) {\r\n this.treeControl.expand(node);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Selects a path from search results: expands path, selects node, loads accounts,\r\n * scrolls selection into view, then clears search.\r\n * Follows UX best practice: expand to path → select → scroll into view.\r\n */\r\n protected selectPath(path: string[]): void {\r\n const flatNode = this.getFlatNodeByPath(path);\r\n if (!flatNode) {\r\n return;\r\n }\r\n\r\n // 1. Expand path so target is visible (don't collapse siblings - keep context)\r\n this.expandPathToNode(flatNode);\r\n\r\n // 2. Select node and load accounts\r\n this.selectNode(flatNode);\r\n\r\n // 3. Clear search to show tree with selection in context\r\n this.clearSearch();\r\n\r\n // 4. Scroll selected node into view after DOM updates\r\n setTimeout(() => {\r\n if (!isPlatformBrowser(this.#platformId)) return;\r\n const el = this.#document.querySelector(`[data-tree-path=\"${path.join(':')}\"]`);\r\n el?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n });\r\n }\r\n\r\n /**\r\n * Clears the search input\r\n */\r\n protected clearSearch(): void {\r\n this.accountSearchTextControl.reset();\r\n }\r\n\r\n /**\r\n * Clears the selected account\r\n */\r\n protected clearSelectedAccount(): void {\r\n this.selectedAccount.set(null);\r\n }\r\n\r\n /**\r\n * Determines if the save button should be enabled.\r\n * Checks if the account has changed and all required inputs are valid.\r\n */\r\n protected readonly saveSelection = computed(() => {\r\n const selected = this.selectedAccount();\r\n const allInputsAreValid = this.accountInputs.every(input =>\r\n input.required || input.validators.includes('')\r\n ? selected?.[input.formControlName as keyof IScoaAccount]\r\n : true,\r\n );\r\n\r\n const isDifferent = !_.isEqual(selected, this.value);\r\n return isDifferent && allInputsAreValid;\r\n });\r\n\r\n /**\r\n * Updates the selected account with new values\r\n * @param account - The updated account\r\n */\r\n protected updateAccount(account: IScoaAccount): void {\r\n this.selectedAccount.set(account);\r\n }\r\n\r\n /**\r\n * Determines if the user can clear the selected account\r\n */\r\n protected readonly userCanClearAccount = computed(() => {\r\n if (this.readonly) {\r\n return false;\r\n }\r\n return !this.segmentConfig?.readOnly;\r\n });\r\n\r\n /**\r\n * Handles keyboard navigation for the dialog.\r\n * Bound via the component `host: {}` block.\r\n * @param event - The keyboard event\r\n */\r\n protected onKeydown(event: KeyboardEvent): void {\r\n // Close dialog on Escape\r\n if (event.key === 'Escape' && !this.selectedAccount()) {\r\n this.closeAndPassData(undefined);\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // Don't interfere with input fields\r\n const target = event.target as HTMLElement;\r\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\r\n return;\r\n }\r\n\r\n // Handle Enter key for search results\r\n if (event.key === 'Enter' && this.accountSearchTextControl.value) {\r\n // Preserve original behaviour: best-effort sync read of the shareReplay'd\r\n // search observable. The original used a `.value` look-up, which only\r\n // resolves on a BehaviorSubject-like stream. Plain `Observable` returns\r\n // undefined here, falling back to []. Behaviour is intentionally kept.\r\n const maybeValueHolder = this.searchedPaths$ as Observable<string[][]> & { value?: string[][] };\r\n const searchResults: string[][] = maybeValueHolder.value ?? [];\r\n const first = searchResults[0];\r\n if (first) {\r\n this.selectPath(first);\r\n event.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Highlights search text in a given string\r\n * @param text - The text to highlight\r\n * @param searchTerm - The search term to highlight\r\n * @returns Safe HTML string with highlighted text\r\n */\r\n protected highlightSearchText(text: string, searchTerm: string): SafeHtml {\r\n if (!searchTerm || !text) {\r\n return this.#sanitizer.bypassSecurityTrustHtml(text);\r\n }\r\n\r\n const regex = new RegExp(`(${this.#escapeRegex(searchTerm)})`, 'gi');\r\n const highlighted = text.replace(regex, '<mark>$1</mark>');\r\n return this.#sanitizer.bypassSecurityTrustHtml(highlighted);\r\n }\r\n\r\n /**\r\n * Escapes special regex characters in a string\r\n * @param str - The string to escape\r\n * @returns Escaped string\r\n */\r\n #escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n }\r\n}\r\n","<!-- Header Toolbar -->\r\n<mat-toolbar class=\"main-toolbar header-toolbar\" role=\"banner\">\r\n <span class=\"toolbar-title\">\r\n {{ (segment || 'No segment') | uppercase }} : {{ activeColumn | uppercase }} ACCOUNT\r\n </span>\r\n <span class=\"spacer\"></span>\r\n @if (selectedAccount()) {\r\n <button mat-flat-button (click)=\"clearSelectedAccount(); cancel()\" [attr.aria-label]=\"'Change account'\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Change Account\r\n </button>\r\n }\r\n</mat-toolbar>\r\n\r\n<!-- Search Bar - Hidden when account selected -->\r\n@if (!selectedAccount()) {\r\n<mat-toolbar class=\"main-toolbar header-toolbar search-toolbar\" role=\"search\">\r\n <mat-form-field [subscriptSizing]=\"'dynamic'\" class=\"search-field\">\r\n <mat-label position=\"floating\">Search {{ segment || 'account' }} : {{ activeColumn || '' }} Account</mat-label>\r\n <input matInput [formControl]=\"accountSearchTextControl\"\r\n [placeholder]=\"('Search ' + segment + ' : ' + activeColumn + ' Account').toUpperCase()\"\r\n [attr.aria-label]=\"'Search for account'\" autocomplete=\"off\">\r\n <button mat-icon-button matSuffix (click)=\"clearSearch()\" [attr.aria-label]=\"'Clear search'\" type=\"button\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </mat-form-field>\r\n</mat-toolbar>\r\n}\r\n\r\n<mat-divider></mat-divider>\r\n\r\n<!-- Account Details View -->\r\n@if (selectedAccount(); as account) {\r\n<div class=\"account-details-container\" role=\"region\" [attr.aria-label]=\"'Account details'\">\r\n <lib-account-value [accountInputs]=\"accountInputs\" [userCanClearAccount]=\"userCanClearAccount()\"\r\n [mscoaAccount]=\"account\" (updateAccount)=\"updateAccount($event)\"\r\n (clearSelectedAccount)=\"clearSelectedAccount()\">\r\n </lib-account-value>\r\n</div>\r\n} @else {\r\n<!-- Main Content Area with Drawer -->\r\n<mat-drawer-container class=\"drawer-container\" [attr.aria-label]=\"'Account selection interface'\">\r\n <!-- Account Table Drawer -->\r\n <mat-drawer #drawer class=\"account-drawer\" mode=\"side\" position=\"end\"\r\n [opened]=\"!searchingAccounts() && !!selectedTreeNode() && !accountSearchTextControl.value\">\r\n\r\n\r\n\r\n\r\n @if (searchingAccounts()) {\r\n <div class=\"loading-container skeleton-table\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n @for (item of [1,2,3,4,5]; track item) {\r\n <div class=\"skeleton-row\">\r\n <div class=\"skeleton-checkbox\"></div>\r\n <div class=\"skeleton-text short\"></div>\r\n <div class=\"skeleton-text medium\"></div>\r\n <div class=\"skeleton-text\"></div>\r\n </div>\r\n }\r\n </div>\r\n } @else if (hasError()) {\r\n <div class=\"error-container\" role=\"alert\" [attr.aria-live]=\"'assertive'\">\r\n <mat-icon class=\"error-icon\" aria-hidden=\"true\">error</mat-icon>\r\n <p class=\"error-message\">{{ errorMessage() }}</p>\r\n <button mat-flat-button color=\"primary\" (click)=\"retryLoadAccounts()\"\r\n [attr.aria-label]=\"'Retry loading accounts'\">\r\n <mat-icon aria-hidden=\"true\">refresh</mat-icon>\r\n Retry\r\n </button>\r\n </div>\r\n } @else if (searchAccounts().length === 0 && selectedTreeNode()) {\r\n <div class=\"empty-state\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n <mat-icon class=\"empty-icon\" aria-hidden=\"true\">info</mat-icon>\r\n <p class=\"empty-message\">No accounts found for this category.</p>\r\n </div>\r\n } @else {\r\n <lib-scoa-account-table [selectedAccount]=\"selectedAccount()\" [segment]=\"segment\"\r\n (accountSelected)=\"selectAccount($event)\" [data]=\"{\r\n accounts: searchAccounts(),\r\n account: currentAccountPath() || ''\r\n }\">\r\n </lib-scoa-account-table>\r\n }\r\n </mat-drawer>\r\n <!-- Tree Content Area -->\r\n <div class=\"tree-content\" role=\"main\">\r\n\r\n <!-- Search Results View -->\r\n @if (accountSearchTextControl.value) {\r\n <mat-nav-list class=\"search-results-list\" role=\"list\">\r\n <div mat-subheader class=\"search-results-header\">\r\n <mat-icon class=\"search-icon\">search</mat-icon>\r\n Search Results\r\n <span class=\"count-badge\" [attr.aria-label]=\"'Number of results'\">\r\n ({{ (searchedPaths$ | async)?.length || 0 }})\r\n </span>\r\n </div>\r\n\r\n @if ((searchedPaths$ | async)?.length === 0) {\r\n <!-- Empty Search Results -->\r\n <div class=\"empty-state\" role=\"status\" [attr.aria-live]=\"'polite'\">\r\n <mat-icon class=\"empty-icon\" aria-hidden=\"true\">search_off</mat-icon>\r\n <p class=\"empty-message\">\r\n No account found for the search\r\n <strong>{{ accountSearchTextControl.value }}</strong>.\r\n </p>\r\n <button mat-flat-button (click)=\"clearSearch()\"\r\n [attr.aria-label]=\"'Clear search and show all accounts'\">\r\n Clear Search\r\n </button>\r\n </div>\r\n } @else {\r\n <p class=\"search-results-hint\">Click a result to load accounts for that category.</p>\r\n <div class=\"search-results-grid\" role=\"list\">\r\n @for (searchedItem of (searchedPaths$ | async); track searchedItem.join(':')) {\r\n\r\n @defer (on viewport) {\r\n <div class=\"path-result-item\" role=\"listitem\" (click)=\"selectPath(searchedItem)\"\r\n [attr.aria-label]=\"'Load accounts for: ' + searchedItem.join(' > ') + '. Click to select.'\"\r\n tabindex=\"0\" (keydown.enter)=\"selectPath(searchedItem)\"\r\n (keydown.space)=\"selectPath(searchedItem); $event.preventDefault()\">\r\n <div class=\"breadcrumb-container\">\r\n @for (part of searchedItem; track part; let last = $last) {\r\n <div class=\"crumb-segment\" [class.is-target]=\"last\">\r\n <span class=\"text-content\"\r\n [innerHTML]=\"accountSearchTextControl.value ? highlightSearchText(part, accountSearchTextControl.value) : part\">\r\n </span>\r\n @if (!last) {\r\n <mat-icon class=\"separator\" aria-hidden=\"true\">chevron_right</mat-icon>\r\n }\r\n </div>\r\n }\r\n </div>\r\n <span class=\"path-result-meta\">Load accounts</span>\r\n <mat-icon class=\"path-result-arrow\" aria-hidden=\"true\">arrow_forward</mat-icon>\r\n </div>\r\n }@placeholder {\r\n <div class=\"mat-spinner-container\">\r\n <mat-spinner diameter=\"16\" color=\"primary\" aria-label=\"Loading search result\"></mat-spinner>\r\n </div>\r\n\r\n }\r\n\r\n }\r\n </div>\r\n }\r\n </mat-nav-list>\r\n }\r\n\r\n <!-- Tree View -->\r\n @else {\r\n <!-- Breadcrumb: show current path when category selected (like file explorers) -->\r\n @if (selectedTreeNode()?.path?.length) {\r\n <div class=\"tree-breadcrumb\" role=\"navigation\"\r\n [attr.aria-label]=\"'Current category: ' + (selectedTreeNode()?.path ?? []).join(' > ')\">\r\n <span class=\"breadcrumb-label\">Category:</span>\r\n @for (part of (selectedTreeNode()?.path ?? []); track $index; let last = $last) {\r\n <span class=\"breadcrumb-part\" [class.is-current]=\"last\">{{ part }}</span>\r\n @if (!last) {\r\n <mat-icon class=\"breadcrumb-sep\" aria-hidden=\"true\">chevron_right</mat-icon>\r\n }\r\n }\r\n </div>\r\n }\r\n <!-- Compact Instructions - Collapsed by default -->\r\n @if (noneIsExpanded()) {\r\n <mat-expansion-panel [expanded]=\"false\" class=\"instructions-panel compact-instructions\"\r\n [attr.aria-label]=\"'How to use the account selector'\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>\r\n <mat-icon class=\"instruction-icon\" aria-hidden=\"true\">info</mat-icon>\r\n <span>Quick tips</span>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <div class=\"instructions-content\">\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">folder_open</mat-icon>\r\n <span>Expand folders to browse</span>\r\n </div>\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">check_box</mat-icon>\r\n <span>Check category to load accounts</span>\r\n </div>\r\n <div class=\"instruction-item\">\r\n <mat-icon class=\"instruction-bullet\" aria-hidden=\"true\">search</mat-icon>\r\n <span>Use search bar to find accounts</span>\r\n </div>\r\n </div>\r\n </mat-expansion-panel>\r\n }\r\n\r\n <!-- Account Tree -->\r\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" role=\"tree\"\r\n [attr.aria-label]=\"'Account category tree'\">\r\n\r\n <!-- Leaf Node (no children) -->\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding role=\"treeitem\"\r\n [attr.data-tree-path]=\"node.path?.join(':')\">\r\n <button class=\"toggle-button\" mat-icon-button disabled aria-hidden=\"true\">\r\n </button>\r\n <mat-checkbox (change)=\"selectNode(node)\"\r\n [disabled]=\"isActivePathOrParent(node.path) && searchingAccounts()\"\r\n [checked]=\"isActivePathOrParent(node.path)\"\r\n [attr.aria-label]=\"'Select ' + node.name + ' account category'\">\r\n @if (isActivePathOrParent(node.path) && searchingAccounts()) {\r\n <mat-spinner color=\"primary\" class=\"loading\"\r\n [attr.aria-label]=\"'Loading accounts for ' + node.name\">\r\n </mat-spinner>\r\n <span class=\"label selected\" [attr.aria-live]=\"'polite'\">\r\n Loading <strong>{{ node.name }}</strong> accounts...\r\n </span>\r\n } @else {\r\n <span class=\"label\" [class.selected]=\"isActivePathOrParent(node.path)\">\r\n {{ node.name }}\r\n </span>\r\n }\r\n </mat-checkbox>\r\n </mat-tree-node>\r\n\r\n <!-- Branch Node (has children) -->\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding role=\"treeitem\"\r\n [attr.data-tree-path]=\"node.path?.join(':')\" [attr.aria-expanded]=\"treeControl.isExpanded(node)\">\r\n <button class=\"toggle-button\" mat-icon-button\r\n [attr.aria-label]=\"(treeControl.isExpanded(node) ? 'Collapse' : 'Expand') + ' ' + node.name\"\r\n (click)=\"toggleNode(node)\" type=\"button\">\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n\r\n @if (isActivePathOrParent(node.path)) {\r\n <mat-checkbox (change)=\"selectNode(node)\" [disabled]=\"true\" [checked]=\"true\"\r\n [attr.aria-label]=\"'Selected: ' + node.name\">\r\n <span class=\"label selected\">\r\n {{ node.name }}\r\n </span>\r\n </mat-checkbox>\r\n } @else {\r\n <mat-checkbox (change)=\"selectNode(node)\" [checked]=\"false\"\r\n [attr.aria-label]=\"'Select ' + node.name + ' account category'\">\r\n <span class=\"label\">\r\n {{ node.name }}\r\n </span>\r\n </mat-checkbox>\r\n }\r\n </mat-tree-node>\r\n </mat-tree>\r\n }\r\n\r\n </div>\r\n</mat-drawer-container>\r\n}\r\n\r\n<mat-divider></mat-divider>\r\n\r\n<!-- Footer Actions -->\r\n<mat-dialog-actions style=\" background: var(--mscoa-surface-container) !important;\" align=\"end\">\r\n <button class=\"action-button close-button\" mat-button (click)=\"closeAndPassData(undefined)\"\r\n [attr.aria-label]=\"'Close dialog without saving'\" type=\"button\">\r\n\r\n Close\r\n </button>\r\n @if (userCanClearAccount() ) {\r\n <button class=\"action-button save-button\" mat-flat-button [disabled]=\"!saveSelection()\" (click)=\"saveAccount()\"\r\n [attr.aria-label]=\"saveSelection() ? 'Save account selection' : 'Save disabled - account unchanged or invalid'\"\r\n type=\"button\">\r\n <mat-icon aria-hidden=\"true\">save</mat-icon>\r\n Save\r\n </button>\r\n }\r\n\r\n</mat-dialog-actions>\r\n","export const extractCols = (hasMultiSelect: boolean, hasVATApplicableAccount:boolean,extensionAccountsForSegments:string[] ) => {\r\n // Start with base columns\r\n let cols = [\"segment\", \"debit\"];\r\n\r\n // Add credit column if hasMultiSelect is true\r\n if (hasMultiSelect) {\r\n cols.push(\"credit\");\r\n }\r\n\r\n // Add vat if applicable\r\n if (!!hasVATApplicableAccount) {\r\n cols.push(\"vat\");\r\n }\r\n \r\n\r\n const exts = (extensionAccountsForSegments || []).map((ext) => hasMultiSelect ? ([\r\n `${ext}Debit`,\r\n `${ext}Credit`\r\n ]) : ([\r\n `${ext}Debit`\r\n ])).flat()\r\n return [...cols, ...exts];\r\n }\r\n\r\n\r\n interface RowData {\r\n // Loosely typed because templates use `!!row['singleSelect']` against mixed payloads.\r\n singleSelect?: unknown;\r\n segment?: string;\r\n inheritValueFromAccrual?: boolean;\r\n vatSelectonActive?: boolean;\r\n // Index sig accommodates dynamic `row[col]` cell access for arbitrary column keys.\r\n [key: string]: unknown;\r\n}\r\n\r\ninterface InputConfig {\r\n required: boolean;\r\n}\r\n\r\nexport interface AccountFieldState {\r\n labelText: string;\r\n showIcon: boolean;\r\n color: string;\r\n}\r\n\r\n/**\r\n * Evaluates the business logic for the Account Selector row\r\n * based on the provided template logic.\r\n */\r\nexport function getAccountFieldState(\r\n row: RowData, \r\n col: string, \r\n touched: boolean = false, \r\n inputConfig: InputConfig = { required: false }\r\n): AccountFieldState {\r\n\r\n // Logic 1: Is this a Credit field with single select enabled?\r\n const isCreditSingle = !!row['singleSelect'] === true && col === 'credit';\r\n\r\n // Logic 2: Is this a VAT field with single select, but NOT an ITEM segment?\r\n const isVatSingle = !!row['singleSelect'] === true && col === 'vat' && row['segment'] !== 'ITEM';\r\n\r\n // Combined Logic: These specific cases enforce a \"Single/Auto\" state\r\n const isRestrictedCase = isCreditSingle || isVatSingle;\r\n\r\n // --- Determine Label Text ---\r\n // The label becomes 'auto selected' if it is a restricted case OR if it inherits from accrual.\r\n const isAutoSelectedLabel = isRestrictedCase || row['inheritValueFromAccrual'];\r\n \r\n // Note: I left out the 'unCamelCase' pipe here to keep the logic pure. \r\n // You can apply the pipe to this result in the template or use a utility function here.\r\n const labelText = isAutoSelectedLabel ? 'auto selected ' : 'Select account';\r\n\r\n // --- Determine Icon Visibility ---\r\n // The dropdown icon is shown ONLY if we are NOT in the restricted (Single Select) cases.\r\n // Note: The template logic implies 'inheritValueFromAccrual' does NOT hide the icon, \r\n // whereas 'singleSelect' logic DOES hide it.\r\n const showIcon = !isRestrictedCase;\r\n\r\n // --- Determine Color ---\r\n // If touched, required, and the value (row[col]) is missing/falsy.\r\n const isErrorState = touched && inputConfig.required && !row[col];\r\n const color = isErrorState ? 'var(--mat-sys-error)' : '';\r\n\r\n return {\r\n labelText,\r\n showIcon,\r\n color\r\n };\r\n}","/**\r\n * Constants for MSCOA Chart Component\r\n */\r\n\r\nexport const ACCOUNTING_BASIS = {\r\n ACCRUAL: 'accrual',\r\n CASH: 'cash',\r\n DUAL: 'dual'\r\n} as const;\r\n\r\nexport type AccountingBasis = typeof ACCOUNTING_BASIS[keyof typeof ACCOUNTING_BASIS];\r\n\r\nexport const COLUMNS = {\r\n SEGMENT: 'segment',\r\n DEBIT: 'debit',\r\n CREDIT: 'credit',\r\n VAT: 'vat'\r\n} as const;\r\n\r\nexport type ColumnType = typeof COLUMNS[keyof typeof COLUMNS];\r\n\r\nexport const SEGMENT_TYPES = {\r\n ITEM: 'ITEM'\r\n} as const;\r\n\r\nexport const DELETION_COUNTDOWN_SECONDS = 5;\r\n\r\nexport const DIALOG_CONFIG = {\r\n COMPUTATION: {\r\n minWidth: 'fit-content',\r\n maxHeight: '98vh',\r\n height: 'fit-content',\r\n panelClass: 'mscoa-computation-dialog'\r\n },\r\n INPUT: {\r\n minWidth: '368px',\r\n minHeight: 'fit-content',\r\n maxHeight: 'fit-content',\r\n height: 'fit-content',\r\n panelClass: 'mscoa-input-dialog'\r\n }\r\n} as const;\r\n\r\nexport const CSS_CUSTOM_PROPERTIES = {\r\n SPACING_XS: '--mscoa-chart-spacing-xs',\r\n SPACING_SM: '--mscoa-chart-spacing-sm',\r\n SPACING_MD: '--mscoa-chart-spacing-md',\r\n SPACING_LG: '--mscoa-chart-spacing-lg',\r\n BORDER_RADIUS: '--mscoa-chart-border-radius',\r\n TRANSITION: '--mscoa-chart-transition'\r\n} as const;\r\n\r\nexport const DEFAULT_EXPANSION_STATE = {\r\n [ACCOUNTING_BASIS.CASH]: true,\r\n [ACCOUNTING_BASIS.ACCRUAL]: true\r\n} as const;\r\n","/**\r\n * Helper functions for MSCOA Chart Component\r\n */\r\n\r\nimport type { ScoaSegmentValueBag } from 'ngx-t-forms-types';\r\nimport { ACCOUNTING_BASIS, COLUMNS, SEGMENT_TYPES } from './mscoa-chart.constants';\r\n\r\n/**\r\n * Row shape used by mscoa-chart helpers.\r\n *\r\n * `segmentValue` mirrors the shared `ScoaSegmentValueBag` (debit/credit pair\r\n * plus optional `vatApplicableTo`). The bag is now correctly typed upstream,\r\n * so callers no longer need an `any` escape hatch.\r\n */\r\nexport interface RowData {\r\n singleSelect?: boolean;\r\n segment?: string;\r\n inheritValueFromAccrual?: boolean;\r\n vatSelectonActive?: boolean;\r\n segmentValue?: ScoaSegmentValueBag;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): innerInput carries arbitrary nested input config payloads; tighten when input schema is narrowed.\r\n innerInput?: any;\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Gets the toolbar color based on accounting basis\r\n */\r\nexport function getToolbarColor(accountingBasis?: string): string {\r\n if (!accountingBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL) {\r\n return 'primary';\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * Gets the toolbar background style based on accounting basis\r\n */\r\nexport function getToolbarBackground(accountingBasis?: string): string {\r\n if (accountingBasis === ACCOUNTING_BASIS.CASH) {\r\n return 'var(--mat-sys-inverse-primary) !important';\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * Gets the toolbar icon color based on accounting basis\r\n */\r\nexport function getToolbarIconColor(accountingBasis?: string): string {\r\n if (!accountingBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL) {\r\n return 'var(--mat-sys-on-primary)';\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * Gets the border style based on accounting basis\r\n */\r\nexport function getBorderStyle(accountingBasis?: string): string {\r\n if (!accountingBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL) {\r\n return 'solid 1px var(--mat-sys-primary)';\r\n }\r\n return 'solid 1px var(--mat-sys-inverse-primary)';\r\n}\r\n\r\n/**\r\n * Checks if a column is the segment column (first column)\r\n */\r\nexport function isSegmentColumn(index: number): boolean {\r\n return index === 0;\r\n}\r\n\r\n/**\r\n * Gets header text for a column\r\n */\r\nexport function getHeaderText(\r\n col: string,\r\n index: number,\r\n hasMultiSelect: boolean\r\n): string {\r\n if (hasMultiSelect || index === 0) {\r\n return col;\r\n }\r\n \r\n if (col === COLUMNS.DEBIT) {\r\n return 'Debit / Credit';\r\n }\r\n \r\n if (col === COLUMNS.VAT) {\r\n return 'VAT';\r\n }\r\n \r\n // Extension columns\r\n return `${col} / credit`;\r\n}\r\n\r\n/**\r\n * Checks if a row has an inner input\r\n */\r\nexport function hasInnerInput(row: RowData | undefined | null): boolean {\r\n const inner = row?.['innerInput'];\r\n return !!(inner && typeof inner === 'object' && Object.keys(inner as Record<string, unknown>).length > 0);\r\n}\r\n\r\n/**\r\n * Checks if credit column should be disabled for single select\r\n */\r\nexport function isCreditDisabledForSingleSelect(row: RowData, col: string): boolean {\r\n return row.singleSelect === true && col === COLUMNS.CREDIT;\r\n}\r\n\r\n/**\r\n * Checks if VAT column should be disabled\r\n */\r\nexport function isVatDisabled(row: RowData, col: string): boolean {\r\n if (col !== COLUMNS.VAT) {\r\n return false;\r\n }\r\n return row.segment?.toLowerCase() !== SEGMENT_TYPES.ITEM.toLowerCase();\r\n}\r\n\r\n/**\r\n * Checks if a field should show auto-selected label\r\n */\r\nexport function shouldShowAutoSelectedLabel(row: RowData, col: string): boolean {\r\n const isCreditSingle = row.singleSelect === true && col === COLUMNS.CREDIT;\r\n const isVatSingle = row.singleSelect === true && col === COLUMNS.VAT && row.segment !== SEGMENT_TYPES.ITEM;\r\n return isCreditSingle || isVatSingle || !!row.inheritValueFromAccrual;\r\n}\r\n\r\n/**\r\n * Checks if dropdown icon should be shown\r\n */\r\nexport function shouldShowDropdownIcon(row: RowData, col: string): boolean {\r\n const isCreditSingle = row.singleSelect === true && col === COLUMNS.CREDIT;\r\n const isVatSingle = row.singleSelect === true && col === COLUMNS.VAT && row.segment !== SEGMENT_TYPES.ITEM;\r\n return !(isCreditSingle || isVatSingle);\r\n}\r\n\r\n/**\r\n * Gets error color for required empty fields\r\n */\r\nexport function getErrorColor(touched: boolean, required: boolean, hasValue: boolean): string {\r\n if (touched && required && !hasValue) {\r\n return 'var(--mat-sys-error)';\r\n }\r\n return '';\r\n}\r\n\r\n/**\r\n * Checks if field has error state (for class binding)\r\n */\r\nexport function hasError(touched: boolean, required: boolean, hasValue: boolean): boolean {\r\n return touched && required && !hasValue;\r\n}\r\n\r\n/**\r\n * Checks if VAT chip should be displayed\r\n */\r\nexport function shouldShowVatChip(row: RowData, col: string): boolean {\r\n return row.segmentValue?.vatApplicableTo === col && row.vatSelectonActive === true;\r\n}\r\n\r\n/**\r\n * Gets cell padding style based on column index\r\n */\r\nexport function getCellPadding(index: number): string {\r\n return index === 0 ? '' : '0px';\r\n}\r\n\r\n/**\r\n * Gets header padding style based on column index\r\n */\r\nexport function getHeaderPadding(index: number): string {\r\n return index === 0 ? '' : '24px';\r\n}\r\n\r\n/**\r\n * Gets cell background style for segment column\r\n */\r\nexport function getSegmentCellBackground(index: number): string {\r\n return index === 0 ? 'var(--mat-list-active-indicator-color, var(--mat-sys-secondary-container))' : '';\r\n}\r\n\r\n/**\r\n * Checks if table should be visible based on dual basis expansion state\r\n */\r\nexport function shouldShowTable(\r\n isDualAccountBasis: boolean,\r\n expansionState: boolean,\r\n accountingBasis?: string\r\n): boolean {\r\n if (isDualAccountBasis) {\r\n return expansionState === true;\r\n }\r\n return true;\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { DELETION_COUNTDOWN_SECONDS } from '../../utils/mscoa-chart.constants';\r\n\r\n@Component({\r\n selector: 'lib-mscoa-chart-input-menu',\r\n imports: [MatButtonModule, MatIconModule, MatProgressSpinnerModule, MatTooltipModule],\r\n templateUrl: './mscoa-chart-input-menu.component.html',\r\n styleUrls: ['./mscoa-chart-input-menu.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MscoaChartInputMenuComponent {\r\n readonly innerInput = input.required<FormColumnInputs>();\r\n readonly countdownSeconds = input<number | null>(null);\r\n readonly hoveredId = input<string | null>(null);\r\n\r\n readonly edit = output<FormColumnInputs>();\r\n readonly delete = output<FormColumnInputs>();\r\n readonly cancelDelete = output<string>();\r\n readonly hoverStart = output<string>();\r\n readonly hoverEnd = output<void>();\r\n\r\n protected readonly DELETION_COUNTDOWN_SECONDS = DELETION_COUNTDOWN_SECONDS;\r\n\r\n protected readonly isDeleting = computed<boolean>(() => {\r\n const s = this.countdownSeconds();\r\n return s !== null && s > 0;\r\n });\r\n\r\n protected readonly progressValue = computed<number>(() => {\r\n const s = this.countdownSeconds();\r\n if (!s) return 0;\r\n return ((DELETION_COUNTDOWN_SECONDS - s) / DELETION_COUNTDOWN_SECONDS) * 100;\r\n });\r\n\r\n protected readonly isHovered = computed<boolean>(() => this.hoveredId() === this.innerInput().id);\r\n\r\n protected onEdit(): void {\r\n this.edit.emit(this.innerInput());\r\n }\r\n\r\n protected onDelete(): void {\r\n if (this.isDeleting()) {\r\n this.cancelDelete.emit(this.innerInput().id);\r\n } else {\r\n this.delete.emit(this.innerInput());\r\n }\r\n }\r\n\r\n protected onMouseEnter(): void {\r\n this.hoverStart.emit(this.innerInput().id);\r\n }\r\n\r\n protected onMouseLeave(): void {\r\n this.hoverEnd.emit();\r\n }\r\n}\r\n","<button\r\n [matTooltip]=\"'Edit Input: ' + innerInput().label\"\r\n (click)=\"onEdit()\"\r\n mat-icon-button\r\n aria-label=\"Edit input\">\r\n <mat-icon>edit</mat-icon>\r\n</button>\r\n\r\n@if (isDeleting()) {\r\n <button\r\n (mouseenter)=\"onMouseEnter()\"\r\n (mouseleave)=\"onMouseLeave()\"\r\n (click)=\"onDelete()\"\r\n color=\"warn\"\r\n mat-stroked-button\r\n [attr.aria-label]=\"isHovered() ? 'Cancel deletion' : 'Deleting in ' + countdownSeconds() + ' seconds'\">\r\n <div class=\"mscoa-chart-input-menu__delete-content\">\r\n <mat-progress-spinner\r\n class=\"mscoa-chart-input-menu__spinner\"\r\n color=\"primary\"\r\n [value]=\"progressValue()\"\r\n [diameter]=\"20\">\r\n </mat-progress-spinner>\r\n <span>\r\n {{ isHovered() ? 'Click to cancel' : 'Deleting in' }} {{ countdownSeconds() }}\r\n </span>\r\n </div>\r\n </button>\r\n} @else {\r\n <button\r\n [matTooltip]=\"'Delete input ' + innerInput().label\"\r\n (click)=\"onDelete()\"\r\n mat-icon-button\r\n aria-label=\"Delete input\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n}\r\n","/**\r\n * Message Formatter Service for MSCOA Chart Component\r\n * Transforms technical error messages into user-friendly, contextual messages\r\n */\r\n\r\nexport interface ValidationError {\r\n message: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface ErrorContext {\r\n segment?: string;\r\n accountNumber?: string;\r\n accountName?: string;\r\n column?: string;\r\n accountingBasis?: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface AccountCombination {\r\n accounts: Array<{ number: string; name: string }>;\r\n segment: string;\r\n column: string;\r\n}\r\n\r\nexport interface ValidationRule {\r\n type: string;\r\n description: string;\r\n applicableSegments?: string[];\r\n}\r\n\r\n/**\r\n * Formats technical error messages into user-friendly messages\r\n */\r\nexport class MscoaMessageFormatter {\r\n /**\r\n * Formats a validation error message with context\r\n */\r\n formatError(error: ValidationError, context?: ErrorContext): string {\r\n const rawMessage = error.message || '';\r\n \r\n // If message is already user-friendly, return as-is\r\n if (this.isUserFriendly(rawMessage)) {\r\n return rawMessage;\r\n }\r\n\r\n // Extract account numbers and names from message if present\r\n const accountMatch = rawMessage.match(/account\\s+(\\d+)/i) || \r\n rawMessage.match(/(\\d{3,})/);\r\n const accountNumber = accountMatch ? accountMatch[1] : context?.accountNumber;\r\n\r\n // Extract segment name\r\n const segment = context?.segment || this.extractSegment(rawMessage);\r\n const column = context?.column || this.extractColumn(rawMessage);\r\n const basis = context?.accountingBasis || '';\r\n\r\n // Common error patterns and their transformations\r\n const patterns = [\r\n {\r\n pattern: /invalid.*combination/i,\r\n transform: () => this.formatInvalidCombination(rawMessage, segment, accountNumber, column, basis)\r\n },\r\n {\r\n pattern: /cannot.*combine/i,\r\n transform: () => this.formatCannotCombine(rawMessage, segment, accountNumber, column, basis)\r\n },\r\n {\r\n pattern: /required/i,\r\n transform: () => this.formatRequired(rawMessage, segment, column, basis)\r\n },\r\n {\r\n pattern: /conflict/i,\r\n transform: () => this.formatConflict(rawMessage, segment, accountNumber, column, basis)\r\n },\r\n {\r\n pattern: /category|reporting/i,\r\n transform: () => this.formatCategoryError(rawMessage, segment, accountNumber, column, basis)\r\n },\r\n {\r\n pattern: /rule|regulation/i,\r\n transform: () => this.formatRuleViolation(rawMessage, segment, accountNumber, column, basis)\r\n }\r\n ];\r\n\r\n // Try to match patterns\r\n for (const { pattern, transform } of patterns) {\r\n if (pattern.test(rawMessage)) {\r\n return transform();\r\n }\r\n }\r\n\r\n // Default: improve the message structure\r\n return this.formatDefault(rawMessage, segment, accountNumber, column, basis);\r\n }\r\n\r\n /**\r\n * Formats success message for valid account combination\r\n */\r\n formatSuccess(combination: AccountCombination): string {\r\n const accountList = combination.accounts\r\n .map(acc => acc.name || acc.number)\r\n .join(' and ');\r\n \r\n return `Account combination successfully created: ${accountList} for ${combination.segment} segment.`;\r\n }\r\n\r\n /**\r\n * Formats contextual hint for validation rules\r\n */\r\n formatHint(rule: ValidationRule): string {\r\n const segmentInfo = rule.applicableSegments?.length \r\n ? ` for ${rule.applicableSegments.join(', ')} segments`\r\n : '';\r\n \r\n return `${rule.description}${segmentInfo}.`;\r\n }\r\n\r\n /**\r\n * Checks if message is already user-friendly\r\n */\r\n private isUserFriendly(message: string): boolean {\r\n // Messages that start with proper capitalization and contain context are likely user-friendly\r\n return /^[A-Z]/.test(message) && \r\n (message.includes('cannot') || message.includes('must') || message.includes('should') || \r\n message.includes('because') || message.includes('due to'));\r\n }\r\n\r\n /**\r\n * Extracts segment name from error message\r\n */\r\n private extractSegment(message: string): string {\r\n const segmentMatch = message.match(/(?:segment|for)\\s+([A-Z]+)/i);\r\n return segmentMatch && segmentMatch[1] ? segmentMatch[1] : '';\r\n }\r\n\r\n /**\r\n * Extracts column name from error message\r\n */\r\n private extractColumn(message: string): string {\r\n const columnMatch = message.match(/(debit|credit|vat)/i);\r\n return columnMatch && columnMatch[1] ? columnMatch[1] : '';\r\n }\r\n\r\n /**\r\n * Formats invalid combination error\r\n */\r\n private formatInvalidCombination(\r\n message: string, \r\n segment: string, \r\n accountNumber: string | undefined,\r\n column: string,\r\n basis: string\r\n ): string {\r\n const segmentText = segment ? ` for ${segment} segment` : '';\r\n const accountText = accountNumber ? ` Account ${accountNumber}` : '';\r\n const columnText = column ? ` in ${column} column` : '';\r\n const basisText = basis ? ` (${basis} basis)` : '';\r\n\r\n return `Invalid account combination${segmentText}${columnText}${basisText}.${accountText ? ` ${accountText} cannot be combined with the selected accounts due to reporting rules.` : ' Please select accounts from the same reporting category.'}`;\r\n }\r\n\r\n /**\r\n * Formats cannot combine error\r\n */\r\n private formatCannotCombine(\r\n message: string,\r\n segment: string,\r\n accountNumber: string | undefined,\r\n column: string,\r\n basis: string\r\n ): string {\r\n const segmentText = segment ? ` in ${segment} segment` : '';\r\n const accountText = accountNumber ? `Account ${accountNumber}` : 'These accounts';\r\n const columnText = column ? ` (${column} column)` : '';\r\n const basisText = basis ? ` for ${basis} basis` : '';\r\n\r\n return `${accountText} cannot be combined${segmentText}${columnText}${basisText} because they belong to different reporting categories. Please select accounts from the same category.`;\r\n }\r\n\r\n /**\r\n * Formats required field error\r\n */\r\n private formatRequired(\r\n message: string,\r\n segment: string,\r\n column: string,\r\n basis: string\r\n ): string {\r\n const segmentText = segment ? ` for ${segment} segment` : '';\r\n const columnText = column ? ` in ${column} column` : '';\r\n const basisText = basis ? ` (${basis} basis)` : '';\r\n\r\n return `An account selection is required${segmentText}${columnText}${basisText}. Please select an account to continue.`;\r\n }\r\n\r\n /**\r\n * Formats conflict error\r\n */\r\n private formatConflict(\r\n message: string,\r\n segment: string,\r\n accountNumber: string | undefined,\r\n column: string,\r\n basis: string\r\n ): string {\r\n const segmentText = segment ? ` in ${segment} segment` : '';\r\n const accountText = accountNumber ? `Account ${accountNumber}` : 'The selected account';\r\n const columnText = column ? ` (${column} column)` : '';\r\n const basisText = basis ? ` for ${basis} basis` : '';\r\n\r\n return `${accountText} conflicts with existing selections${segmentText}${columnText}${basisText}. Please choose a different account or review your current selections.`;\r\n }\r\n\r\n /**\r\n * Formats category error\r\n */\r\n private formatCategoryError(\r\n message: string,\r\n segment: string,\r\n accountNumber: string | undefined,\r\n column: string,\r\n basis: string\r\n ): string {\r\n const segmentText = segment ? ` for ${segment} segment` : '';\r\n const accountText = accountNumber ? `Account ${accountNumber}` : 'The selected account';\r\n const columnText = column ? ` in ${column} column` : '';\r\n const basisText = basis ? ` (${basis} basis)` : '';\r\n\r\n return `${accountText} cannot be used${segmentText}${columnText}${basisText} because it belongs to a different reporting category. Please select accounts from the same category.`;\r\n }\r\n\r\n /**\r\n * Formats rule violation error\r\n */\r\n private formatRuleViolation(\r\n message: string,\r\n segment: string,\r\n accountNumber: string | undefined,\r\n column: string,\r\n basis: string\r\n ): string {\r\n const segmentText = segment ? ` in ${segment} segment` : '';\r\n const accountText = accountNumber ? `Account ${accountNumber}` : 'The selected account';\r\n const columnText = column ? ` (${column} column)` : '';\r\n const basisText = basis ? ` for ${basis} basis` : '';\r\n\r\n return `${accountText} violates reporting rules${segmentText}${columnText}${basisText}. Please review the account combination requirements and select a valid combination.`;\r\n }\r\n\r\n /**\r\n * Formats default error message\r\n */\r\n private formatDefault(\r\n message: string,\r\n segment: string,\r\n accountNumber: string | undefined,\r\n column: string,\r\n basis: string\r\n ): string {\r\n // Clean up the message\r\n let formatted = message.trim();\r\n \r\n // Capitalize first letter\r\n formatted = formatted.charAt(0).toUpperCase() + formatted.slice(1);\r\n \r\n // Add period if missing\r\n if (!formatted.endsWith('.') && !formatted.endsWith('!') && !formatted.endsWith('?')) {\r\n formatted += '.';\r\n }\r\n\r\n // Add context if available\r\n const contextParts: string[] = [];\r\n if (segment) contextParts.push(`for ${segment} segment`);\r\n if (column) contextParts.push(`in ${column} column`);\r\n if (basis) contextParts.push(`(${basis} basis)`);\r\n \r\n if (contextParts.length > 0) {\r\n formatted += ` ${contextParts.join(' ')}.`;\r\n }\r\n\r\n return formatted;\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const mscoaMessageFormatter = new MscoaMessageFormatter();\r\n","import {\r\n Component,\r\n OnInit,\r\n OnDestroy,\r\n inject,\r\n Injector,\r\n ChangeDetectorRef,\r\n ChangeDetectionStrategy,\r\n DestroyRef,\r\n effect,\r\n input,\r\n output\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n combineLatest,\r\n map,\r\n Observable,\r\n Subject,\r\n BehaviorSubject,\r\n take,\r\n takeUntil,\r\n distinctUntilChanged,\r\n timer,\r\n tap,\r\n withLatestFrom,\r\n shareReplay,\r\n debounceTime\r\n} from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialog, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport {\r\n IAccountSegmentTreeKeys,\r\n IScoaAccount,\r\n IScoaInputConfig,\r\n ITowerStepColumn,\r\n ScoaInnerInput\r\n} from \"ngx-t-forms-types\";\r\nimport { MscoaComponentStore } from '../../store/mscoa-component-store.service';\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { IMscoaComputationComponentData, MscoaComputationComponent } from '../mscoa-computation/mscoa-computation.component';\r\nimport { FormBuilderFunctions } from \"ngx-t-forms-types\";\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { ScoaInputComponent } from '../scoa-input/scoa-input.component';\r\nimport { ComponentPortal, PortalModule } from '@angular/cdk/portal';\r\nimport { ConvertCamelCasePipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\r\nimport { extractCols, getAccountFieldState } from './extractCols';\r\n\r\n// Import utilities\r\nimport {\r\n ACCOUNTING_BASIS,\r\n COLUMNS,\r\n DELETION_COUNTDOWN_SECONDS,\r\n DIALOG_CONFIG,\r\n DEFAULT_EXPANSION_STATE\r\n} from './utils/mscoa-chart.constants';\r\nimport {\r\n getToolbarColor,\r\n isSegmentColumn,\r\n getHeaderText,\r\n hasInnerInput,\r\n shouldShowAutoSelectedLabel,\r\n shouldShowDropdownIcon,\r\n getErrorColor,\r\n hasError,\r\n shouldShowVatChip,\r\n shouldShowTable\r\n} from './utils/mscoa-chart.helpers';\r\nimport type { DualBasisExpansionState, CountdownSeconds, ExtendedTableRow } from './utils/mscoa-chart.types';\r\n\r\n// Import child components\r\nimport { MscoaChartToolbarComponent } from './components/mscoa-chart-toolbar/mscoa-chart-toolbar.component';\r\nimport { MscoaChartInputMenuComponent } from './components/mscoa-chart-input-menu/mscoa-chart-input-menu.component';\r\nimport { MscoaErrorDisplayComponent } from './components/mscoa-error-display/mscoa-error-display.component';\r\nimport { MscoaTemporaryHintComponent } from './components/mscoa-temporary-hint/mscoa-temporary-hint.component';\r\n\r\n// Import message formatter\r\nimport { mscoaMessageFormatter, ValidationError, ErrorContext } from './utils/mscoa-message-formatter';\r\n\r\n/**\r\n * MSCOA Chart Component\r\n *\r\n * Displays account selection tables for accrual and/or cash accounting basis.\r\n * Supports dynamic column generation, portal-based input rendering, and complex\r\n * selection logic for account assignment.\r\n */\r\n@Component({\r\n selector: 'lib-mscoa-chart',\r\n templateUrl: './mscoa-chart.component.html',\r\n styleUrls: ['./mscoa-chart.component.scss'],\r\n imports: [\r\n CommonModule,\r\n PortalModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n MatTableModule,\r\n MatTooltipModule,\r\n MatProgressSpinnerModule,\r\n ConvertCamelCasePipe,\r\n MscoaChartToolbarComponent,\r\n MscoaChartInputMenuComponent,\r\n MscoaErrorDisplayComponent,\r\n MscoaTemporaryHintComponent\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class MscoaChartComponent implements OnInit, OnDestroy {\r\n // Injected dependencies (private)\r\n readonly #store = inject(MscoaComponentStore);\r\n readonly #injector = inject(Injector);\r\n readonly #cdr = inject(ChangeDetectorRef);\r\n readonly #dialog = inject(MatDialog);\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n // Store selectors\r\n readonly #selectAccountTreeKeys$ = this.#store.selectors.accountTreeKeys$;\r\n readonly #selectCashAccountTreeKeys$ = this.#store.selectors.cashAccountTreeKeys$;\r\n readonly #selectMscoaLoadingTree$ = this.#store.selectors.loadingTree$;\r\n readonly #validationErrors$ = this.#store.selectors.validationErrors$;\r\n readonly #validatingValue$ = this.#store.selectors.validatingValue$;\r\n readonly #table$ = this.#store.selectors.table$.pipe(\r\n distinctUntilChanged((a, b) => _isEqual(a, b))\r\n );\r\n readonly #cashTable$ = this.#store.selectors.cashTable$.pipe(\r\n distinctUntilChanged((a, b) => _isEqual(a, b))\r\n );\r\n readonly #hasVATApplicableAccount$ = this.#store.selectors.hasVATApplicableAccount$;\r\n readonly #cashHasVATApplicableAccount$ = this.#store.selectors.cashHasVATApplicableAccount$;\r\n readonly #inputs$ = this.#store.selectors.inputs$;\r\n\r\n // Business rule errors - formatted with user-friendly messages\r\n protected readonly busnessRuleErrors$ = this.#validationErrors$.pipe(\r\n map(errors => Object.entries(errors).reduce((acc, curr) => {\r\n const basis = curr[0];\r\n const errorEntries = Object.entries(curr[1]);\r\n const formattedErrors = errorEntries.map(([key, err]) => {\r\n const context: ErrorContext = {\r\n accountingBasis: basis,\r\n segment: key\r\n };\r\n return mscoaMessageFormatter.formatError(err as ValidationError, context);\r\n });\r\n acc[basis] = formattedErrors;\r\n return acc;\r\n }, {} as Record<string, string[]>))\r\n );\r\n\r\n // Component state\r\n readonly #destroy$ = new Subject<void>();\r\n\r\n // Success state tracking - per accounting basis\r\n readonly #successMessageSubject$ = new BehaviorSubject<Record<string, string | null>>({\r\n [ACCOUNTING_BASIS.ACCRUAL]: null,\r\n [ACCOUNTING_BASIS.CASH]: null\r\n });\r\n protected readonly successMessage$ = this.#successMessageSubject$.pipe(\r\n distinctUntilChanged(),\r\n takeUntil(this.#destroy$)\r\n );\r\n\r\n // Real-time validation with debouncing\r\n protected readonly validationState$ = combineLatest([\r\n this.#validationErrors$.pipe(debounceTime(300)),\r\n this.#validatingValue$\r\n ]).pipe(\r\n map(([errors, isValidating]) => ({\r\n hasErrors: Object.keys(errors).length > 0,\r\n isValidating,\r\n errorCount: Object.values(errors as Record<string, Record<string, unknown> | undefined>)\r\n .reduce((sum: number, basisErrors) => sum + Object.keys(basisErrors ?? {}).length, 0)\r\n })),\r\n shareReplay(1)\r\n );\r\n\r\n // Computed observables\r\n protected readonly hasMultiSelect$ = this.#table$.pipe(\r\n map(table => table.some(row => row.singleSelect === false)),\r\n shareReplay(1)\r\n );\r\n\r\n protected readonly cashHasMultiSelect$ = this.#cashTable$.pipe(\r\n map(table => table.some(row => row.singleSelect === false)),\r\n shareReplay(1)\r\n );\r\n\r\n protected readonly cols$ = combineLatest([\r\n this.hasMultiSelect$,\r\n this.#hasVATApplicableAccount$\r\n ]).pipe(\r\n map(([hasMultiSelect, hasVATApplicableAccount]) =>\r\n extractCols(hasMultiSelect, hasVATApplicableAccount, this.config()?.extensionAccountsForSegments || [])\r\n ),\r\n shareReplay(1)\r\n );\r\n\r\n protected readonly cashCol$ = combineLatest([\r\n this.cashHasMultiSelect$,\r\n this.#cashHasVATApplicableAccount$\r\n ]).pipe(\r\n map(([hasMultiSelect, hasVATApplicableAccount]) =>\r\n extractCols(hasMultiSelect, hasVATApplicableAccount, this.config()?.extensionAccountsForSegments || [])\r\n ),\r\n shareReplay(1)\r\n );\r\n\r\n // View data observable\r\n protected readonly viewData$ = combineLatest([\r\n this.#selectMscoaLoadingTree$,\r\n this.#selectAccountTreeKeys$,\r\n this.#table$,\r\n this.cols$,\r\n this.hasMultiSelect$,\r\n this.#selectCashAccountTreeKeys$,\r\n this.#cashTable$,\r\n this.cashCol$,\r\n this.cashHasMultiSelect$,\r\n this.busnessRuleErrors$,\r\n this.#validationErrors$,\r\n this.#validatingValue$\r\n ]).pipe(\r\n map(([\r\n loading,\r\n accountTreeKeys,\r\n tableData,\r\n cols,\r\n hasMultiSelect,\r\n cashAccountTreeKeys,\r\n cashTableData,\r\n cashCols,\r\n cashHasMultiSelect,\r\n busnessRuleErrors,\r\n validationErrors,\r\n validatingValue\r\n ]) => ({\r\n loading,\r\n accountTreeKeys,\r\n tableData: tableData || [],\r\n cols,\r\n hasMultiSelect,\r\n cashAccountTreeKeys,\r\n cashTableData,\r\n cashCols,\r\n cashHasMultiSelect,\r\n busnessRuleErrors,\r\n validationErrors: validationErrors || {},\r\n validatingValue\r\n })),\r\n shareReplay(1)\r\n );\r\n\r\n // Form-builder functions, mirrored for dialog / portal use (read-only here).\r\n #formBuilderFunctions: FormBuilderFunctions | undefined = undefined;\r\n #previousInputsHash: string = '';\r\n\r\n // Portal management — the portal component is loaded lazily via `import('../../../t-form-input/...')`\r\n // at runtime, so the eager `ComponentPortal<T>` generic cannot be tightened without breaking the\r\n // lazy module boundary. `ComponentPortal<T>` is invariant in T so `unknown` is not assignable from\r\n // the concrete portal returned by `new ComponentPortal(module.TFormInputComponent, ...)`.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- TODO(phase-4): replace lazy-import portal pattern with eager type-only import.\r\n protected inputPortals: { [key: string]: ComponentPortal<any> } = {};\r\n\r\n // Selection state\r\n protected editSelection: ExtendedTableRow | undefined = undefined;\r\n protected activeColumn: string | undefined;\r\n protected isCashSelection: boolean | undefined = undefined;\r\n\r\n // Temporary hints state\r\n protected temporaryHintMessage: string | null = null;\r\n protected temporaryHintType: 'info' | 'guidance' = 'info';\r\n\r\n // Validation success indicator - shown on cells with value when validation completes, then fades out\r\n protected showValidationSuccessIndicators = false;\r\n #prevValidating = false;\r\n\r\n // Dual basis expansion state\r\n protected dualBasisExpansion: DualBasisExpansionState = {\r\n [ACCOUNTING_BASIS.CASH]: DEFAULT_EXPANSION_STATE[ACCOUNTING_BASIS.CASH],\r\n [ACCOUNTING_BASIS.ACCRUAL]: DEFAULT_EXPANSION_STATE[ACCOUNTING_BASIS.ACCRUAL]\r\n };\r\n\r\n // Input deletion countdown\r\n protected countdownSeconds: CountdownSeconds = {};\r\n protected hoveredInputId: string | null = null;\r\n\r\n // Constants\r\n protected readonly COLUMNS = COLUMNS;\r\n protected readonly ACCOUNTING_BASIS = ACCOUNTING_BASIS;\r\n protected readonly DELETION_COUNTDOWN_SECONDS = DELETION_COUNTDOWN_SECONDS;\r\n\r\n // Helper functions (exposed for template)\r\n protected readonly getToolbarColor = getToolbarColor;\r\n protected readonly isSegmentColumn = isSegmentColumn;\r\n protected readonly getHeaderText = getHeaderText;\r\n protected readonly hasInnerInput = hasInnerInput;\r\n protected readonly shouldShowAutoSelectedLabel = shouldShowAutoSelectedLabel;\r\n protected readonly shouldShowDropdownIcon = shouldShowDropdownIcon;\r\n protected readonly getErrorColor = getErrorColor;\r\n protected readonly hasError = hasError;\r\n protected readonly shouldShowVatChip = shouldShowVatChip;\r\n protected readonly shouldShowTable = shouldShowTable;\r\n\r\n /** Form column input configuration. */\r\n readonly inputConfig = input.required<ITowerStepColumn>();\r\n /** Editor mode flag. */\r\n readonly editorMode = input<boolean>(false);\r\n /** Read-only flag. */\r\n readonly readonly = input<boolean>(false);\r\n /** Touched flag. */\r\n readonly touched = input<boolean>(false);\r\n /** Parent form group. */\r\n readonly formGroup = input<FormGroup | undefined | null>(undefined);\r\n /** Form builder functions. First non-undefined value wins (legacy behaviour). */\r\n readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n /** MSCOA input configuration (read-only; the parent field owns the store down-path). */\r\n readonly config = input<IScoaInputConfig | undefined | null>(undefined);\r\n\r\n // Outputs\r\n /** Emitted when the container is clicked (used to mark as touched). */\r\n readonly onContainerClick = output<MouseEvent>();\r\n /** Emitted on user interaction. */\r\n readonly interaction = output<string>();\r\n\r\n /**\r\n * Gets the success message for a specific accounting basis\r\n */\r\n protected getSuccessMessage(messages: Record<string, string | null> | null, basis: string): string | null {\r\n if (!messages) return null;\r\n return messages[basis] || null;\r\n }\r\n\r\n constructor() {\r\n // Mirror the form-builder functions for dialog / portal use — first\r\n // non-undefined value wins (legacy behaviour). The store down-path\r\n // (config / value / tree load) is now owned by the parent reactive form\r\n // field; the chart only *reads* the store and drives user interaction, so\r\n // there are no longer any store-writing bridge effects here. Removing them\r\n // is what breaks the input → store → output → input feedback cycle.\r\n effect(() => {\r\n const fn = this.formBuilderFunctions();\r\n if (this.#formBuilderFunctions !== undefined) return;\r\n this.#formBuilderFunctions = fn;\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // Optimized portal setup - only recreate when inputs actually change\r\n this.#inputs$\r\n .pipe(\r\n takeUntilDestroyed(this.#destroyRef),\r\n distinctUntilChanged((prev, curr) => {\r\n const prevHash = this.getInputsHash(prev);\r\n const currHash = this.getInputsHash(curr);\r\n return prevHash === currHash;\r\n })\r\n )\r\n .subscribe(inputs => {\r\n this.setupPortals(inputs);\r\n this.#cdr.markForCheck();\r\n });\r\n\r\n // Show shield icon on validated cells when validation completes (true -> false)\r\n this.#validatingValue$\r\n .pipe(takeUntilDestroyed(this.#destroyRef))\r\n .subscribe(curr => {\r\n if (this.#prevValidating && !curr) {\r\n this.showValidationSuccessIndicators = true;\r\n this.#cdr.markForCheck();\r\n timer(2500).pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => {\r\n this.showValidationSuccessIndicators = false;\r\n this.#cdr.markForCheck();\r\n });\r\n }\r\n this.#prevValidating = curr;\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.#successMessageSubject$.complete();\r\n this.#destroy$.next();\r\n this.#destroy$.complete();\r\n // Clean up portals\r\n this.inputPortals = {};\r\n }\r\n\r\n /**\r\n * Sets the component as touched and emits the event\r\n */\r\n protected setAsTouched(ev: MouseEvent | Event): void {\r\n // Convert Event to MouseEvent if needed for compatibility\r\n if (ev instanceof MouseEvent) {\r\n this.onContainerClick.emit(ev);\r\n } else {\r\n // For keyboard events, create a synthetic mouse event\r\n const view: Window = (ev instanceof UIEvent && ev.view) ? ev.view : window;\r\n const syntheticEvent = new MouseEvent('click', {\r\n bubbles: ev.bubbles,\r\n cancelable: ev.cancelable,\r\n view,\r\n detail: 0\r\n });\r\n this.onContainerClick.emit(syntheticEvent);\r\n }\r\n }\r\n\r\n /**\r\n * Optimized portal setup - only recreates portals when inputs actually change\r\n */\r\n #setupPortalsInternal(inputs: ScoaInnerInput[]): void {\r\n const currentHash = this.getInputsHash(inputs);\r\n if (currentHash === this.#previousInputsHash) {\r\n return; // No change, skip portal recreation\r\n }\r\n this.#previousInputsHash = currentHash;\r\n\r\n // Clear existing portals\r\n this.inputPortals = {};\r\n\r\n if (!inputs || inputs.length === 0) {\r\n return;\r\n }\r\n\r\n const sectionId = this.inputConfig()?.sectionId;\r\n if (!sectionId) {\r\n return;\r\n }\r\n\r\n try {\r\n // Dynamically import the component\r\n import('../../../../t-form-input.component').then(module => {\r\n // Filter and create portals for each input\r\n const validInputs = inputs.filter(input => {\r\n // Skip inputs linked to segments if needed\r\n if (input.linkedSegmentId) return false;\r\n\r\n // Make sure the form control exists\r\n const controlKey = `${this.inputConfig()?.id}.${input.id}`;\r\n if (!this.formGroup()?.controls[controlKey]) {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n // Create a portal for each valid input\r\n validInputs.forEach(inp => {\r\n const portalKey = this.getPortalKey(inp.id);\r\n this.inputPortals[portalKey] = new ComponentPortal(\r\n module.TFormInputComponent,\r\n null,\r\n this.#createInjectorWithProps({\r\n inputConfig: {\r\n ...inp,\r\n sectionId,\r\n id: portalKey,\r\n label: '',\r\n appearance: 'fill',\r\n originalId: inp.id,\r\n },\r\n formGroup: this.formGroup(),\r\n formBuilderFunctions: this.#formBuilderFunctions,\r\n editorMode: this.editorMode()\r\n })\r\n );\r\n });\r\n\r\n this.#cdr.markForCheck();\r\n }).catch(error => {\r\n // Error handling - could emit to error service in production\r\n if (error) {\r\n // Silent fail for now, but could log to error service\r\n }\r\n });\r\n } catch (error) {\r\n // Error handling\r\n if (error) {\r\n // Silent fail for now\r\n }\r\n }\r\n }\r\n\r\n /** Wrapper preserved for backwards compatibility — delegates to internal #setupPortalsInternal. */\r\n private setupPortals(inputs: ScoaInnerInput[]): void {\r\n this.#setupPortalsInternal(inputs);\r\n }\r\n\r\n /**\r\n * Creates a hash of inputs array for comparison\r\n */\r\n private getInputsHash(inputs: ScoaInnerInput[]): string {\r\n if (!inputs || inputs.length === 0) return '';\r\n return inputs.map(i => i.id).sort().join(',');\r\n }\r\n\r\n /**\r\n * Generates a consistent portal key for an input\r\n */\r\n protected getPortalKey(inputId: string): string {\r\n return `${this.inputConfig()?.id}.${inputId}`;\r\n }\r\n\r\n /**\r\n * Helper to create an injector with properties to pass to the component.\r\n * `props` is opaque to this helper — it is passed verbatim through the\r\n * `COMPONENT_PROPS` provider to the child component which knows its shape.\r\n */\r\n #createInjectorWithProps(props: Record<string, unknown>): Injector {\r\n return Injector.create({\r\n providers: [\r\n { provide: 'COMPONENT_PROPS', useValue: props }\r\n ],\r\n parent: this.#injector\r\n });\r\n }\r\n\r\n /**\r\n * Handles segment change\r\n */\r\n segmentChange(activeSegment: string): void {\r\n this.#store.setActiveSegment(activeSegment);\r\n }\r\n\r\n /**\r\n * Handles account number selection\r\n */\r\n accountNumberSelected(\r\n account: IScoaAccount | undefined,\r\n segment: string,\r\n accountType: string = COLUMNS.DEBIT,\r\n isCash: boolean = false\r\n ): void {\r\n this.#store.setSegmentAccount({ segment, account, accountType, isCash });\r\n }\r\n\r\n /**\r\n * Handles account selection\r\n */\r\n protected selectAccount(row: ExtendedTableRow | undefined, col: string | undefined, cash: boolean = false): void {\r\n if (!row || !col) return;\r\n\r\n // Clear any existing success message for the current basis when opening a new selection\r\n const currentBasis = cash ? ACCOUNTING_BASIS.CASH : ACCOUNTING_BASIS.ACCRUAL;\r\n const currentMessages = this.#successMessageSubject$.value;\r\n this.#successMessageSubject$.next({\r\n ...currentMessages,\r\n [currentBasis]: null\r\n });\r\n\r\n this.editSelection = row;\r\n this.activeColumn = col;\r\n this.isCashSelection = cash;\r\n this.interaction.emit('');\r\n\r\n // Show contextual hint when opening selection\r\n const guidance = this.getContextualGuidance(row, col, false);\r\n if (guidance) {\r\n this.showTemporaryHint(guidance, 'guidance');\r\n }\r\n\r\n const isInput = hasInnerInput(row);\r\n if (isInput && row.innerInput) {\r\n this.#openInput(row.innerInput as FormColumnInputs);\r\n } else {\r\n this.#openScoaSelection();\r\n }\r\n }\r\n\r\n /**\r\n * Opens SCOA selection dialog\r\n */\r\n #openScoaSelection(): void {\r\n if (!this.editSelection) return;\r\n\r\n const segmentValueBag = this.editSelection.segmentValue;\r\n const data: IMscoaComputationComponentData = {\r\n segment: this.editSelection.segment as string,\r\n segmentConfig: this.config()?.segments?.find(segment => segment.id === this.editSelection?.id),\r\n value: segmentValueBag?.[this.activeColumn as 'debit' | 'credit'],\r\n data: this.editSelection.segmentTree,\r\n accountInputs: this.editSelection.accountInputs || [],\r\n activeColumn: this.activeColumn,\r\n readonly: this.readonly(),\r\n isCashSelection: Boolean(this.isCashSelection),\r\n getSCOAAccount: this.#formBuilderFunctions?.getSCOAAccount ??\r\n ((): Observable<{ accounts: IScoaAccount[] }> => new Observable(subscriber => subscriber.next({ accounts: [] })))\r\n };\r\n\r\n const dialogRef = this.#dialog.open(MscoaComputationComponent, {\r\n data,\r\n ...DIALOG_CONFIG.COMPUTATION\r\n });\r\n\r\n dialogRef.afterClosed().pipe(\r\n take(1),\r\n withLatestFrom(this.isCashSelection ? this.#cashHasVATApplicableAccount$ : this.#hasVATApplicableAccount$),\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe(([result, hasVat]) => {\r\n this.#handleDialogResult(result, hasVat);\r\n });\r\n }\r\n\r\n /**\r\n * Handles dialog result and updates columns accordingly\r\n */\r\n #handleDialogResult(result: IScoaAccount | undefined, hasVat: boolean): void {\r\n const { activeColumn, editSelection, isCashSelection } = this;\r\n if (!result || !activeColumn || !editSelection) return;\r\n\r\n const segment = editSelection.customSegment || editSelection.segment;\r\n if (!segment) return;\r\n\r\n const isSingleSelect = editSelection.singleSelect === true;\r\n\r\n // Determine which columns need updating\r\n const targetColumns = this.#resolveTargetColumns(activeColumn, isSingleSelect, hasVat);\r\n\r\n // Execute updates\r\n targetColumns.forEach(col => {\r\n this.accountNumberSelected(result, segment, col, isCashSelection);\r\n });\r\n if (targetColumns.size > 0) {\r\n // Track successful selection for success message\r\n const basis = isCashSelection ? ACCOUNTING_BASIS.CASH : ACCOUNTING_BASIS.ACCRUAL;\r\n const successMessage = `Account combination successfully created for ${segment} segment (${activeColumn} column, ${basis} basis).`;\r\n\r\n // Emit success message with debounce for the specific basis\r\n timer(500).pipe(\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe(() => {\r\n const currentMessages = this.#successMessageSubject$.value;\r\n this.#successMessageSubject$.next({\r\n ...currentMessages,\r\n [basis]: successMessage\r\n });\r\n // Auto-clear after 6 seconds\r\n timer(6000).pipe(\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe(() => {\r\n const updatedMessages = this.#successMessageSubject$.value;\r\n this.#successMessageSubject$.next({\r\n ...updatedMessages,\r\n [basis]: null\r\n });\r\n });\r\n });\r\n\r\n // Clear any temporary hints when selection is made\r\n this.clearTemporaryHint();\r\n }\r\n\r\n this.#resetSelectionState();\r\n }\r\n\r\n /**\r\n * Resolves which columns should be updated based on selection type\r\n */\r\n #resolveTargetColumns(activeColumn: string, isSingleSelect: boolean, hasVat: boolean): Set<string> {\r\n const targets = new Set<string>();\r\n\r\n // Rule 1: Multi-select always just updates the active column\r\n if (!isSingleSelect) {\r\n targets.add(activeColumn);\r\n return targets;\r\n }\r\n\r\n // Rule 2: Single Select Logic\r\n switch (activeColumn) {\r\n case COLUMNS.DEBIT:\r\n targets.add(COLUMNS.DEBIT);\r\n targets.add(COLUMNS.CREDIT);\r\n break;\r\n\r\n case COLUMNS.VAT:\r\n targets.add(COLUMNS.VAT);\r\n break;\r\n\r\n default:\r\n // Check for Extension Logic (e.g., bankChargesDebit)\r\n const extension = this.#getExtensionPair(activeColumn);\r\n if (extension) {\r\n targets.add(activeColumn);\r\n targets.add(extension);\r\n }\r\n break;\r\n }\r\n\r\n // Rule 3: VAT Side Effect (Independent Rule)\r\n if (hasVat && activeColumn !== COLUMNS.VAT) {\r\n targets.add(COLUMNS.VAT);\r\n }\r\n\r\n return targets;\r\n }\r\n\r\n /**\r\n * Gets extension pair for a column (e.g., bankChargesDebit -> bankChargesCredit)\r\n */\r\n #getExtensionPair(activeColumn: string): string | null {\r\n const split = activeColumn.split(/(?=[A-Z])/);\r\n const suffix = split.at(-1)?.toLowerCase();\r\n const baseKey = split[0];\r\n\r\n const isDebitExtension = suffix === COLUMNS.DEBIT;\r\n const isValidConfig = baseKey && this.config()?.extensionAccountsForSegments?.includes(baseKey);\r\n\r\n if (isDebitExtension && isValidConfig) {\r\n return `${baseKey}Credit`;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Resets selection state\r\n */\r\n #resetSelectionState(): void {\r\n this.editSelection = undefined;\r\n this.activeColumn = undefined;\r\n this.isCashSelection = undefined;\r\n }\r\n\r\n /**\r\n * Opens input dialog\r\n */\r\n #openInput(input: FormColumnInputs): void {\r\n if (!this.editSelection || !this.activeColumn) return;\r\n\r\n const segment = this.editSelection.segment;\r\n if (!segment) return;\r\n\r\n const segmentValueBag = this.editSelection.segmentValue;\r\n const dialogRef = this.#dialog.open(ScoaInputComponent, {\r\n data: {\r\n input,\r\n formGroup: this.formGroup(),\r\n heading: `${this.activeColumn} ${segment?.toLowerCase() || 'Incomplete configuration'}`,\r\n value: segmentValueBag?.[this.activeColumn as 'debit' | 'credit'],\r\n subHeading: `Enter ${this.activeColumn} ${segment?.toLowerCase() || '***'} and save`\r\n },\r\n ...DIALOG_CONFIG.INPUT\r\n });\r\n\r\n dialogRef.afterClosed().pipe(\r\n take(1),\r\n takeUntilDestroyed(this.#destroyRef)\r\n ).subscribe(result => {\r\n if (result && segment) {\r\n this.accountNumberSelected(\r\n result[segment],\r\n segment,\r\n this.activeColumn as \"debit\" | \"credit\",\r\n this.isCashSelection\r\n );\r\n }\r\n this.#resetSelectionState();\r\n });\r\n }\r\n\r\n /**\r\n * Checks if selection should be disabled\r\n */\r\n protected selectionDisabled(row: IAccountSegmentTreeKeys | ExtendedTableRow, col: string): boolean {\r\n if (this.inputConfig()?.readonly || row['readOnly'] || row['inheritValueFromAccrual']) {\r\n return true;\r\n }\r\n\r\n const isVatCol = col === COLUMNS.VAT;\r\n\r\n // Case 1: Credit column with singleSelect enabled\r\n if (row['singleSelect'] && col === COLUMNS.CREDIT && !isVatCol) {\r\n return true;\r\n }\r\n\r\n // Case 2: VAT columns with special conditions\r\n if (isVatCol === true) {\r\n return (row.segment ?? '').toLowerCase() !== 'item';\r\n }\r\n\r\n // Case 3: Extension columns\r\n const split = (col || '').split(/(?=[A-Z])/);\r\n const isExtensionDebit = split?.at(-1)?.toLowerCase() === COLUMNS.DEBIT;\r\n const isExtensionCredit = split?.at(-1)?.toLowerCase() === COLUMNS.CREDIT;\r\n const isInConfig = this.config()?.extensionAccountsForSegments?.includes(split[0] as string);\r\n const isSetupForRow = Boolean(row?.additionalAccounts?.includes(split[0] as string));\r\n\r\n if ((isExtensionDebit && isInConfig && !isSetupForRow) ||\r\n (isExtensionCredit && isInConfig && !isSetupForRow)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Gets account field state\r\n */\r\n protected getFields(row: ExtendedTableRow, col: string) {\r\n return getAccountFieldState(row, col, this.touched(), this.inputConfig());\r\n }\r\n\r\n /**\r\n * Checks if dual account basis is enabled\r\n */\r\n protected get isDualAccountBasis(): boolean {\r\n return this.config()?.accountingBasis === ACCOUNTING_BASIS.DUAL;\r\n }\r\n\r\n /**\r\n * Toggles dual basis expansion\r\n */\r\n protected toggleDualBasisExpansion(basis: string): void {\r\n this.dualBasisExpansion[basis] = !this.dualBasisExpansion[basis];\r\n this.#cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Gets expansion state for a basis\r\n */\r\n protected getExpansionState(basis: string): boolean {\r\n return this.dualBasisExpansion[basis] ?? true;\r\n }\r\n\r\n /**\r\n * Input deletion methods\r\n */\r\n protected inputWillBeRemovedIn(id: string): number | null {\r\n return this.countdownSeconds[id]?.count ?? null;\r\n }\r\n\r\n protected removeInput(item: FormColumnInputs): void {\r\n if (this.countdownSeconds[item.id]) {\r\n this.stopDeletion(item.id);\r\n return;\r\n }\r\n\r\n this.countdownSeconds[item.id] = {\r\n count: DELETION_COUNTDOWN_SECONDS,\r\n stop$: new Subject<void>()\r\n };\r\n\r\n const countdown$ = timer(0, 1000).pipe(\r\n tap((secondsElapsed) => {\r\n const data = this.countdownSeconds[item.id];\r\n if (!data) return;\r\n\r\n const remainingTime = DELETION_COUNTDOWN_SECONDS - secondsElapsed;\r\n if (remainingTime <= 0) {\r\n this.formDeleteInput(item);\r\n this.stopDeletion(item.id);\r\n } else {\r\n data.count = remainingTime;\r\n this.#cdr.markForCheck();\r\n }\r\n }),\r\n takeUntil(this.countdownSeconds[item.id]!.stop$),\r\n takeUntilDestroyed(this.#destroyRef)\r\n );\r\n\r\n countdown$.subscribe({\r\n complete: () => {\r\n // Countdown completed or stopped\r\n }\r\n });\r\n }\r\n\r\n protected stopDeletion(id: string): void {\r\n if (this.countdownSeconds[id]) {\r\n this.countdownSeconds[id]?.stop$.next();\r\n delete this.countdownSeconds[id];\r\n this.#cdr.markForCheck();\r\n }\r\n }\r\n\r\n protected formDeleteInput(item: FormColumnInputs): void {\r\n this.#formBuilderFunctions?.deleteInput(item);\r\n }\r\n\r\n protected editInput(input: FormColumnInputs): void {\r\n this.#formBuilderFunctions?.editInput(input);\r\n }\r\n\r\n /**\r\n * TrackBy functions for performance\r\n */\r\n protected trackByColumn(index: number, col: string): string {\r\n return col;\r\n }\r\n\r\n protected trackByRow(index: number, row: ExtendedTableRow): string {\r\n return row.segment || `row-${index}`;\r\n }\r\n\r\n protected trackByError(index: number, error: string): string {\r\n return error;\r\n }\r\n\r\n /**\r\n * Handles input menu events\r\n */\r\n protected onInputMenuEdit(input: FormColumnInputs): void {\r\n this.editInput(input);\r\n }\r\n\r\n protected onInputMenuDelete(input: FormColumnInputs): void {\r\n this.removeInput(input);\r\n }\r\n\r\n protected onInputMenuCancelDelete(id: string): void {\r\n this.stopDeletion(id);\r\n }\r\n\r\n protected onInputMenuHoverStart(id: string): void {\r\n this.hoveredInputId = id;\r\n this.#cdr.markForCheck();\r\n }\r\n\r\n protected onInputMenuHoverEnd(): void {\r\n this.hoveredInputId = null;\r\n this.#cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Returns the business validation error for a cell. validationErrors is keyed by basis then by segment;\r\n * each error has accountDimension (the column, e.g. \"debit\"). So we match row segment and col to that.\r\n */\r\n protected getCellBusinessError(\r\n validationErrors: Record<string, Record<string, { canOveride?: boolean; accountDimension?: string; message?: string }>> | undefined | null,\r\n basis: string,\r\n col: string,\r\n segment: string | undefined\r\n ): { canOveride: boolean; accountDimension: string; message: string } | null {\r\n if (!validationErrors || !basis || !col || segment == null || segment === '') return null;\r\n const basisErrors = validationErrors[basis];\r\n if (!basisErrors) return null;\r\n const segmentKey = Object.keys(basisErrors).find(k => k.toLowerCase() === String(segment).toLowerCase());\r\n if (!segmentKey) return null;\r\n const err = basisErrors[segmentKey];\r\n if (!err) return null;\r\n const dim = (err.accountDimension ?? '').toLowerCase();\r\n const colLower = col.toLowerCase();\r\n if (dim && dim !== colLower) return null;\r\n return { canOveride: !!err.canOveride, accountDimension: err.accountDimension ?? col, message: err.message ?? '' };\r\n }\r\n\r\n /**\r\n * True when this table (basis) has at least one business rule error. When true, only cells with an error should be clickable.\r\n */\r\n protected tableHasBusinessErrors(\r\n validationErrors: Record<string, Record<string, unknown>> | undefined | null,\r\n basis: string\r\n ): boolean {\r\n if (!validationErrors || !basis) return false;\r\n const basisErrors = validationErrors[basis];\r\n return !!basisErrors && Object.keys(basisErrors).length > 0;\r\n }\r\n\r\n /**\r\n * True when the cell should be disabled because the table has business errors and this cell is not one of them.\r\n */\r\n protected isCellDisabledByBusinessErrors(\r\n validationErrors: Record<string, Record<string, { canOveride?: boolean; accountDimension?: string; message?: string }>> | undefined | null,\r\n basis: string,\r\n col: string,\r\n segment: string | undefined\r\n ): boolean {\r\n return this.tableHasBusinessErrors(validationErrors, basis) && !this.getCellBusinessError(validationErrors, basis, col, segment);\r\n }\r\n\r\n /**\r\n * Gets validation hint for a row/column combination\r\n * Only shows hints when the selection value is entirely empty\r\n */\r\n protected getValidationHint(row: ExtendedTableRow, col: string, basis: string): string | null {\r\n // Only show hints if the selection value is entirely empty\r\n if (row[col]) {\r\n return null;\r\n }\r\n\r\n // Show hints for empty required fields\r\n if (this.touched() && this.inputConfig()?.required) {\r\n return `Please select an account for ${row.segment || 'this segment'} in ${col} column.`;\r\n }\r\n\r\n // Show hints for single select fields (only when empty)\r\n if (row.singleSelect && col === COLUMNS.CREDIT) {\r\n return `The credit account will be automatically selected based on your debit selection.`;\r\n }\r\n\r\n // Show hints for VAT fields (only when empty)\r\n if (col === COLUMNS.VAT && row.segment?.toLowerCase() !== 'item') {\r\n return `VAT selection is only available for the Item segment.`;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets context-aware guidance hint based on current state\r\n */\r\n protected getContextualGuidance(row: ExtendedTableRow, col: string, hasErrors: boolean): string | null {\r\n // If there are errors, don't show guidance\r\n if (hasErrors) {\r\n return null;\r\n }\r\n\r\n // Context-specific guidance based on segment and column\r\n const segment = row.segment?.toLowerCase() || '';\r\n\r\n // Item segment specific guidance\r\n if (segment === 'item' && col === COLUMNS.DEBIT) {\r\n return `For Item segments, select accounts that align with your transaction type (Assets, Payables, or Retentions).`;\r\n }\r\n\r\n // Project segment specific guidance\r\n if (segment === 'project' && col === COLUMNS.DEBIT) {\r\n return `Capital projects typically use specific account codes. Ensure your selection matches the project type.`;\r\n }\r\n\r\n // Regional segment specific guidance\r\n if (segment === 'regional' && col === COLUMNS.DEBIT && !row[col]) {\r\n return `Select the appropriate regional account code that matches your organization's regional structure.`;\r\n }\r\n\r\n // General guidance for first-time selection\r\n if (!row[col] && col === COLUMNS.DEBIT) {\r\n return `Choose an account that matches your transaction's reporting category. The system will validate compatibility automatically.`;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Shows a temporary hint message\r\n */\r\n protected showTemporaryHint(message: string, type: 'info' | 'guidance' = 'info'): void {\r\n this.temporaryHintMessage = message;\r\n this.temporaryHintType = type;\r\n this.#cdr.markForCheck();\r\n\r\n // Auto-clear after 6 seconds\r\n timer(6000).pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => {\r\n this.temporaryHintMessage = null;\r\n this.#cdr.markForCheck();\r\n });\r\n }\r\n\r\n /**\r\n * Clears temporary hint\r\n */\r\n protected clearTemporaryHint(): void {\r\n this.temporaryHintMessage = null;\r\n this.#cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Checks if text is likely truncated (heuristic based on length)\r\n */\r\n protected isTextTruncated(text: unknown): boolean {\r\n if (!text || typeof text !== 'string') return false;\r\n // Consider text truncated if it's longer than ~30 characters\r\n // This is a heuristic - actual truncation depends on available space\r\n return text.length > 30;\r\n }\r\n\r\n /**\r\n * Calculates column width percentage for proper space distribution\r\n */\r\n protected getColumnWidthPercent(isSegment: boolean, totalColumns: number): number | null {\r\n if (isSegment) {\r\n return 15; // Segment column gets 20%\r\n }\r\n // Remaining 80% is distributed equally among account columns\r\n const accountColumns = totalColumns - 1; // Exclude segment column\r\n if (accountColumns > 0) {\r\n return 80 / accountColumns;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets formatted error context for a specific row/column\r\n */\r\n protected getErrorContext(row: ExtendedTableRow, col: string, basis: string): ErrorContext {\r\n // Phase-4 TODO: tighten ExtendedTableRow index-signature to a discriminated union of column types.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const cell = row[col] as any;\r\n return {\r\n segment: row.segment,\r\n column: col,\r\n accountingBasis: basis,\r\n accountNumber: cell?.AccountNumberShortened || cell?.SCOAAccount\r\n };\r\n }\r\n\r\n /**\r\n * Checks if there are errors for a specific row\r\n */\r\n protected hasRowErrors(row: ExtendedTableRow, basis: string): boolean {\r\n // This would need access to validation errors per row\r\n // For now, return false - can be enhanced with row-specific error tracking\r\n return false;\r\n }\r\n\r\n /**\r\n * Handles keyboard navigation in table cells\r\n */\r\n protected handleCellKeyDown(event: KeyboardEvent, row: ExtendedTableRow, col: string, isCash: boolean): void {\r\n const key = event.key;\r\n const target = event.target as HTMLElement;\r\n const cell = target.closest('td[mat-cell]') as HTMLElement;\r\n\r\n if (!cell) return;\r\n\r\n switch (key) {\r\n case 'ArrowRight':\r\n event.preventDefault();\r\n this.#focusNextCell(cell, 'right');\r\n break;\r\n case 'ArrowLeft':\r\n event.preventDefault();\r\n this.#focusNextCell(cell, 'left');\r\n break;\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this.#focusNextCell(cell, 'down');\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.#focusNextCell(cell, 'up');\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n // selectionDisabled now accepts either IAccountSegmentTreeKeys or ExtendedTableRow.\r\n if (!this.selectionDisabled(row, col)) {\r\n event.preventDefault();\r\n this.selectAccount(row, col, isCash);\r\n this.setAsTouched(event);\r\n }\r\n break;\r\n case 'Escape':\r\n event.preventDefault();\r\n this.#resetSelectionState();\r\n cell.blur();\r\n break;\r\n case 'Tab':\r\n // Allow default tab behavior\r\n break;\r\n default:\r\n // Allow other keys to propagate\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Focuses the next cell in the specified direction\r\n */\r\n #focusNextCell(currentCell: HTMLElement, direction: 'up' | 'down' | 'left' | 'right'): void {\r\n const table = currentCell.closest('table');\r\n if (!table) return;\r\n\r\n const cells = Array.from(table.querySelectorAll<HTMLElement>('td[mat-cell]'));\r\n const currentIndex = cells.indexOf(currentCell);\r\n\r\n if (currentIndex === -1) return;\r\n\r\n // Get column count from table headers\r\n const headers = Array.from(table.querySelectorAll<HTMLElement>('th[mat-header-cell]'));\r\n const colCount = headers.length || 4; // Default to 4 if can't determine\r\n\r\n let nextIndex = currentIndex;\r\n\r\n switch (direction) {\r\n case 'right':\r\n nextIndex = currentIndex + 1;\r\n break;\r\n case 'left':\r\n nextIndex = currentIndex - 1;\r\n break;\r\n case 'down':\r\n nextIndex = currentIndex + colCount;\r\n break;\r\n case 'up':\r\n nextIndex = currentIndex - colCount;\r\n break;\r\n }\r\n\r\n if (nextIndex >= 0 && nextIndex < cells.length) {\r\n const nextCell = cells[nextIndex];\r\n if (nextCell) {\r\n const button = nextCell.querySelector<HTMLButtonElement>('button.cell-button');\r\n if (button && button.disabled === false) {\r\n button.focus();\r\n } else if (nextCell) {\r\n // Try to focus the cell itself if no button or button is disabled\r\n nextCell.focus();\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","@if ((viewData$ | async); as viewData) {\r\n<section\r\n (click)=\"setAsTouched($event)\"\r\n class=\"mscoa-chart__container\"\r\n [class.mscoa-chart__container--touched]=\"touched()\"\r\n role=\"region\"\r\n [attr.aria-label]=\"'MSCOA Account Chart'\"\r\n [attr.aria-busy]=\"viewData.loading || viewData.validatingValue\">\r\n\r\n @if (viewData.loading) {\r\n <div class=\"mscoa-chart__loading-container\" role=\"status\" aria-live=\"polite\">\r\n <mat-spinner [diameter]=\"40\"></mat-spinner>\r\n <span class=\"sr-only\">Loading account chart data...</span>\r\n </div>\r\n } @else {\r\n @defer () {\r\n @if (viewData.accountTreeKeys || viewData.cashAccountTreeKeys) {\r\n <div class=\"mscoa-chart__table-container\">\r\n @if (isDualAccountBasis) {\r\n <div class=\"dual-basis-container\" role=\"group\" aria-label=\"Dual accounting basis tables\">\r\n <div class=\"dual-basis-container__item\">\r\n <ng-container\r\n *ngTemplateOutlet=\"selectionTable;\r\n context: {\r\n accountingBasis: ACCOUNTING_BASIS.ACCRUAL,\r\n canCollapse: true,\r\n viewData: viewData\r\n }\">\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"dual-basis-container__item\">\r\n <ng-container\r\n *ngTemplateOutlet=\"selectionTable;\r\n context: {\r\n accountingBasis: ACCOUNTING_BASIS.CASH,\r\n canCollapse: true,\r\n viewData: viewData\r\n }\">\r\n </ng-container>\r\n </div>\r\n </div>\r\n } @else {\r\n <ng-container\r\n *ngTemplateOutlet=\"selectionTable;\r\n context: {\r\n accountingBasis: config()?.accountingBasis,\r\n canCollapse: false,\r\n viewData: viewData\r\n }\">\r\n </ng-container>\r\n }\r\n </div>\r\n }\r\n\r\n <ng-template\r\n #selectionTable\r\n let-accountingBasis=\"accountingBasis\"\r\n let-canCollapse=\"canCollapse\"\r\n let-viewData=\"viewData\">\r\n\r\n <div class=\"mscoa-chart-table\" role=\"group\" [attr.aria-label]=\"'Accounting basis: ' + (accountingBasis || 'Accrual')\">\r\n <!-- Toolbar -->\r\n <lib-mscoa-chart-toolbar\r\n [accountingBasis]=\"accountingBasis\"\r\n [canCollapse]=\"canCollapse\"\r\n [isExpanded]=\"getExpansionState(accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\"\r\n (toggleExpansion)=\"toggleDualBasisExpansion(accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\">\r\n </lib-mscoa-chart-toolbar>\r\n\r\n @if (shouldShowTable(isDualAccountBasis, getExpansionState(accountingBasis || ACCOUNTING_BASIS.ACCRUAL), accountingBasis)) {\r\n <div class=\"account-selection-table-wrapper\">\r\n <div\r\n class=\"account-selection-table-container\"\r\n [class.account-selection-table-container--accrual]=\"!accountingBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL\"\r\n [class.account-selection-table-container--cash]=\"accountingBasis === ACCOUNTING_BASIS.CASH\"\r\n role=\"table\"\r\n [attr.aria-label]=\"'Account selection table for ' + (accountingBasis || 'Accrual') + ' basis'\">\r\n\r\n <table\r\n mat-table\r\n [dataSource]=\"accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashTableData : viewData.tableData\"\r\n [trackBy]=\"trackByRow\"\r\n class=\"table\"\r\n [attr.aria-label]=\"'Account selection table for ' + (accountingBasis || 'Accrual') + ' basis'\"\r\n [attr.aria-describedby]=\"'table-description-' + (accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\"\r\n role=\"table\">\r\n <span [id]=\"'table-description-' + (accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\" class=\"sr-only\">\r\n Use arrow keys to navigate between cells. Press Enter or Space to select an account.\r\n </span>\r\n\r\n @for (\r\n col of (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols);\r\n track trackByColumn($index, col);\r\n let i = $index\r\n ) {\r\n <ng-container [matColumnDef]=\"col\" [sticky]=\"i === 0\">\r\n <!-- Header Cell -->\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [class.table__header-cell--segment]=\"isSegmentColumn(i)\"\r\n [class.table__header-cell--regular]=\"!isSegmentColumn(i)\"\r\n [style.width.%]=\"getColumnWidthPercent(isSegmentColumn(i), (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols).length)\"\r\n [style.min-width.px]=\"isSegmentColumn(i) ? 150 : 200\"\r\n [attr.aria-sort]=\"i === 0 ? 'none' : null\"\r\n [attr.scope]=\"'col'\"\r\n [attr.aria-label]=\"getHeaderText(col, i, accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashHasMultiSelect : viewData.hasMultiSelect) + ' column'\">\r\n {{ getHeaderText(col, i, accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashHasMultiSelect : viewData.hasMultiSelect) | titlecase | unCamelCase }}\r\n </th>\r\n\r\n <!-- Data Cell -->\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n [class.table__cell--segment]=\"isSegmentColumn(i)\"\r\n [class.table__cell--regular]=\"!isSegmentColumn(i)\"\r\n [class.table__cell--active]=\"editSelection?.segment === row['segment'] && activeColumn === col\"\r\n [class.table__cell--business-error]=\"!isSegmentColumn(i) && getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\r\n [attr.aria-label]=\"'Cell for ' + row['segment'] + ' segment, ' + col + ' column'\"\r\n [attr.aria-selected]=\"!!row[col]\"\r\n [attr.aria-invalid]=\"!isSegmentColumn(i) && !!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\r\n [attr.role]=\"'gridcell'\"\r\n [attr.tabindex]=\"isSegmentColumn(i) ? -1 : (row[col] ? 0 : -1)\">\r\n\r\n @if (isSegmentColumn(i)) {\r\n <!-- Segment Column -->\r\n <div class=\"segment-cell-content\">\r\n @if (editorMode() && row.innerInput?.id) {\r\n <button\r\n mat-icon-button\r\n [matMenuTriggerData]=\"{innerInput: row.innerInput}\"\r\n [matMenuTriggerFor]=\"inputMenu\"\r\n [matTooltip]=\"'Options for: ' + row.innerInput.label\"\r\n [attr.aria-label]=\"'Options menu for ' + row.innerInput.label\"\r\n (click)=\"$event.stopPropagation()\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n }\r\n <span class=\"segment-cell-content__label\">{{ row['label'] }}</span>\r\n </div>\r\n } @else {\r\n <!-- Regular Column -->\r\n @if (row.innerInput?.id && formGroup() && inputPortals[getPortalKey(row.innerInput.id)]) {\r\n <div class=\"portal-container\">\r\n <ng-template [cdkPortalOutlet]=\"inputPortals[getPortalKey(row.innerInput.id)]\"></ng-template>\r\n </div>\r\n } @else {\r\n @if (row[col]) {\r\n <!-- Account Selected -->\r\n @if (getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment']); as cellError) {\r\n <div class=\"account-cell-wrapper\"\r\n [class.account-cell-wrapper--expandable]=\"isTextTruncated(row[col] | unCamelCase)\">\r\n <button\r\n [disabled]=\"row['singleSelect'] === true && col === COLUMNS.CREDIT\"\r\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation(); selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); setAsTouched($event)\"\r\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\r\n color=\"primary\"\r\n mat-button\r\n class=\"cell-button cell-button--selected cell-button--business-error\"\r\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase) + ' for ' + row['segment'] + ' segment, ' + col + ' column. Business error: ' + cellError.message\"\r\n [attr.aria-invalid]=\"true\"\r\n [attr.aria-pressed]=\"true\"\r\n [matTooltip]=\"cellError.message\">\r\n <div class=\"content\">\r\n <span\r\n class=\"selected-acount-label selected-acount-label--tag selected-acount-label--business-error\"\r\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase)\">\r\n {{ row[col] | unCamelCase }}\r\n @if (shouldShowVatChip(row, col)) {\r\n <span\r\n class=\"vat-badge\"\r\n [attr.aria-label]=\"'VAT applicable to ' + col + ' column'\"\r\n [matTooltip]=\"'VAT is applicable to this ' + col + ' account selection'\">\r\n VAT\r\n </span>\r\n }\r\n </span>\r\n <mat-icon class=\"business-error-indicator\" aria-hidden=\"true\">error</mat-icon>\r\n </div>\r\n </button>\r\n </div>\r\n } @else {\r\n <div class=\"account-cell-wrapper\"\r\n [class.account-cell-wrapper--expandable]=\"isTextTruncated(row[col] | unCamelCase)\">\r\n <button\r\n [disabled]=\"(row['singleSelect'] === true && col === COLUMNS.CREDIT) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\r\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation(); selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); setAsTouched($event)\"\r\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\r\n color=\"primary\"\r\n mat-button\r\n class=\"cell-button cell-button--selected\"\r\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase) + ' for ' + row['segment'] + ' segment, ' + col + ' column. Press Enter or Space to change'\"\r\n [attr.aria-invalid]=\"false\"\r\n [attr.aria-disabled]=\"(row['singleSelect'] === true && col === COLUMNS.CREDIT) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\r\n [attr.aria-pressed]=\"true\">\r\n <div class=\"content\">\r\n <span\r\n class=\"selected-acount-label selected-acount-label--tag\"\r\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase)\">\r\n {{ row[col] | unCamelCase }}\r\n @if (shouldShowVatChip(row, col)) {\r\n <span\r\n class=\"vat-badge\"\r\n [attr.aria-label]=\"'VAT applicable to ' + col + ' column'\"\r\n [matTooltip]=\"'VAT is applicable to this ' + col + ' account selection'\">\r\n VAT\r\n </span>\r\n }\r\n </span>\r\n @if (showValidationSuccessIndicators) {\r\n <mat-icon class=\"validated-indicator\" aria-hidden=\"true\" [matTooltip]=\"'Validated'\">shield</mat-icon>\r\n } @else {\r\n <mat-icon class=\"success-indicator\" aria-hidden=\"true\">check_circle</mat-icon>\r\n }\r\n </div>\r\n </button>\r\n </div>\r\n }\r\n } @else {\r\n <!-- No Account Selected -->\r\n <div class=\"cell-button-wrapper\">\r\n <button\r\n [disabled]=\"selectionDisabled(row, col) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\r\n [color]=\"\"\r\n (click)=\"selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); $event.stopPropagation(); setAsTouched($event)\"\r\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\r\n mat-button\r\n class=\"cell-button\"\r\n [class.cell-button--business-error]=\"!!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\r\n [attr.aria-label]=\"shouldShowAutoSelectedLabel(row, col) ? 'Auto selected for ' + row['segment'] + ' segment, ' + col + ' column' : 'Select account for ' + row['segment'] + ' segment, ' + col + ' column'\"\r\n [attr.aria-disabled]=\"selectionDisabled(row, col) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\r\n [attr.aria-describedby]=\"getValidationHint(row, col, accountingBasis || ACCOUNTING_BASIS.ACCRUAL) ? 'hint-' + row['segment'] + '-' + col : null\"\r\n [attr.aria-invalid]=\"hasError(touched(), inputConfig().required || false, !!row[col]) || !!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\r\n [attr.aria-required]=\"inputConfig().required && !row[col]\"\r\n [matTooltip]=\"getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])?.message\">\r\n <div class=\"content\">\r\n <span\r\n class=\"selected-acount-label\"\r\n [class.selected-acount-label--error]=\"hasError(touched(), inputConfig().required || false, !!row[col])\"\r\n [class.selected-acount-label--business-error]=\"!!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\">\r\n {{ (shouldShowAutoSelectedLabel(row, col) ? 'auto selected' : 'Select account') | unCamelCase }}\r\n @if (inputConfig().required && !row[col]) {\r\n <span class=\"required-indicator\" aria-label=\"Required field\">*</span>\r\n }\r\n </span>\r\n @if (getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])) {\r\n <mat-icon class=\"business-error-indicator\" aria-hidden=\"true\">error</mat-icon>\r\n } @else if (shouldShowDropdownIcon(row, col)) {\r\n <mat-icon aria-hidden=\"true\">arrow_drop_down</mat-icon>\r\n }\r\n </div>\r\n </button>\r\n @if (getValidationHint(row, col, accountingBasis || ACCOUNTING_BASIS.ACCRUAL); as hint) {\r\n <span\r\n class=\"inline-hint\"\r\n [id]=\"'hint-' + row['segment'] + '-' + col\"\r\n role=\"tooltip\"\r\n aria-live=\"polite\">\r\n {{ hint }}\r\n </span>\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols)\"></tr>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n <!-- Empty State -->\r\n @if ((accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashAccountTreeKeys : viewData.accountTreeKeys).length === 0) {\r\n <section class=\"empty-state\" role=\"status\" aria-live=\"polite\">\r\n <mat-icon aria-hidden=\"true\">info</mat-icon>\r\n <span>\r\n No account segments are currently configured.\r\n Please configure account segments to proceed.\r\n </span>\r\n </section>\r\n }\r\n\r\n <!-- Success Messages (Temporary) -->\r\n @if ((successMessage$ | async); as successMessages) {\r\n @if (getSuccessMessage(successMessages, accountingBasis || ACCOUNTING_BASIS.ACCRUAL); as msg) {\r\n <lib-mscoa-temporary-hint\r\n [message]=\"getSuccessMessage(successMessages, accountingBasis || ACCOUNTING_BASIS.ACCRUAL) ?? ''\"\r\n [type]=\"'info'\"\r\n [duration]=\"6000\"\r\n [showDismiss]=\"true\">\r\n </lib-mscoa-temporary-hint>\r\n }\r\n }\r\n\r\n <!-- Business Rule Errors (Temporary display, keeps error styling) -->\r\n @if ((viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL] || []).length > 0) {\r\n <lib-mscoa-error-display\r\n [errors]=\"viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL] || []\"\r\n type=\"error\"\r\n [context]=\"{ accountingBasis: accountingBasis || ACCOUNTING_BASIS.ACCRUAL }\"\r\n [duration]=\"6000\"\r\n [showDismiss]=\"true\">\r\n </lib-mscoa-error-display>\r\n }\r\n\r\n <!-- Temporary Contextual Hints -->\r\n @if (temporaryHintMessage) {\r\n <lib-mscoa-temporary-hint\r\n [message]=\"temporaryHintMessage\"\r\n [type]=\"temporaryHintType\"\r\n [duration]=\"6000\"\r\n [showDismiss]=\"true\">\r\n </lib-mscoa-temporary-hint>\r\n }\r\n\r\n <!-- Validation Hints (Context-Aware) -->\r\n @if (!touched() && inputConfig().required && !viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL]?.length && (!isDualAccountBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL || !accountingBasis)) {\r\n <div class=\"validation-hints\" role=\"region\" aria-label=\"Validation guidance\">\r\n <p class=\"validation-hints__title\">Guidance:</p>\r\n <ul class=\"validation-hints__list\">\r\n <li>Account combinations are validated automatically. Select accounts that belong to compatible reporting categories.</li>\r\n <li>Required fields are marked with an asterisk (*). Complete all required selections to proceed.</li>\r\n <li>Some fields may be automatically populated based on your selections to ensure consistency.</li>\r\n </ul>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </ng-template>\r\n } @placeholder {\r\n <div class=\"loading-placeholder\" role=\"status\" aria-live=\"polite\">\r\n <p>Loading data...</p>\r\n </div>\r\n } @loading (minimum 100ms) {\r\n <div class=\"loading-spinner-container\" role=\"status\" aria-live=\"polite\">\r\n <mat-progress-spinner mode=\"indeterminate\" [diameter]=\"40\"></mat-progress-spinner>\r\n <span class=\"sr-only\">Loading account chart...</span>\r\n </div>\r\n } @error {\r\n <div class=\"error-state\" role=\"alert\" aria-live=\"assertive\">\r\n <p>Error loading data. Please try again.</p>\r\n </div>\r\n }\r\n }\r\n</section>\r\n}\r\n\r\n<!-- Input Menu -->\r\n<mat-menu #inputMenu=\"matMenu\">\r\n <ng-template matMenuContent let-innerInput=\"innerInput\">\r\n <lib-mscoa-chart-input-menu\r\n [innerInput]=\"innerInput\"\r\n [countdownSeconds]=\"inputWillBeRemovedIn(innerInput.id)\"\r\n [hoveredId]=\"hoveredInputId\"\r\n (edit)=\"onInputMenuEdit($event)\"\r\n (delete)=\"onInputMenuDelete($event)\"\r\n (cancelDelete)=\"onInputMenuCancelDelete($event)\"\r\n (hoverStart)=\"onInputMenuHoverStart($event)\"\r\n (hoverEnd)=\"onInputMenuHoverEnd()\">\r\n </lib-mscoa-chart-input-menu>\r\n </ng-template>\r\n</mat-menu>\r\n","import { Directive, ElementRef, Input, Optional, Self, OnDestroy, DoCheck, output } from '@angular/core';\r\nimport { ControlValueAccessor, NgControl, ValidationErrors } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { Subject } from 'rxjs';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\n\r\nimport { _isEqual } from '../../../../shared/functions/isEqual';\r\n\r\nexport interface BaseCustomInputConfig {\r\n controlType: string;\r\n nextId: number;\r\n}\r\n/**\r\n * Abstract base class for custom form input components that implement Material Form Field Control and Control Value Accessor.\r\n * Provides common functionality for custom form controls including state management, validation, and accessibility features.\r\n *\r\n * @template T - The type of value that this input control handles\r\n * \r\n * @implements {MatFormFieldControl<T>} - Material Form Field Control interface\r\n * @implements {ControlValueAccessor} - Angular's Control Value Accessor interface\r\n * @implements {OnDestroy} - Angular's OnDestroy lifecycle hook\r\n * \r\n * @param ngControl - Optional NgControl instance for form integration\r\n * @param _elementRef - Reference to the host element\r\n * @param config - Configuration object for the custom input\r\n * \r\n * @property {Subject<void>} stateChanges - Subject that emits when the control's state changes\r\n * @property {string} id - Unique identifier for the control\r\n * @property {boolean} focused - Tracks the focus state of the control\r\n * @property {boolean} touched - Tracks if the control has been touched\r\n * @property {string} controlType - Type identifier for the control\r\n * @property {boolean} autofilled - Tracks if the control has been autofilled\r\n * @property {string} userAriaDescribedBy - ARIA describedby attribute for accessibility\r\n * @property {string} placeholder - Placeholder text for the control\r\n * @property {boolean} required - Whether the control is required\r\n * @property {boolean} disabled - Whether the control is disabled\r\n * @property {T | null} value - Current value of the control\r\n * @property {ValidationErrors | null} errors - Current validation errors\r\n * @property {boolean} errorState - Whether the control is in an error state\r\n * @property {boolean} empty - Abstract getter for checking if the control is empty\r\n * @property {boolean} shouldLabelFloat - Abstract getter for determining if the label should float\r\n * \r\n * @method writeValue - Writes a new value to the control\r\n * @method registerOnChange - Registers a callback for value changes\r\n * @method registerOnTouched - Registers a callback for when the control is touched\r\n * @method setDisabledState - Sets the disabled state of the control\r\n * @method setDescribedByIds - Sets ARIA describedby IDs for accessibility\r\n * @method onContainerClick - Handles clicks on the control container\r\n * @method markAsTouched - Marks the control as touched\r\n * @method onFocusIn - Handles focus events\r\n * @method onFocusOut - Handles blur events\r\n * @method checkValidationsAndErrors - Checks and updates validation errors\r\n * @method ngOnDestroy - Cleanup on component destruction\r\n */\r\n\r\n@Directive()\r\nexport abstract class BaseCustomInput<T> implements MatFormFieldControl<T>, ControlValueAccessor, OnDestroy, DoCheck {\r\n destroy$ = new Subject<void>();\r\n protected constructor(\r\n @Optional() @Self() public ngControl: NgControl,\r\n protected _elementRef: ElementRef<HTMLElement>,\r\n private config: BaseCustomInputConfig\r\n ) {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n protected _touched = false;\r\n // Common properties\r\n readonly stateChanges = new Subject<void>();\r\n readonly id = `${this.config.controlType}-${this.config.nextId++}`;\r\n focused = false;\r\n get touched(){\r\n const { touched } = this.ngControl || {};\r\n return touched || this._touched;\r\n }\r\n set touched(value: boolean) {\r\n this._touched = value;\r\n }\r\n readonly controlType = this.config.controlType;\r\n autofilled = false;\r\n\r\n // Protected fields with getters/setters\r\n protected _placeholder = '';\r\n protected _required = false;\r\n protected _disabled = false;\r\n protected _value: T | null = null;\r\n protected _errors: ValidationErrors | null = null;\r\n\r\n // Input properties\r\n @Input('aria-describedby') userAriaDescribedBy = '';\r\n\r\n // Output properties\r\n readonly blur = output<FocusEvent>();\r\n\r\n // Required implementations\r\n abstract get empty(): boolean;\r\n abstract get shouldLabelFloat(): boolean;\r\n\r\n // Common getters/setters\r\n @Input()\r\n get placeholder(): string { return this._placeholder; }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n @Input()\r\n get required(): boolean { return this._required; }\r\n set required(req: boolean) {\r\n this._required = coerceBooleanProperty(req);\r\n this.stateChanges.next();\r\n }\r\n\r\n @Input()\r\n get disabled(): boolean { return this._disabled; }\r\n set disabled(value: boolean) {\r\n this._disabled = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n get value(): T | null { return this._value; }\r\n set value(value: T | null) {\r\n if (!_isEqual(this._value, value)) {\r\n this._value = value;\r\n this.onChange(value);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n get errorState(): boolean {\r\n const invalidValue = this.value === null || this.value === undefined || this.value === '';\r\n return ((invalidValue && this.required) || !!this.ngControl?.errors) && this.touched;\r\n }\r\n\r\n get errors() { return this._errors; }\r\n set errors(err: ValidationErrors | null) {\r\n if (!_isEqual(this._errors, err)) {\r\n this._errors = err;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n onChange = (_: T | null) => { };\r\n onTouched = () => { };\r\n\r\n writeValue(value: T): void {\r\n this._value = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (_: T | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n // MatFormFieldControl implementation\r\n setDescribedByIds(ids: string[]): void {\r\n const controlElement = this._elementRef.nativeElement.querySelector(`.${this.controlType}`);\r\n controlElement?.setAttribute('aria-describedby', ids.join(' '));\r\n }\r\n\r\n // Common methods\r\n onContainerClick(event: MouseEvent): void {\r\n if (event.target !== this._elementRef.nativeElement) {\r\n this.markAsTouched();\r\n this.stateChanges.next();\r\n }\r\n \r\n }\r\n\r\n markAsTouched(): void {\r\n if (!this.touched) {\r\n this.onTouched();\r\n this.touched = true;\r\n }\r\n }\r\n\r\n onFocusIn(event: FocusEvent): void {\r\n if (!this.focused) {\r\n this.focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n onFocusOut(event: FocusEvent): void {\r\n if (!this._elementRef.nativeElement.contains(event.relatedTarget as Element)) {\r\n this.touched = true;\r\n this.focused = false;\r\n this.onTouched();\r\n this.stateChanges.next();\r\n this.blur.emit(event);\r\n \r\n }\r\n \r\n }\r\n\r\n\r\n\r\n\r\n\r\n errorMessage: string | null = null;\r\n private errorTimer: ReturnType<typeof setTimeout> | undefined;\r\n temporaryError(msg: string) {\r\n // Set the error message\r\n this.errorMessage = msg\r\n const { control } = this.ngControl || {};\r\n const newErrors = {\r\n ...control?.errors, temporaryError :msg\r\n };\r\n control?.setErrors(newErrors);\r\n this.stateChanges.next();\r\n this.errorTimer = setTimeout(() => {\r\n this.errorMessage = null\r\n\r\n\r\n control?.setErrors(control?.errors ? { ...control.errors, temporaryError: undefined } : null);\r\n this.stateChanges.next();\r\n }, 3000);\r\n }\r\n\r\n checkValidationsAnErrors() {\r\n\r\n const { control } = this.ngControl || {};\r\n const { value, } = this;\r\n // Early exit if conditions are not met\r\n if (!this.required || !control || !value && !control.touched) {\r\n return;\r\n }\r\n\r\n const errors = control.errors ?? {};\r\n if (!_isEqual(this.errors, errors)) return;\r\n this.errors = errors;\r\n const hasIsRequiredError = 'required' in errors;\r\n const valueValid = value !== undefined && value !=='' && value !==null && control.touched;\r\n const hasOtherErrors = Object.keys(errors).length > 1;\r\n\r\n if (valueValid) {\r\n if (hasIsRequiredError) {\r\n // Only update errors if there are other errors besides 'required'\r\n if (hasOtherErrors) {\r\n delete errors['required'];\r\n control.setErrors(errors);\r\n } else {\r\n control.setErrors(null);\r\n }\r\n }\r\n } else if (!hasIsRequiredError) {\r\n // Only add 'required' error if it's not already present\r\n control.setErrors({ required: true, ...errors });\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n clearTimeout(this.errorTimer);\r\n this.stateChanges.complete();\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n }\r\n\r\n ngDoCheck(): void {\r\n //ngDoCheck runs strictly on every change detection cycle \r\n //implementation relies on _isEqual (deep comparison). If _isEqual is expensive, this will degrade performance.\r\n //:FIX\r\n this.checkValidationsAnErrors();\r\n }\r\n}","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n untracked,\n} from '@angular/core';\nimport { AbstractControl, FormGroup, NgControl, ReactiveFormsModule, ValidationErrors } from '@angular/forms';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport {\n AccountingBasis,\n FormBuilderFunctions,\n IIncludedSegmentConfig,\n IScoaInputConfig,\n ITowerStepColumn,\n ScoaSegmentValue,\n ScoaSegmentValueBag,\n} from 'ngx-t-forms-types';\n\nimport { MscoaChartComponent } from '../mscoa-chart/mscoa-chart.component';\nimport {\n BaseCustomInput,\n BaseCustomInputConfig,\n} from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\nimport { MscoaComponentStore } from '../../store/mscoa-component-store.service';\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\n\nconst customInputConfig: BaseCustomInputConfig = {\n controlType: 'lib-mscoa-reactive-form-field',\n nextId: 0,\n};\n\n/**\n * Reactive MSCOA form field — wraps the MSCOA chart in a MatFormFieldControl\n * implementation so it participates in Angular reactive forms with validation\n * for required, segment completeness, and non-overridable business rule errors.\n *\n * Data-flow ownership (the part that previously looped):\n * - **Down-path (render):** this field owns it. `inputConfig`, the reactive\n * `value` (via `writeValue`) and `formBuilderFunctions` are pushed into the\n * signal store. The chart only reads the store.\n * - **Up-path (persist):** a single effect reflects `store.segmentValues` back\n * onto the control through the `value` setter, which deep-compares and only\n * calls `onChange` when the value genuinely changed. The store reducers are\n * idempotent, so the form ⇄ store ⇄ form graph settles in one pass. This\n * replaces the old `segmentValuesChanged` output round-trip and the manual\n * `#lastEmittedSegmentValues` echo flag in the chart.\n * - **Validation:** runs from an effect keyed on the store + config signals,\n * not from `ngDoCheck` (which fired every change-detection tick).\n */\n@Component({\n selector: 'lib-mscoa-reactive-form-field',\n imports: [MscoaChartComponent, ReactiveFormsModule],\n providers: [\n MscoaComponentStore,\n { provide: MatFormFieldControl, useExisting: MscoaReactiveFormFieldComponent },\n ],\n templateUrl: './mscoa-reactive-form-field.component.html',\n styleUrl: './mscoa-reactive-form-field.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: {\n '[class.floating]': 'shouldLabelFloat',\n '[id]': 'id',\n },\n})\nexport class MscoaReactiveFormFieldComponent extends BaseCustomInput<ScoaSegmentValue> {\n protected readonly store = inject(MscoaComponentStore);\n\n /** Business-rule validation errors, read directly from the signal store. */\n protected readonly businessRuleValidationErrors = this.store.validationErrors;\n\n /** Optional form-builder utility functions provided by the host form. */\n readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\n\n /** When true the field renders in editor (design-time) mode. */\n readonly editorMode = input<boolean>(false);\n\n /** Tower-step column definition driving the MSCOA chart configuration. */\n readonly inputConfig = input.required<ITowerStepColumn>();\n\n /**\n * MSCOA config handed to the chart. Replaces the old `mscoaInputConfig$`\n * BehaviorSubject + `async` pipe: a pure projection of `inputConfig`.\n */\n protected readonly mscoaConfig = computed(() => ({\n ...this.inputConfig().mscoaConfig,\n inputId: this.inputConfig().id,\n }) as IScoaInputConfig);\n\n readonly #destroyRef = inject(DestroyRef);\n\n constructor() {\n super(\n inject(NgControl, { self: true, optional: true }) as NgControl,\n inject<ElementRef<HTMLElement>>(ElementRef),\n customInputConfig,\n );\n\n // --- Down-path: feed the store from this field's signals ---\n\n // Config: mirror the merged MSCOA config into the store on every change.\n effect(() => {\n const config = this.mscoaConfig();\n untracked(() => this.store.setConfig(config));\n });\n\n // Tree load: first non-undefined form-builder functions wins (legacy rule).\n effect(() => {\n const fn = this.formBuilderFunctions();\n untracked(() => {\n if (this.#loadedFunctions) return;\n this.#loadedFunctions = true;\n this.store.loadMscoa(fn);\n });\n });\n\n // --- Up-path: reflect store segment values back onto the control ---\n // The `value` setter (BaseCustomInput) deep-compares and only fires\n // `onChange` + `stateChanges` when the value actually changed, so this is a\n // no-op once the store and the control agree.\n effect(() => {\n const segmentValues = this.store.segmentValues();\n untracked(() => {\n this.value = segmentValues as ScoaSegmentValue;\n });\n });\n\n // --- Validation: react to value / config / business-rule error changes ---\n effect(() => {\n // Establish reactive dependencies; the body reads current values imperatively.\n this.store.segmentValues();\n this.businessRuleValidationErrors();\n this.inputConfig();\n untracked(() => this.checkValidationsAnErrors());\n });\n\n void this.#destroyRef;\n }\n\n /** Guards the one-shot tree load (legacy \"first non-undefined wins\"). */\n #loadedFunctions = false;\n\n override writeValue(value: ScoaSegmentValue): void {\n super.writeValue(value);\n // Down-path: an externally-set control value flows into the store.\n this.store.setSegmentValues(value ?? undefined);\n }\n\n /**\n * Validation is driven by an effect (see constructor), not by `ngDoCheck`.\n * Overriding `ngDoCheck` to a no-op keeps the per-change-detection-tick\n * `setErrors` of the base class from running for this field, without touching\n * `BaseCustomInput` (which other custom inputs still rely on).\n */\n override ngDoCheck(): void {\n // intentionally empty — see class doc and the validation effect.\n }\n\n override get empty(): boolean {\n return this.value === null || this.value === undefined || Object.keys(this.value).length === 0;\n }\n\n override get errorState(): boolean {\n const hasErrors = !!this.ngControl?.errors;\n return hasErrors && (this.touched || (this.required && hasErrors));\n }\n\n get shouldLabelFloat(): boolean {\n return this.focused || !this.empty;\n }\n\n protected get readonly(): boolean {\n return !!this.inputConfig().readonly;\n }\n\n protected get parentFormGroup(): FormGroup | undefined {\n return (this.ngControl?.control?.parent as FormGroup | undefined) ?? undefined;\n }\n\n override checkValidationsAnErrors(): void {\n const { control } = this.ngControl || {};\n if (!control) return;\n\n const errors: ValidationErrors = { ...(control.errors || {}) };\n const cfg = this.inputConfig();\n const mscoa = cfg?.mscoaConfig as { accountingBasis?: AccountingBasis; segments?: IIncludedSegmentConfig[]; cashSegments?: IIncludedSegmentConfig[] } | undefined;\n const rawValue: ScoaSegmentValue = this.value || ({} as ScoaSegmentValue);\n\n // 1. Check for non-overridable business rule errors (even when not required)\n const businessRuleErrors = this.businessRuleValidationErrors();\n const bases = (() => {\n const b = ((mscoa?.accountingBasis as string) || '').toLowerCase();\n if (b === 'dual') return ['accrual', 'cash'];\n if (b === 'cash') return ['cash'];\n return ['accrual'];\n })();\n\n let hasNonOverridableBusinessError = false;\n const businessRuleMessages: string[] = [];\n if (businessRuleErrors && typeof businessRuleErrors === 'object') {\n const errorsByBasis = businessRuleErrors as Record<string, Record<string, { canOveride?: boolean; message?: string }>>;\n for (const basis of bases) {\n const basisErrors = errorsByBasis[basis];\n if (basisErrors && typeof basisErrors === 'object') {\n for (const err of Object.values(basisErrors)) {\n if (err?.canOveride === false) {\n hasNonOverridableBusinessError = true;\n if (err?.message) businessRuleMessages.push(err.message);\n }\n }\n }\n }\n }\n const uniqueMessages = [...new Set(businessRuleMessages)];\n\n // 2. Required/segment completeness validation (only when required)\n let segmentValid = true;\n let segmentErrorMessage: string | undefined;\n if (this.required && mscoa) {\n const basis = ((mscoa.accountingBasis as string) ?? '').toString().toLowerCase();\n const isDual = basis === 'dual';\n const hasAccrualKey = 'accrual' in rawValue;\n const hasCashKey = 'cash' in rawValue;\n\n const isGroupValid = (defs?: IIncludedSegmentConfig[], values?: ScoaSegmentValue): boolean => {\n if (!defs?.length) return true;\n return defs.every(seg => {\n const key = (seg.customSegment || seg.segment || '').toUpperCase();\n const val = values?.[key];\n if (!val) return false;\n if ('debit' in val || 'credit' in val) {\n const singleSelect = !!(seg as { singleSelect?: boolean }).singleSelect;\n if (singleSelect) {\n return !!(val.debit || val.credit);\n }\n return !!(val.debit && val.credit);\n }\n return true;\n });\n };\n\n if (isDual) {\n // Dual basis: both accrual and cash keys must exist (legacy format lacks them)\n if (!hasAccrualKey || !hasCashKey) {\n segmentValid = false;\n segmentErrorMessage = 'Both cash and accrual segments are required.';\n } else {\n const data = {\n accrual: this.#asNestedSegmentValue(rawValue['accrual']),\n cash: this.#asNestedSegmentValue(rawValue['cash']),\n };\n const accrualValid = isGroupValid(mscoa.segments, data.accrual);\n let cashValid = isGroupValid(mscoa.cashSegments, data.cash);\n if (!mscoa.cashSegments?.length) {\n cashValid = false; // Dual requires cashSegments; empty/undefined = cash invalid\n }\n segmentValid = accrualValid && cashValid;\n if (!segmentValid) {\n segmentErrorMessage = 'Both cash and accrual segments must be valid.';\n }\n }\n } else {\n // Single basis (cash or accrual): preserve existing legacy/nested handling\n const isNested = hasAccrualKey || hasCashKey;\n const data = {\n accrual: (isNested ? rawValue['accrual'] : rawValue) as ScoaSegmentValue,\n cash: (isNested ? rawValue['cash'] : {}) as ScoaSegmentValue,\n };\n const accrualValid = isGroupValid(mscoa.segments, data.accrual);\n const cashValid = isGroupValid(mscoa.cashSegments, data.cash);\n segmentValid = this.#checkBasisValidity(mscoa.accountingBasis, accrualValid, cashValid);\n }\n }\n\n // 3. Update control: invalid if segment incomplete (when required) OR has non-overridable business errors\n this.#updateControlErrors(control, errors, segmentValid, hasNonOverridableBusinessError, uniqueMessages, segmentErrorMessage);\n }\n\n /**\n * Reads a per-basis nested segment value out of the raw control value.\n *\n * In dual/nested form, `rawValue['accrual']` / `rawValue['cash']` hold a\n * segment-keyed {@link ScoaSegmentValue} even though the index signature of\n * the parent declares a {@link ScoaSegmentValueBag}. The widening here mirrors\n * the single-basis branch (which already reads through a `ScoaSegmentValue`\n * union) and preserves the original runtime value verbatim — `undefined`\n * passes through and is handled downstream by `isGroupValid`'s optional read.\n */\n #asNestedSegmentValue(\n value: ScoaSegmentValueBag | ScoaSegmentValue | undefined,\n ): ScoaSegmentValue | undefined {\n return value as ScoaSegmentValue | undefined;\n }\n\n /**\n * Determines if the current value satisfies the specific Accounting Basis.\n * For dual basis, BOTH accrual and cash must be valid.\n */\n #checkBasisValidity(basis: AccountingBasis | undefined, accrualValid: boolean, cashValid: boolean): boolean {\n const b = ((basis as string) ?? '').toString().toLowerCase();\n if (b === 'dual') return accrualValid && cashValid;\n if (b === 'cash') return cashValid;\n if (b === 'accrual') return accrualValid;\n return accrualValid; // Default fallback (e.g. undefined basis)\n }\n\n /** Updates control errors for required, segment completeness, and non-overridable business rule errors. */\n #updateControlErrors(\n control: AbstractControl,\n currentErrors: ValidationErrors,\n segmentValid: boolean,\n hasNonOverridableBusinessError: boolean,\n businessRuleMessages: string[],\n segmentErrorMessage?: string,\n ): void {\n const newErrors = { ...currentErrors };\n\n // Remove required if segment is now valid\n if (segmentValid && 'required' in newErrors) {\n delete newErrors['required'];\n }\n // Add/update required when invalid and required (with optional custom message for dual-basis)\n if (!segmentValid && this.required) {\n newErrors['required'] = segmentErrorMessage ? { message: segmentErrorMessage } : true;\n }\n\n // Add business rule error when there are non-overridable errors\n if (hasNonOverridableBusinessError && businessRuleMessages.length > 0) {\n newErrors['businessRule'] = { message: businessRuleMessages.join(' ') };\n } else if ('businessRule' in newErrors) {\n delete newErrors['businessRule'];\n }\n\n const hasErrors = Object.keys(newErrors).length > 0;\n const nextErrors = hasErrors ? newErrors : null;\n\n // Guard: only write when the error map genuinely changed. AbstractControl\n // .setErrors() emits statusChanges + MatFormFieldControl stateChanges\n // *unconditionally* — even for a logically-identical map. Comparing first\n // avoids re-dirtying the view (the historical NG0103 source).\n if (!_isEqual(control.errors ?? null, nextErrors)) {\n control.setErrors(nextErrors);\n }\n }\n}\n","\n<div (click)=\"onContainerClick($event)\">\n @if (parentFormGroup; as fg) {\n <lib-mscoa-chart\n (onContainerClick)=\"onContainerClick($event)\"\n [config]=\"mscoaConfig()\"\n [inputConfig]=\"inputConfig()\"\n [readonly]=\"readonly\"\n [touched]=\"touched\"\n [editorMode]=\"editorMode()\"\n [formGroup]=\"fg\"\n [formBuilderFunctions]=\"formBuilderFunctions()\">\n </lib-mscoa-chart>\n }\n</div>\n","import { FormGroup, ValidationErrors } from \"@angular/forms\";\r\n\r\nimport { ElementTypes, IDateRangePickerInput } from \"ngx-t-forms-types\";\r\nimport { FormColumnInputs } from \"ngx-t-forms-types\";\r\n\r\n/** Maps validation error keys to human-readable messages */\r\nconst ERROR_MESSAGE_MAP: Record<string, (err: unknown) => string> = {\r\n required: (err) => (err as { message?: string })?.message || 'This field is required',\r\n email: () => 'Invalid email',\r\n multipleInputListMissingSomeFields: () => 'Some values in the list are missing required fields',\r\n businessRule: (err) => (err as { message?: string })?.message || 'Invalid account selection',\r\n minlength: (err) => {\r\n const e = err as { requiredLength?: number; actualLength?: number };\r\n return e?.requiredLength != null\r\n ? `Minimum length is ${e.requiredLength}${e.actualLength != null ? ` (current: ${e.actualLength})` : ''}`\r\n : 'Value is too short';\r\n },\r\n maxlength: (err) => {\r\n const e = err as { requiredLength?: number; actualLength?: number };\r\n return e?.requiredLength != null\r\n ? `Maximum length is ${e.requiredLength}${e.actualLength != null ? ` (current: ${e.actualLength})` : ''}`\r\n : 'Value is too long';\r\n },\r\n min: (err) => {\r\n const e = err as { min?: number; actual?: number };\r\n return e?.min != null\r\n ? `Minimum value is ${e.min}${e.actual != null ? ` (current: ${e.actual})` : ''}`\r\n : 'Value is below minimum';\r\n },\r\n max: (err) => {\r\n const e = err as { max?: number; actual?: number };\r\n return e?.max != null\r\n ? `Maximum value is ${e.max}${e.actual != null ? ` (current: ${e.actual})` : ''}`\r\n : 'Value exceeds maximum';\r\n },\r\n pattern: (err) => {\r\n const e = err as { requiredPattern?: string; actualValue?: string };\r\n return e?.actualValue != null\r\n ? `Invalid format: \"${e.actualValue}\" does not match the required pattern`\r\n : 'Invalid format';\r\n },\r\n temporaryError: (err) => (typeof err === 'string' ? err : 'Validation error'),\r\n};\r\n\r\nfunction resolveErrorMessage(key: string, value: unknown): string {\r\n const resolver = ERROR_MESSAGE_MAP[key];\r\n if (resolver) return resolver(value);\r\n const obj = value as { message?: string } | undefined;\r\n return obj?.message ?? (typeof value === 'string' ? value : 'Invalid');\r\n}\r\n\r\nexport function getInputErrorMessage(\r\n inputConfig: FormColumnInputs,\r\n formGroup: FormGroup,\r\n asArray: boolean = false\r\n): string | string[] | undefined {\r\n const control = formGroup.controls[inputConfig.id];\r\n const dateRangePicker = inputConfig.element === ElementTypes.DateRangePicker;\r\n\r\n if (!!dateRangePicker) {\r\n const { startDateControl, endDateControl } = (inputConfig as IDateRangePickerInput) || {};\r\n if (!startDateControl || !endDateControl) {\r\n return asArray ? ['Start/End Form control is not found'] : 'Start/End Form control is not found';\r\n }\r\n const startControl = formGroup.controls[`${inputConfig.id}.${startDateControl}`] || formGroup.controls[startDateControl];\r\n const endControl = formGroup.controls[`${inputConfig.id}.${endDateControl}`] || formGroup.controls[endDateControl];\r\n\r\n return returnError(\r\n { ...startControl?.errors, ...endControl?.errors },\r\n asArray\r\n );\r\n }\r\n\r\n if (!control && !dateRangePicker) {\r\n const msg = `Form control ${inputConfig.id} is not found`;\r\n return asArray ? [msg] : msg;\r\n }\r\n\r\n return returnError(control?.errors ?? null, asArray);\r\n\r\n\r\n\r\n function returnError(errors: ValidationErrors | null, asArray: boolean): string | string[] | undefined {\r\n if (!errors) return undefined;\r\n\r\n // Check for temporary error first (single message, high priority)\r\n if (errors['temporaryError']) {\r\n const msg = typeof errors['temporaryError'] === 'string'\r\n ? errors['temporaryError']\r\n : 'Validation error';\r\n return asArray ? [msg] : msg;\r\n }\r\n\r\n const keys = Object.keys(errors).filter(k => k !== 'temporaryError');\r\n if (keys.length === 0) return undefined;\r\n\r\n const errorMessages = keys.map((key) => resolveErrorMessage(key, errors[key]));\r\n\r\n return asArray ? errorMessages : errorMessages.join(', ');\r\n }\r\n}","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\r\nimport type { ITowerStepColumn, FormBuilderFunctions } from 'ngx-t-forms-types';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatInputModule } from '@angular/material/input';\r\n\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { MscoaReactiveFormFieldComponent } from './elements/mscoa-reactive-form-field/mscoa-reactive-form-field.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n\r\n/**\r\n * Renders an MSCOA (Municipal Standard Chart of Accounts) form input — a\r\n * segmented reactive form field that lets the user pick an account by\r\n * walking the MSCOA tree. Surfaces validation status via\r\n * `TFormInputStatusComponent`.\r\n *\r\n * Inputs:\r\n * - `inputConfig: ITowerStepColumn` — required, descriptor for this MSCOA input.\r\n * - `editorMode: boolean` — default `false`; when `true`, renders in\r\n * builder-editor mode rather than user-facing mode.\r\n * - `formGroup: FormGroup` — required, the parent reactive form group that\r\n * owns this input's controls.\r\n * - `formBuilderFunctions: FormBuilderFunctions | undefined` — optional\r\n * builder hooks supplied when used inside the form builder.\r\n *\r\n * Outputs:\r\n * - `reload: void` — fires when the input requests its\r\n * container reload the underlying data (e.g., after a tree refresh).\r\n */\r\n@Component({\r\n selector: 'lib-mscoa-form-input',\r\n imports: [\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n TFormInputStatusComponent,\r\n MscoaReactiveFormFieldComponent,\r\n ],\r\n templateUrl: './mscoa-form-input.component.html',\r\n styleUrl: './mscoa-form-input.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MscoaFormInputComponent {\r\n /** Descriptor for this MSCOA input. */\r\n readonly inputConfig = input.required<ITowerStepColumn>();\r\n /** When `true`, renders in builder-editor mode rather than user-facing mode. */\r\n readonly editorMode = input<boolean>(false);\r\n /** Parent reactive form group that owns this input's controls. */\r\n readonly formGroup = input.required<FormGroup>();\r\n /** Optional builder hooks supplied when used inside the form builder. */\r\n readonly formBuilderFunctions = input<FormBuilderFunctions | undefined>(undefined);\r\n\r\n /** Fires when the input requests its container reload the underlying data. */\r\n readonly reload = output<void>();\r\n\r\n protected get errorMessage(): string | string[] | undefined {\r\n return getInputErrorMessage(this.inputConfig(), this.formGroup(), true);\r\n }\r\n}\r\n","<form [formGroup]=\"formGroup()\">\r\n @if (inputConfig(); as inputConfig) {\r\n <mat-form-field\r\n [appearance]=\"inputConfig.appearance || 'fill'\"\r\n [floatLabel]=\"'always'\"\r\n subscriptSizing=\"dynamic\">\r\n <mat-label>\r\n {{ inputConfig.label }}\r\n <lib-t-form-input-status\r\n [inputConfig]=\"inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n\r\n\r\n <lib-mscoa-reactive-form-field\r\n [inputConfig]=\"inputConfig\"\r\n [formControlName]=\"inputConfig.id\"\r\n [required]=\"inputConfig.required\"\r\n [formGroup]=\"formGroup()\"\r\n [editorMode]=\"editorMode()\"\r\n [formBuilderFunctions]=\"formBuilderFunctions()\"\r\n ></lib-mscoa-reactive-form-field>\r\n\r\n\r\n\r\n\r\n @if (inputConfig.hintLabel || inputConfig.temporaryHint) {\r\n <mat-hint class=\"inputHint\">\r\n {{ inputConfig.temporaryHint || inputConfig.hintLabel }}\r\n </mat-hint>\r\n }\r\n\r\n @if ((errorMessage || []).length > 0) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">\r\n <ul style=\" margin: 0px;\r\n padding-left: 16px;\">\r\n @for (err of errorMessage; track err) {\r\n <li>\r\n {{ err }}\r\n </li>\r\n }\r\n </ul>\r\n\r\n </mat-error>\r\n }\r\n @if (inputConfig.canReload?.canReload) {\r\n <button mat-icon-button\r\n style=\"margin-right: 4px;\"\r\n matTooltip=\"Click to refresh this field.\"\r\n class=\"input-sync-button\"\r\n (click)=\"inputConfig.canReload.emit()\" matSuffix>\r\n <mat-icon style=\"color:var(--mat-sys-primary)\">sync</mat-icon>\r\n </button>\r\n }\r\n <!-- Prefix Icon -->\r\n @if (inputConfig.prefixIcon) {\r\n <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n }\r\n\r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n @if (inputConfig.suffixIcon) {\r\n @if (inputConfig.id !== 'password') {\r\n <mat-icon matSuffix>{{ inputConfig.suffixIcon }}</mat-icon>\r\n }\r\n <!-- <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"inputConfig.togglePasswordVisibility()\"\r\n mat-icon-button matSuffix>\r\n <mat-icon>{{ inputConfig.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\r\n </button> -->\r\n }\r\n\r\n <!-- Prefix & Suffix Text -->\r\n @if (inputConfig.prefixText) {\r\n <span matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n }\r\n @if (inputConfig.suffixText) {\r\n <span matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText }}</span>\r\n }\r\n\r\n <!-- Character Count Hint -->\r\n @if (inputConfig.maxLength && formGroup()) {\r\n <mat-hint align=\"end\">\r\n {{ (formGroup().controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength }}\r\n </mat-hint>\r\n }\r\n\r\n\r\n </mat-form-field>\r\n }\r\n\r\n\r\n\r\n\r\n</form>\r\n","import type { Options } from \"signature_pad\";\r\n\r\n export const SignatureConfigOptions: Options = {\r\n // Pen properties\r\n dotSize: 2,\r\n minWidth: 0.5,\r\n maxWidth: 2.5,\r\n penColor: '#000000',\r\n \r\n // Canvas background\r\n backgroundColor: '#ffffff',\r\n \r\n // Performance and quality\r\n velocityFilterWeight: 0.9, // Increase from 0.7\r\n minDistance: 2.0, // Increase from 1.0 to reduce points\r\n throttle: 8, // Reduce from 16 for smoother lines\r\n \r\n // Composite operation for drawing\r\n compositeOperation: 'source-over' as GlobalCompositeOperation,\r\n \r\n // Canvas context options\r\n canvasContextOptions: {\r\n alpha: true,\r\n desynchronized: true,\r\n willReadFrequently: false \r\n }\r\n }","import CryptoJS from 'crypto-js';\r\nimport type { EncryptedData } from 'ngx-t-forms-types';\r\n\r\nconst ITERATIONS = 100000;\r\nconst KEY_LENGTH = 32;\r\n\r\nasync function encrypt(value: string, secret: string): Promise<EncryptedData> {\r\n if (!value || !secret) throw new Error('Missing required parameters');\r\n\r\n try {\r\n const salt = crypto.getRandomValues(new Uint8Array(16));\r\n const iv = crypto.getRandomValues(new Uint8Array(16));\r\n \r\n const saltWords = CryptoJS.lib.WordArray.create(salt);\r\n const ivWords = CryptoJS.lib.WordArray.create(iv);\r\n \r\n const key = CryptoJS.PBKDF2(secret, saltWords, {\r\n keySize: KEY_LENGTH / 4,\r\n iterations: ITERATIONS,\r\n hasher: CryptoJS.algo.SHA256\r\n });\r\n\r\n // Convert input to WordArray\r\n const messageWords = CryptoJS.enc.Utf8.parse(value);\r\n\r\n const encrypted = CryptoJS.AES.encrypt(messageWords, key, {\r\n iv: ivWords,\r\n mode: CryptoJS.mode.CBC,\r\n padding: CryptoJS.pad.Pkcs7\r\n });\r\n\r\n const hmac = CryptoJS.HmacSHA256(encrypted.ciphertext.toString(), key);\r\n\r\n return {\r\n ciphertext: CryptoJS.enc.Base64.stringify(encrypted.ciphertext),\r\n salt: CryptoJS.enc.Base64.stringify(saltWords),\r\n iv: CryptoJS.enc.Base64.stringify(ivWords),\r\n hmac: hmac.toString(CryptoJS.enc.Base64)\r\n };\r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n\r\nasync function decrypt(encrypted: EncryptedData, secret: string): Promise<string> {\r\n if (!encrypted || !encrypted.salt || !secret || typeof encrypted.iv !=='string' ||typeof encrypted.salt !=='string' ) {\r\n \r\n\r\n throw new Error('Encrypted data is missing or corrupt');\r\n\r\n\r\n }\r\n try {\r\n \r\n const salt = CryptoJS.enc.Base64.parse(encrypted.salt);\r\n const iv = CryptoJS.enc.Base64.parse(encrypted.iv);\r\n const ciphertext = CryptoJS.enc.Base64.parse(encrypted.ciphertext);\r\n \r\n const key = CryptoJS.PBKDF2(secret, salt, {\r\n keySize: KEY_LENGTH / 4,\r\n iterations: ITERATIONS,\r\n hasher: CryptoJS.algo.SHA256\r\n });\r\n\r\n const computedHmac = CryptoJS.HmacSHA256(ciphertext.toString(), key)\r\n .toString(CryptoJS.enc.Base64);\r\n \r\n if (computedHmac !== encrypted.hmac) {\r\n throw new Error('Invalid HMAC - data may be tampered');\r\n }\r\n\r\n const decrypted = CryptoJS.AES.decrypt(\r\n CryptoJS.lib.CipherParams.create({\r\n ciphertext: ciphertext\r\n }),\r\n key,\r\n {\r\n iv: iv,\r\n mode: CryptoJS.mode.CBC,\r\n padding: CryptoJS.pad.Pkcs7\r\n }\r\n );\r\n\r\n return decrypted.toString(CryptoJS.enc.Utf8);\r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n\r\nexport { encrypt, decrypt };\r\nexport type { EncryptedData };","import { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport CryptoJS from 'crypto-js';\r\n\r\n// `crypto-js` is CommonJS — destructure from the default export rather than using\r\n// named ESM imports, so Node ESM consumers (SSR, smoke harness) resolve cleanly.\r\nconst { HmacSHA256, enc } = CryptoJS;\r\n\r\n/**\r\n * Derives a deterministic 32-char HMAC key for a given form input, salted by\r\n * the consumer-supplied secret. The secret must be configured via\r\n * `withInputSecret()` and read from `INPUT_SECRET_TOKEN` at the callsite —\r\n * this function does not (and cannot, as a free helper) inject it itself.\r\n *\r\n * @param input Input descriptor; its identity fields seed the primary digest.\r\n * @param secret Consumer-supplied HMAC secret. Throws if missing.\r\n */\r\nexport const generateSecretKey = async (\r\n input: FormColumnInputs,\r\n secret: string,\r\n): Promise<string> => {\r\n if (!input) {\r\n throw new Error('Input is required to generate secret key');\r\n }\r\n if (!secret) {\r\n throw new Error(\r\n '[ngx-t-forms] generateSecretKey: secret is required. Configure it via withInputSecret() and inject INPUT_SECRET_TOKEN at the callsite.',\r\n );\r\n }\r\n\r\n const { id, element, formControlName, sectionId } = input;\r\n const pepper = 'NGX_T_FORMS_V1';\r\n const timestamp = new Date().getTimezoneOffset();\r\n\r\n const primarySeed = `${id}:${formControlName}:${element}:${sectionId}`;\r\n const enrichedSeed = `${pepper}:${primarySeed}:${timestamp}`;\r\n\r\n const firstHash = HmacSHA256(enrichedSeed, secret);\r\n const secondHash = HmacSHA256(firstHash.toString(), secret + pepper);\r\n\r\n return secondHash.toString(enc.Hex).substring(0, 32);\r\n};\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n NgZone,\r\n Optional,\r\n PLATFORM_ID,\r\n Self,\r\n ViewEncapsulation,\r\n effect,\r\n inject,\r\n input,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { NgControl } from '@angular/forms';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport type { default as SignaturePadType, PointGroup } from 'signature_pad';\r\nimport { FormColumnInputs, IUserSignature } from 'ngx-t-forms-types';\r\n\r\nimport { debounceTime, finalize, firstValueFrom, Subject, take } from 'rxjs';\r\n\r\nimport {\r\n BaseCustomInput,\r\n BaseCustomInputConfig,\r\n} from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { SignatureConfigOptions } from '../../config/signature';\r\nimport {\r\n decrypt,\r\n encrypt,\r\n EncryptedData,\r\n} from '../../../../../../shared/functions/enryption';\r\nimport { generateSecretKey } from '../../../../../../services/core/t-input-controller/functions/generateInputSecret';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN, INPUT_SECRET_TOKEN } from '../../../../../../injection-tokens';\r\n\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'lib-signature-pad-input',\r\n nextId: 0,\r\n};\r\n\r\n@Component({\r\n selector: 'lib-signature-pad-input',\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatProgressSpinnerModule,\r\n MatTooltipModule,\r\n ],\r\n templateUrl: './signature-pad-input.component.html',\r\n styleUrl: './signature-pad-input.component.css',\r\n providers: [\r\n {\r\n provide: MatFormFieldControl,\r\n useExisting: SignaturePadInputComponent,\r\n },\r\n ],\r\n encapsulation: ViewEncapsulation.Emulated,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SignaturePadInputComponent\r\n extends BaseCustomInput<PointGroup[] | undefined>\r\n implements AfterViewInit\r\n{\r\n readonly NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n readonly #inputSecret = inject(INPUT_SECRET_TOKEN, { optional: true });\r\n\r\n /** Column descriptor that drives this signature pad's behaviour. */\r\n readonly inputConfig = input.required<FormColumnInputs>();\r\n\r\n protected readonly signatureElement =\r\n viewChild<ElementRef<HTMLDivElement>>('signature');\r\n\r\n signaturePad: SignaturePadType | undefined;\r\n\r\n override get empty(): boolean {\r\n const n = this.value;\r\n // Check for null, undefined, or empty string, but allow 0\r\n return (\r\n n === null ||\r\n n === undefined ||\r\n (n as PointGroup[] | string).length === 0\r\n );\r\n }\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n\r\n readonly #signatureSubject = new Subject<void>();\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #cdr = inject(ChangeDetectorRef);\r\n readonly #ngZone = inject(NgZone);\r\n readonly #platformId = inject(PLATFORM_ID);\r\n readonly #document = inject(DOCUMENT);\r\n\r\n /**\r\n * Bridge for the legacy `@Input() set inputConfig(...)` setter. The original\r\n * setter body only assigned to a backing field; runtime behaviour now reads\r\n * the signal directly via `this.inputConfig()`. The effect keeps `#config`\r\n * in sync for any synchronous code paths that still want a snapshot.\r\n */\r\n protected readonly inputConfigBridge = effect(() => {\r\n this.#config = this.inputConfig();\r\n });\r\n\r\n #config!: FormColumnInputs;\r\n\r\n #requireSecret(): string {\r\n if (!this.#inputSecret) {\r\n throw new Error(\r\n '[ngx-t-forms] Signature input requires an HMAC secret. Configure it via withInputSecret(secret) when calling provideNgxTForms().',\r\n );\r\n }\r\n return this.#inputSecret;\r\n }\r\n\r\n /**\r\n * Runtime guard for the encrypted payload stored in `this.value`. The base\r\n * class types `value` as `PointGroup[] | null`, but this control persists the\r\n * encrypted signature (an {@link EncryptedData} object) there. This guard is\r\n * the single typed boundary that recovers the real shape without an unsafe\r\n * double cast.\r\n */\r\n #isEncryptedData(value: unknown): value is EncryptedData {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n 'ciphertext' in value &&\r\n typeof value.ciphertext === 'string' &&\r\n 'salt' in value &&\r\n typeof value.salt === 'string' &&\r\n 'iv' in value &&\r\n typeof value.iv === 'string' &&\r\n 'hmac' in value &&\r\n typeof value.hmac === 'string'\r\n );\r\n }\r\n\r\n /**\r\n * Persists the encrypted signature payload into the control's value slot.\r\n *\r\n * The base {@link BaseCustomInput} types `value` as `PointGroup[] | null`\r\n * (the MatFormFieldControl value type), but this control stores the encrypted\r\n * {@link EncryptedData} object at rest and only materialises `PointGroup[]`\r\n * after decryption (recovered via {@link #isEncryptedData}). This helper is\r\n * the single, explicit point where the encrypted shape crosses into the\r\n * value slot. The base setter's declared parameter type is fixed by the\r\n * MatFormFieldControl contract and cannot be widened from here, so the\r\n * crossing is funnelled through one typed parameter rather than scattered\r\n * double casts at each call site.\r\n */\r\n #writeEncryptedValue(encrypted: EncryptedData): void {\r\n this.value = encrypted as never;\r\n }\r\n\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>,\r\n ) {\r\n super(ngControl, elementRef, customInputConfig);\r\n this.#signatureSubject\r\n .pipe(debounceTime(500), takeUntilDestroyed(this.#destroyRef))\r\n .subscribe(async () => {\r\n await this.saveSignature();\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.loading = 'Initializing signature pad ...';\r\n this.initSignature();\r\n }\r\n\r\n initSignature(): void {\r\n if (!isPlatformBrowser(this.#platformId)) {\r\n this.loading = undefined;\r\n return;\r\n }\r\n this.#ngZone.runOutsideAngular(async () => {\r\n try {\r\n const host = this.signatureElement()?.nativeElement;\r\n if (!host) {\r\n return;\r\n }\r\n const canvas = this.#document.createElement('canvas');\r\n // Set canvas dimensions\r\n canvas.width = host.offsetWidth;\r\n canvas.height = 200; // You can adjust this value\r\n\r\n // Append canvas to the div\r\n host.appendChild(canvas);\r\n // Dynamically load browser-only UMD bundle (SSR-safe — gated above).\r\n const { default: SignaturePad } = await import('signature_pad');\r\n // Initialize SignaturePad\r\n this.signaturePad = new SignaturePad(canvas, SignatureConfigOptions);\r\n // Load initial value if exists\r\n\r\n if (\r\n this.value !== undefined &&\r\n this.value !== null &&\r\n (this.value as PointGroup[] | string) !== ''\r\n ) {\r\n await this.initLoadValue();\r\n } else {\r\n await this.loadUserDigitalSignatureFromAPI();\r\n }\r\n\r\n // Add event listeners for changes\r\n this.signaturePad.addEventListener(\r\n 'afterUpdateStroke',\r\n () => {\r\n this.#signatureSubject.next();\r\n this.canSaveSignature = true;\r\n },\r\n { once: false },\r\n );\r\n if (!!this.inputConfig().readonly) {\r\n this.signaturePad.off();\r\n }\r\n this.loading = undefined;\r\n } catch {\r\n // swallow init errors — pad will remain uninitialized; loading cleared below\r\n }\r\n });\r\n }\r\n\r\n async initLoadValue(): Promise<void> {\r\n try {\r\n this.loading = 'Loading signature ...';\r\n\r\n // Load user signature\r\n const secret = await generateSecretKey(this.inputConfig(), this.#requireSecret());\r\n if (!secret) {\r\n this.loading = undefined;\r\n return;\r\n }\r\n\r\n const encrypted: unknown = this.value;\r\n if (!this.#isEncryptedData(encrypted)) {\r\n this.loading = undefined;\r\n return;\r\n }\r\n\r\n const decrypted: string = await decrypt(encrypted, secret);\r\n\r\n let parsed: PointGroup[];\r\n try {\r\n parsed = JSON.parse(decrypted || '[]');\r\n } catch {\r\n this.loading = undefined;\r\n return;\r\n }\r\n this.NGX_T_FORMS_CONFIG.formBuilder.toastSuccess(\r\n 'Signature loaded successfully',\r\n );\r\n this.signaturePad?.fromData(parsed);\r\n } catch {\r\n // ignore decryption failures\r\n } finally {\r\n this.loading = undefined;\r\n }\r\n }\r\n\r\n #loading?: string;\r\n get loading(): string | undefined {\r\n return this.#loading;\r\n }\r\n set loading(value: string | undefined) {\r\n this.#loading = value;\r\n this.#cdr.markForCheck(); // Replace detectChanges() with markForCheck()\r\n }\r\n\r\n async #processSignatureData(data: PointGroup[]): Promise<string> {\r\n // Process in chunks if data is large\r\n if (data.length > 1000) {\r\n const chunkSize = 1000;\r\n const chunks: PointGroup[][] = [];\r\n for (let i = 0; i < data.length; i += chunkSize) {\r\n chunks.push(data.slice(i, i + chunkSize));\r\n }\r\n return JSON.stringify(await Promise.all(chunks.map((chunk) => chunk)));\r\n }\r\n return JSON.stringify(data);\r\n }\r\n\r\n saveSignature = async (): Promise<PointGroup[] | null> => {\r\n // FIXME: This function causes app rendering to freeze for a few ms\r\n // 4 hours trying speed this function good luck next time\r\n try {\r\n if (!this.signaturePad) {\r\n return null;\r\n }\r\n\r\n // get this from user profile\r\n const data = this.signaturePad.toData();\r\n\r\n // send this to api to save\r\n\r\n if (!data?.length) {\r\n return null;\r\n }\r\n\r\n this.loading = 'Securing signature ...';\r\n const secrete = await generateSecretKey(this.inputConfig(), this.#requireSecret());\r\n if (!secrete) {\r\n this.loading = undefined;\r\n return null;\r\n }\r\n\r\n const processedData = await this.#processSignatureData(data);\r\n const encrypted: EncryptedData = await encrypt(processedData, secrete);\r\n this.#writeEncryptedValue(encrypted);\r\n\r\n this.onChange(this.value);\r\n this.stateChanges.next();\r\n this.loading = undefined;\r\n this.canApplySignature = false;\r\n return data;\r\n } catch {\r\n this.loading = undefined;\r\n this.canApplySignature = false;\r\n return null;\r\n }\r\n };\r\n\r\n clearSignature(): void {\r\n this.signaturePad?.clear();\r\n this.value = undefined;\r\n this.onChange(this.value);\r\n this.stateChanges.next();\r\n this.canSaveSignature = false;\r\n this.canApplySignature = false;\r\n this.userStoredSignature = undefined;\r\n this.loading = undefined;\r\n }\r\n\r\n override ngOnDestroy(): void {\r\n this.signaturePad?.off(); // Remove event listeners\r\n this.stateChanges.complete();\r\n }\r\n\r\n canSaveSignature = false;\r\n canApplySignature = false;\r\n userStoredSignature: IUserSignature | undefined;\r\n\r\n getUserUrl(): string {\r\n const userPicture =\r\n this.userStoredSignature?.pictureUrl ||\r\n `https://ui-avatars.com/api/?name=${this.userStoredSignature?.userName}&background=random&rounded=true&size=32&bold=true`;\r\n return userPicture;\r\n }\r\n\r\n async loadUserDigitalSignatureFromAPI(): Promise<void> {\r\n if (!this.NGX_T_FORMS_CONFIG.formBuilder.getUserSignature) {\r\n return;\r\n }\r\n const cfg = this.#config;\r\n if (cfg?.disabled || !!cfg?.readonly) {\r\n return;\r\n }\r\n\r\n try {\r\n this.loading = 'Loading signature...';\r\n\r\n this.userStoredSignature = await firstValueFrom(\r\n this.NGX_T_FORMS_CONFIG.formBuilder.getUserSignature().pipe(take(1)),\r\n );\r\n\r\n if (!this.userStoredSignature?.dataPoints) {\r\n throw new Error('Invalid signature data received');\r\n }\r\n\r\n this.signaturePad?.fromData(this.userStoredSignature.dataPoints);\r\n this.canApplySignature = true;\r\n } catch {\r\n // ignore failures — pad stays empty\r\n } finally {\r\n this.loading = undefined;\r\n }\r\n }\r\n\r\n saveUserSignature(): null {\r\n if (!this.signaturePad) {\r\n return null;\r\n }\r\n const data = this.signaturePad.toData();\r\n this.loading = 'Saving signature ...';\r\n this.NGX_T_FORMS_CONFIG.formBuilder\r\n .saveUserSignature(data)\r\n .pipe(\r\n take(1),\r\n finalize(() => {\r\n this.loading = undefined;\r\n this.canSaveSignature = false;\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n )\r\n .subscribe(() => {\r\n // no-op: side effects handled in finalize()\r\n });\r\n return null;\r\n }\r\n}\r\n","<div class=\"signature-field\" [class.signature-field--readonly]=\"inputConfig().readonly\">\n <!-- Drawing surface — the <canvas> is appended here imperatively at runtime. -->\n <div\n #signature\n class=\"signature-container\"\n [class.signature-container--preview]=\"canApplySignature\"\n ></div>\n\n <!-- Footer: trust note on the left, contextual actions on the right. -->\n <div class=\"signature-toolbar\">\n <span class=\"signature-trust\">\n <mat-icon class=\"signature-trust__icon\" aria-hidden=\"true\">verified_user</mat-icon>\n <span class=\"signature-trust__text\">\n <span class=\"signature-trust__title\">Signature</span>\n <span class=\"signature-trust__subtitle\">Secured &amp; encrypted</span>\n </span>\n </span>\n\n <span class=\"spacer\"></span>\n\n @if (canSaveSignature) {\n <button\n type=\"button\"\n mat-button\n class=\"signature-action signature-action--save\"\n matTooltip=\"Save this signature for quick use in future documents\"\n (click)=\"saveUserSignature()\"\n >\n <mat-icon>bookmark_add</mat-icon>\n <span class=\"signature-action__label\">Save for future use</span>\n </button>\n }\n\n @if (!inputConfig().readonly) {\n <button\n type=\"button\"\n mat-stroked-button\n class=\"signature-action signature-action--clear\"\n (click)=\"clearSignature()\"\n >\n <mat-icon>ink_eraser</mat-icon>\n <span class=\"signature-action__label\">Clear</span>\n </button>\n }\n </div>\n\n <!-- Prompt to re-use a previously saved signature. Floats over the faint preview. -->\n @if (canApplySignature && !inputConfig().disabled && !inputConfig().readonly) {\n <div class=\"signature-overlay\">\n <div class=\"signature-card\">\n <div class=\"signature-card__head\">\n <img\n class=\"signature-card__avatar\"\n [src]=\"getUserUrl()\"\n [attr.aria-label]=\"'Profile picture of ' + userStoredSignature?.userName\"\n alt=\"\"\n />\n <div class=\"signature-card__heading\">\n <span class=\"signature-card__title\">Found an existing signature</span>\n <div class=\"signature-card__meta\">\n <span class=\"signature-card__meta-item\">\n <mat-icon aria-hidden=\"true\">person</mat-icon>\n <span class=\"oneLineTextEllipsis\">{{ userStoredSignature?.userName }}</span>\n </span>\n <span class=\"signature-card__meta-item\">\n <mat-icon aria-hidden=\"true\">calendar_month</mat-icon>\n {{ userStoredSignature?.signatureDate | date: 'mediumDate' }}\n </span>\n </div>\n </div>\n </div>\n\n <p class=\"signature-card__description\">\n Apply your saved signature, or clear the pad to draw a new one.\n </p>\n\n <div class=\"signature-card__actions\">\n <button\n type=\"button\"\n mat-flat-button\n color=\"primary\"\n class=\"signature-card__apply\"\n (click)=\"saveSignature()\"\n [matTooltip]=\"'Apply your saved signature from ' + (userStoredSignature?.signatureDate | date: 'mediumDate')\"\n >\n <mat-icon>draw</mat-icon>\n <span>Apply signature</span>\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Blocking progress overlay for async secure operations. -->\n @if (loading) {\n <div class=\"signature-loading\">\n <mat-spinner diameter=\"40\"></mat-spinner>\n <span class=\"signature-loading__text\">{{ loading }}</span>\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport type { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { SignaturePadInputComponent } from './core/signature-pad-input/signature-pad-input.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n/**\r\n * Form input that captures a hand-drawn signature via `SignaturePadInputComponent`\r\n * and writes the resulting image to the bound `FormGroup` control. Surfaces\r\n * validation state through `TFormInputStatusComponent`.\r\n *\r\n * Inputs:\r\n * - `inputConfig: ITowerStepColumn` — required, descriptor for this input.\r\n * - `formGroup: FormGroup` — required, the parent reactive form group.\r\n *\r\n * Outputs:\r\n * - `reload: void` — fires when the input requests its container reload\r\n * (e.g., after clearing the pad).\r\n *\r\n * @public\r\n */\r\n@Component({\r\n selector: 'lib-signature-input-element',\r\n templateUrl: './signature-input-element.component.html',\r\n styleUrl: './signature-input-element.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatButtonModule,\r\n MatTooltipModule,\r\n TFormInputStatusComponent,\r\n SignaturePadInputComponent,\r\n ],\r\n})\r\nexport class SignatureInputElementComponent {\r\n readonly inputConfig = input.required<ITowerStepColumn>();\r\n readonly formGroup = input.required<FormGroup>();\r\n readonly reload = output<void>();\r\n\r\n protected readonly errorMessage = computed(() =>\r\n getInputErrorMessage(this.inputConfig(), this.formGroup()),\r\n );\r\n}\r\n","<form [formGroup]=\"formGroup()\">\r\n @if (inputConfig(); as inputConfig) {\r\n <mat-form-field\r\n [appearance]=\"inputConfig.appearance || 'fill'\"\r\n [floatLabel]=\"'always'\"\r\n subscriptSizing=\"dynamic\"\r\n >\r\n <mat-label>\r\n {{ inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n\r\n <lib-signature-pad-input\r\n [inputConfig]=\"inputConfig\"\r\n [required]=\"inputConfig.required\"\r\n [formControlName]=\"inputConfig.id\"\r\n ></lib-signature-pad-input>\r\n\r\n @if (inputConfig.hintLabel || inputConfig.temporaryHint) {\r\n <mat-hint class=\"inputHint\">\r\n {{ inputConfig.temporaryHint || inputConfig.hintLabel }}\r\n </mat-hint>\r\n }\r\n\r\n @if (!!errorMessage()) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{ errorMessage() }}</mat-error>\r\n }\r\n\r\n @if (inputConfig && inputConfig.canReload && inputConfig.canReload.canReload) {\r\n <button\r\n mat-icon-button\r\n style=\"margin-right: 4px;\"\r\n matTooltip=\"Click to refresh this field.\"\r\n class=\"input-sync-button\"\r\n (click)=\"inputConfig.canReload.emit()\"\r\n matSuffix\r\n >\r\n <mat-icon style=\"color: var(--mat-sys-primary)\">sync</mat-icon>\r\n </button>\r\n }\r\n\r\n @if (inputConfig.prefixIcon) {\r\n <mat-icon matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n }\r\n\r\n @if (inputConfig.suffixIcon && inputConfig.id !== 'password') {\r\n <mat-icon matSuffix>{{ inputConfig.suffixIcon }}</mat-icon>\r\n }\r\n\r\n @if (inputConfig.prefixText) {\r\n <span matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n }\r\n @if (inputConfig.suffixText) {\r\n <span matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText }}</span>\r\n }\r\n\r\n @if (inputConfig.maxLength && formGroup()) {\r\n <mat-hint align=\"end\">\r\n {{ (formGroup().controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength }}\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n }\r\n</form>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'searchList',\r\n standalone: true,\r\n})\r\nexport class SearchListPipe implements PipeTransform {\r\n /**\r\n * Filters an array of items by a search key. Items may be primitive strings,\r\n * shallow records, or one-level-nested records — the pipe checks every reachable\r\n * string leaf for a regex match. Generic over T so the consumer template keeps the\r\n * element type.\r\n */\r\n transform<T>(value: readonly T[] | null | undefined, searchKey?: string | null): readonly T[] {\r\n if ( !value || !Array.isArray(value) || value.length === 0 || !searchKey || searchKey.trim() === '') {\r\n return value ?? [];\r\n }\r\n const regex = new RegExp(searchKey.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'i');\r\n return value.filter(item => {\r\n if (typeof item === \"string\") {\r\n return regex.test(item);\r\n }\r\n if (typeof item !== 'object' || item === null) {\r\n return false;\r\n }\r\n // Check if any string property value within the document matches the regex.\r\n return Object.values(item as Record<string, unknown>).some(value => {\r\n if(typeof value === 'object' && value !== null) {\r\n return Object.values(value as Record<string, unknown>).some(val => typeof val === 'string' && regex.test(val));\r\n }\r\n return typeof value === 'string' && regex.test(value)\r\n }\r\n\r\n );\r\n })\r\n\r\n\r\n\r\n }\r\n}\r\n\r\n\r\n\r\n","import { AbstractControl, ValidatorFn, ValidationErrors } from '@angular/forms';\nimport { validateExpressionSyntax } from '../../../../../shared/modules/stringJsonValidator/getObjectValidations';\nimport { evaluatePredicate } from '../../../../../shared/functions/array-access/predicate-dsl';\n\n/**\n * Creates a validator that checks predicate-expression syntax.\n *\n * The engine ({@link evaluatePredicate}) is the source of truth for what counts\n * as a valid expression: it is a superset of the legacy grammar (deep paths,\n * multi-word strings, `!`, keyword operators, paren-aware precedence). Anything\n * the engine accepts is accepted here — we never reject an expression the\n * runtime would happily evaluate. When the engine rejects it, we fall back to\n * {@link validateExpressionSyntax} to surface a friendly, specific message.\n *\n * @returns {ValidatorFn} A validator function.\n */\nexport function expressionSyntaxValidator(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n // If the control is empty, don't perform validation.\n // Use Validators.required alongside this validator if the field is mandatory.\n if (!control.value) {\n return null;\n }\n\n const expression = control.value as string;\n\n // Source of truth: if the engine can parse & evaluate it (against an empty\n // sample), the syntax is valid. Evaluating against `{}` never throws for a\n // structurally-valid expression — only malformed grammar throws.\n try {\n evaluatePredicate(expression, {});\n return null;\n } catch {\n // Engine rejected it — derive a human-friendly message from the linter.\n try {\n const message = validateExpressionSyntax(expression);\n return { invalidExpression: message || 'The expression syntax is invalid.' };\n } catch (error) {\n const invalidExpression =\n error instanceof Error ? error.message : 'An unexpected validation error occurred.';\n return { invalidExpression };\n }\n }\n };\n}\n","export function searchAndOrderArray<T extends object>(\r\n arr: readonly T[],\r\n searchTerm: string,\r\n filterBy: keyof T & string\r\n): T[] {\r\n // Filter the array based on the search term\r\n const filteredArr = arr.filter((obj) =>\r\n searchTerm\r\n ? String((obj as Record<string, unknown>)[filterBy]).toLowerCase().includes(searchTerm.toLowerCase())\r\n : true\r\n );\r\n\r\n // Order the filtered array alphabetically by name\r\n const orderedArr = [...filteredArr].sort((a, b) =>\r\n String((a as Record<string, unknown>)[filterBy]).localeCompare(String((b as Record<string, unknown>)[filterBy]))\r\n );\r\n\r\n return orderedArr;\r\n}\r\n","import { FunctionTypes } from 'ngx-t-forms-types';\n\n/**\n * Bridge between the no-code guided builders in `lib-data-tree` and the\n * `IArrayFunction.expression` **string** (the frozen public contract).\n *\n * Every operation has a structured builder model. {@link parseToBuilder}\n * best-effort parses an expression string into that model; {@link serializeBuilder}\n * turns a model back into a valid expression string. When an expression cannot\n * be represented structurally (e.g. a hand-typed predicate with parentheses or\n * negation), parsing yields a `{ kind: 'raw' }` model and the UI shows the raw\n * editor — so power users and legacy configs are never locked out.\n *\n * The builders enforce the grammar documented in `docs/array-transform-rules.md`\n * by construction: a model can only serialise to a valid expression.\n *\n * @internal\n */\n\n// --- shared option lists (rendered by the UI) --------------------------------\n\n/** Predicate operators offered in the condition builder, with friendly labels. */\nexport const PREDICATE_OPERATORS: readonly { value: string; label: string }[] = [\n { value: '===', label: 'is' },\n { value: '!==', label: 'is not' },\n { value: '>', label: 'greater than' },\n { value: '<', label: 'less than' },\n { value: '>=', label: 'at least' },\n { value: '<=', label: 'at most' },\n { value: 'includes', label: 'contains' },\n { value: 'startsWith', label: 'starts with' },\n { value: 'endsWith', label: 'ends with' },\n { value: 'matches', label: 'matches (regex)' },\n { value: 'in', label: 'is one of' },\n];\n\n/** Reduce aggregates, with friendly labels and whether they need a field. */\nexport const AGGREGATES: readonly { value: string; label: string; needsField: boolean }[] = [\n { value: 'count', label: 'count', needsField: false },\n { value: 'sum', label: 'sum of', needsField: true },\n { value: 'avg', label: 'average of', needsField: true },\n { value: 'min', label: 'minimum of', needsField: true },\n { value: 'max', label: 'maximum of', needsField: true },\n { value: 'first', label: 'first', needsField: false },\n { value: 'last', label: 'last', needsField: false },\n { value: 'join', label: 'join', needsField: true },\n];\n\nexport const SLICE_MODES: readonly { value: SliceMode; label: string }[] = [\n { value: 'first', label: 'First N' },\n { value: 'last', label: 'Last N' },\n { value: 'range', label: 'Range (start–end)' },\n { value: 'fromCount', label: 'From index, N items' },\n];\n\n// --- model ------------------------------------------------------------------\n\nexport interface Condition { field: string; operator: string; value: string; }\nexport interface SortKey { field: string; dir: 'asc' | 'desc'; }\nexport type ProjectionItem =\n | { type: 'field'; field: string }\n | { type: 'rename'; alias: string; path: string }\n | { type: 'literal'; alias: string; value: string }\n | { type: 'spread' };\nexport type SliceMode = 'first' | 'last' | 'range' | 'fromCount';\nexport interface AggItem { alias: string; agg: string; field: string; }\n\nexport type BuilderModel =\n | { kind: 'predicate'; connector: '&&' | '||'; conditions: Condition[] }\n | { kind: 'project'; items: ProjectionItem[] }\n | { kind: 'sort'; keys: SortKey[] }\n | { kind: 'slice'; mode: SliceMode; a: number; b: number }\n | { kind: 'keys'; keys: string[] }\n | { kind: 'flatten'; path: string }\n | { kind: 'reduce'; aggs: AggItem[] }\n | { kind: 'raw'; text: string };\n\n/** The builder kind each operation uses. */\nexport function builderKind(fn: FunctionTypes): BuilderModel['kind'] {\n switch (fn) {\n case FunctionTypes.Filter:\n case FunctionTypes.Find: return 'predicate';\n case FunctionTypes.Map: return 'project';\n case FunctionTypes.Sort: return 'sort';\n case FunctionTypes.Slice: return 'slice';\n case FunctionTypes.Unique:\n case FunctionTypes.GroupBy: return 'keys';\n case FunctionTypes.Flatten: return 'flatten';\n case FunctionTypes.Reduce: return 'reduce';\n default: return 'raw';\n }\n}\n\n// --- helpers ----------------------------------------------------------------\n\nconst KEYWORD_OPS = ['includes', 'startsWith', 'endsWith', 'matches', 'in'] as const;\nconst SYMBOLIC_OPS = ['===', '!==', '==', '!=', '>=', '<=', '>', '<'] as const;\n\nconst unquote = (v: string): string => {\n const t = v.trim();\n if (t.length >= 2) {\n const a = t[0];\n const b = t[t.length - 1];\n if ((a === '\"' && b === '\"') || (a === \"'\" && b === \"'\")) return t.slice(1, -1);\n }\n return t;\n};\n\nconst isBareLiteral = (v: string): boolean =>\n v === 'true' || v === 'false' || v === 'null' || (v.trim() !== '' && !Number.isNaN(Number(v)));\n\n/** Formats a builder value for the expression string (bare for numbers/bools, else quoted). */\nconst formatValue = (v: string): string => (isBareLiteral(v.trim()) ? v.trim() : `\"${v}\"`);\n\nconst toNum = (v: string, fallback = 0): number => {\n const n = Number(v);\n return Number.isNaN(n) ? fallback : n;\n};\n\n// --- parse ------------------------------------------------------------------\n\nfunction parseCondition(part: string): Condition | null {\n const p = part.trim();\n for (const kw of KEYWORD_OPS) {\n const m = p.match(new RegExp(`^(.+?)\\\\s+${kw}\\\\s+(.+)$`, 'i'));\n if (m && m[1] && m[2]) return { field: m[1].trim(), operator: kw, value: unquote(m[2]) };\n }\n for (const op of SYMBOLIC_OPS) {\n const idx = p.indexOf(op);\n if (idx > 0) {\n const field = p.slice(0, idx).trim();\n const value = p.slice(idx + op.length).trim();\n if (field && value) return { field, operator: op, value: unquote(value) };\n }\n }\n return null;\n}\n\nfunction parsePredicate(expr: string): BuilderModel | null {\n const e = expr.trim();\n if (e === '') return { kind: 'predicate', connector: '&&', conditions: [] };\n if (/[()]/.test(e)) return null; // grouping → raw editor\n const hasAnd = e.includes('&&');\n const hasOr = e.includes('||');\n if (hasAnd && hasOr) return null; // mixed connectors → raw editor\n const connector: '&&' | '||' = hasOr ? '||' : '&&';\n const parts = hasOr ? e.split('||') : hasAnd ? e.split('&&') : [e];\n const conditions: Condition[] = [];\n for (const part of parts) {\n const c = parseCondition(part);\n if (!c) return null;\n conditions.push(c);\n }\n return { kind: 'predicate', connector, conditions };\n}\n\nfunction parseProjection(expr: string): BuilderModel | null {\n const e = expr.trim();\n if (e === '') return { kind: 'project', items: [] };\n const items: ProjectionItem[] = [];\n for (const raw of e.split(',')) {\n const t = raw.trim();\n if (t === '') continue;\n if (t === '*') { items.push({ type: 'spread' }); continue; }\n const bo = t.indexOf('{');\n const bc = t.indexOf('}');\n const c = t.indexOf(':');\n const hasBrace = bo !== -1 && bc !== -1 && bc > bo;\n if (hasBrace && c !== -1 && c < bo) {\n items.push({ type: 'rename', alias: t.slice(0, c).trim(), path: t.slice(bo + 1, bc).trim() });\n } else if (hasBrace && c === -1) {\n const path = t.slice(bo + 1, bc).trim();\n const segs = path.split('.');\n items.push({ type: 'rename', alias: (segs[segs.length - 1] ?? '').trim(), path });\n } else if (!hasBrace && c !== -1) {\n items.push({ type: 'literal', alias: t.slice(0, c).trim(), value: unquote(t.slice(c + 1)) });\n } else if (/^[\\w.$-]+$/.test(t)) {\n items.push({ type: 'field', field: t });\n } else {\n return null;\n }\n }\n return { kind: 'project', items };\n}\n\nfunction parseSort(expr: string): BuilderModel {\n const keys: SortKey[] = expr.split(',').map(s => s.trim()).filter(Boolean).map(part => {\n const segs = part.split(/\\s+/);\n return { field: segs[0] ?? '', dir: (segs[1] ?? 'asc').toLowerCase() === 'desc' ? 'desc' : 'asc' };\n });\n return { kind: 'sort', keys };\n}\n\nfunction parseSlice(expr: string): BuilderModel {\n const e = expr.trim();\n if (e.includes(':')) {\n const [a = '', b = ''] = e.split(':');\n return { kind: 'slice', mode: 'range', a: toNum(a), b: toNum(b) };\n }\n if (e.includes(',')) {\n const [a = '', b = ''] = e.split(',');\n return { kind: 'slice', mode: 'fromCount', a: toNum(a), b: toNum(b, 1) };\n }\n const n = toNum(e);\n return n < 0 ? { kind: 'slice', mode: 'last', a: 0, b: -n } : { kind: 'slice', mode: 'first', a: 0, b: n };\n}\n\nfunction parseReduce(expr: string): BuilderModel {\n const toAgg = (spec: string, alias: string): AggItem => {\n const colon = spec.indexOf(':');\n const agg = (colon === -1 ? spec : spec.slice(0, colon)).trim().toLowerCase();\n const field = colon === -1 ? '' : spec.slice(colon + 1).trim();\n return { alias, agg, field };\n };\n if (expr.includes('=')) {\n const aggs = expr.split(',').map(s => s.trim()).filter(Boolean).map(part => {\n const eq = part.indexOf('=');\n return toAgg(part.slice(eq + 1), part.slice(0, eq).trim());\n });\n return { kind: 'reduce', aggs };\n }\n return { kind: 'reduce', aggs: [toAgg(expr.trim() || 'count', '')] };\n}\n\n/** Parses an expression string into a structured builder model for the given operation. */\nexport function parseToBuilder(fn: FunctionTypes, expression: string): BuilderModel {\n const kind = builderKind(fn);\n switch (kind) {\n case 'predicate': return parsePredicate(expression) ?? { kind: 'raw', text: expression };\n case 'project': return parseProjection(expression) ?? { kind: 'raw', text: expression };\n case 'sort': return parseSort(expression);\n case 'slice': return parseSlice(expression);\n case 'keys': return { kind: 'keys', keys: expression.split(',').map(s => s.trim()).filter(Boolean) };\n case 'flatten': return { kind: 'flatten', path: expression.trim() };\n case 'reduce': return parseReduce(expression);\n default: return { kind: 'raw', text: expression };\n }\n}\n\n// --- serialize --------------------------------------------------------------\n\n/** Serialises a builder model back into a valid expression string. */\nexport function serializeBuilder(model: BuilderModel): string {\n switch (model.kind) {\n case 'raw':\n return model.text;\n case 'predicate':\n return model.conditions\n .filter(c => c.field.trim() !== '')\n .map(c => `${c.field} ${c.operator} ${formatValue(c.value)}`)\n .join(` ${model.connector} `);\n case 'project':\n return model.items.map(serializeProjectionItem).filter(Boolean).join(', ');\n case 'sort':\n return model.keys.filter(k => k.field.trim() !== '').map(k => `${k.field} ${k.dir}`).join(', ');\n case 'slice':\n return serializeSlice(model);\n case 'keys':\n return model.keys.filter(Boolean).join(', ');\n case 'flatten':\n return model.path.trim();\n case 'reduce':\n return serializeReduce(model.aggs);\n }\n}\n\nfunction serializeProjectionItem(item: ProjectionItem): string {\n switch (item.type) {\n case 'spread': return '*';\n case 'field': return item.field.trim();\n case 'rename': return item.alias.trim() && item.path.trim() ? `${item.alias.trim()}:{${item.path.trim()}}` : '';\n case 'literal': return item.alias.trim() ? `${item.alias.trim()}:${formatValue(item.value)}` : '';\n }\n}\n\nfunction serializeSlice(model: Extract<BuilderModel, { kind: 'slice' }>): string {\n switch (model.mode) {\n case 'first': return `${model.b}`;\n case 'last': return `-${model.b}`;\n case 'range': return `${model.a}:${model.b}`;\n case 'fromCount': return `${model.a},${model.b}`;\n }\n}\n\nfunction serializeReduce(aggs: AggItem[]): string {\n const part = (a: AggItem): string => (a.field.trim() ? `${a.agg}:${a.field.trim()}` : a.agg);\n if (aggs.length === 1 && aggs[0] && !aggs[0].alias.trim()) return part(aggs[0]);\n return aggs\n .filter(a => a.agg.trim() !== '')\n .map(a => `${a.alias.trim() || a.agg}=${part(a)}`)\n .join(', ');\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n effect,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { JsonPipe, TitleCasePipe } from '@angular/common';\n\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTreeModule } from '@angular/material/tree';\n\nimport { FlatNode, FunctionTypes, IArrayFunction, TreeNode } from 'ngx-t-forms-types';\n\nimport { TreeComponent } from '../../functions/convertDataToTree';\nimport { searchAndOrderArray } from '../../../../../../shared/functions/searchArray';\nimport { FormColumnInputs } from 'ngx-t-forms-types';\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\nimport { arrayAccessFunctions } from '../../../../../../shared/functions/evaluateArrayAccessRules';\nimport { safeReturnDeepProperty } from '../../../../../../shared/functions/getDeepObject';\nimport {\n AGGREGATES,\n AggItem,\n BuilderModel,\n Condition,\n PREDICATE_OPERATORS,\n ProjectionItem,\n SLICE_MODES,\n SliceMode,\n SortKey,\n builderKind,\n parseToBuilder,\n serializeBuilder,\n} from '../../functions/pipeline-expression';\n\n/** A selectable array-transform operation plus the editor guidance for its expression. */\ninterface FunctionOption {\n readonly value: FunctionTypes;\n readonly label: string;\n /** Material icon name shown on the pipeline chip. */\n readonly icon: string;\n /** One-line description of what the step does. */\n readonly hint: string;\n}\n\n/** A pickable deep path within the array's item shape (for the path-tree menu). */\ninterface PathOption {\n readonly path: string;\n readonly name: string;\n readonly depth: number;\n readonly leaf: boolean;\n}\n\n/**\n * No-code field-mapping & transform builder for `lib-api-value-access-rules`.\n *\n * Three panels: (1) navigate a JSON shape and check fields to build a path,\n * (2) build a visible, reorderable transform **pipeline** on the selected array\n * node — each step is a guided, per-operation form (filter/find/map/sort/slice/\n * unique/flatten/groupBy/reduce) that serialises to the `IArrayFunction`\n * expression string, with a raw escape hatch — and (3) a live preview of the\n * mapped result. The guided forms enforce the grammar in\n * `docs/array-transform-rules.md` by construction.\n *\n * @example\n * <lib-data-tree [data]=\"responseBody()\" [value]=\"path()\" [formInputs]=\"inputs()\"\n * (pathChanged)=\"onPath($event)\" />\n */\n@Component({\n selector: 'lib-data-tree',\n templateUrl: './data-tree.component.html',\n styleUrls: ['./data-tree.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: { class: 'lib-data-tree' },\n imports: [\n JsonPipe,\n TitleCasePipe,\n MatButtonModule,\n MatButtonToggleModule,\n MatCheckboxModule,\n MatExpansionModule,\n MatIconModule,\n MatMenuModule,\n MatTooltipModule,\n MatTreeModule,\n ],\n})\nexport class DataTreeComponent {\n /** Source data object converted to a tree for navigation; arbitrary JSON shape. */\n readonly data = input<unknown>();\n\n /** Current selected path (or expression string). */\n readonly value = input<TreeNode[] | string>([]);\n\n /** Inputs the expression may reference as variables. */\n readonly formInputs = input<FormColumnInputs[]>([]);\n\n /** Fires with the new selected path (or expression). */\n readonly pathChanged = output<TreeNode[] | string>();\n\n /**\n * Imperative tree state the template binds to (dataSource/treeControl, active\n * path, edit state). Public so the template can read it; the class is the\n * compatibility surface the original children rely on.\n */\n readonly treeClass: TreeComponent = new TreeComponent();\n\n protected readonly textareaElementRef = viewChild<ElementRef<HTMLTextAreaElement>>('textarea');\n\n // -- Static option lists exposed to the template --\n\n /** Operators offered in the predicate condition builder. */\n protected readonly operators = PREDICATE_OPERATORS;\n /** Aggregates offered in the reduce builder. */\n protected readonly aggregates = AGGREGATES;\n /** Window modes offered in the slice builder. */\n protected readonly sliceModes = SLICE_MODES;\n\n /**\n * Every selectable transform operation with chip icon + description. Driven by\n * the `FunctionTypes` enum so the picker stays in sync with the engine.\n */\n protected readonly functionOptions: readonly FunctionOption[] = [\n { value: FunctionTypes.Filter, label: 'filter', icon: 'filter_alt', hint: 'Keep only items matching a condition' },\n { value: FunctionTypes.Find, label: 'find', icon: 'search', hint: 'Return the first item matching a condition' },\n { value: FunctionTypes.Map, label: 'map', icon: 'tune', hint: 'Reshape each item — pick, rename or add fields' },\n { value: FunctionTypes.Sort, label: 'sort', icon: 'swap_vert', hint: 'Order items by one or more fields' },\n { value: FunctionTypes.Slice, label: 'slice', icon: 'content_cut', hint: 'Take a window of items' },\n { value: FunctionTypes.Unique, label: 'unique', icon: 'filter_none', hint: 'Drop duplicate items' },\n { value: FunctionTypes.Flatten, label: 'flatten', icon: 'unfold_more', hint: 'Un-nest arrays one level' },\n { value: FunctionTypes.GroupBy, label: 'groupBy', icon: 'workspaces', hint: 'Bucket items into groups' },\n { value: FunctionTypes.Reduce, label: 'reduce', icon: 'functions', hint: 'Summarise items into a total / object' },\n ];\n\n // -- Builder state (signals) --\n\n /** Whether the current step is edited via the raw expression textarea. */\n protected readonly rawMode = signal<boolean>(false);\n protected readonly showSuggestions = signal<boolean>(false);\n protected readonly optionsSearch = signal<string>('');\n #cursorPosition = 0;\n\n /** Structured model for the step currently being edited. */\n readonly #builder = signal<BuilderModel>({ kind: 'raw', text: '' });\n\n protected readonly methods: readonly { label: string; value: string }[] = [\n { label: 'logical AND (&&)', value: '&&' },\n { label: 'logical OR (||)', value: '||' },\n { label: 'equals (===)', value: '===' },\n { label: 'not equal (!==)', value: '!==' },\n { label: 'greater than (>)', value: '>' },\n { label: 'less than (<)', value: '<' },\n ];\n\n // -- Reactive bridges: keep TreeComponent state in sync with inputs. --\n\n #cachedData: unknown;\n #cachedValue: TreeNode[] | string = [];\n\n protected readonly dataBridge = effect(() => {\n const value = this.data();\n if (_isEqual(this.#cachedData, value)) return;\n this.#cachedData = value;\n this.treeClass.computeTreeData(value);\n\n const currentValue = this.value();\n if (\n Array.isArray(currentValue) &&\n currentValue.length > 0 &&\n 'functions' in (currentValue.at(0) ?? {})\n ) {\n this.treeClass.updateStateFromPath(currentValue);\n }\n });\n\n protected readonly valueBridge = effect(() => {\n const value = this.value();\n if (_isEqual(this.#cachedValue, value)) return;\n this.#cachedValue = value;\n if (Array.isArray(value)) {\n this.treeClass.updateStateFromPath(value);\n }\n });\n\n // ===========================================================================\n // Tree navigation (panel 1)\n // ===========================================================================\n\n protected nodeIsChecked(node: FlatNode): boolean {\n return this.treeClass.nodeIsChecked(node);\n }\n\n /** Maps a value's JS type to a semantic token for syntax-style colouring. */\n protected getNodeValueColor(v: unknown): string {\n switch (typeof v) {\n case 'string': return 'var(--lib-forms-method-patch)';\n case 'number': return 'var(--lib-forms-method-post)';\n case 'boolean': return 'var(--lib-forms-method-get)';\n case 'object': return 'var(--sem-info)';\n default: return 'currentcolor';\n }\n }\n\n protected trackByPath(_index: number, node: TreeNode): string {\n return node.path.join('.');\n }\n\n protected update(node: FlatNode): void {\n const selected = this.treeClass.selectNode(node);\n if (!selected) return;\n const path: TreeNode[] = selected.map(\n (p): TreeNode => ({ ...p, children: undefined, value: undefined }),\n );\n this.pathChanged.emit(path);\n }\n\n protected setupPath(node: TreeNode): void {\n this.treeClass.setupPath(node);\n this.#syncBuilder();\n }\n\n // ===========================================================================\n // Pipeline (panel 2)\n // ===========================================================================\n\n protected hasANodeInEdit(): boolean {\n return this.treeClass.hasANodeInEdit();\n }\n\n protected get steps(): IArrayFunction[] {\n return this.treeClass.pathInEdit?.functions ?? [];\n }\n\n protected getFunctionInEdit(): IArrayFunction | undefined {\n return this.treeClass.pathInEdit?.functions?.find((f) => f.inEdit);\n }\n\n /** Editor guidance (icon/hint) for the operation currently being edited. */\n protected activeFunctionMeta(): FunctionOption | undefined {\n const fn = this.getFunctionInEdit()?.function;\n return this.functionOptions.find((o) => o.value === fn);\n }\n\n protected functionMeta(fn: string): FunctionOption | undefined {\n return this.functionOptions.find((o) => o.value === fn);\n }\n\n /** Which guided builder the in-edit step uses (drives the editor `@switch`). */\n protected activeKind(): BuilderModel['kind'] | '' {\n const fn = this.getFunctionInEdit()?.function;\n return fn ? builderKind(fn as FunctionTypes) : '';\n }\n\n /** True when the given operation string is `unique` (keeps templates enum-free). */\n protected isUnique(fn: string): boolean {\n return fn === FunctionTypes.Unique;\n }\n\n /** Adds a step of a chosen type and opens it for editing. */\n protected addStep(fn: FunctionTypes): void {\n this.treeClass.addNewFunction();\n const created = this.getFunctionInEdit();\n if (created) {\n created.function = fn;\n created.expression = '';\n }\n this.#syncBuilder();\n }\n\n protected editFunction(id: string): void {\n const pathInEdit = this.treeClass.pathInEdit;\n if (!pathInEdit) return;\n pathInEdit.functions = pathInEdit.functions.map((f) => ({ ...f, inEdit: f.id === id }));\n this.#syncBuilder();\n }\n\n protected removeFunction(id: string): void {\n this.treeClass.removeFunction(id);\n this.#syncBuilder();\n }\n\n /** Moves a step earlier/later in the pipeline (direction: -1 left, +1 right). */\n protected moveStep(id: string, direction: -1 | 1): void {\n const pathInEdit = this.treeClass.pathInEdit;\n if (!pathInEdit) return;\n const list = [...pathInEdit.functions];\n const i = list.findIndex((f) => f.id === id);\n const j = i + direction;\n if (i === -1 || j < 0 || j >= list.length) return;\n const a = list[i];\n const b = list[j];\n if (!a || !b) return;\n list[i] = b;\n list[j] = a;\n pathInEdit.functions = list;\n }\n\n protected functionChanged(value: string): void {\n this.treeClass.functionChanged(value);\n const f = this.getFunctionInEdit();\n if (f) f.expression = ''; // a new operation starts from a blank expression\n this.#syncBuilder();\n }\n\n /** Row count after applying the pipeline up to and including step `index`. */\n protected stepRowCount(index: number): number | null {\n const base = this.#baseArray();\n if (!Array.isArray(base)) return null;\n const rules = this.steps.slice(0, index + 1);\n try {\n const result = arrayAccessFunctions(base, rules);\n if (Array.isArray(result)) return result.length;\n return result === undefined ? 0 : 1;\n } catch {\n return null;\n }\n }\n\n /** The array the pipeline transforms (the array the in-edit index node belongs to). */\n #baseArray(): unknown {\n const node = this.treeClass.pathInEdit;\n if (!node) return undefined;\n const parentPath = node.path.slice(0, -1);\n const base = parentPath.length === 0\n ? this.data()\n : safeReturnDeepProperty(this.data(), parentPath).value;\n return Array.isArray(base) ? base : node.value;\n }\n\n protected get mappedValue(): unknown {\n return this.treeClass.getValue();\n }\n\n protected resultRowCount(): number | null {\n const v = this.mappedValue;\n if (Array.isArray(v)) return v.length;\n return v === undefined ? 0 : 1;\n }\n\n protected saveNodeInEdit(): void {\n const newPath = this.treeClass.saveNodeInEdit();\n if (newPath) this.pathChanged.emit(newPath);\n }\n\n // ===========================================================================\n // Field discovery (drives the guided dropdowns)\n // ===========================================================================\n\n /** Field names available on the items of the array being transformed. */\n protected availableFields(): string[] {\n const sample = this.#sampleItem();\n return sample ? Object.keys(sample) : [];\n }\n\n /** Available fields, guaranteed to include `current` so a parsed value still renders. */\n protected fieldOptionsWith(current: string): string[] {\n const fields = this.availableFields();\n return current && !fields.includes(current) ? [current, ...fields] : fields;\n }\n\n /**\n * Flattened deep paths within the array's item shape, for the path-tree\n * picker — so builders select an existing `profile.city` instead of typing it.\n * Capped in depth and count to stay snappy on large payloads.\n */\n protected availableDeepPaths(): PathOption[] {\n const sample = this.#sampleItem();\n if (!sample) return [];\n const out: PathOption[] = [];\n const walk = (obj: Record<string, unknown>, prefix: string, depth: number): void => {\n if (depth > 3 || out.length > 200) return;\n for (const key of Object.keys(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n const val = obj[key];\n const isObject = val !== null && typeof val === 'object' && !Array.isArray(val);\n out.push({ path, name: key, depth, leaf: !isObject });\n if (isObject) walk(val as Record<string, unknown>, path, depth + 1);\n }\n };\n walk(sample, '', 0);\n return out;\n }\n\n #sampleItem(): Record<string, unknown> | undefined {\n const base = this.#baseArray();\n const first = Array.isArray(base) ? base[0] : undefined;\n if (first && typeof first === 'object') return first as Record<string, unknown>;\n const node = this.treeClass.pathInEdit;\n return node && typeof node.value === 'object' && node.value !== null\n ? (node.value as Record<string, unknown>)\n : undefined;\n }\n\n // ===========================================================================\n // Builder model (the guided forms) <-> expression string\n // ===========================================================================\n\n protected builderModel(): BuilderModel {\n return this.#builder();\n }\n\n #syncBuilder(): void {\n const f = this.getFunctionInEdit();\n if (!f || !f.function) {\n this.#builder.set({ kind: 'raw', text: f?.expression ?? '' });\n this.rawMode.set(false);\n return;\n }\n const model = parseToBuilder(f.function as FunctionTypes, f.expression || '');\n this.#builder.set(model);\n // An operation with a structured builder whose expression couldn't be parsed\n // (hand-typed predicate/projection) opens in raw mode so nothing is lost.\n this.rawMode.set(model.kind === 'raw' && builderKind(f.function as FunctionTypes) !== 'raw');\n }\n\n #commit(model: BuilderModel): void {\n this.#builder.set(model);\n const f = this.getFunctionInEdit();\n if (f) f.expression = serializeBuilder(model);\n }\n\n /** Reads a native input/select/textarea value from a DOM event (keeps templates `any`-free). */\n protected inputValue(event: Event): string {\n return (event.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement).value;\n }\n\n // -- raw escape hatch --\n\n protected toggleRaw(): void {\n const next = !this.rawMode();\n if (next) {\n const f = this.getFunctionInEdit();\n this.#builder.set({ kind: 'raw', text: f?.expression ?? '' });\n } else {\n this.#syncBuilder(); // re-parse; stays raw if still unrepresentable\n }\n this.rawMode.set(next);\n }\n\n protected onRawChange(event: Event): void {\n const text = this.inputValue(event);\n const f = this.getFunctionInEdit();\n if (f) f.expression = text;\n this.#builder.set({ kind: 'raw', text });\n this.#cursorPosition = this.textareaElementRef()?.nativeElement.selectionStart ?? 0;\n this.showSuggestions.set(text[this.#cursorPosition - 1] === '$');\n }\n\n // -- predicate (filter / find) --\n\n protected predicate(): Extract<BuilderModel, { kind: 'predicate' }> | null {\n const m = this.#builder();\n return m.kind === 'predicate' ? m : null;\n }\n\n protected setConnector(connector: '&&' | '||'): void {\n const m = this.predicate();\n if (m) this.#commit({ ...m, connector });\n }\n\n protected addCondition(): void {\n const m = this.predicate();\n if (m) this.#commit({ ...m, conditions: [...m.conditions, { field: '', operator: '===', value: '' }] });\n }\n\n protected updateCondition(index: number, patch: Partial<Condition>): void {\n const m = this.predicate();\n if (!m) return;\n const conditions = m.conditions.map((c, i) => (i === index ? { ...c, ...patch } : c));\n this.#commit({ ...m, conditions });\n }\n\n protected removeCondition(index: number): void {\n const m = this.predicate();\n if (m) this.#commit({ ...m, conditions: m.conditions.filter((_, i) => i !== index) });\n }\n\n // -- map (projection) --\n\n protected projection(): Extract<BuilderModel, { kind: 'project' }> | null {\n const m = this.#builder();\n return m.kind === 'project' ? m : null;\n }\n\n protected renameItems(): { item: Extract<ProjectionItem, { type: 'rename' }>; index: number }[] {\n const m = this.projection();\n if (!m) return [];\n const out: { item: Extract<ProjectionItem, { type: 'rename' }>; index: number }[] = [];\n m.items.forEach((item, index) => { if (item.type === 'rename') out.push({ item, index }); });\n return out;\n }\n\n protected literalItems(): { item: Extract<ProjectionItem, { type: 'literal' }>; index: number }[] {\n const m = this.projection();\n if (!m) return [];\n const out: { item: Extract<ProjectionItem, { type: 'literal' }>; index: number }[] = [];\n m.items.forEach((item, index) => { if (item.type === 'literal') out.push({ item, index }); });\n return out;\n }\n\n protected fieldPicked(field: string): boolean {\n const m = this.projection();\n return !!m && m.items.some((i) => i.type === 'field' && i.field === field);\n }\n\n protected toggleField(field: string): void {\n const m = this.projection();\n if (!m) return;\n const exists = m.items.some((i) => i.type === 'field' && i.field === field);\n const items = exists\n ? m.items.filter((i) => !(i.type === 'field' && i.field === field))\n : [...m.items, { type: 'field', field } as ProjectionItem];\n this.#commit({ ...m, items });\n }\n\n protected hasSpread(): boolean {\n const m = this.projection();\n return !!m && m.items.some((i) => i.type === 'spread');\n }\n\n protected toggleSpread(): void {\n const m = this.projection();\n if (!m) return;\n const exists = m.items.some((i) => i.type === 'spread');\n const items = exists\n ? m.items.filter((i) => i.type !== 'spread')\n : [{ type: 'spread' } as ProjectionItem, ...m.items];\n this.#commit({ ...m, items });\n }\n\n protected addRename(): void {\n const m = this.projection();\n if (m) this.#commit({ ...m, items: [...m.items, { type: 'rename', alias: '', path: '' }] });\n }\n\n protected addLiteral(): void {\n const m = this.projection();\n if (m) this.#commit({ ...m, items: [...m.items, { type: 'literal', alias: '', value: '' }] });\n }\n\n protected updateItem(index: number, patch: Partial<Extract<ProjectionItem, { type: 'rename' | 'literal' }>>): void {\n const m = this.projection();\n if (!m) return;\n const items = m.items.map((item, i) => (i === index ? { ...item, ...patch } as ProjectionItem : item));\n this.#commit({ ...m, items });\n }\n\n protected removeItem(index: number): void {\n const m = this.projection();\n if (m) this.#commit({ ...m, items: m.items.filter((_, i) => i !== index) });\n }\n\n // -- sort --\n\n protected sort(): Extract<BuilderModel, { kind: 'sort' }> | null {\n const m = this.#builder();\n return m.kind === 'sort' ? m : null;\n }\n\n protected addSortKey(): void {\n const m = this.sort();\n if (m) this.#commit({ ...m, keys: [...m.keys, { field: '', dir: 'asc' }] });\n }\n\n protected updateSortKey(index: number, patch: Partial<SortKey>): void {\n const m = this.sort();\n if (!m) return;\n const keys = m.keys.map((k, i) => (i === index ? { ...k, ...patch } : k));\n this.#commit({ ...m, keys });\n }\n\n protected removeSortKey(index: number): void {\n const m = this.sort();\n if (m) this.#commit({ ...m, keys: m.keys.filter((_, i) => i !== index) });\n }\n\n // -- slice --\n\n protected slice(): Extract<BuilderModel, { kind: 'slice' }> | null {\n const m = this.#builder();\n return m.kind === 'slice' ? m : null;\n }\n\n protected setSliceMode(mode: string): void {\n const m = this.slice();\n if (m) this.#commit({ ...m, mode: mode as SliceMode });\n }\n\n protected setSliceA(event: Event): void {\n const m = this.slice();\n if (m) this.#commit({ ...m, a: Number(this.inputValue(event)) || 0 });\n }\n\n protected setSliceB(event: Event): void {\n const m = this.slice();\n if (m) this.#commit({ ...m, b: Number(this.inputValue(event)) || 0 });\n }\n\n // -- keys (unique / groupBy) --\n\n protected keysModel(): Extract<BuilderModel, { kind: 'keys' }> | null {\n const m = this.#builder();\n return m.kind === 'keys' ? m : null;\n }\n\n protected keyPicked(field: string): boolean {\n const m = this.keysModel();\n return !!m && m.keys.includes(field);\n }\n\n protected toggleKey(field: string): void {\n const m = this.keysModel();\n if (!m) return;\n const keys = m.keys.includes(field) ? m.keys.filter((k) => k !== field) : [...m.keys, field];\n this.#commit({ ...m, keys });\n }\n\n // -- flatten --\n\n protected flatten(): Extract<BuilderModel, { kind: 'flatten' }> | null {\n const m = this.#builder();\n return m.kind === 'flatten' ? m : null;\n }\n\n protected setFlatten(path: string): void {\n const m = this.flatten();\n if (m) this.#commit({ ...m, path });\n }\n\n // -- reduce --\n\n protected reduce(): Extract<BuilderModel, { kind: 'reduce' }> | null {\n const m = this.#builder();\n return m.kind === 'reduce' ? m : null;\n }\n\n protected aggNeedsField(agg: string): boolean {\n return this.aggregates.find((a) => a.value === agg)?.needsField ?? false;\n }\n\n protected addAgg(): void {\n const m = this.reduce();\n if (m) this.#commit({ ...m, aggs: [...m.aggs, { alias: '', agg: 'count', field: '' }] });\n }\n\n protected updateAgg(index: number, patch: Partial<AggItem>): void {\n const m = this.reduce();\n if (!m) return;\n const aggs = m.aggs.map((a, i) => (i === index ? { ...a, ...patch } : a));\n this.#commit({ ...m, aggs });\n }\n\n protected removeAgg(index: number): void {\n const m = this.reduce();\n if (m) this.#commit({ ...m, aggs: m.aggs.filter((_, i) => i !== index) });\n }\n\n // ===========================================================================\n // Raw-mode suggestion helpers (carried over for the escape hatch)\n // ===========================================================================\n\n protected getMethods(): { label: string; value: string }[] {\n return searchAndOrderArray([...this.methods], this.optionsSearch(), 'label');\n }\n\n protected getAllInputs(): FormColumnInputs[] {\n const inputs = this.formInputs().filter((inp) => !inp.multipleInputInEditId);\n return searchAndOrderArray(inputs, this.optionsSearch(), 'label');\n }\n\n protected onFocus(): void {\n this.#cursorPosition = this.textareaElementRef()?.nativeElement.selectionStart ?? 0;\n }\n\n protected selectSuggestionInput(suggestion: string): void {\n const f = this.getFunctionInEdit();\n if (!f) return;\n const value = f.expression || '';\n const beforeCursor = value.slice(0, this.#cursorPosition - 1);\n const afterCursor = value.slice(this.#cursorPosition);\n f.expression = `${beforeCursor}${suggestion} ${afterCursor}`;\n this.#builder.set({ kind: 'raw', text: f.expression });\n this.showSuggestions.set(false);\n\n const textarea = this.textareaElementRef()?.nativeElement;\n textarea?.focus();\n const newCursorPosition = this.#cursorPosition + suggestion.length;\n setTimeout(() => textarea?.setSelectionRange(newCursorPosition, newCursorPosition), 0);\n }\n}\n","<mat-accordion multi class=\"surface\">\n <!-- 1 - Pick the data -->\n <mat-expansion-panel expanded>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">dataset_linked</mat-icon>\n <span class=\"panel-title\">1 &middot; Pick your data</span>\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <p class=\"hint-line\">\n <mat-icon class=\"info-icon\">touch_app</mat-icon>\n <span>Tick a field to map it. Pick an array (<mat-icon class=\"inline-icon\">data_array</mat-icon>) to transform its items next.</span>\n </p>\n\n <mat-tree [dataSource]=\"treeClass.dataSource\" [treeControl]=\"treeClass.treeControl\" class=\"data-tree\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\n <span class=\"node-spacer\" aria-hidden=\"true\"></span>\n <mat-checkbox (change)=\"update(node)\" [checked]=\"nodeIsChecked(node)\" class=\"node-checkbox\"\n [matTooltip]=\"'Map field: ' + node.key\">\n <span class=\"node-key\">{{ node.key }}</span>\n <span class=\"node-value\" [style.color]=\"getNodeValueColor(node.value)\">{{ node.value }}</span>\n </mat-checkbox>\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: treeClass.hasChild\" matTreeNodePadding>\n <button class=\"node-toggle\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.key\">\n <mat-icon>{{ treeClass.treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}</mat-icon>\n </button>\n <mat-checkbox (change)=\"update(node)\" [checked]=\"nodeIsChecked(node)\" [matTooltip]=\"'Select ' + node.key\">\n <span class=\"node-key\">{{ node.key }}</span>\n </mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n </div>\n </mat-expansion-panel>\n\n <!-- 2 - Build the pipeline -->\n <mat-expansion-panel expanded>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">account_tree</mat-icon>\n <span class=\"panel-title\">2 &middot; Transform your data</span>\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n @if (treeClass.activePath.length === 0) {\n <p class=\"hint-line\">\n <mat-icon class=\"info-icon\">arrow_upward</mat-icon>\n <span>Select a field above to begin.</span>\n </p>\n } @else {\n <nav class=\"breadcrumb\" aria-label=\"Selected path\">\n @for (path of treeClass.activePath; track trackByPath($index, path); let isLast = $last) {\n <button type=\"button\" class=\"crumb\" [class.crumb-active]=\"path.inEdit\"\n [class.crumb-array]=\"path.keyIsArrayIndex\" [disabled]=\"!path.keyIsArrayIndex && !path.inEdit\"\n [matTooltip]=\"path.keyIsArrayIndex ? 'Transform this array' : path.key\" (click)=\"setupPath(path)\">\n <mat-icon>{{ path.keyIsArrayIndex ? 'data_array' : 'folder' }}</mat-icon>\n <span class=\"crumb-text\">{{ path.key }}</span>\n @if (path.functions.length > 0) { <span class=\"crumb-badge\">{{ path.functions.length }}</span> }\n </button>\n @if (!isLast) { <mat-icon class=\"crumb-sep\">chevron_right</mat-icon> }\n }\n </nav>\n\n @if (hasANodeInEdit()) {\n <div class=\"pipeline\" role=\"list\" aria-label=\"Transform pipeline\">\n <span class=\"stage stage-source\" role=\"listitem\">\n <mat-icon>database</mat-icon>\n <span class=\"stage-label\">Source</span>\n </span>\n\n @for (step of steps; track step.id; let i = $index) {\n <mat-icon class=\"flow-arrow\">chevron_right</mat-icon>\n <button class=\"stage stage-step\" role=\"listitem\" [class.stage-active]=\"step.inEdit\"\n [class.stage-empty]=\"!step.function\" (click)=\"editFunction(step.id)\"\n [matTooltip]=\"functionMeta(step.function)?.hint || 'Choose an operation'\">\n <mat-icon>{{ functionMeta(step.function)?.icon || 'help_outline' }}</mat-icon>\n <span class=\"stage-label\">{{ (step.function | titlecase) || 'Choose' }}</span>\n @if (stepRowCount(i); as n) {\n <span class=\"stage-count\">{{ n }} {{ n === 1 ? 'row' : 'rows' }}</span>\n }\n </button>\n }\n\n <mat-icon class=\"flow-arrow\">chevron_right</mat-icon>\n <button class=\"stage stage-add\" [matMenuTriggerFor]=\"addMenu\" matTooltip=\"Add a transform step\">\n <mat-icon>add</mat-icon>\n <span class=\"stage-label\">Add</span>\n </button>\n <mat-menu #addMenu=\"matMenu\">\n @for (option of functionOptions; track option.value) {\n <button mat-menu-item (click)=\"addStep(option.value)\">\n <mat-icon>{{ option.icon }}</mat-icon>\n <span>{{ option.label }}</span>\n <span class=\"menu-hint\">{{ option.hint }}</span>\n </button>\n }\n </mat-menu>\n </div>\n\n @if (getFunctionInEdit(); as fn) {\n <section class=\"editor\">\n <label class=\"f-field full\">\n <span class=\"f-label\">Operation</span>\n <select class=\"f-control\" [value]=\"fn.function\" (change)=\"functionChanged(inputValue($event))\">\n <option value=\"\" disabled>Choose what this step does</option>\n @for (option of functionOptions; track option.value) {\n <option [value]=\"option.value\">{{ option.label }}</option>\n }\n </select>\n </label>\n @if (fn.function && activeFunctionMeta(); as meta) {\n <p class=\"sub-hint\">{{ meta.hint }}</p>\n }\n\n @if (!fn.function) {\n <p class=\"hint-line\">\n <mat-icon class=\"info-icon\">info</mat-icon>\n <span>Choose an operation to configure this step.</span>\n </p>\n } @else {\n @if (rawMode()) {\n <label class=\"f-field full\">\n <span class=\"f-label\">Expression</span>\n <textarea class=\"f-control f-textarea\" #textarea rows=\"2\" [value]=\"fn.expression\"\n (input)=\"onRawChange($event)\" (focus)=\"onFocus()\" placeholder=\"Type the raw expression\"></textarea>\n </label>\n <p class=\"sub-hint\">Type <code>$</code> to insert a field or operator.</p>\n\n @if (showSuggestions()) {\n <div class=\"suggestions\">\n <div class=\"suggestion-group\">\n <span class=\"field-label\">Operators</span>\n <div class=\"chip-row\">\n @for (method of getMethods(); track method.value) {\n <button mat-stroked-button class=\"ins-chip\" (click)=\"selectSuggestionInput(method.value)\">\n {{ method.value }}\n </button>\n }\n </div>\n </div>\n <div class=\"suggestion-group\">\n <span class=\"field-label\">Inputs</span>\n <div class=\"chip-row\">\n @for (input of getAllInputs(); track input.formControlName) {\n <button mat-stroked-button class=\"ins-chip\" (click)=\"selectSuggestionInput(input.formControlName)\">\n {{ input.label }}\n </button>\n }\n </div>\n </div>\n </div>\n }\n } @else {\n @switch (activeKind()) {\n @case ('predicate') {\n @if (predicate(); as p) {\n @if (p.conditions.length > 1) {\n <div class=\"match-row\">\n <span class=\"field-label\">Match</span>\n <mat-button-toggle-group class=\"seg\" [value]=\"p.connector\" hideSingleSelectionIndicator\n (change)=\"setConnector($event.value)\">\n <mat-button-toggle value=\"&&\">All</mat-button-toggle>\n <mat-button-toggle value=\"||\">Any</mat-button-toggle>\n </mat-button-toggle-group>\n <span class=\"muted\">of the conditions</span>\n </div>\n }\n @for (cond of p.conditions; track $index) {\n <div class=\"q-item\">\n <div class=\"q-stack\">\n <label class=\"f-field\">\n <span class=\"f-label\">Field</span>\n <select class=\"f-control\" [value]=\"cond.field\"\n (change)=\"updateCondition($index, { field: inputValue($event) })\">\n @for (f of fieldOptionsWith(cond.field); track f) { <option [value]=\"f\">{{ f }}</option> }\n </select>\n </label>\n <div class=\"q-pair q-pair-op\">\n <label class=\"f-field\">\n <span class=\"f-label\">Operator</span>\n <select class=\"f-control\" [value]=\"cond.operator\"\n (change)=\"updateCondition($index, { operator: inputValue($event) })\">\n @for (op of operators; track op.value) { <option [value]=\"op.value\">{{ op.label }}</option> }\n </select>\n </label>\n <label class=\"f-field\">\n <span class=\"f-label\">Value</span>\n <input class=\"f-control\" [value]=\"cond.value\" placeholder=\"active, 18, Durban\"\n (input)=\"updateCondition($index, { value: inputValue($event) })\">\n </label>\n </div>\n </div>\n <button mat-icon-button class=\"q-remove\" (click)=\"removeCondition($index)\"\n matTooltip=\"Remove\"><mat-icon>close</mat-icon></button>\n </div>\n }\n <button type=\"button\" class=\"link-btn\" (click)=\"addCondition()\">\n <mat-icon>add</mat-icon> Add condition\n </button>\n }\n }\n\n @case ('project') {\n @if (projection(); as proj) {\n <span class=\"field-label\">Keep fields</span>\n <div class=\"checklist\">\n @for (f of availableFields(); track f) {\n <mat-checkbox [checked]=\"fieldPicked(f)\" (change)=\"toggleField(f)\">{{ f }}</mat-checkbox>\n }\n <mat-checkbox [checked]=\"hasSpread()\" (change)=\"toggleSpread()\"\n matTooltip=\"Include every field\">everything (*)</mat-checkbox>\n </div>\n\n <div class=\"section-head\">\n <span class=\"field-label\">Mapped fields</span>\n <span class=\"section-actions\">\n <button type=\"button\" class=\"link-btn\" (click)=\"addRename()\"><mat-icon>add</mat-icon> Field</button>\n <button type=\"button\" class=\"link-btn\" (click)=\"addLiteral()\"><mat-icon>add</mat-icon> Constant</button>\n </span>\n </div>\n\n @for (r of renameItems(); track r.index) {\n <div class=\"map-row\">\n <label class=\"f-field\">\n <span class=\"f-label\">New name</span>\n <input class=\"f-control\" [value]=\"r.item.alias\"\n (input)=\"updateItem(r.index, { alias: inputValue($event) })\">\n </label>\n <div class=\"f-field\">\n <span class=\"f-label\">From path</span>\n <button type=\"button\" class=\"f-control f-picker\" [matMenuTriggerFor]=\"pathMenu\">\n <span class=\"f-picker-text\" [class.f-placeholder]=\"!r.item.path\">{{ r.item.path || 'Select a path' }}</span>\n <mat-icon>account_tree</mat-icon>\n </button>\n <mat-menu #pathMenu=\"matMenu\" class=\"path-menu\">\n @for (p of availableDeepPaths(); track p.path) {\n <button mat-menu-item class=\"path-item\" [style.padding-left.px]=\"12 + p.depth * 14\"\n (click)=\"updateItem(r.index, { path: p.path })\">\n <mat-icon class=\"path-icon\">{{ p.leaf ? 'chevron_right' : 'folder_open' }}</mat-icon>\n <span>{{ p.name }}</span>\n </button>\n } @empty {\n <button mat-menu-item disabled>No paths detected</button>\n }\n </mat-menu>\n </div>\n <button mat-icon-button class=\"q-remove\" (click)=\"removeItem(r.index)\"\n matTooltip=\"Remove\"><mat-icon>close</mat-icon></button>\n </div>\n }\n @for (l of literalItems(); track l.index) {\n <div class=\"map-row\">\n <label class=\"f-field\">\n <span class=\"f-label\">Field name</span>\n <input class=\"f-control\" [value]=\"l.item.alias\"\n (input)=\"updateItem(l.index, { alias: inputValue($event) })\">\n </label>\n <label class=\"f-field\">\n <span class=\"f-label\">Constant</span>\n <input class=\"f-control\" [value]=\"l.item.value\" placeholder='\"api\", 1, true'\n (input)=\"updateItem(l.index, { value: inputValue($event) })\">\n </label>\n <button mat-icon-button class=\"q-remove\" (click)=\"removeItem(l.index)\"\n matTooltip=\"Remove\"><mat-icon>close</mat-icon></button>\n </div>\n }\n }\n }\n\n @case ('sort') {\n @if (sort(); as s) {\n @for (key of s.keys; track $index) {\n <div class=\"q-item\">\n <div class=\"q-pair q-pair-sort\">\n <label class=\"f-field\">\n <span class=\"f-label\">Sort by</span>\n <select class=\"f-control\" [value]=\"key.field\"\n (change)=\"updateSortKey($index, { field: inputValue($event) })\">\n @for (f of fieldOptionsWith(key.field); track f) { <option [value]=\"f\">{{ f }}</option> }\n </select>\n </label>\n <mat-button-toggle-group class=\"seg seg-dir\" [value]=\"key.dir\" hideSingleSelectionIndicator\n (change)=\"updateSortKey($index, { dir: $event.value })\">\n <mat-button-toggle value=\"asc\" matTooltip=\"Ascending\"><mat-icon>arrow_upward</mat-icon></mat-button-toggle>\n <mat-button-toggle value=\"desc\" matTooltip=\"Descending\"><mat-icon>arrow_downward</mat-icon></mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n <button mat-icon-button class=\"q-remove\" (click)=\"removeSortKey($index)\"\n matTooltip=\"Remove\"><mat-icon>close</mat-icon></button>\n </div>\n }\n <button type=\"button\" class=\"link-btn\" (click)=\"addSortKey()\">\n <mat-icon>add</mat-icon> Add sort key\n </button>\n }\n }\n\n @case ('slice') {\n @if (slice(); as sl) {\n <div class=\"field-grid\">\n <label class=\"f-field\">\n <span class=\"f-label\">Take</span>\n <select class=\"f-control\" [value]=\"sl.mode\" (change)=\"setSliceMode(inputValue($event))\">\n @for (mode of sliceModes; track mode.value) { <option [value]=\"mode.value\">{{ mode.label }}</option> }\n </select>\n </label>\n @switch (sl.mode) {\n @case ('range') {\n <label class=\"f-field\"><span class=\"f-label\">Start</span>\n <input class=\"f-control\" type=\"number\" [value]=\"sl.a\" (input)=\"setSliceA($event)\"></label>\n <label class=\"f-field\"><span class=\"f-label\">End</span>\n <input class=\"f-control\" type=\"number\" [value]=\"sl.b\" (input)=\"setSliceB($event)\"></label>\n }\n @case ('fromCount') {\n <label class=\"f-field\"><span class=\"f-label\">From index</span>\n <input class=\"f-control\" type=\"number\" [value]=\"sl.a\" (input)=\"setSliceA($event)\"></label>\n <label class=\"f-field\"><span class=\"f-label\">Count</span>\n <input class=\"f-control\" type=\"number\" [value]=\"sl.b\" (input)=\"setSliceB($event)\"></label>\n }\n @default {\n <label class=\"f-field\"><span class=\"f-label\">How many</span>\n <input class=\"f-control\" type=\"number\" [value]=\"sl.b\" (input)=\"setSliceB($event)\"></label>\n }\n }\n </div>\n }\n }\n\n @case ('keys') {\n @if (keysModel(); as k) {\n <span class=\"field-label\">\n @if (isUnique(fn.function)) { Unique by &mdash; none = whole row } @else { Group by }\n </span>\n <div class=\"checklist\">\n @for (f of availableFields(); track f) {\n <mat-checkbox [checked]=\"keyPicked(f)\" (change)=\"toggleKey(f)\">{{ f }}</mat-checkbox>\n }\n </div>\n @if (availableFields().length === 0) {\n <p class=\"hint-line\"><mat-icon class=\"info-icon\">info</mat-icon>\n <span>No fields detected &mdash; use Advanced to type a key path.</span></p>\n }\n }\n }\n\n @case ('flatten') {\n @if (flatten(); as fl) {\n <label class=\"f-field full\">\n <span class=\"f-label\">Flatten</span>\n <select class=\"f-control\" [value]=\"fl.path\" (change)=\"setFlatten(inputValue($event))\">\n <option [value]=\"''\">nested arrays (one level)</option>\n @for (f of fieldOptionsWith(fl.path); track f) { <option [value]=\"f\">items in {{ f }}</option> }\n </select>\n </label>\n <p class=\"sub-hint\">Blank flattens one level; a field flat-maps that child array.</p>\n }\n }\n\n @case ('reduce') {\n @if (reduce(); as red) {\n @for (agg of red.aggs; track $index) {\n <div class=\"q-item\">\n <div class=\"q-stack\">\n @if (red.aggs.length > 1) {\n <label class=\"f-field\">\n <span class=\"f-label\">Output name</span>\n <input class=\"f-control\" [value]=\"agg.alias\"\n (input)=\"updateAgg($index, { alias: inputValue($event) })\">\n </label>\n }\n <div class=\"q-pair\">\n <label class=\"f-field\">\n <span class=\"f-label\">Aggregate</span>\n <select class=\"f-control\" [value]=\"agg.agg\"\n (change)=\"updateAgg($index, { agg: inputValue($event) })\">\n @for (a of aggregates; track a.value) { <option [value]=\"a.value\">{{ a.label }}</option> }\n </select>\n </label>\n @if (aggNeedsField(agg.agg)) {\n <label class=\"f-field\">\n <span class=\"f-label\">Field</span>\n <select class=\"f-control\" [value]=\"agg.field\"\n (change)=\"updateAgg($index, { field: inputValue($event) })\">\n @for (f of fieldOptionsWith(agg.field); track f) { <option [value]=\"f\">{{ f }}</option> }\n </select>\n </label>\n }\n </div>\n </div>\n <button mat-icon-button class=\"q-remove\" (click)=\"removeAgg($index)\"\n matTooltip=\"Remove\"><mat-icon>close</mat-icon></button>\n </div>\n }\n <button type=\"button\" class=\"link-btn\" (click)=\"addAgg()\">\n <mat-icon>add</mat-icon> Add aggregate\n </button>\n }\n }\n }\n }\n\n <div class=\"editor-foot\">\n <button type=\"button\" class=\"link-btn\" (click)=\"toggleRaw()\">\n @if (rawMode()) { <mat-icon>view_module</mat-icon> Guided }\n @else { <mat-icon>code</mat-icon> Advanced }\n </button>\n </div>\n }\n\n <div class=\"editor-actions\">\n <button mat-icon-button (click)=\"moveStep(fn.id, -1)\" matTooltip=\"Move earlier\"\n aria-label=\"Move step earlier\"><mat-icon>chevron_left</mat-icon></button>\n <button mat-icon-button (click)=\"moveStep(fn.id, 1)\" matTooltip=\"Move later\"\n aria-label=\"Move step later\"><mat-icon>chevron_right</mat-icon></button>\n <button mat-icon-button (click)=\"removeFunction(fn.id)\" matTooltip=\"Remove step\"\n aria-label=\"Remove step\"><mat-icon>delete_outline</mat-icon></button>\n <span class=\"spacer\"></span>\n <button mat-flat-button color=\"primary\" (click)=\"saveNodeInEdit()\">\n <mat-icon>check</mat-icon> Apply\n </button>\n </div>\n </section>\n }\n } @else {\n <p class=\"hint-line\">\n <mat-icon class=\"info-icon\">data_array</mat-icon>\n <span>Click an array (<mat-icon class=\"inline-icon\">data_array</mat-icon>) in the path above to add steps.</span>\n </p>\n }\n }\n </div>\n </mat-expansion-panel>\n\n <!-- 3 - Preview -->\n <mat-expansion-panel expanded>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">preview</mat-icon>\n <span class=\"panel-title\">3 &middot; Result preview</span>\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n @if (resultRowCount(); as n) {\n <span class=\"result-count\"><mat-icon>check_circle</mat-icon> {{ n }} {{ n === 1 ? 'result' : 'results' }}</span>\n }\n <div class=\"mapped-value\">\n <pre>{{ mappedValue | json }}</pre>\n </div>\n </div>\n </mat-expansion-panel>\n</mat-accordion>\n","import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, ViewEncapsulation, computed, effect, inject, input, output, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { debounceTime } from 'rxjs';\nimport { _isEqual } from '../../../../shared/functions/isEqual';\n\n/** Shape emitted on every edit: the parsed value plus whether the text parsed cleanly. */\nexport interface JsonEditorChange {\n /** Parsed JSON value. On an invalid edit this is the last value that parsed cleanly. */\n readonly value: object | unknown[];\n /** `true` when the current text is syntactically valid JSON. */\n readonly valid: boolean;\n}\n\n/**\n * Embedded code-style JSON editor: a textarea with a synced syntax-highlight\n * backdrop, a persistent error zone and a \"Format JSON\" action. It owns only\n * its editing surface — the parent renders any field label / hint.\n *\n * @example\n * <lib-json-editor [value]=\"config()\" (valueChange)=\"onConfig($event)\" />\n */\n@Component({\n selector: 'lib-json-editor',\n templateUrl: './json-editor.component.html',\n styleUrls: ['./json-editor.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: { 'class': 'lib-json-editor' },\n imports: [MatIconModule, MatButtonModule, ReactiveFormsModule],\n})\nexport class JsonEditorComponent {\n /** JSON value to display and edit. */\n readonly value = input<object | undefined>();\n\n /** Editor height (CSS length, e.g. `\"320px\"` or `\"60vh\"`). */\n readonly height = input<string>('450px');\n\n /** When `true`, the editor is read-only and the Format action is disabled. */\n readonly disabled = input<boolean>(false);\n\n /** Emitted (debounced) on every edit with the parsed value and validity. */\n readonly valueChange = output<JsonEditorChange>();\n\n protected readonly backdrop = viewChild<ElementRef<HTMLDivElement>>('backdrop');\n\n /** Reactive control backing the textarea. */\n protected readonly jsonText = new FormControl<string>('', { nonNullable: true });\n\n /** Current parse error, or `null` when the text parses cleanly. */\n protected readonly errorMessage = signal<string | null>(null);\n\n /** Raw editor text, mirrored from the control so highlighting stays reactive. */\n readonly #text = signal<string>('');\n\n /** Syntax-highlighted HTML rendered behind the textarea. */\n protected readonly highlightedHtml = computed(() => this.#syntaxHighlight(this.#text()));\n\n /** Disables the Format action while there is a parse error or the editor is read-only. */\n protected readonly formatDisabled = computed(() => this.disabled() || this.errorMessage() !== null);\n\n readonly #destroyRef = inject(DestroyRef);\n\n /** Last value that parsed cleanly — emitted (with `valid:false`) on an invalid edit. */\n #lastValid: object | unknown[] = {};\n /** Snapshot of the most recently applied `value` input, gating the bridge. */\n #lastInput: object | undefined;\n /** Pending rAF id for scroll syncing, so we coalesce bursts of scroll events. */\n #scrollFrame = 0;\n\n /**\n * Bridges the external `value` input to the internal control. Gated on\n * `_isEqual` so a change that round-trips through the parent does not reset\n * the cursor position.\n */\n protected readonly valueBridge = effect(() => {\n const next = this.value();\n if (_isEqual(next, this.#lastInput)) return;\n this.#lastInput = next;\n this.#formatAndSet(next);\n });\n\n /** Mirrors the `disabled` input onto the control. */\n protected readonly disabledBridge = effect(() => {\n if (this.disabled()) this.jsonText.disable({ emitEvent: false });\n else this.jsonText.enable({ emitEvent: false });\n });\n\n constructor() {\n this.jsonText.valueChanges\n .pipe(debounceTime(300), takeUntilDestroyed(this.#destroyRef))\n .subscribe((text) => this.#handleInput(text));\n\n this.#destroyRef.onDestroy(() => {\n if (this.#scrollFrame) cancelAnimationFrame(this.#scrollFrame);\n });\n }\n\n /** Validates the current text, updates the error zone and emits the change. */\n #handleInput(text: string): void {\n this.#text.set(text);\n try {\n const parsed = JSON.parse(text) as object | unknown[];\n this.#lastValid = parsed;\n this.errorMessage.set(null);\n this.valueChange.emit({ value: parsed, valid: true });\n } catch (error) {\n this.errorMessage.set(this.#describeError(text, error));\n // DEFECT FIX: the original re-parsed the (invalid) text here, which always\n // threw and silently swallowed the invalid-state emission. We emit the\n // last value that parsed cleanly so the consumer keeps a stable shape,\n // flagged `valid: false`.\n this.valueChange.emit({ value: this.#lastValid, valid: false });\n }\n }\n\n /** Pretty-prints the current text. No-op when it is not valid JSON. */\n protected prettify(): void {\n if (this.disabled()) return;\n try {\n const parsed: unknown = JSON.parse(this.jsonText.value);\n this.#formatAndSet(parsed);\n } catch {\n // Cannot prettify invalid JSON — leave the text untouched.\n }\n }\n\n /** Writes a beautified value into the control without emitting a change. */\n #formatAndSet(jsonValue: unknown): void {\n const beautified = jsonValue === undefined ? '' : JSON.stringify(jsonValue, null, 4);\n this.jsonText.setValue(beautified, { emitEvent: false });\n this.#text.set(beautified);\n this.errorMessage.set(null);\n }\n\n /** Keeps the highlight backdrop scroll-aligned with the textarea (rAF-throttled). */\n protected syncScroll(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n const { scrollTop, scrollLeft } = target;\n if (this.#scrollFrame) cancelAnimationFrame(this.#scrollFrame);\n this.#scrollFrame = requestAnimationFrame(() => {\n this.#scrollFrame = 0;\n const el = this.backdrop()?.nativeElement;\n if (!el) return;\n el.scrollTop = scrollTop;\n el.scrollLeft = scrollLeft;\n });\n }\n\n /** Inserts four spaces on Tab instead of moving focus. */\n protected handleTab(event: KeyboardEvent): void {\n if (event.key !== 'Tab') return;\n event.preventDefault();\n const el = event.target as HTMLTextAreaElement;\n const { selectionStart: start, selectionEnd: end, value } = el;\n const next = `${value.substring(0, start)} ${value.substring(end)}`;\n this.jsonText.setValue(next);\n el.value = next;\n el.selectionStart = el.selectionEnd = start + 4;\n }\n\n /** Regex-based JSON highlighter; HTML-escapes input to avoid injection. */\n #syntaxHighlight(json: string): string {\n if (!json) return '';\n const escaped = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n return escaped.replace(\n /(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?|\\b(true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)/g,\n (match) => {\n let cls = 'json-number';\n if (match.startsWith('\"')) cls = match.endsWith(':') ? 'json-key' : 'json-string';\n else if (/true|false/.test(match)) cls = 'json-boolean';\n else if (/null/.test(match)) cls = 'json-null';\n return `<span class=\"${cls}\">${match}</span>`;\n },\n );\n }\n\n /** Builds a human-readable parse-error message, pinpointing the offending position. */\n #describeError(text: string, error: unknown): string {\n if (!(error instanceof SyntaxError)) return 'Invalid JSON format';\n const positionMatch = error.message.match(/position (\\d+)/);\n const raw = positionMatch?.[1];\n if (!raw) return error.message;\n const position = parseInt(raw, 10);\n const start = Math.max(0, position - 20);\n const end = Math.min(text.length, position + 20);\n const excerpt = text.substring(start, end).replace(/\\n/g, '↵');\n return `Error at position ${position} near \"${excerpt}\"`;\n }\n}\n","<div class=\"json-editor\" [style.--lib-json-editor-height]=\"height()\">\n\n <div class=\"editor-toolbar\">\n <span class=\"toolbar-label\">\n <mat-icon class=\"icon-sm\">code</mat-icon> JSON Editor\n </span>\n\n <div class=\"toolbar-actions\">\n @if (errorMessage(); as message) {\n <span class=\"status-indicator status-indicator--error\" [title]=\"message\">\n <mat-icon class=\"icon-sm\">error_outline</mat-icon> Invalid\n </span>\n } @else {\n <span class=\"status-indicator status-indicator--valid\">\n <mat-icon class=\"icon-sm\">check_circle</mat-icon> Valid\n </span>\n }\n <button\n mat-button\n type=\"button\"\n class=\"prettify-btn\"\n (click)=\"prettify()\"\n [disabled]=\"formatDisabled()\">\n Format JSON\n </button>\n </div>\n </div>\n\n <div class=\"editor-container\">\n <div #backdrop class=\"editor-backdrop\" aria-hidden=\"true\">\n <div class=\"highlights\" [innerHTML]=\"highlightedHtml()\"></div>\n </div>\n\n <textarea\n class=\"editor-textarea\"\n spellcheck=\"false\"\n [formControl]=\"jsonText\"\n (scroll)=\"syncScroll($event)\"\n (keydown)=\"handleTab($event)\"\n placeholder=\"Paste JSON here...\"></textarea>\n </div>\n\n <!-- Persistent error zone: always reserves space so the layout never jumps. -->\n <div class=\"editor-footer\" [class.editor-footer--active]=\"errorMessage() !== null\" role=\"status\">\n @if (errorMessage(); as message) {\n <mat-icon class=\"icon-sm\">warning</mat-icon>\n <span>{{ message }}</span>\n }\n </div>\n\n</div>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\n\n/**\n * Internal empty-state block for editor lists: an icon, a message, and an\n * optional projected call-to-action. Colour is never the only signal — the\n * icon always accompanies the text (GDP L-02).\n *\n * @example\n * <lib-empty-state icon=\"link_off\" message=\"No data sources yet\">\n * <button mat-stroked-button>Add one</button>\n * </lib-empty-state>\n */\n@Component({\n selector: 'lib-empty-state',\n imports: [MatIconModule],\n templateUrl: './empty-state.component.html',\n styleUrl: './empty-state.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: { 'class': 'lib-empty-state' },\n})\nexport class EmptyStateComponent {\n /** Material icon shown above the message. */\n readonly icon = input<string>('inbox');\n /** Empty-state message. */\n readonly message = input<string>('');\n}\n","<mat-icon class=\"lib-empty-state__icon\">{{ icon() }}</mat-icon>\n@if (message()) {\n<p class=\"lib-empty-state__message\">{{ message() }}</p>\n}\n<ng-content></ng-content>\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, input } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport type { IConfigElementError } from '../../../t-dynamic-data-edit.component';\n\n/**\n * Internal validation-error list for editors that render their own errors\n * (i.e. editors the parent form-field does not already decorate). Renders\n * nothing when there are no errors; announces via `role=\"alert\"` and pairs each\n * message with an icon so colour is never the only signal (GDP L-02).\n *\n * @example\n * <lib-error-list [errors]=\"errors()\" />\n */\n@Component({\n selector: 'lib-error-list',\n imports: [MatIconModule],\n templateUrl: './error-list.component.html',\n styleUrl: './error-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: { 'class': 'lib-error-list' },\n})\nexport class ErrorListComponent {\n /** Validation errors to render; empty/undefined renders nothing. */\n readonly errors = input<readonly IConfigElementError[] | undefined>([]);\n}\n","@if ((errors() || []).length) {\n<ul class=\"lib-error-list__list\" role=\"alert\">\n @for (error of errors() || []; track error.key) {\n <li class=\"lib-error-list__item\">\n <mat-icon class=\"lib-error-list__icon\">error</mat-icon>\n <span>{{ error.message }}</span>\n </li>\n }\n</ul>\n}\n","import type { IArrayFunction, IFolderItem, TreeNode } from 'ngx-t-forms-types';\r\n\r\nexport function convertPostmanFolderItemsToTree(obj: IFolderItem[] | undefined, parentPath: string[] = [],): TreeNode[] {\r\n\r\n if (!obj) {\r\n return []\r\n }\r\n return obj.map((item) => {\r\n const { name } = item\r\n const currentPath = [...parentPath, name];\r\n const node: TreeNode = { key: name, name, value: item, path: currentPath, functions: [] as IArrayFunction[] };\r\n\r\n if (item.item) {\r\n node.children = convertPostmanFolderItemsToTree(item.item, currentPath)\r\n }\r\n return node;\r\n });\r\n }\r\n\r\n export function flatApiList(obj: IFolderItem[] | undefined):IFolderItem[] {\r\n if (!obj) {\r\n return []\r\n }\r\n return obj.reduce((acc, item) => {\r\n acc.push(item)\r\n if (item.item) {\r\n acc.push(...flatApiList(item.item))\r\n }\r\n return acc\r\n }, [] as IFolderItem[])\r\n\r\n }","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\nimport { catchError, take, tap, throwError } from 'rxjs';\n\nimport {\n IFolderItem,\n IGetPostmanCollections,\n IPostmanCollectionConfig,\n TreeNode,\n FormColumnInputs,\n} from 'ngx-t-forms-types';\n\nimport { DataTreeComponent } from './elements/data-tree/data-tree.component';\nimport { JsonEditorComponent } from '../json-editor/json-editor.component';\nimport { EmptyStateComponent } from '../_shared/empty-state/empty-state.component';\nimport { ErrorListComponent } from '../_shared/error-list/error-list.component';\nimport type { IConfigElementError } from '../../t-dynamic-data-edit.component';\nimport { flatApiList } from '../postman-collections/functions/convertPostmanCollectionToTree';\nimport { _isEqual } from '../../../../shared/functions/isEqual';\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../injection-tokens';\n\n/** View mode toggled by the segmented control: `map` selects fields, `sync` runs the API. */\nexport type ViewMode = 'map' | 'sync';\n\n/** Keyed map of paths/expressions emitted/consumed in `multipleBind` mode. */\ntype KeyedAccessValue = Record<string, TreeNode[] | string>;\n\n/** Value emitted/consumed by api-value-access-rules — either a flat tree path,\n * a free-text expression, or a keyed map of paths/expressions (multipleBind mode). */\ntype ApiValueAccessRulesValue = TreeNode[] | string | KeyedAccessValue;\n\n/**\n * Builder editor for mapping a Postman/API response onto a form value. Renders a\n * field-selection tree (`map` mode) and an executable request body (`sync` mode),\n * and supports a keyed record of bindings when `multipleBind` is supplied.\n *\n * Plain (non-MatFormFieldControl) editor: signal inputs/outputs only. Embeds\n * `lib-json-editor` for the request body and `lib-data-tree` for field mapping.\n *\n * @example\n * <lib-api-value-access-rules\n * [value]=\"value()\"\n * [formInputs]=\"inputs()\"\n * [mapToData]=\"requestId()\"\n * [postmanCollectionConfig]=\"config()\"\n * (valueChanged)=\"onValue($event)\" />\n */\n@Component({\n selector: 'lib-api-value-access-rules',\n templateUrl: './api-value-access-rules.component.html',\n styleUrls: ['./api-value-access-rules.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.Emulated,\n host: { class: 'lib-api-value-access-rules' },\n imports: [\n OverlayModule,\n MatButtonModule,\n MatButtonToggleModule,\n MatIconModule,\n MatProgressSpinnerModule,\n DataTreeComponent,\n JsonEditorComponent,\n EmptyStateComponent,\n ErrorListComponent,\n ],\n})\nexport class ApiValueAccessRulesComponent {\n // -- Inputs --\n\n /** Disables interaction and dims the editor behind a CDK overlay. */\n readonly disabled = input<boolean>(false);\n\n /** Control names to bind, producing a keyed record value instead of a single path. */\n readonly multipleBind = input<string[] | undefined>(undefined);\n\n /** Validation errors surfaced by the parent for display. */\n readonly errors = input<IConfigElementError[] | undefined>([]);\n\n /** Current value: a tree path, a free-text expression, or a keyed record (multipleBind). */\n readonly value = input<ApiValueAccessRulesValue>([]);\n\n /** Inputs the mapping expressions may reference. */\n readonly formInputs = input<FormColumnInputs[]>([]);\n\n /** Identifier (typically the postman item id) used to lookup the active request. */\n readonly mapToData = input<string | undefined>(undefined);\n\n /** Postman collection source to load available requests from. */\n readonly postmanCollectionConfig = input<IPostmanCollectionConfig | undefined>(undefined);\n\n // -- Outputs --\n\n /** Fires with the new mapping (a tree path or a keyed record). */\n readonly valueChanged = output<TreeNode[] | KeyedAccessValue>();\n\n /** Fires when the editor requests the parent to reload its data. */\n readonly reload = output<void>();\n\n // -- Component State (signals) --\n\n readonly #error = signal<HttpErrorResponse | undefined>(undefined);\n readonly #loading = signal<boolean>(false);\n readonly #viewMode = signal<ViewMode>('map');\n readonly #folderItems = signal<readonly IFolderItem[]>([]);\n\n /** The Postman item the current `mapToData` id resolves to (if any). */\n readonly #activeItem = computed<IFolderItem | undefined>(() => {\n const id = this.mapToData();\n return id ? this.#folderItems().find((i) => i.id === id) : undefined;\n });\n\n // Parsed bodies (arbitrary JSON shapes). They track the active item but can be\n // overridden locally — the response by runApiCall, the request by the editor —\n // so they are linkedSignals, not pure computeds.\n readonly #parsedResponseBody = linkedSignal<object | undefined>(() =>\n this.#parseResponseBody(this.#activeItem()),\n );\n readonly #parsedRequestBody = linkedSignal<object | undefined>(() =>\n this.#parseRequestBody(this.#activeItem()),\n );\n\n protected readonly error = this.#error.asReadonly();\n protected readonly loading = this.#loading.asReadonly();\n protected readonly viewMode = this.#viewMode.asReadonly();\n protected readonly parsedResponseBody = this.#parsedResponseBody.asReadonly();\n protected readonly parsedRequestBody = this.#parsedRequestBody.asReadonly();\n\n /** Whether the parent supplied validation errors to render. */\n protected readonly hasErrors = computed<boolean>(() => (this.errors()?.length ?? 0) > 0);\n\n /**\n * Value normalised for the template: in multipleBind mode a non-record value\n * collapses to an empty record so `keyedValue()[name]` is always safe.\n */\n protected readonly keyedValue = computed<KeyedAccessValue>(() => {\n const v = this.value();\n if (Array.isArray(v) || typeof v === 'string') {\n return {};\n }\n return v;\n });\n\n /** Single (non-keyed) value passed to the tree when not in multipleBind mode. */\n protected readonly singleValue = computed<TreeNode[] | string>(() => {\n const v = this.value();\n if (Array.isArray(v) || typeof v === 'string') {\n return v;\n }\n return '';\n });\n\n /** Data passed to the tree: the parsed response body, falling back to the raw id. */\n protected readonly treeData = computed<unknown>(\n () => this.#parsedResponseBody() ?? this.mapToData(),\n );\n\n // -- Injected dependencies --\n\n readonly #destroyRef = inject(DestroyRef);\n readonly #httpClient = inject(HttpClient);\n readonly #formsConfig = inject(NGX_T_FORMS_CONFIG_TOKEN);\n\n readonly #postFn = this.#formsConfig.formBuilder.httpPostDataFunction;\n readonly #getFn = this.#formsConfig.formBuilder.httpGetDataFunction;\n\n // -- Reactive bridges (replace legacy setters) --\n\n #cachedConfig: IPostmanCollectionConfig | undefined;\n protected readonly configBridge = effect(() => {\n const cfg = this.postmanCollectionConfig();\n if (_isEqual(this.#cachedConfig, cfg)) return;\n this.#cachedConfig = cfg;\n this.#initializePostmanService(cfg);\n });\n\n // -- Template-facing helpers --\n\n protected setViewMode(mode: ViewMode): void {\n this.#viewMode.set(mode);\n }\n\n protected keyedValueFor(control: string): TreeNode[] | string {\n return this.keyedValue()[control] ?? '';\n }\n\n protected pathChanged(path: TreeNode[] | string, control?: string): void {\n if (!Array.isArray(path)) {\n return;\n }\n if (!control) {\n this.valueChanged.emit(path);\n return;\n }\n const current = this.value();\n const base: KeyedAccessValue =\n Array.isArray(current) || typeof current === 'string' ? {} : { ...current };\n this.valueChanged.emit({ ...base, [control]: path });\n }\n\n protected requestBodyChanged(newBody: { value: object | unknown[]; valid: boolean }): void {\n const next = { ...(newBody.value as object) };\n if (_isEqual(this.#parsedRequestBody(), next)) {\n return;\n }\n this.#parsedRequestBody.set(next);\n }\n\n protected runApiCall(): void {\n const item = this.#activeItem();\n const url = item?.request?.url?.raw;\n if (!url) return;\n const method = item?.request?.method;\n const req$ =\n method === 'GET' ? this.#getFn(url) : this.#postFn(url, { ...this.#parsedRequestBody() });\n\n this.#loading.set(true);\n req$\n .pipe(\n take(1),\n tap((response: unknown) => {\n // Atomic success transition.\n this.#parsedResponseBody.set(response as object);\n this.#error.set(undefined);\n this.#viewMode.set('map');\n this.#loading.set(false);\n }),\n catchError((err: HttpErrorResponse) => {\n this.#error.set(err);\n this.#loading.set(false);\n return throwError(() => err);\n }),\n takeUntilDestroyed(this.#destroyRef),\n )\n .subscribe();\n }\n\n // -- Private helpers --\n\n #isValidConfig(\n config: IPostmanCollectionConfig | undefined,\n ): config is IPostmanCollectionConfig {\n return Boolean(config?.collectionUrl && config?.collectionKey);\n }\n\n #initializePostmanService(cfg: IPostmanCollectionConfig | undefined): void {\n if (!this.#isValidConfig(cfg)) {\n this.#error.set(new HttpErrorResponse({ error: 'Invalid Postman Collection Config' }));\n return;\n }\n\n const { collectionUrl, collectionKey } = cfg;\n\n const requestOptions = {\n params: { apikey: collectionKey, clearSystemHeaders: 'true' },\n headers: { 'Content-Type': 'application/json' },\n };\n\n this.#loading.set(true);\n\n this.#httpClient\n .get<IGetPostmanCollections>(collectionUrl, requestOptions)\n .pipe(\n take(1),\n tap((data) => {\n this.#error.set(undefined);\n this.#loading.set(false);\n this.#folderItems.set(flatApiList(data.collection.item));\n }),\n catchError((err: HttpErrorResponse) => {\n this.#error.set(err);\n this.#loading.set(false);\n return throwError(() => err);\n }),\n takeUntilDestroyed(this.#destroyRef),\n )\n .subscribe();\n }\n\n #parseResponseBody(item: IFolderItem | undefined): object | undefined {\n if (!item) return undefined;\n try {\n const bodySource = item.response?.[0]?.body;\n const responseBody: unknown =\n typeof bodySource === 'string' ? JSON.parse(bodySource || '{}') : bodySource;\n return responseBody &&\n typeof responseBody === 'object' &&\n Object.keys(responseBody).length > 0\n ? (responseBody as object)\n : undefined;\n } catch {\n return undefined;\n }\n }\n\n #parseRequestBody(item: IFolderItem | undefined): object | undefined {\n if (!item) return undefined;\n try {\n const body = item.request?.body;\n if (body?.mode !== 'raw') {\n return undefined;\n }\n const raw = body.raw || '';\n return typeof raw === 'string' ? (JSON.parse(raw) as object) : raw;\n } catch {\n return undefined;\n }\n }\n}\n","@if (hasErrors()) {\n <lib-error-list [errors]=\"errors()\" />\n}\n\n<div class=\"mode-toggle\">\n <mat-button-toggle-group name=\"valueAccessMode\" aria-label=\"Value access mode\" [value]=\"viewMode()\">\n <mat-button-toggle (click)=\"setViewMode('map')\" [checked]=\"viewMode() === 'map'\" value=\"map\">\n Value Mapping\n </mat-button-toggle>\n <mat-button-toggle (click)=\"setViewMode('sync')\" [checked]=\"viewMode() === 'sync'\" value=\"sync\">\n Data Sync\n </mat-button-toggle>\n </mat-button-toggle-group>\n</div>\n\n@if (error(); as err) {\n <lib-empty-state icon=\"error_outline\"\n [message]=\"err.error || err.message || 'Failed to load the collection.'\" />\n}\n\n@switch (viewMode()) {\n @case ('sync') {\n @if (parsedRequestBody(); as body) {\n <lib-json-editor (valueChange)=\"requestBodyChanged($event)\" [value]=\"body\" />\n } @else {\n <lib-empty-state icon=\"data_object\"\n message=\"No request body found in the selected API request.\" />\n }\n\n <div class=\"run-bar\">\n <p class=\"run-bar__hint\">Run the API call with the body above to load a live response.</p>\n <span class=\"run-bar__spacer\"></span>\n <button mat-stroked-button type=\"button\" [disabled]=\"loading()\" (click)=\"runApiCall()\"\n [attr.aria-busy]=\"loading()\" aria-label=\"Run API call\">\n @if (loading()) {\n <mat-spinner diameter=\"16\" />\n } @else {\n <mat-icon>play_arrow</mat-icon>\n }\n <span>{{ loading() ? 'Running API…' : 'Run API Call' }}</span>\n </button>\n </div>\n }\n\n @case ('map') {\n @if (multipleBind(); as controls) {\n @for (controlName of controls; track controlName) {\n <section class=\"mapping-section\">\n <label class=\"mapping-section__label\" [attr.for]=\"controlName\">\n Map <strong>{{ controlName }}</strong>\n </label>\n <lib-data-tree [formInputs]=\"formInputs()\" [data]=\"treeData()\"\n [value]=\"keyedValueFor(controlName)\"\n (pathChanged)=\"pathChanged($event, controlName)\" />\n </section>\n }\n } @else {\n <lib-data-tree [formInputs]=\"formInputs()\" [data]=\"treeData()\" [value]=\"singleValue()\"\n (pathChanged)=\"pathChanged($event)\" />\n }\n }\n}\n\n<!-- CDK overlay shown while disabled -->\n<ng-template cdkConnectedOverlay [cdkConnectedOverlayOpen]=\"disabled()\">\n <div class=\"disabled-overlay\" aria-hidden=\"true\"></div>\n</ng-template>\n","import { TitleCasePipe } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n ViewEncapsulation,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { distinctUntilChanged, tap } from 'rxjs';\r\nimport { FormColumnInputs, TreeNode } from 'ngx-t-forms-types';\r\nimport { SearchListPipe } from '../../../../../../shared/pipes/list-search.pipe';\r\nimport { expressionSyntaxValidator } from '../../functions/validateExpression';\r\nimport { ApiValueAccessRulesComponent } from '../../api-value-access-rules.component';\r\n\r\n/**\r\n * Builder-side editor for authoring a boolean expression (used for guarded\r\n * navigation, conditional validation, and API path-selection rules). Validates\r\n * the expression's syntax in real time and exposes the typed tree of value-\r\n * access references the expression depends on.\r\n *\r\n * Inputs:\r\n * - `hint: string` — helper text shown beneath the expression field.\r\n * - `label: string` — label for the expression field (default\r\n * `'Validation Expression'`).\r\n * - `formInputs: FormColumnInputs[]` — inputs the expression may reference.\r\n * - `data: unknown` — sample data used to test the expression.\r\n * - `expression: string` — initial expression string written into the editor\r\n * control.\r\n * - `valueAccessRules: Record<string, TreeNode[]>` — current value-access\r\n * tree for variables referenced by the expression.\r\n *\r\n * Outputs:\r\n * - `expressionChange` — fires when either the expression text or its derived\r\n * value-access tree changes.\r\n *\r\n * @public\r\n * @deprecated Internal builder UI re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n */\r\n@Component({\r\n selector: 'lib-validation-expressio-creator',\r\n imports: [\r\n TitleCasePipe,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatChipsModule,\r\n MatDividerModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatTooltipModule,\r\n SearchListPipe,\r\n ApiValueAccessRulesComponent,\r\n ],\r\n templateUrl: './validation-expressio-creator.component.html',\r\n styleUrl: './validation-expressio-creator.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.Emulated,\r\n host: {\r\n class: 'lib-validation-expressio-creator',\r\n },\r\n})\r\nexport class ValidationExpressioCreatorComponent {\r\n /** Helper text shown beneath the expression field. */\r\n readonly hint = input<string>(\r\n ' An expression that evaluates to true or false to determine if this path is taken.',\r\n );\r\n\r\n /** Label for the expression field. */\r\n readonly label = input<string>('Validation Expression');\r\n\r\n /** Inputs the expression may reference. */\r\n readonly formInputs = input<FormColumnInputs[]>([]);\r\n\r\n /** Sample data used to test the expression. Heterogeneous shape from parent template binding. */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n readonly data = input<any>({});\r\n\r\n /** Initial expression string written into the editor control. */\r\n readonly expression = input<string>('');\r\n\r\n /** Current value-access tree for variables referenced by the expression. */\r\n readonly valueAccessRules = input<Record<string, TreeNode[]>>({});\r\n\r\n /** Fires when either the expression text or its derived value-access tree changes. */\r\n readonly expressionChange = output<{\r\n expression: string | null;\r\n valueAccessRules: Record<string, TreeNode[]>;\r\n }>();\r\n\r\n protected readonly textareaElementRef =\r\n viewChild.required<ElementRef<HTMLTextAreaElement>>('textarea');\r\n\r\n protected readonly expressionControl = new FormControl<string>('', [\r\n Validators.required,\r\n expressionSyntaxValidator(),\r\n ]);\r\n\r\n protected readonly showSuggestions = signal<boolean>(false);\r\n protected readonly optionsSearch = signal<string | undefined>(undefined);\r\n protected readonly variableInEdit = signal<string | null>(null);\r\n #cursorPosition = 0;\r\n\r\n /** Local mutable mirror of incoming `valueAccessRules`. */\r\n #valueAccessRules: Record<string, TreeNode[]> = {};\r\n\r\n protected readonly methods = [\r\n { label: '&&', hint: ' logical AND . Returns true if both operands are true.', value: '&&' },\r\n { label: '||', hint: ' logical OR. Returns true if at least one operand is true.', value: '||' },\r\n {\r\n label: '===',\r\n hint: 'strict equality . Returns true if both operands are equal and of the same type.',\r\n value: '===',\r\n },\r\n {\r\n label: '==',\r\n hint: 'loose equality. Returns true if both operands are equal, performing type coercion if necessary.',\r\n value: '==',\r\n },\r\n {\r\n label: '!==',\r\n hint: 'strict inequality . Returns true if operands are not equal or not of the same type.',\r\n value: '!==',\r\n },\r\n {\r\n label: '!=',\r\n hint: 'loose inequality. Returns true if operands are not equal, performing type coercion if necessary.',\r\n value: '!=',\r\n },\r\n {\r\n label: '>',\r\n hint: 'greater than. Returns true if the left operand is greater than the right operand.',\r\n value: '>',\r\n },\r\n {\r\n label: '<',\r\n hint: 'less than. Returns true if the left operand is less than the right operand.',\r\n value: '<',\r\n },\r\n {\r\n label: '>=',\r\n hint: 'greater than or equal to. Returns true if the left operand is greater than or equal to the right operand.',\r\n value: '>=',\r\n },\r\n {\r\n label: '<=',\r\n hint: 'less than or equal to. Returns true if the left operand is less than or equal to the right operand.',\r\n value: '<=',\r\n },\r\n ];\r\n\r\n /** Bridge the `expression` input into the FormControl. */\r\n protected readonly expressionBridge = effect(() => {\r\n const value = this.expression();\r\n if (this.expressionControl.value !== value) {\r\n this.expressionControl.setValue(value);\r\n this.expressionControl.markAsPristine();\r\n this.expressionControl.markAsUntouched();\r\n }\r\n });\r\n\r\n /** Mirror the `valueAccessRules` input into the local mutable copy. */\r\n protected readonly valueAccessRulesBridge = effect(() => {\r\n this.#valueAccessRules = { ...this.valueAccessRules() };\r\n });\r\n\r\n protected readonly valueAccessOptions = computed<string[]>(() =>\r\n Object.keys(this.valueAccessRules()),\r\n );\r\n\r\n protected readonly allInputs = computed<FormColumnInputs[]>(() =>\r\n this.formInputs().filter((inp) => !inp.multipleInputInEditId),\r\n );\r\n\r\n readonly #destroyRef = inject(DestroyRef);\r\n\r\n constructor() {\r\n this.expressionControl.valueChanges\r\n .pipe(\r\n distinctUntilChanged((prev, curr) => prev === curr),\r\n tap((value) => {\r\n this.onTextChange(value || '').then(() => {\r\n this.expressionChange.emit({\r\n expression: this.expressionControl.value,\r\n valueAccessRules: this.#valueAccessRules,\r\n });\r\n });\r\n }),\r\n takeUntilDestroyed(this.#destroyRef),\r\n )\r\n .subscribe();\r\n }\r\n\r\n protected getMethods(): { label: string; hint: string; value: string }[] {\r\n return this.methods;\r\n }\r\n\r\n protected get errorMessage(): string | null {\r\n const errors = this.expressionControl.errors;\r\n if (!errors) {\r\n return null;\r\n }\r\n if (errors['invalidExpression']) {\r\n return errors['invalidExpression'] || 'The expression syntax is invalid.';\r\n }\r\n if (errors['required']) {\r\n return 'This field is required.';\r\n }\r\n return null;\r\n }\r\n\r\n protected getValueAccessRule(key: string): TreeNode[] {\r\n return this.#valueAccessRules[key] ?? [];\r\n }\r\n\r\n protected async onTextChange(expression: string): Promise<void> {\r\n const textarea = this.textareaElementRef().nativeElement;\r\n this.#cursorPosition = textarea.selectionStart || 0;\r\n\r\n // Define the operators that should prevent suggestions from showing\r\n const operators = this.methods.map((method) => method.value);\r\n\r\n // Create a regex to find any of these operators\r\n const operatorRegex = new RegExp(\r\n operators.map((op) => `\\\\${op.split('').join('\\\\')}`).join('|'),\r\n );\r\n\r\n // Find the last occurrence of '$' before the cursor\r\n const lastDollarIndex = expression.substring(0, this.#cursorPosition).lastIndexOf('$');\r\n\r\n if (lastDollarIndex !== -1) {\r\n // Extract the text between the last '$' and the cursor\r\n const textAfterDollar = expression.substring(lastDollarIndex + 1, this.#cursorPosition);\r\n this.optionsSearch.set(textAfterDollar);\r\n const isValidFormat = /^[a-zA-Z\\s]*$/.test(textAfterDollar);\r\n const containsOperator = operatorRegex.test(textAfterDollar);\r\n this.showSuggestions.set(isValidFormat && !containsOperator);\r\n } else {\r\n this.optionsSearch.set('');\r\n this.showSuggestions.set(false);\r\n }\r\n this.cleanValueAccessRules();\r\n }\r\n\r\n protected cleanValueAccessRules(): void {\r\n const expression = this.expressionControl.value || '';\r\n const originalRules = this.#valueAccessRules;\r\n\r\n const expressionTokens: RegExpMatchArray | null = expression.match(/[a-zA-Z0-9_]+/g);\r\n\r\n const filteredRules = Object.keys(originalRules)\r\n .filter((key: string) => expressionTokens?.includes(key))\r\n .reduce<Record<string, TreeNode[]>>((newRules, key) => {\r\n newRules[key] = originalRules[key] ?? [];\r\n return newRules;\r\n }, {});\r\n\r\n const inputsToAdd = this.formInputs().filter(\r\n (inp) =>\r\n expressionTokens?.includes(inp.formControlName) && !filteredRules[inp.formControlName],\r\n );\r\n\r\n const newRulesToAdd = inputsToAdd.reduce<Record<string, TreeNode[]>>((acc, inp) => {\r\n acc[inp.formControlName] = [\r\n {\r\n value: inp.formControlName,\r\n key: inp.formControlName,\r\n name: inp.label,\r\n path: [inp.formControlName],\r\n functions: [],\r\n },\r\n ];\r\n return acc;\r\n }, {});\r\n\r\n this.#valueAccessRules = {\r\n ...filteredRules,\r\n ...newRulesToAdd,\r\n };\r\n }\r\n\r\n protected selectSuggestionInput(suggestion: string): void {\r\n const originalValue = this.expressionControl.value || '';\r\n\r\n const lastDollarIndex = originalValue.substring(0, this.#cursorPosition).lastIndexOf('$');\r\n\r\n if (lastDollarIndex !== -1) {\r\n const beforeDollar = originalValue.slice(0, lastDollarIndex);\r\n const afterCursor = originalValue.slice(this.#cursorPosition);\r\n\r\n const newValue = beforeDollar + suggestion + ' ' + afterCursor;\r\n\r\n this.expressionControl.setValue(newValue);\r\n this.expressionControl.markAsDirty();\r\n this.showSuggestions.set(false);\r\n\r\n const textarea = this.textareaElementRef().nativeElement;\r\n textarea.focus();\r\n\r\n const newCursorPosition = (beforeDollar + suggestion + ' ').length;\r\n\r\n setTimeout(() => {\r\n textarea.setSelectionRange(newCursorPosition, newCursorPosition);\r\n }, 0);\r\n const formInput = this.formInputs().find((inp) => inp.formControlName === suggestion);\r\n if (formInput?.formControlName) {\r\n this.#valueAccessRules = {\r\n ...this.#valueAccessRules,\r\n [formInput.formControlName]: [\r\n {\r\n value: formInput.formControlName,\r\n key: formInput.formControlName,\r\n name: formInput.label,\r\n path: [formInput.formControlName],\r\n functions: [],\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n }\r\n\r\n protected onFocus(): void {\r\n const textarea = this.textareaElementRef().nativeElement;\r\n this.#cursorPosition = textarea.selectionStart || 0;\r\n }\r\n\r\n protected toggleVariableInEdit(variable: string): void {\r\n this.variableInEdit.update((current) => (current === variable ? null : variable));\r\n }\r\n\r\n protected activeVariableChanged(\r\n value: TreeNode[] | string | { [key: string]: TreeNode[] | string },\r\n ): void {\r\n this.expressionChange.emit({\r\n expression: this.expressionControl.value,\r\n valueAccessRules: {\r\n ...this.#valueAccessRules,\r\n [this.variableInEdit() || '']: value,\r\n } as Record<string, TreeNode[]>,\r\n });\r\n }\r\n}\r\n","<mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" style=\"width: 100%;\" floatLabel=\"always\"\r\n id=\"validationExpressionCreator\">\r\n <mat-label>Condition expression</mat-label>\r\n <textarea [formControl]=\"expressionControl\" matInput #textarea (focus)=\"onFocus()\"\r\n placeholder=\"Enter a validation string for the function\"></textarea>\r\n\r\n\r\n <mat-hint\r\n [style.color]=\"expressionControl.invalid && !showSuggestions() ? 'var(--mat-form-field-error-text-color, var(--mat-sys-error))' : ''\">\r\n @if (expressionControl.invalid && errorMessage !== null && !showSuggestions()) {\r\n {{ errorMessage }}\r\n } @else {\r\n {{ showSuggestions() ? 'Click a suggestion to apply it' : 'Enter a filter condition. Type $ for options' }}\r\n @if (showSuggestions()) {\r\n <section class=\"showSuggestionContainer\">\r\n <mat-divider></mat-divider>\r\n <div style=\"padding: 0px;margin-top:8px\" class=\"\">\r\n <div class=\"suggestion-container\">\r\n <div class=\"suggestion-column\">\r\n <div class=\"suggestion-heading\">\r\n Logical Operators\r\n </div>\r\n <div class=\"button-container\">\r\n @for (method of getMethods() | searchList:optionsSearch(); track method.value) {\r\n <button matTooltipPosition=\"left\" [matTooltip]=\"method.hint\" color=\"primary\" mat-button\r\n (click)=\"selectSuggestionInput(method.value)\" class=\"suggestion-button\">\r\n {{ method.label | titlecase }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"suggestion-column\">\r\n <div class=\"suggestion-heading\">\r\n Add Input as a Variable\r\n </div>\r\n <div class=\"button-container\">\r\n @for (inp of allInputs() | searchList:optionsSearch(); track inp.formControlName) {\r\n <button mat-button matTooltipPosition=\"right\"\r\n [matTooltip]=\"'Add Variable - ' + inp.label\"\r\n (click)=\"selectSuggestionInput(inp.formControlName)\" class=\"suggestion-button\">\r\n {{ inp.label | titlecase }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n }\r\n }\r\n </mat-hint>\r\n</mat-form-field>\r\n\r\n@if (valueAccessOptions().length > 0) {\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" style=\"width: 100%;margin-top:12px\"\r\n floatLabel=\"always\" id=\"Value access options\">\r\n <mat-label>\r\n Form Fields for expression\r\n </mat-label>\r\n <mat-chip-grid #chipGrid aria-label=\"value access options\">\r\n @for (variable of valueAccessOptions(); track variable) {\r\n <mat-chip-option\r\n [selected]=\"variableInEdit() === variable\"\r\n (click)=\"toggleVariableInEdit(variable)\"\r\n [aria-description]=\"'press enter to edit ' + variable\">\r\n {{ variable }}\r\n </mat-chip-option>\r\n }\r\n <input placeholder=\"\" style=\"display: none;\" [matChipInputFor]=\"chipGrid\" />\r\n </mat-chip-grid>\r\n @if (variableInEdit(); as activeVariable) {\r\n <lib-api-value-access-rules\r\n [value]=\"getValueAccessRule(activeVariable)\"\r\n [errors]=\"[]\"\r\n [formInputs]=\"formInputs() || []\"\r\n [mapToData]=\"data()\"\r\n (valueChanged)=\"activeVariableChanged($event)\">\r\n </lib-api-value-access-rules>\r\n }\r\n <mat-hint>\r\n Click a field to define how to process its value. You can filter a list, count its items, or access specific\r\n data within a complex object.\r\n </mat-hint>\r\n </mat-form-field>\r\n}\r\n","import { A11yModule } from '@angular/cdk/a11y';\r\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { DialogConfig } from 'ngx-t-forms-types';\r\n\r\n/**\r\n * Generic Material dialog shell used by the forms runtime to surface\r\n * confirmation prompts and short-lived informational dialogs. Reads its\r\n * configuration (title, body, button labels) from `MAT_DIALOG_DATA` as a\r\n * `DialogConfig` and resolves its `MatDialogRef` with `true` when the user\r\n * proceeds.\r\n *\r\n * Inputs:\r\n * - _None._ Configuration arrives through `MAT_DIALOG_DATA` (`DialogConfig`).\r\n *\r\n * Outputs:\r\n * - _None._ Result is delivered via `MatDialogRef.close(true)`.\r\n *\r\n * @public\r\n * @deprecated Internal Material dialog template re-exported via the `_deprecated/`\r\n * compatibility barrel; remains functional. A renamed/improved replacement may be\r\n * introduced in a future minor; the original symbol stays callable. See\r\n * DECISIONS.md D-014.\r\n */\r\n@Component({\r\n selector: 'lib-dialog-template',\r\n imports: [MatDialogModule, MatButtonModule, A11yModule],\r\n templateUrl: './dialog-template.component.html',\r\n styleUrl: './dialog-template.component.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DialogTemplateComponent {\r\n readonly dialogRef = inject(MatDialogRef<DialogTemplateComponent>);\r\n readonly data = inject<DialogConfig>(MAT_DIALOG_DATA);\r\n\r\n proceed(): void {\r\n this.dialogRef.close(true);\r\n }\r\n}\r\n","<h2 mat-dialog-title>\r\n {{data.title}}\r\n</h2>\r\n<mat-dialog-content>\r\n{{data.message}}\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions >\r\n <button \r\n color=\"warn\"\r\n mat-flat-button mat-dialog-close>\r\n {{data.noText}}\r\n </button>\r\n <span class=\"spacer\"></span>\r\n <button \r\n (click)=\"proceed()\"\r\n color=\"primary\"\r\n mat-raised-button mat-dialog-close cdkFocusInitial>\r\n {{data.yesText}}\r\n </button>\r\n</mat-dialog-actions>","import { FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport { generateSecretKey } from '../../../../../../../services/core/t-input-controller/functions/generateInputSecret';\r\nimport type { PointGroup } from \"signature_pad\";\r\nimport { decrypt, EncryptedData } from \"../../../../../../../shared/functions/enryption\";\r\nimport { SignatureConfigOptions } from \"../../../config/signature\";\r\n/**\r\n * @public\r\n * @deprecated Internal helper re-exported via the `_deprecated/` compatibility\r\n * barrel; remains functional. A renamed/improved replacement may be introduced\r\n * in a future minor; the original symbol stays callable. See DECISIONS.md D-014.\r\n *\r\n * **Breaking (v2.x):** now requires `secret` as a third argument — the\r\n * hardcoded library secret was removed (LIB-05). Read it from\r\n * `INPUT_SECRET_TOKEN` in your component / service before calling.\r\n */\r\nexport const getSignatureImage = async (\r\n inputConfig: FormColumnInputs,\r\n value: EncryptedData | undefined,\r\n secret: string,\r\n): Promise<string | undefined> => {\r\n // SSR guard (Trap 14): free helper has no DI context. Returning `undefined`\r\n // matches existing early-exit paths in this function — caller contract preserved.\r\n if (typeof document === 'undefined') return;\r\n\r\n if (typeof value !== 'object' && value !== null || value === null) return\r\n\r\n const key = await generateSecretKey(inputConfig, secret);\r\n const canvas = document.createElement('canvas');\r\n // canvas.height = 50\r\n // canvas.width = 160\r\n canvas.height = 200\r\n canvas.width = 640\r\n // Dynamically load browser-only UMD bundle (SSR-safe — gated above by `typeof document` check).\r\n const { default: SignaturePad } = await import('signature_pad');\r\n const signaturePad = new SignaturePad(canvas, SignatureConfigOptions);\r\n if (!key) {\r\n return\r\n }\r\n if (!value || !value.salt || !key || typeof value.iv !== 'string' || typeof value.salt !== 'string') {\r\n return\r\n }\r\n\r\n const decrypted: string = await decrypt(value, key);\r\n let parsed: PointGroup[];\r\n try {\r\n parsed = JSON.parse(decrypted || '[]');\r\n } catch {\r\n return\r\n }\r\n signaturePad?.fromData(parsed);\r\n const url = signaturePad.toDataURL()\r\n return url\r\n\r\n}\r\n","/**\r\n * Compatibility re-export barrel. These symbols were transitively reachable\r\n * via the pre-Phase-1 `export *` chains and remain exported here so existing\r\n * consumers continue to compile.\r\n *\r\n * NOTE — corrected scope (see DECISIONS.md D-013 + D-014): the symbols listed\r\n * below are NOT scheduled for removal. Two distinct corrections apply:\r\n *\r\n * (a) D-013 — The 15 component classes in the `t-form-input/` subtree\r\n * (`TFormInputComponent` is the polymorphic dispatcher used by\r\n * `UserFormStepperComponent`/`TFormInputBridgeComponent`/`FormSectionStepperComponent`;\r\n * `MscoaFormInputComponent` and `SignatureInputElementComponent` are\r\n * rendered by the dispatcher for `MscoaSelection` and `Signature` element\r\n * types) were Phase-3 swept in batches 11–13 and the `@deprecated`\r\n * markers were removed at the source declarations.\r\n *\r\n * (b) D-014 — The ~20 helpers / services / tokens / sub-components in this\r\n * barrel that still carried \"Target removal: v3.0.0. Internal helper —\r\n * no public replacement\" had that wording stripped. Per the project rule\r\n * that original functionality is never removed without an equivalent\r\n * alternative, the TSDoc on each declaration now states that the symbol\r\n * remains callable and that any future replacement will be additive.\r\n *\r\n * The folder name is retained to keep the re-export path stable for consumers.\r\n * Do not add new symbols here without an accompanying decision entry.\r\n */\r\n\r\n// ─── Boilerplate stubs from `ng generate library` ────────────────────────────\r\nexport { NgxTFormsService } from '../ngx-t-forms.service';\r\nexport { NgxTFormsComponent } from '../ngx-t-forms.component';\r\n\r\n// ─── Internal services that leaked via `services/index` ──────────────────────\r\nexport { TFormImportController } from '../services/core/t-form-import-controller/t-form-import-controller';\r\nexport { IMPORT_TOWER_INSTANCE_ID } from '../services/core/t-form-import-controller/import-tokens';\r\n\r\n// ─── Internal helpers / generators that leaked via `services/index` ──────────\r\nexport { formGenerator } from '../services/core/t-form-section-controller/Functions/formGenerator';\r\nexport { getSectionElements } from '../services/core/t-form-builder/functions/inputElementEditorConfigs';\r\nexport {\r\n returnMappedPathValue,\r\n getValueFromValueAccessor,\r\n} from '../services/core/t-form-section-controller/Functions/getValueFromPathMap';\r\n\r\n// ─── Internal sub-components reached via the old `components/index` barrel ───\r\nexport { TFormInputComponent } from '../components/t-form-input/t-form-input.component';\r\nexport { MscoaFormInputComponent } from '../components/t-form-input/elements/mscoa-form-input/mscoa-form-input.component';\r\nexport { SignatureInputElementComponent } from '../components/t-form-input/elements/signature-input-element/signature-input-element.component';\r\nexport { ValidationExpressioCreatorComponent } from '../components/t-dynamic-data-edit/elements/api-value-access-rules/elements/validation-expressio-creator/validation-expressio-creator.component';\r\nexport { DialogTemplateComponent } from '../components/dialog-template/dialog-template.component';\r\n\r\n// ─── Shared utility functions that leaked via `shared/index` ─────────────────\r\nexport {\r\n returnDeepProperty,\r\n safeReturnDeepProperty,\r\n PropertyAccessError,\r\n} from '../shared/functions/getDeepObject';\r\nexport { assignDeepPropertyToObject } from '../shared/functions/assignDeepPropertyToObject';\r\nexport { createFileFromBase64 } from '../shared/functions/createFileUploadSample';\r\nexport { getSampleValueForInput } from '../shared/functions/getformInputsSampleValue';\r\nexport { getPipedValueFromDataType } from '../shared/functions/getPipedValueFromDataType';\r\nexport { initFormConfigToV2 } from '../shared/functions/migrationCheck';\r\nexport { getUrl } from '../shared/functions/replaceUrlVariables';\r\nexport { sheetConsolodation } from '../shared/functions/sheetConsolodator';\r\nexport { textIconsForUserHints } from '../shared/functions/textIconsForUserHints';\r\nexport {\r\n validateObjectAgainstString,\r\n validateExpressionSyntax,\r\n} from '../shared/modules/stringJsonValidator/getObjectValidations';\r\n\r\n// ─── Helper functions that leaked via `components/index` ─────────────────────\r\nexport { testAgainstItem } from '../components/t-dynamic-data-edit/functions/testData';\r\nexport { getSignatureImage } from '../components/t-form-input/elements/signature-input-element/core/signature-pad-input/functions/getSignatureImage';\r\n","/*\r\n * Public API Surface of ngx-t-forms\r\n */\r\n\r\n// ─── Provider entrypoint ─────────────────────────────────────────────────────\r\nexport { provideNgxTForms } from './lib/services/core/t-form-environment-injection/functions/provideNgxTforms';\r\nexport { withHttpPipeline } from './lib/config/with-http-pipeline';\r\nexport { withInputSecret } from './lib/config/with-input-secret';\r\nexport { withRouterFormId } from './lib/config/with-router-form-id';\r\n\r\n// ─── Injection tokens ────────────────────────────────────────────────────────\r\nexport {\r\n FORM_ACTIONS_TOKEN,\r\n FORM_CONFIG_TOKEN,\r\n FORM_SLIDES_TOKEN,\r\n UTILS_OBJECT_TOKEN,\r\n FORM_INPUTS_TOKEN,\r\n MULTIPLE_FORM_INPUT_TOKEN,\r\n MSCOA_TREE_PROVIDER,\r\n NGX_T_FORMS_CONFIG_TOKEN,\r\n PIPELINE_REPOSITORY,\r\n INPUT_SECRET_TOKEN,\r\n FORM_ROUTE_SOURCE,\r\n} from './lib/tokens';\r\n\r\n// ─── Repository abstractions (Phase 2 layering — LP §9) ──────────────────────\r\nexport { PipelineRepository } from './lib/domain/pipeline.repository';\r\nexport { HttpPipelineRepository } from './lib/infrastructure/http-pipeline.repository';\r\n\r\n// ─── Components ──────────────────────────────────────────────────────────────\r\nexport { FormsComponent } from './lib/components/forms/forms.component';\r\nexport { FormBuilderComponent } from './lib/components/form-builder/form-builder.component';\r\nexport { UserFormStepperComponent } from './lib/components/user-form-stepper/user-form-stepper.component';\r\nexport { TDynamicDataEditComponent } from './lib/components/t-dynamic-data-edit/t-dynamic-data-edit.component';\r\nexport { TDynamicDataViewComponent } from './lib/components/t-dynamic-data-view/t-dynamic-data-view.component';\r\n\r\n// ─── Services (deprecated extension point — SIGNAL_FORMS Phase 0 / D-025) ────\r\n/**\r\n * @deprecated The three internal consumers no longer extend this class — they\r\n * compose the per-instance `TFormEngine` façade (SIGNAL_FORMS migration Phase 0;\r\n * DECISIONS.md D-023/D-025). The export is retained for one minor cycle for\r\n * backward compatibility and remains fully callable. Internalisation is deferred\r\n * pending confirmation that no external consumer subclasses it (plan §10 Q2).\r\n */\r\nexport { FormTowerControllerService } from './lib/services/core/t-form-tower-controller/form-tower-controller.service';\r\n\r\n// ─── Pipes ───────────────────────────────────────────────────────────────────\r\nexport { FormatDataPipe } from './lib/shared/pipes/format-Data.pipe';\r\n\r\n// ─── D-010 type re-exports (Phase 4, 2026-05-26) ─────────────────────────────\r\n/** Re-exported types from `ngx-t-forms-types` for consumer convenience. @public */\r\nexport type {\r\n FormInterface,\r\n NgxTFormsConfig,\r\n IFormActions,\r\n FormColumnInputs,\r\n TreeNode,\r\n IGetTreeResponse,\r\n IWorkflowOption,\r\n BlurHandleTypes,\r\n InputDataTypes,\r\n ElementEditorTypes,\r\n IFormChangeHistory,\r\n FormSubmissionStatus,\r\n IArrayFunction,\r\n FileUploadInputValueInterface,\r\n IFormValidationOverride,\r\n DialogConfig,\r\n FormBuilderFunctions,\r\n ITowerStepColumn,\r\n LocalFormStateSelectorInterface,\r\n FormListSection,\r\n DocumentLitsLabelConfigInterfaceValueType,\r\n InputPipeTypes,\r\n ElementEditorInnerSectionElementInterface,\r\n InClassFormUtilsInterface,\r\n ValidationError,\r\n ConfigurationValidTestInterface,\r\n // H-018b: surfaced explicitly so api-extractor can resolve\r\n // `IScoaAccount[]` referenced by `FormBuilderFunctions.getSCOAAccount`.\r\n IScoaAccount,\r\n // H-018b: migration-bridge union for `initFormConfigToV2` consumers.\r\n FormInterfaceMigration,\r\n OLD_FormInterface,\r\n} from 'ngx-t-forms-types';\r\n\r\n// ─── D-016 type re-exports (Phase 4 closure, 2026-05-26) ─────────────────────\r\n/**\r\n * Types upstreamed from `ngx-t-forms` to `ngx-t-forms-types` per DECISIONS.md\r\n * D-016. These previously triggered `ae-forgotten-export` warnings because\r\n * they were declared locally inside `src/lib/**` but referenced in public\r\n * signatures. They now live in the shared types package and are surfaced here.\r\n *\r\n * `WorkflowFunctionTypes` was previously surfaced by api-extractor under the\r\n * auto-disambiguated name `FunctionTypes_2` (collided with the array-access\r\n * `FunctionTypes` already in `ngx-t-forms-types`); it is now distinctly named.\r\n *\r\n * @public\r\n */\r\nexport type {\r\n IFormTour,\r\n EncryptedData,\r\n ImportProgress,\r\n ImportRowState,\r\n ImportRowStatus,\r\n PropertyPath,\r\n DeepPropertyValue,\r\n} from 'ngx-t-forms-types';\r\nexport { WorkflowFunctionTypes } from 'ngx-t-forms-types';\r\n\r\n// ─── Deprecated (kept one minor cycle — target removal v3.0.0) ───────────────\r\nexport * from './lib/_deprecated';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isRecord","splitPath","FunctionTypes","this","uuidv4","map","catchError","applyValueAccessRules","switchMap","reducers.auditStateValues","reducers.setConfig","reducers.setSegmentValues","reducers.setSegmentAccount","reducers.setActiveSegment","reducers.setLoadingTree","reducers.setValidatingValue","reducers.setValidationErrors","reducers.setInitiated","i1","i2","i3","i4","i7","i8","i9","i10","i11","i6","i5","debounceTime","distinctUntilChanged","shareReplay","tap","finalize","customInputConfig"],"mappings":"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"}