ngx-t-forms 2.0.29 → 2.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/fesm2022/ngx-t-forms-auto-complete-input-element.component-DCKuXHAW.mjs +104 -0
  2. package/fesm2022/ngx-t-forms-auto-complete-input-element.component-DCKuXHAW.mjs.map +1 -0
  3. package/fesm2022/ngx-t-forms-basic-input-input-element.component-Ce4ipSUc.mjs +85 -0
  4. package/fesm2022/ngx-t-forms-basic-input-input-element.component-Ce4ipSUc.mjs.map +1 -0
  5. package/fesm2022/ngx-t-forms-calculated-field-rules.component-C5TPddVe.mjs +643 -0
  6. package/fesm2022/ngx-t-forms-calculated-field-rules.component-C5TPddVe.mjs.map +1 -0
  7. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-CICQaqz6.mjs +97 -0
  8. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-CICQaqz6.mjs.map +1 -0
  9. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-CzisLSIP.mjs +195 -0
  10. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-CzisLSIP.mjs.map +1 -0
  11. package/fesm2022/ngx-t-forms-data-source-picker.component-Dzz_o6fJ.mjs +261 -0
  12. package/fesm2022/ngx-t-forms-data-source-picker.component-Dzz_o6fJ.mjs.map +1 -0
  13. package/fesm2022/ngx-t-forms-date-picker-input-element.component-CYUbVyzP.mjs +85 -0
  14. package/fesm2022/ngx-t-forms-date-picker-input-element.component-CYUbVyzP.mjs.map +1 -0
  15. package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-CmoquQGV.mjs +156 -0
  16. package/fesm2022/ngx-t-forms-date-range-picker-input-element.component-CmoquQGV.mjs.map +1 -0
  17. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs +368 -0
  18. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-CLUOXreG.mjs.map +1 -0
  19. package/fesm2022/ngx-t-forms-document-picker.component-qObjcqhE.mjs +704 -0
  20. package/fesm2022/ngx-t-forms-document-picker.component-qObjcqhE.mjs.map +1 -0
  21. package/fesm2022/ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs +294 -0
  22. package/fesm2022/ngx-t-forms-editor-input-element.component-BLXlfb6F.mjs.map +1 -0
  23. package/fesm2022/ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs +240 -0
  24. package/fesm2022/ngx-t-forms-editor-js-input.component-BQL0AH7H.mjs.map +1 -0
  25. package/fesm2022/ngx-t-forms-file-upload-input-element.component-C7mMeEjF.mjs +205 -0
  26. package/fesm2022/ngx-t-forms-file-upload-input-element.component-C7mMeEjF.mjs.map +1 -0
  27. package/fesm2022/ngx-t-forms-form-input-selector.component-C9u8zq9B.mjs +86 -0
  28. package/fesm2022/ngx-t-forms-form-input-selector.component-C9u8zq9B.mjs.map +1 -0
  29. package/fesm2022/ngx-t-forms-form-json-view.component-856Hx1Bg.mjs +22 -0
  30. package/fesm2022/ngx-t-forms-form-json-view.component-856Hx1Bg.mjs.map +1 -0
  31. package/fesm2022/ngx-t-forms-form-payload-projection.component-CDkTuX9S.mjs +179 -0
  32. package/fesm2022/ngx-t-forms-form-payload-projection.component-CDkTuX9S.mjs.map +1 -0
  33. package/fesm2022/ngx-t-forms-form-section-stepper.component-Bs50-nEB.mjs +319 -0
  34. package/fesm2022/ngx-t-forms-form-section-stepper.component-Bs50-nEB.mjs.map +1 -0
  35. package/fesm2022/ngx-t-forms-forms-builder-menu.component-qrhM0jGL.mjs +379 -0
  36. package/fesm2022/ngx-t-forms-forms-builder-menu.component-qrhM0jGL.mjs.map +1 -0
  37. package/fesm2022/ngx-t-forms-geo-location.component-Bosp1UzR.mjs +124 -0
  38. package/fesm2022/ngx-t-forms-geo-location.component-Bosp1UzR.mjs.map +1 -0
  39. package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs +31 -0
  40. package/fesm2022/ngx-t-forms-getInputIcon-B4ADgevZ.mjs.map +1 -0
  41. package/fesm2022/ngx-t-forms-image-capture-input-element.component-C1g7Z0cK.mjs +180 -0
  42. package/fesm2022/ngx-t-forms-image-capture-input-element.component-C1g7Z0cK.mjs.map +1 -0
  43. package/fesm2022/ngx-t-forms-index-dDSobs6A.mjs +2 -0
  44. package/fesm2022/ngx-t-forms-index-dDSobs6A.mjs.map +1 -0
  45. package/fesm2022/ngx-t-forms-input-custom.component-BkbHFAyR.mjs +105 -0
  46. package/fesm2022/ngx-t-forms-input-custom.component-BkbHFAyR.mjs.map +1 -0
  47. package/fesm2022/ngx-t-forms-input-editor.component-BPUOM9kQ.mjs +181 -0
  48. package/fesm2022/ngx-t-forms-input-editor.component-BPUOM9kQ.mjs.map +1 -0
  49. package/fesm2022/{ngx-t-forms-map-mat-options-keys-CbdW82su.mjs → ngx-t-forms-map-mat-options-keys-B6hJ7Io5.mjs} +12 -14
  50. package/fesm2022/ngx-t-forms-map-mat-options-keys-B6hJ7Io5.mjs.map +1 -0
  51. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs +66 -0
  52. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-c7uZT1sr.mjs.map +1 -0
  53. package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs +211 -0
  54. package/fesm2022/ngx-t-forms-mat-slider-editor.component-CTSBrM-j.mjs.map +1 -0
  55. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs +165 -0
  56. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-CcYiwx-8.mjs.map +1 -0
  57. package/fesm2022/ngx-t-forms-missing-form-configs.component-DrnH8qdG.mjs +38 -0
  58. package/fesm2022/ngx-t-forms-missing-form-configs.component-DrnH8qdG.mjs.map +1 -0
  59. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-C_abEBQ5.mjs +38 -0
  60. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-C_abEBQ5.mjs.map +1 -0
  61. package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs +126 -0
  62. package/fesm2022/ngx-t-forms-mscoa-error-display.component-99DpVSy7.mjs.map +1 -0
  63. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C0qsMfsq.mjs +336 -0
  64. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-C0qsMfsq.mjs.map +1 -0
  65. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs +74 -0
  66. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-B1Z-IXSL.mjs.map +1 -0
  67. package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C7y1OGPx.mjs +905 -0
  68. package/fesm2022/ngx-t-forms-multiple-input-input-element.component-C7y1OGPx.mjs.map +1 -0
  69. package/fesm2022/ngx-t-forms-ngx-t-forms-u_kigDid.mjs +19461 -0
  70. package/fesm2022/ngx-t-forms-ngx-t-forms-u_kigDid.mjs.map +1 -0
  71. package/fesm2022/ngx-t-forms-paginated-selection-table-AQZSMmhr.mjs +555 -0
  72. package/fesm2022/ngx-t-forms-paginated-selection-table-AQZSMmhr.mjs.map +1 -0
  73. package/fesm2022/ngx-t-forms-pipeline-generator.component-DmNSc5aw.mjs +748 -0
  74. package/fesm2022/ngx-t-forms-pipeline-generator.component-DmNSc5aw.mjs.map +1 -0
  75. package/fesm2022/ngx-t-forms-record-list-manager.component-CUMMvMch.mjs +358 -0
  76. package/fesm2022/ngx-t-forms-record-list-manager.component-CUMMvMch.mjs.map +1 -0
  77. package/fesm2022/ngx-t-forms-required-inputs.component-Ch2yNcIS.mjs +272 -0
  78. package/fesm2022/ngx-t-forms-required-inputs.component-Ch2yNcIS.mjs.map +1 -0
  79. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-C_aFtdvW.mjs +398 -0
  80. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-C_aFtdvW.mjs.map +1 -0
  81. package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs +38 -0
  82. package/fesm2022/ngx-t-forms-search-field.component-B2ZO7lqO.mjs.map +1 -0
  83. package/fesm2022/ngx-t-forms-section-report.component-BxOhR6C0.mjs +98 -0
  84. package/fesm2022/ngx-t-forms-section-report.component-BxOhR6C0.mjs.map +1 -0
  85. package/fesm2022/ngx-t-forms-select-input-element.component-DbgZdNoe.mjs +150 -0
  86. package/fesm2022/ngx-t-forms-select-input-element.component-DbgZdNoe.mjs.map +1 -0
  87. package/fesm2022/ngx-t-forms-selection-options-editor.component-Dhln81DL.mjs +169 -0
  88. package/fesm2022/ngx-t-forms-selection-options-editor.component-Dhln81DL.mjs.map +1 -0
  89. package/fesm2022/ngx-t-forms-t-workflow-picker.component-leBokXvM.mjs +204 -0
  90. package/fesm2022/ngx-t-forms-t-workflow-picker.component-leBokXvM.mjs.map +1 -0
  91. package/fesm2022/ngx-t-forms-textarea-input-element.component-BEbXJjFA.mjs +95 -0
  92. package/fesm2022/ngx-t-forms-textarea-input-element.component-BEbXJjFA.mjs.map +1 -0
  93. package/fesm2022/ngx-t-forms-toggle-input-element.component-DDErRUJd.mjs +82 -0
  94. package/fesm2022/ngx-t-forms-toggle-input-element.component-DDErRUJd.mjs.map +1 -0
  95. package/fesm2022/ngx-t-forms-validators-config.component-oGjQVGE2.mjs +733 -0
  96. package/fesm2022/ngx-t-forms-validators-config.component-oGjQVGE2.mjs.map +1 -0
  97. package/fesm2022/ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs +1303 -0
  98. package/fesm2022/ngx-t-forms-workflow-adjudication.component-CtU8dECN.mjs.map +1 -0
  99. package/fesm2022/ngx-t-forms.mjs +2 -1
  100. package/fesm2022/ngx-t-forms.mjs.map +1 -1
  101. package/package.json +20 -18
  102. package/styles/_editor-mixins.scss +62 -0
  103. package/styles/_json-editor-syntax.scss +26 -0
  104. package/styles/_signature-pad.scss +26 -0
  105. package/styles/_tokens.scss +148 -0
  106. package/types/ngx-t-forms.d.ts +1767 -621
  107. package/fesm2022/ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs +0 -313
  108. package/fesm2022/ngx-t-forms-calculated-field-rules.component-D-SBMdYg.mjs.map +0 -1
  109. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs +0 -191
  110. package/fesm2022/ngx-t-forms-chip-options-creator-editor.component-1cpszpPN.mjs.map +0 -1
  111. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs +0 -207
  112. package/fesm2022/ngx-t-forms-config-mscoa-additional-inputs.component-DFdAVWTg.mjs.map +0 -1
  113. package/fesm2022/ngx-t-forms-data-source-picker.component-DxORinAD.mjs +0 -204
  114. package/fesm2022/ngx-t-forms-data-source-picker.component-DxORinAD.mjs.map +0 -1
  115. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs +0 -289
  116. package/fesm2022/ngx-t-forms-document-list-label-config-editor.component-DcWS1txl.mjs.map +0 -1
  117. package/fesm2022/ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs +0 -134
  118. package/fesm2022/ngx-t-forms-form-input-selector.component-B2QEnvkq.mjs.map +0 -1
  119. package/fesm2022/ngx-t-forms-form-json-view.component-DePf44w6.mjs +0 -22
  120. package/fesm2022/ngx-t-forms-form-json-view.component-DePf44w6.mjs.map +0 -1
  121. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs +0 -270
  122. package/fesm2022/ngx-t-forms-form-section-stepper.component-BTkcSjg7.mjs.map +0 -1
  123. package/fesm2022/ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs +0 -345
  124. package/fesm2022/ngx-t-forms-forms-builder-menu.component-Wamzf_sq.mjs.map +0 -1
  125. package/fesm2022/ngx-t-forms-input-editor.component-D4xHO76K.mjs +0 -147
  126. package/fesm2022/ngx-t-forms-input-editor.component-D4xHO76K.mjs.map +0 -1
  127. package/fesm2022/ngx-t-forms-map-mat-options-keys-CbdW82su.mjs.map +0 -1
  128. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs +0 -105
  129. package/fesm2022/ngx-t-forms-mat-chip-list-editor.component-DmTyO9Wi.mjs.map +0 -1
  130. package/fesm2022/ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs +0 -109
  131. package/fesm2022/ngx-t-forms-mat-slider-editor.component-DZ4TenrI.mjs.map +0 -1
  132. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs +0 -155
  133. package/fesm2022/ngx-t-forms-mat-slider-toggle-editor.component-DPyBYE4p.mjs.map +0 -1
  134. package/fesm2022/ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs +0 -28
  135. package/fesm2022/ngx-t-forms-missing-form-configs.component-BRmnwAK6.mjs.map +0 -1
  136. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs +0 -43
  137. package/fesm2022/ngx-t-forms-mscoa-chart-toolbar.component-D_umeAPL.mjs.map +0 -1
  138. package/fesm2022/ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs +0 -116
  139. package/fesm2022/ngx-t-forms-mscoa-error-display.component-CSX2NCNU.mjs.map +0 -1
  140. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs +0 -296
  141. package/fesm2022/ngx-t-forms-mscoa-segment-config.component-B6IF8kGg.mjs.map +0 -1
  142. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs +0 -83
  143. package/fesm2022/ngx-t-forms-mscoa-temporary-hint.component-BPkjsRmH.mjs.map +0 -1
  144. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs +0 -16844
  145. package/fesm2022/ngx-t-forms-ngx-t-forms-D9qmig6g.mjs.map +0 -1
  146. package/fesm2022/ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs +0 -613
  147. package/fesm2022/ngx-t-forms-pipeline-generator.component-DBJEyCbd.mjs.map +0 -1
  148. package/fesm2022/ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs +0 -269
  149. package/fesm2022/ngx-t-forms-record-list-manager.component-Dgs9lNSr.mjs.map +0 -1
  150. package/fesm2022/ngx-t-forms-required-inputs.component-CSIJvSHq.mjs +0 -190
  151. package/fesm2022/ngx-t-forms-required-inputs.component-CSIJvSHq.mjs.map +0 -1
  152. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs +0 -291
  153. package/fesm2022/ngx-t-forms-rest-api-call-setup.component-CY-JSkGs.mjs.map +0 -1
  154. package/fesm2022/ngx-t-forms-section-report.component-12-KdKT6.mjs +0 -156
  155. package/fesm2022/ngx-t-forms-section-report.component-12-KdKT6.mjs.map +0 -1
  156. package/fesm2022/ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs +0 -186
  157. package/fesm2022/ngx-t-forms-selection-options-editor.component-Be3QAG_L.mjs.map +0 -1
  158. package/fesm2022/ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs +0 -187
  159. package/fesm2022/ngx-t-forms-t-workflow-picker.component-a4f1r8gH.mjs.map +0 -1
  160. package/fesm2022/ngx-t-forms-validators-config.component-B3j9Dmgu.mjs +0 -215
  161. package/fesm2022/ngx-t-forms-validators-config.component-B3j9Dmgu.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-t-forms-ngx-t-forms-D9qmig6g.mjs","sources":["../../../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/shared/functions/migrationCheck.ts","../../../projects/ngx-t-forms/src/lib/injection-tokens/index.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-environment-injection/functions/provideNgxTforms.ts","../../../projects/ngx-t-forms/src/lib/shared/modules/stringJsonValidator/getObjectValidations.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/shared/functions/isEqual.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/startTowerFormChangesEventListener.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/getAllFunctionTypes.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/errorResolver.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-controller/function/validateMinInputForPostRequest.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/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/postApiDataFetching.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/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/updateFormInputConfig.ts","../../../projects/ngx-t-forms/src/lib/components/forms/functions/findFormInput.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/updateValue.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/updateChangeHistory.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-tower-controller/functions/extractInitFunctions.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-controller/function/getApiDataFetching.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/components/forms/functions/formHttpSubmissions.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-controller/function/getInputSourcedValue.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/form-tower-controller.service.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/shared/modules/mat-modules.module.ts","../../../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/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-Actions.ts","../../../projects/ngx-t-forms/src/lib/components/forms/store/Forms-Effects.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-form-builder/functions/formCanSave.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/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/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/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/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/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/shared/functions/searchArray.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/postman-collections/functions/convertPostmanCollectionToTree.ts","../../../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/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/shared/functions/convertElementEditorTypesToInputType.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-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/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/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/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/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/services/core/t-input-controller/functions/generateInputSecret.ts","../../../projects/ngx-t-forms/src/lib/shared/functions/enryption.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/signature-input-element/config/signature.ts","../../../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/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/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/elements/auto-complete-input-element/core/auto-complet-reactive-input/auto-complet-reactive-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/auto-complete-input-element/core/auto-complet-reactive-input/auto-complet-reactive-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/auto-complete-input-element/auto-complete-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/auto-complete-input-element/auto-complete-input-element.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/toggle-input-element/core/toggle/toggle.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/toggle-input-element/core/toggle/toggle.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/toggle-input-element/toggle-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/toggle-input-element/toggle-input-element.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/select-input-element/elements/select-input/select-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/select-input-element/elements/select-input/select-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/select-input-element/select-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/select-input-element/select-input-element.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/textarea-input-element/core/text-area-reactive-input/text-area-reactive-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/textarea-input-element/core/text-area-reactive-input/text-area-reactive-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/textarea-input-element/textarea-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/textarea-input-element/textarea-input-element.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-range-picker-input-element/core/date-range-picker-reactive-input/date-range-picker-reactive-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-range-picker-input-element/core/date-range-picker-reactive-input/date-range-picker-reactive-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-range-picker-input-element/date-range-picker-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-range-picker-input-element/date-range-picker-input-element.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-picker-input-element/core/date-picker-reactive-input/date-picker-reactive-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-picker-input-element/core/date-picker-reactive-input/date-picker-reactive-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-picker-input-element/date-picker-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/date-picker-input-element/date-picker-input-element.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/file-upload-input-element/core/file-uploader/file-uploader.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/file-upload-input-element/core/file-uploader/file-uploader.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/file-upload-input-element/file-upload-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/file-upload-input-element/file-upload-input-element.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/editor-input-element/core/form-input-rich-text-editor/config.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/editor-input-element/core/editor-js-input/editor-js-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/editor-input-element/core/editor-js-input/editor-js-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/editor-input-element/editor-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/editor-input-element/editor-input-element.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/basic-input-input-element/core/input-custom/input-custom.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/basic-input-input-element/core/input-custom/input-custom.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/basic-input-input-element/basic-input-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/basic-input-input-element/basic-input-input-element.component.html","../../../projects/ngx-t-forms/src/lib/services/core/t-input-controller/functions/colorCoding.ts","../../../projects/ngx-t-forms/src/lib/services/core/t-input-controller/functions/configureCols.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table-view/multiple-input-table-view.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table-view/multiple-input-table-view.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table-edit/multiple-input-table-edit.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table-edit/multiple-input-table-edit.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/functions/getListCalculated.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table/multiple-input-table.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/core/multiple-input-table/multiple-input-table.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/multiple-input-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/multiple-input-input-element/multiple-input-input-element.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/Geo-location-form-input/functions/getGeoLocation.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/Geo-location-form-input/elements/geo-location-form-input/geo-location-form-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/Geo-location-form-input/elements/geo-location-form-input/geo-location-form-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/Geo-location-form-input/geo-location.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/Geo-location-form-input/geo-location.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/file-upload-input-element/core/file-uploader/camera-functions.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/image-capture-input-element/core/camera-capture/camera-capture.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/image-capture-input-element/core/camera-capture/camera-capture.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/image-capture-input-element/image-capture-input-element.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/image-capture-input-element/image-capture-input-element.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/document-picker/document-loader.service.ts","../../../projects/ngx-t-forms/src/lib/shared/pipes/format-Data.pipe.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/document-picker/core/document-picker-reactive-input/document-picker-reactive-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/document-picker/core/document-picker-reactive-input/document-picker-reactive-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/document-picker/document-picker.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/document-picker/document-picker.component.html","../../../projects/ngx-t-forms/src/lib/shared/functions/getInputIllustration.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/points-creation/points-creation.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/points-creation/points-creation.component.html","../../../projects/ngx-t-forms/src/lib/shared/functions/mapColors.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/elements/submission-review-dialog/submission-review-dialog.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/elements/submission-review-dialog/submission-review-dialog.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/submission-review.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/submission-review/submission-review.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/elements/point-assignment-dialog/point-assignment-dialog.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/elements/point-assignment-dialog/point-assignment-dialog.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/point-assignment.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/point-assignment/point-assignment.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/supplier-selection/supplier-selection.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/supplier-selection/supplier-selection.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/workflow-adjudication-reactive-input/workflow-adjudication-reactive-input.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/elements/workflow-adjudication-reactive-input/workflow-adjudication-reactive-input.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/workflow-adjudication.component.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/workflow-adjudication/workflow-adjudication.component.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/paginated-selection-table/elements/paginated-selection-table-reactive-input/paginated-selection-table-reactive-input.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/paginated-selection-table/elements/paginated-selection-table-reactive-input/paginated-selection-table-reactive-input.html","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/paginated-selection-table/paginated-selection-table.ts","../../../projects/ngx-t-forms/src/lib/components/t-form-input/elements/paginated-selection-table/paginated-selection-table.html","../../../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/services/core/tour/tour-manager.service.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/public-api.ts","../../../projects/ngx-t-forms/src/ngx-t-forms.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\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 { Component } from '@angular/core';\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})\r\nexport class NgxTFormsComponent {\r\n\r\n}\r\n","import { FormColumnInputs, FormInterface, 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: undefined as any,\r\n formId: undefined,\r\n formTitle: ''\r\n}\r\n\r\nconst initFormConfigToV2: (formConfig: OLD_FormInterface) => FormInterface = (formConfig: OLD_FormInterface) => {\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 return {\r\n\r\n } as any\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: OLD_FormInterface): formConfig is OLD_FormInterface => {\r\n if (typeof formConfig !== 'object') return false;\r\n const hasOldPrimaryKeys = ['formSectionSteps', 'activeSlideNumber'].every((key: any) => (formConfig as any)[key] !== undefined);\r\n if (hasOldPrimaryKeys) return true;\r\n const hasSlideContentRows = formConfig.slides.some((slide) => slide.slideContentRows !== undefined);\r\n return hasSlideContentRows;\r\n\r\n}\r\nexport { initFormConfigToV2 }","import { InjectionToken } from \"@angular/core\";\r\nimport { FormInterface, InClassFormUtilsInterface, NgxTFormsConfig,IWorkflowDocumentPicker } from \"ngx-t-forms-types\";\r\n\r\nimport { IFileUploadInput, IDateRangePickerInput, ITextareaProperties, IToggleInput, IMatrixInput, IMultiple, IBasicFormInput, IGetTreeResponse } from\"ngx-t-forms-types\"\r\nimport { FormSlideInterface } from \"ngx-t-forms-types\";\r\nimport { IFormActions } from\"ngx-t-forms-types\";\r\nimport { Observable } from \"rxjs\";\r\nexport const FORM_ACTIONS_TOKEN = new InjectionToken<IFormActions>('FORM_ACTIONS');\r\nexport const FORM_CONFIG_TOKEN = new InjectionToken<FormInterface>('FORM_CONFIG');\r\nexport const FORM_SLIDES_TOKEN = new InjectionToken<FormSlideInterface>('FORM_SLIDES');\r\n\r\nexport const UTILS_OBJECT_TOKEN = new InjectionToken<InClassFormUtilsInterface>('UTILS_OBJECT_TOKEN');\r\nexport const FORM_INPUTS_TOKEN = new InjectionToken<IWorkflowDocumentPicker & IBasicFormInput& IFileUploadInput & IDateRangePickerInput \r\n& ITextareaProperties & IToggleInput & IMatrixInput & IMultiple>('FORM_INPUTS_TOKEN');\r\nexport const MULTIPLE_FORM_INPUT_TOKEN = new InjectionToken<IMultiple>('MULTIPLE_FORM_INPUT_TOKEN');\r\nexport const MSCOA_TREE_PROVIDER = new InjectionToken<() => Observable<IGetTreeResponse>>(\r\n 'MSCOA_TREE_PROVIDER'\r\n );\r\nexport const NGX_T_FORMS_CONFIG_TOKEN = new InjectionToken<NgxTFormsConfig>('NGX_T_FORMS_CONFIG');","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { NgxTFormsConfig } from 'ngx-t-forms-types';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../injection-tokens';\r\n\r\n\r\nexport function provideNgxTForms(config: NgxTFormsConfig): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n { provide: NGX_T_FORMS_CONFIG_TOKEN, useValue: config }\r\n ]);\r\n}","/**\r\n * Validates an object against a validation expression.\r\n *\r\n * @param {string} expression - The validation expression to evaluate.\r\n * @param {object} object - The object to validate.\r\n * @returns {boolean} - A boolean indicating whether the object is valid according to the expression.\r\n *\r\n * This function is designed to handle a variety of cases for validating objects based on a given expression. It can:\r\n * 1. Evaluate an expression part with a single comparison operator, for example: 'a === 1' or '(a === 1)'.\r\n * 2. Evaluate an expression with multiple comparison operators, including: '===', '==', '!==', '!=', '>', '<', '>=', and '<='.\r\n * 3. Group expression parts considering bracket enclosures and logical operators.\r\n * 4. Evaluate an expression with multiple logical operators, such as 'a === 1 && b === 2 || c === 3'.\r\n */\r\n\r\ntype Operator = '===' | '==' | '!==' | '!=' | '>' | '<' | '>=' | '<=';\r\n//type LogicalOperator = '&&' | '||' | '!';\r\n\r\nconst validateObjectAgainstString = (expression: string, object: any): boolean => {\r\n\r\n /**\r\n * Removes enclosing brackets from a string.\r\n * @param expression The string to remove brackets from.\r\n * @returns The string without enclosing brackets.\r\n */\r\n function removeEnclosingBrackets(exp: string): string {\r\n exp = exp.trim();\r\n if (exp.startsWith('(') && exp.endsWith(')')) {\r\n // remove the first and last characters from the string\r\n return exp.slice(1, -1);\r\n }\r\n return exp;\r\n }\r\n\r\n /**\r\n * Evaluates a validation string against an object.\r\n * @param validationString The validation string to evaluate.\r\n * @param data The object to validate.\r\n * @returns A boolean indicating whether the object is valid according to the validation string.\r\n */\r\n function evaluateValidationString(validationString: string, data: Record<string, any>): boolean {\r\n //const operators: Operator[] = ['===', '==', '!==', '!=', '>', '<', '>=', '<='];\r\n const evaluationExpression = removeEnclosingBrackets(validationString)\r\n\r\n /**\r\n * Parses an operand from a string.\r\n * @param operand The string to parse.\r\n * @returns The parsed operand.\r\n */\r\n function parseOperand(operand: string | undefined): any {\r\n if (!operand) {\r\n throw new Error(`Invalid operand: ${operand}`);\r\n }\r\n if (operand in data) {\r\n return data[operand];\r\n } else if (operand === 'true') {\r\n return true;\r\n } else if (operand === 'false') {\r\n return false;\r\n } else if (!isNaN(Number(operand))) {\r\n return Number(operand);\r\n } else if (typeof operand === 'string') {\r\n return operand.replace(/['\"]+/g, '');\r\n }\r\n\r\n else {\r\n throw new Error(`Invalid operand: ${operand}`);\r\n }\r\n }\r\n\r\n /**\r\n * Evaluates a comparison expression.\r\n * @param expression The expression to evaluate.\r\n * @returns A boolean indicating whether the expression is true or false.\r\n */\r\n function evaluateExpression(expression: string): boolean {\r\n const operators: Operator[] = ['===', '==', '!==', '!=', '>', '<', '>=', '<='];\r\n const parts = (expression || '').split(' ').filter(part => part.trim() !== ''); // Split by spaces and filter out empty parts\r\n if (parts.length !== 3) {\r\n throw new Error(`Invalid expression: ${expression}`);\r\n }\r\n const [leftOperand, operator, rightOperand] = parts;\r\n const leftValue = parseOperand(leftOperand);\r\n const rightValue = parseOperand(rightOperand);\r\n if (!operators.includes(operator as Operator)) {\r\n throw new Error(`Invalid operator: ${operator}`);\r\n }\r\n switch (operator) {\r\n case '===':\r\n return leftValue === rightValue;\r\n case '==':\r\n return leftValue == rightValue;\r\n case '!==':\r\n return leftValue !== rightValue;\r\n case '!=':\r\n return leftValue != rightValue;\r\n case '>':\r\n return leftValue > rightValue;\r\n case '<':\r\n return leftValue < rightValue;\r\n case '>=':\r\n return leftValue >= rightValue;\r\n case '<=':\r\n return leftValue <= rightValue;\r\n default:\r\n throw new Error(`Invalid operator: ${operator}`);\r\n }\r\n }\r\n return evaluateExpression(evaluationExpression);\r\n }\r\n\r\n /**\r\n * Evaluates a conjunction expression.\r\n * @param conjunctionExpression The conjunction expression to evaluate.\r\n * @param object The object to validate.\r\n * @returns A boolean indicating whether the object is valid according to the conjunction expression.\r\n */\r\n function evaluateConjunction(conjunctionExpression: string, object: any): boolean {\r\n if (typeof conjunctionExpression !== 'string') {\r\n return false\r\n }\r\n const parts = (conjunctionExpression || '').split(\"&&\") //conjunctions\r\n return parts.every((part) => {\r\n const hasDisjunction = part.split(\"||\").length > 1\r\n const hasConjunction = part.split(\"&&\").length > 1\r\n const strippedPart = removeEnclosingBrackets(part)\r\n if (hasDisjunction) {\r\n return evaluateDisjunctions(strippedPart, object)\r\n }\r\n if (hasConjunction) {\r\n return evaluateConjunction(strippedPart, object)\r\n }\r\n if (!hasConjunction && !hasDisjunction) {\r\n return evaluateValidationString(strippedPart, object)\r\n }\r\n\r\n return false\r\n\r\n })\r\n\r\n }\r\n\r\n /**\r\n * Evaluates a disjunction expression.\r\n * @param disjunctionExpression The disjunction expression to evaluate.\r\n * @param object The object to validate.\r\n * @returns A boolean indicating whether the object is valid according to the disjunction expression.\r\n */\r\n function evaluateDisjunctions(disjunctionExpression: string, object: any): boolean {\r\n let evaluationResult = false\r\n if (typeof disjunctionExpression !== 'string') {\r\n return false\r\n }\r\n const parts = disjunctionExpression.split(\"||\") //disjunctions\r\n for (let part of parts) {\r\n const hasDisjunction = part.split(\"||\").length > 1\r\n const hasConjunction = part.split(\"&&\").length > 1\r\n const strippedPart = removeEnclosingBrackets(part)\r\n if (hasDisjunction) {\r\n evaluationResult = evaluateDisjunctions(strippedPart, object)\r\n } else if (hasConjunction) {\r\n evaluationResult = evaluateConjunction(strippedPart, object)\r\n } else if (!hasConjunction && !hasDisjunction) {\r\n evaluationResult = evaluateValidationString(strippedPart, object)\r\n }\r\n\r\n if (evaluationResult) {\r\n break\r\n }\r\n\r\n }\r\n\r\n\r\n\r\n\r\n return evaluationResult\r\n }\r\n\r\n return evaluateDisjunctions(expression, object)\r\n\r\n}\r\n\r\nfunction validateExpressionSyntax(expression: string): string | null {\r\n expression = expression.trim();\r\n\r\n // Rule 1: Expression cannot be empty. An empty string is not a valid expression.\r\n if (typeof expression !== 'string') {\r\n throw new Error(\"Expression must be a string.\");\r\n }\r\n if (expression === '') {\r\n throw new Error(\"The expression cannot be blank. Please enter a condition.\");\r\n }\r\n\r\n // Rule 2: Check for balanced parentheses.\r\n // This ensures that every opening parenthesis has a corresponding closing one, and vice-versa.\r\n let balance = 0;\r\n for (let i = 0; i < expression.length; i++) {\r\n if (expression[i] === '(') {\r\n balance++;\r\n } else if (expression[i] === ')') {\r\n balance--;\r\n }\r\n // If balance drops below zero, it means an unmatched closing parenthesis appeared prematurely.\r\n if (balance < 0) {\r\n throw new Error(\"It looks like you have an extra closing parenthesis ')'. Please check your expression.\");\r\n }\r\n }\r\n // If balance is not zero at the end, it means there are unmatched opening parentheses.\r\n if (balance !== 0) {\r\n throw new Error(\"It looks like you're missing a closing parenthesis ')'. Make sure every opening parenthesis has a matching closing one.\");\r\n }\r\n\r\n // Rule 3: Handle outermost parentheses if they truly enclose the entire logical expression.\r\n // This recursive step simplifies the expression for further validation,\r\n // ensuring we only validate the \"core\" logical unit at each level.\r\n let isFullyEnclosed = false;\r\n if (expression.startsWith('(') && expression.endsWith(')')) {\r\n let openCount = 0;\r\n isFullyEnclosed = true;\r\n // Iterate through the content *inside* the potential outermost parentheses (from index 1 to length-2)\r\n // to check if any top-level logical operators exist within them.\r\n for (let i = 1; i < expression.length - 1; i++) {\r\n if (expression[i] === '(') {\r\n openCount++;\r\n } else if (expression[i] === ')') {\r\n openCount--;\r\n }\r\n // If we find a top-level logical operator (&& or ||) within the content\r\n // (i.e., openCount is 0, meaning not inside nested parentheses),\r\n // then the outer parentheses are just for grouping a sub-expression, not the entire expression.\r\n if (openCount === 0 && (expression.substring(i, i + 2) === '&&' || expression.substring(i, i + 2) === '||')) {\r\n isFullyEnclosed = false;\r\n break; // Found a top-level operator, so outer parentheses don't enclose the whole.\r\n }\r\n }\r\n }\r\n // If truly fully enclosed and balanced, recursively validate the inner expression.\r\n if (isFullyEnclosed) {\r\n return validateExpressionSyntax(expression.slice(1, -1).trim());\r\n }\r\n\r\n // Rule 4: Check for logical operators (|| then &&, respecting precedence).\r\n // We iterate to find the lowest precedence operator ('||') first, then '&&'.\r\n // This mirrors the parsing logic in `validateObjectAgainstString`.\r\n const logicalOperators = ['||', '&&'];\r\n\r\n for (const op of logicalOperators) {\r\n let openParenCount = 0;\r\n for (let i = 0; i < expression.length; i++) {\r\n if (expression[i] === '(') {\r\n openParenCount++;\r\n } else if (expression[i] === ')') {\r\n openParenCount--;\r\n }\r\n // If a top-level logical operator is found (outside any parentheses)\r\n if (openParenCount === 0 && expression.substring(i, i + op.length) === op) {\r\n // Split the expression into two parts around the operator.\r\n const part1 = expression.substring(0, i).trim();\r\n const part2 = expression.substring(i + op.length).trim();\r\n\r\n // Rule 4a: Logical operators cannot be at the beginning or end of an expression\r\n // (i.e., parts cannot be empty). This catches cases like \"&& b\" or \"a &&\".\r\n if (part1 === '' || part2 === '') {\r\n throw new Error(`The expression seems incomplete. A connector like '${op}' must have a condition on both sides.`);\r\n\r\n }\r\n // Rule 4b: Recursively validate both parts of the logical expression.\r\n // If both parts are syntactically valid, then this logical expression is valid.\r\n return validateExpressionSyntax(part1) && validateExpressionSyntax(part2);\r\n }\r\n }\r\n }\r\n\r\n // Rule 5: If no top-level logical operators were found, it must be a simple comparison.\r\n // Use regex to validate the format of a simple comparison: `operand operator operand`.\r\n\r\n // Regex for valid identifiers (e.g., object keys like 'age', 'name').\r\n const identifierRegex = `[a-zA-Z_][a-zA-Z0-9_]*`;\r\n // Regex for valid number literals (e.g., '10', '3.14').\r\n const numberRegex = `\\\\d+(?:\\\\.\\\\d+)?`;\r\n // Regex for valid boolean literals.\r\n const booleanRegex = `true|false`;\r\n // Regex for valid string literals (enclosed in single or double quotes, handles escaped quotes).\r\n const stringLiteralRegex = `(['\"])(?:(?=(\\\\\\\\?))\\\\2.)*?\\\\1`;\r\n\r\n // Combined regex for any valid operand type. This covers object keys, booleans, numbers, and strings.\r\n const operandRegex = `(?:${identifierRegex}|${booleanRegex}|${numberRegex}|${stringLiteralRegex})`;\r\n\r\n // Regex for valid comparison operators (sorted by length descending for correct matching).\r\n const comparisonOperators = `===|==|!==|!=|>=|<=|>|<`;\r\n\r\n // Full regex pattern for a simple comparison, allowing for flexible whitespace around operands and operators.\r\n const simpleComparisonPattern = new RegExp(`^\\\\s*(${operandRegex})\\\\s*(${comparisonOperators})\\\\s*(${operandRegex})\\\\s*$`);\r\n\r\n const match = expression.match(simpleComparisonPattern);\r\n\r\n // Rule 5a: If the expression doesn't match the simple comparison pattern, it's invalid.\r\n // This catches malformed comparisons or unrecognized characters.\r\n if (!match) {\r\n throw new Error(`The expression '${expression}' seems invalid. A condition should look like 'value > 10' or 'status == \"active\"'.`);\r\n\r\n }\r\n\r\n // Rule 5b: Although regex matches, ensure operands are not just empty strings if the regex allowed it.\r\n // (The `operandRegex` is already designed to prevent truly empty matches, but this adds robustness).\r\n const [, leftRaw, , rightRaw] = match;\r\n if (leftRaw?.trim() === '' || rightRaw?.trim() === '') {\r\n throw new Error(`A value seems to be missing in your expression '${expression}'. Please check both sides of the operator.`);\r\n }\r\n\r\n // If all checks pass for this level of the expression, it is considered syntactically valid.\r\n return null;\r\n}\r\n\r\nexport { validateObjectAgainstString, validateExpressionSyntax }\r\n\r\n\r\n\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 } from 'ngx-t-forms-types';\r\n\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { validateObjectAgainstString } from \"../../../../shared/modules/stringJsonValidator/getObjectValidations\";\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: any, disabled: boolean }, AbstractControlOptions];\r\n}\r\n\r\nexport function compileInputValidators(input: FormColumnInputs,getFormValue:()=>Record<string, any>): 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 if (input.type === 'email' && !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,any>,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 return Val;\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,any>): 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: { inputId: string; variable: string }[],\r\n formData: Record<string, any>\r\n): Record<string, any> => {\r\n // Create a new object directly instead of using reduce with spread operator\r\n const result: Record<string, any> = {};\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 } = inputsObservedForChanges[i] || {};\r\n if(!inputId || !variable) continue;\r\n result[variable] = formData[inputId];\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\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 any;\r\n}\r\n\r\nexport function generateControlsForTheseInputs(inputs: FormColumnInputs[], getFormValue:any): 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): any => {\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}","/**\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, any>>(\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 any)[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 any)[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 any)[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: any, next: any): 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 prevConstructor = prev.constructor;\r\n const nextConstructor = next.constructor;\r\n\r\n if (prevConstructor !== nextConstructor) return false;\r\n\r\n if (prevConstructor === Date) {\r\n return prev.getTime() === next.getTime();\r\n }\r\n\r\n if (prevConstructor === RegExp) {\r\n return prev.source === next.source && prev.flags === next.flags;\r\n }\r\n\r\n const prevKeys = Object.keys(prev);\r\n const nextKeys = Object.keys(next);\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(next, key)) return false;\r\n if (!_isEqual(prev[key], next[key])) return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return prev === null && next === null;\r\n}","import {\r\n EMPTY,\r\n Observable,\r\n Subject,\r\n\r\n catchError,\r\n debounceTime,\r\n distinctUntilChanged,\r\n\r\n map,\r\n\r\n pairwise,\r\n\r\n startWith,\r\n\r\n switchMap,\r\n takeUntil,\r\n\r\n throwError,\r\n} from 'rxjs';\r\n\r\nimport { FormGroup } from '@angular/forms';\r\nimport { _isEqual, getChangedProperties } from '../../../../shared/functions/isEqual';\r\n\r\n/**\r\n * Starts an event listener for form changes.\r\n * \r\n * @param sections - An object containing the form sections.\r\n * @param functionMonitor - A function that monitors the form sections.\r\n * @returns A subscription to the form changes event.\r\n */\r\nexport function startTowerFormChangesEventListener(\r\n formGroup: FormGroup,\r\n destroy$: Subject<void>,\r\n monitorFunction: (value: any) => Observable<any>\r\n) {\r\n return formGroup.valueChanges\r\n .pipe(\r\n takeUntil(destroy$),\r\n debounceTime(500),\r\n distinctUntilChanged(),\r\n startWith(undefined),\r\n map((value) => {\r\n if (!value) return undefined;\r\n // Combine all nested objects into single object\r\n return Object.values(value).reduce((acc, section) => ({\r\n ...(acc as any),\r\n ...(section as object)\r\n }), {} as any);\r\n }),\r\n // Use pairwise to compare previous and current values\r\n pairwise(),\r\n map(([previous, current]) => (getChangedProperties( previous as any,current as any))),\r\n \r\n switchMap((value: any) => monitorFunction(value).pipe(\r\n catchError(() => EMPTY)\r\n )),\r\n catchError((error) => throwError(() => error))\r\n )\r\n .subscribe();\r\n}\r\n\r\n","import { validateCalculatedFieldRules, MinimumInputRequiredInterface } from 'ngx-t-forms-types';\nimport {FormColumnInputs} from \"ngx-t-forms-types\";\n\nimport { APIDataFetchingConfigurationInterface, DataSources } from \"ngx-t-forms-types\";\nimport { MinInputMapInput } from \"ngx-t-forms-types\";\nexport enum FunctionTypes{\n ValueCalculation = 'ValueCalculation',\n ValuePostMethodAPI = 'ValuePostMethodAPI',\n ValuePostMethodAPIWithAllDefaultParams = 'ValuePostMethodAPIWithAllDefaultParams',\n OptionsPostMethodAPI = 'OptionsPostMethodAPI',\n OptionsPostMethodAPIWithAllDefaultParams = 'OptionsPostMethodAPIWithAllDefaultParams',\n ValueGetMethodAPI = 'ValueGetMethodAPI',\n OptionsGetMethodAPI = 'OptionsGetMethodAPI',\n InputSourcedValue = 'InputSourcedValue',\n ManualValueValidation = 'ManualValueValidation',\n}\n\n\nexport function getAllFunctionTypes(inputConfig: FormColumnInputs): Partial<Record<FunctionTypes, boolean>>{\n const functionTypes: Partial<Record<FunctionTypes, boolean>> = {};\n\n try {\n \n // Check for each function type\n functionTypes[FunctionTypes.ValueCalculation] = Boolean(!!validateCalculatedFieldRules(inputConfig.calculatedFieldRules).value)\n functionTypes[FunctionTypes.ValuePostMethodAPI] = Boolean(inputConfig.matOptions?.fetch?.value?.source === 'api' && (inputConfig.matOptions?.fetch.value as APIDataFetchingConfigurationInterface)?.httpMethod === 'POST')\n functionTypes[FunctionTypes.ValuePostMethodAPIWithAllDefaultParams] = Boolean(\n inputConfig.matOptions?.fetch.value?.source === 'api' \n && (inputConfig.matOptions?.fetch?.value as APIDataFetchingConfigurationInterface)?.httpMethod === 'POST')\n && (inputConfig.matOptions?.fetch?.value as APIDataFetchingConfigurationInterface).backEndConfig.minimumInputRequired.every(\n (minIn: MinimumInputRequiredInterface) => minIn.type === 'default'\n )\n functionTypes[FunctionTypes.OptionsPostMethodAPI] = Boolean(inputConfig.matOptions?.fetch?.options?.source === 'api' && (inputConfig.matOptions?.fetch.options as APIDataFetchingConfigurationInterface)?.httpMethod === 'POST')\n functionTypes[FunctionTypes.OptionsPostMethodAPIWithAllDefaultParams] = Boolean(\n inputConfig.matOptions?.fetch?.options?.source === 'api' \n && (inputConfig.matOptions?.fetch?.options as APIDataFetchingConfigurationInterface)?.httpMethod === 'POST')\n && (inputConfig.matOptions?.fetch?.options as APIDataFetchingConfigurationInterface).backEndConfig.minimumInputRequired.every(\n (minIn: MinimumInputRequiredInterface) => minIn.type === 'default'\n )\n \n \n functionTypes[FunctionTypes.ValueGetMethodAPI] = Boolean(inputConfig.matOptions?.fetch?.value?.source === 'api' && (inputConfig.matOptions?.fetch.value as APIDataFetchingConfigurationInterface)?.httpMethod === 'GET')\n functionTypes[FunctionTypes.OptionsGetMethodAPI] = Boolean(inputConfig.matOptions?.fetch?.options?.source === 'api' && (inputConfig.matOptions?.fetch.options as APIDataFetchingConfigurationInterface)?.httpMethod === 'GET')\n functionTypes[FunctionTypes.InputSourcedValue] = Boolean(inputConfig.matOptions?.fetch.value?.source === DataSources.Local && !!inputConfig.matOptions?.fetch.value?.source)\n functionTypes[FunctionTypes.ManualValueValidation] = Boolean(inputConfig.validators?.filter(validator => typeof validator === 'object' && validator !== null).length !== 0)\n \n return functionTypes;\n } catch {\n return {} as any\n }\n}\n\nexport function createInputChangeDependency(inputConfig: FormColumnInputs): Partial<Record<FunctionTypes,Record<string,boolean>>> {\n \n try {\n const tree:Partial<Record<FunctionTypes,Record<string,boolean>>>= {}\n tree[FunctionTypes.ValueCalculation] = (inputConfig.calculatedFieldRules?.variables\n ?.map(variable =>variable.parentInputId ? [\n variable.parentInputId,\n variable.inputId\n ] :[variable.inputId]) || [])\n .flat().reduce((acc, inputId) => ({...acc, [inputId]: true}), {})\n tree[FunctionTypes.ValuePostMethodAPI] = (inputConfig.matOptions?.fetch.value as APIDataFetchingConfigurationInterface )\n ?.backEndConfig?.minimumInputRequired\n .flatMap(minIn=>\n Array.isArray(minIn.mapTo)? \n (minIn.mapTo as MinInputMapInput[] )\n .map(mapTo=>mapTo.inputId):\n minIn.mapTo?.inputId )\n .filter(Boolean)\n .reduce((acc, inputId) => \n ({...acc, [inputId!]: true}), {})\n\n tree[FunctionTypes.OptionsPostMethodAPI] = (inputConfig.matOptions?.fetch.options as APIDataFetchingConfigurationInterface )\n ?.backEndConfig?.minimumInputRequired\n .flatMap(minIn=>\n Array.isArray(minIn.mapTo)? \n (minIn.mapTo as MinInputMapInput[] )\n .map(mapTo=>mapTo.inputId):\n minIn.mapTo?.inputId )\n .filter(Boolean)\n .reduce((acc, inputId) => \n ({...acc, [inputId!]: true}), {})\n\n\n tree[FunctionTypes.ManualValueValidation] = inputConfig.validators\n ?.filter(validator => typeof validator === 'object' && validator !== null)\n .reduce((acc, validator) => {\n validator.inputsObservedForChanges.forEach(input => {\n acc[input.inputId] = true;\n });\n return acc;\n }, {} as Record<string, boolean>)\n tree[FunctionTypes.InputSourcedValue]= inputConfig.matOptions?.fetch.value?.source === DataSources.Local ? {\n [(inputConfig.matOptions?.fetch.value as any).inputSourceId!]: true\n } : {}\n \n\n return tree\n } catch (error) {\n console.error('Error in createInputChangeDependency:', error);\n return {}\n }\n}","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\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\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\nconst math = create(all!, {\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: ()=>Record<string, any>,\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;\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 let 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]: number } = 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: Record<string, any>,\r\n): Record<string, number> {\r\n let scope: Record<string, number> = {};\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: Record<string, any>[] = formValue[inputId as string] || [];\r\n if (!Array.isArray(formInputValues)) continue;\r\n let arrayValues = [];\r\n\r\n if (rule.filterValuesByCol) {\r\n\r\n arrayValues = formInputValues\r\n .filter(\r\n (v: { [x: string]: any }) => v[rule.filterValuesByCol as string]\r\n )\r\n .map((v: { [x: string]: any }) =>\r\n math.bignumber(v[rule.applyFunctionToCol as string])\r\n )\r\n\r\n\r\n } else {\r\n if (input.element === ElementTypes.MultipleInput) {\r\n arrayValues = formInputValues.map((v: { [x: string]: any }) =>\r\n math.bignumber(v[ rule.inputId as string])\r\n )\r\n\r\n } else {\r\n\r\n\r\n arrayValues = formInputValues\r\n ? formInputValues.map((v: { [x: string]: any }) =>\r\n math.bignumber(v[ rule.inputId as string])\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]);\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]: number }\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(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);\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: any): number {\r\n try {\r\n const len = arrayValues.length;\r\n let sum = math.sum(arrayValues) \r\n switch (rule) {\r\n case CalculationFunctions.Avg:\r\n let avg = len == 0 ? sum : Number(sum / len);\r\n return avg;\r\n\r\n case CalculationFunctions.Sum:\r\n return sum;\r\n\r\n case CalculationFunctions.Max:\r\n return Math.max(...arrayValues);\r\n\r\n case CalculationFunctions.Min:\r\n return Math.min(...arrayValues);\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: any, decimals: number, mode: 'FLOOR' | 'CEIL' | 'ROUND' = 'ROUND'): any {\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);\r\n if (mode === 'CEIL') return math.ceil(value);\r\n return math.round(value);\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, scale);\r\n\r\n switch (mode) {\r\n case 'FLOOR':\r\n scaledValue = math.floor(scaledValue);\r\n break;\r\n case 'CEIL':\r\n scaledValue = math.ceil(scaledValue);\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, decimals);\r\n }\r\n\r\n return math.divide(scaledValue, scale);\r\n}","\r\n\r\n\r\ninterface HttpError extends Error {\r\n status?: number;\r\n error?: any;\r\n}\r\n\r\nexport function errorResolver(err: HttpError | undefined):string|undefined {\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 = err?.error.errors\r\n ? err?.error.errors.message\r\n : 'Sorry, an unknown error occurred. Please try again later.';\r\n break;\r\n case 400:\r\n err?.error.hasOwnProperty('validation')\r\n ? (errorMessage = err?.error.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\nexport function resolveErrorString(error: Error | any) {\r\n const validation = error.hasOwnProperty('validation');\r\n\r\n if (validation) {\r\n const errMsg = error.validation.body.message;\r\n \r\n return errMsg\r\n } else {\r\n return error\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: any): 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:any): any {\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\nimport { IArrayFunction } from \"ngx-t-forms-types\"\r\nimport { validateObjectAgainstString } from \"../modules/stringJsonValidator/getObjectValidations\";\r\nimport { getValueByPath } from \"./getDeepObject\";\r\n\r\n\r\nexport enum FunctionTypes {\r\n Filter = \"filter\",\r\n Find = \"find\",\r\n Map = \"map\",\r\n // Add more function types here as needed\r\n}\r\n\r\n\r\ninterface IRuleFunctions {\r\n [key: string]: <T>(array: T[], expression: string) => T[] | T | undefined;\r\n}\r\n\r\n/**\r\n * Applies the specified array access function based on the provided rule.\r\n * @param array The input array to operate on\r\n * @param rule The rule specifying the function and expression to apply\r\n * @returns The result of applying the specified function\r\n * @throws Error if invalid arguments are provided\r\n */\r\nexport function arrayAccessFunctions<T>(array: T[], rule: IArrayFunction[]): T[] | T | undefined {\r\n // Input validation\r\n if (!Array.isArray(array)) {\r\n throw new Error(\"First argument must be an array\");\r\n }\r\n if (!rule || !Array.isArray(rule) || !rule.every(r=>typeof r.expression === 'string') ) {\r\n throw new Error(\"Rule must have a valid function and expression\");\r\n }\r\n const hasCorrectFunctionType = rule.every((r) => Object.values(FunctionTypes).includes(r.function as FunctionTypes));\r\n if (!hasCorrectFunctionType) {\r\n throw new Error(`Invalid function type`);\r\n }\r\n\r\n\r\n // Apply the specified function\r\n\r\n return rule.reduce((acc: T[] | T | undefined, item: IArrayFunction) => {\r\n if (Array.isArray(acc)) {\r\n return ruleFunctions[item.function]?.(acc, item.expression);\r\n }\r\n return acc;\r\n }, array);\r\n\r\n\r\n\r\n}\r\n\r\n// Define the rule functions\r\nconst ruleFunctions: IRuleFunctions = {\r\n [FunctionTypes.Filter]: <T>(array: T[], expression: string): T[] => {\r\n\r\n return array.filter((item) => {\r\n try {\r\n const ev = validateObjectAgainstString(expression, item as T[])\r\n return ev\r\n } catch (error) {\r\n return false\r\n \r\n }\r\n \r\n \r\n\r\n });\r\n },\r\n [FunctionTypes.Find]: <T>(array: T[], expression: string): T | undefined => {\r\n return array.find((item) => validateObjectAgainstString(expression, item as T[],));\r\n },\r\n [FunctionTypes.Map]: <T>(array: T[], expression: string): T[] => {\r\n \r\n return array.map((item) => {\r\n let obj\r\n\r\n try {\r\n obj = destructureObject(item,expression)\r\n } catch (error) {\r\n\r\n obj = undefined\r\n }\r\n return obj\r\n });\r\n },\r\n // Add more rule functions here as needed\r\n};\r\n\r\nfunction destructureObject(obj: any, keysString: string): any {\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: any = {};\r\n keys.forEach(key => {\r\n if (key in obj) {\r\n result[key] = obj[key];\r\n\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 if(!keyName ) return\r\n const bindKey = properties[1]?.replace('{','').replace('}','')||''\r\n const path = bindKey.split('.').map(s => s.trim()).filter(Boolean);\r\n result[keyName] = getValueByPath(obj, path);\r\n \r\n }\r\n });\r\n\r\n return result;\r\n}","import { IArrayFunction } from\"ngx-t-forms-types\"\r\nimport { arrayAccessFunctions } from \"./evaluateArrayAccessRules\";\r\n\r\n\r\ntype DeepPropertyValue = any;\r\nexport type PropertyPath = (string | number | IArrayFunction[])[];\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\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 {any} 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 {any} 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\nconst returnDeepProperty = (item: any, 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 let current = 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 '${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: '${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 '${key}' of ${typeof current}`, path.slice(0, i), key);\r\n }\r\n\r\n if ((key as any) 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 {any} 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: any, 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\r\nconst safeReturnDeepProperty = (item: any, 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 = any>(obj: any, 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 return segments.reduce(\r\n (acc, seg) => (acc != null && acc[seg] !== undefined ? acc[seg] : undefined),\r\n obj as any\r\n ) as T | undefined;\r\n }\r\nexport { returnDeepProperty, safeReturnDeepProperty,getValueByPath, PropertyAccessError };","\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\nconst returnMappedPathValue = (pathMap: TreeNode[], obj: any) => {\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\nconst getValueFromValueAccessor = (valueAccessRules: FormInputBasicOptionInterface | TreeNode[] | Record<string, TreeNode[]>, data: any) => {\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 let v: any = {}\r\n for (let key in valueAccessRules) {\r\n v[key] = returnMappedPathValue((valueAccessRules as any)[key] as TreeNode[], 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 return data[valueAccessRules['value'] as string]\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: any,\r\n) {\r\n try {\r\n if (input.element !== ElementTypes.MultipleInput) return value;\r\n if (!Array.isArray(value)) return value;\r\n return value.map((val) => \r\n \r\n {\r\n const newVal = Object.entries(val).reduce((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 { 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/**\r\n * Retrieves the input data for a POST request.\r\n * @param minRequiredInputs - An array of TInputControllerService objects representing the minimum required inputs.\r\n * @param inputClass - The TInputControllerService object representing the input class requesting the data.\r\n * @param formValues - An object containing the entire form's values.\r\n * @param section - The TFormSectionControllerService object representing the form section.\r\n * @param minInputs - An array of MinimumInputRequiredInterface objects representing the minimum required inputs.\r\n * @param dataFor - A string indicating whether the data is for \"options\" or \"value\".\r\n * @param httpPostDataFunction - A function that performs the HTTP POST request.\r\n */\r\nexport function inputGetApiPostData(\r\n inputConfig: FormColumnInputs,\r\n formValues: any,\r\n dataFor: \"options\" | \"value\",\r\n utils :IFunctionUtils\r\n\r\n\r\n) :Observable<void>{\r\n \r\n try {\r\n const fetchOptions: APIDataFetchingConfigurationInterface | undefined = inputConfig.matOptions?.fetch?.[dataFor] as any\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 = (inputConfig.matOptions?.fetch?.[dataFor] as APIDataFetchingConfigurationInterface)?.httpEndPoint as string\r\n\r\n const submissionParameters= {\r\n handleId: (inputConfig.matOptions?.fetch?.[dataFor] as APIDataFetchingConfigurationInterface)?._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: (inputConfig.matOptions?.fetch?.[dataFor] as APIDataFetchingConfigurationInterface)?.httpHeaderOptions,\r\n refresh: false,\r\n httpEndPoint: endpoint\r\n ,\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 tap(\r\n (response: any) => {\r\n utils.removeInputStatus(inputConfig.id, 'd19be9ca-ceda-4388-9f7b-3fcb5f12d921');\r\n const valueAccessRules = (fetchOptions as APIDataFetchingConfigurationInterface)?.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 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\r\n\r\n\r\n\r\n \r\n\r\n\r\n } catch (error: any) {\r\n const errorMessage = errorResolver(error as unknown as any);\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\nexport function returnMappedData(\r\n formValues: any,\r\n minInputs: MinimumInputRequiredInterface[],\r\n endpoint: string\r\n) {\r\ntry {\r\n const newData: any = {\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 isPrimary ? newData[minInput.name] = v :\r\n newData.data[minInput.name] = v\r\n } else if (minInput.type === MinInputTypes.MapTo && minInput.mapTo) {\r\n if ((minInput.mapTo as MinInputMapInput).element === ElementTypes.DateRangePicker) {\r\n isPrimary ? newData[minInput.name] = formValues[minInput.name] :\r\n newData.data[minInput.name] = formValues[minInput.name]\r\n } else {\r\n isPrimary ? newData[minInput.name] = formValues[(minInput.mapTo as MinInputMapInput)\r\n .inputId] : newData.data[minInput.name]\r\n = formValues[(minInput.mapTo as MinInputMapInput)\r\n .inputId]\r\n }\r\n\r\n } else if (minInput.type === MinInputTypes.MapDocFilter) {\r\n isPrimary ? newData['docFilter'] = (minInput.mapTo as MinInputMapInput[]).map((mappedInput) => {\r\n return {\r\n key: mappedInput.inputId,\r\n filterValue: formValues[mappedInput.inputId]\r\n }\r\n }) :\r\n newData.data['docFilter'] = (minInput.mapTo as MinInputMapInput[]).map((mappedInput) => {\r\n return {\r\n key: mappedInput.inputId,\r\n filterValue: formValues[mappedInput.inputId]\r\n }\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 = { ...newData, startPeriod: undefined, endPeriod: undefined, searchFilter: undefined }\r\n payload['data']['filter'] = {}\r\n\r\n return {\r\n startPeriod, endPeriod, searchFilter,\r\n\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","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 { IStepOption } from \"ngx-ui-tour-md-menu\";\r\nexport interface IFormTour extends IStepOption{\r\n sectionId: string;\r\n \r\n}\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 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: !!(column.value as any)?.start ?\r\n new Date((column.value as any).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: !!(column.value as any)?.end ?new Date((column.value as any).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) {\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 return !!(self.mainForm?.controls[c.sectionId] as FormGroup<any> )?.controls[c.id]?.valid === true || \r\n !!(self.mainForm?.controls[c.sectionId] as FormGroup<any> )?.controls[c.id]?.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: { sectionIsInvalid: any; }) => step.sectionIsInvalid);\r\n const incompleteSteps = steps.filter((step: { sectionIsSeen: any; }) => !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 }","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 if (!self?.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 = self?.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 self.mainForm!.controls[inputId] = control;\r\n \r\n // Force form validation\r\n self.mainForm!.updateValueAndValidity();\r\n\r\n setTimeout(() => {\r\n // Get fresh control reference\r\n const currentControl = self.mainForm?.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 self.mainForm!.controls[inputId] = currentControl;\r\n \r\n // Force validation\r\n self.mainForm!.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 } as any, 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 } as any, 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 self.updateFormInputConfig(inputId, { temporaryHint: newHint } as any);\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 any);\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, any>, 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 { 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\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};","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 return {\r\n ...mainInput,\r\n id,\r\n value: isStartDate ? (mainInput.value as any)?.start: (mainInput.value as any)?.end,\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 { ElementTypes } from \"ngx-t-forms-types\";\r\nimport { returnAnyFormInputFromForm } from \"../../../../components/forms/functions/findFormInput\";\r\nimport { getSectionControl } from \"../../t-form-section-controller/Functions/formGenerator\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nimport { FormGroup } from \"@angular/forms\";\r\n\r\n export const updateValue = (self:FormTowerControllerService,inputId: string, value: any) => {\r\n const input = returnAnyFormInputFromForm(self.form!, inputId);\r\n \r\n \r\n if(!input) {\r\n \r\n throw new Error(`Input cant be found.Failed to set value`)\r\n \r\n }\r\n \r\n const sectionId = input?.sectionId\r\n if(!sectionId) {\r\n throw new Error(`Input is missing a section. Failed to set value`)\r\n \r\n }\r\n const isDateRangePicker = input?.element === ElementTypes.DateRangePicker;\r\n if(isDateRangePicker){\r\n const alreadyHasCompoundedKey = inputId.includes('.');\r\n if(!alreadyHasCompoundedKey){\r\n throw new Error(`Input ID ${inputId} does not have a compounded key for date range picker. Failed to set value`);\r\n }\r\n const sectionControl =(self.mainForm?.controls[sectionId] as FormGroup).controls[inputId];\r\n const isStartDate = inputId.split('.')?.[1] === input.startDateControl\r\n const valueIsDate = !Number.isNaN(Date.parse(value));\r\n if(valueIsDate){\r\n sectionControl?.setValue(value);\r\n return;\r\n }\r\n sectionControl?.setValue(isStartDate ? value.start : value.end);\r\n return\r\n \r\n \r\n }\r\n \r\n \r\n const sectionControl = getSectionControl(self.mainForm!, sectionId,inputId);\r\n if(!sectionControl){\r\n throw new Error('Missing FormControl. Failed to set value')\r\n \r\n \r\n }\r\n sectionControl?.setValue(value);\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 inputSectionIsSeen = !!self.mainForm?.controls[input.sectionId]?.touched && !!self.mainForm?.controls[input.sectionId]?.dirty;\r\n if(!inputSectionIsSeen){\r\n return\r\n }\r\n const control = getSectionControl(self.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 }","export function assignDeepPropertyToObject(item: any, path: Array<string>, value: any) {\r\n let 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 item = obj;\r\n return obj\r\n}","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, any> => {\r\n if (!self.mainForm?.value) return {}\r\n // Combine all nested objects into single object\r\n return Object.values(self.mainForm?.value).reduce((acc, section) => ({\r\n ...(acc as any),\r\n ...(section as object)\r\n }), {} as any) as Record<string, any>;\r\n\r\n}\r\nexport const getFormValueAsFormControlBasedObject = (\r\n self: FormTowerControllerService,\r\n): Record<string, any> => {\r\n try {\r\n // Validate essential inputs exist\r\n if ((!!self.mainForm?.controls && !!self.form) === false) {\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(self.form!);\r\n const multipleInputIds = multipleInputs.map(input => input.id);\r\n\r\n return Object.entries(formValues).reduce((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(self.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\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((acc, mscoaInput) => {\r\n acc[mscoaInput.formControlName] = formValues[`${input.id}.${mscoaInput.id}`];\r\n return acc;\r\n }, {} as Record<string, any>);\r\n result[input.formControlName] = {\r\n ... 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 }, {} as Record<string, any>);\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: any,\r\n allFormValues: Record<string, any>\r\n): any[] => {\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((item: Record<string, any>) => {\r\n if (!item || typeof item !== 'object') {\r\n return {};\r\n }\r\n\r\n const result: Record<string, any> = {};\r\n const itemId = item[\"id\"] || '';\r\n\r\n // Process each form input within the multiple input\r\n ([...(input.formInputs || []), {\r\n id: \"id\",\r\n formControlName: \"id\",\r\n } as any])?.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, any>,\r\n key: string,\r\n value: any\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, any>): Record<string, any> => {\r\n return Object.entries(value).reduce((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 }, {} as any);\r\n}","import { IFormChangeHistory } from \"ngx-t-forms-types\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nexport const updateChangeHistory =async (self: FormTowerControllerService, changes:Record<string,any>) => {\r\n // change history is limited to 20 changes\r\n if(Object.keys(changes).length ===0) return;\r\n if(self.changeHistory.length >= 20) {\r\n self.changeHistory.shift()\r\n }\r\n const newChange :IFormChangeHistory = {\r\n date: new Date(),\r\n changes: changes,\r\n id: uuidv4()\r\n }\r\n self.changeHistory.push(newChange)\r\n const allChangedInputIds = Object.keys(changes)\r\n if(self.form === undefined) return;\r\n self.form = {\r\n ...self.form,\r\n slides: self.form.slides.map(slide => {\r\n return {\r\n ...slide,\r\n columns: slide.columns.map(column => {\r\n return {\r\n ...column,\r\n valueUpdatedAt: allChangedInputIds.includes(column.id) ? new Date() : column.valueUpdatedAt\r\n \r\n }\r\n })\r\n }\r\n })\r\n }\r\n\r\n}","\r\nimport { Observable } from \"rxjs\";\r\nimport { FunctionTypes } from \"./getAllFunctionTypes\";\r\n\r\n/**\r\n * Extracts ValueGetMethodAPI and OptionsGetMethodAPI observables from the input collection\r\n * @param inputCollection The collection of functions to extract from\r\n * @returns Array of extracted observables\r\n */\r\nexport function extractSpecificFunctionTypes(\r\n inputCollection: Record<string, Partial<Record<FunctionTypes, Observable<void>>>>\r\n ): Observable<void>[] {\r\n const result:Observable<void>[] = [];\r\n \r\n // Extract all API functions that should run on init\r\n Object.entries(inputCollection).forEach(([, functions]) => {\r\n [FunctionTypes.ValueGetMethodAPI, \r\n FunctionTypes.OptionsGetMethodAPI,\r\n FunctionTypes.OptionsPostMethodAPIWithAllDefaultParams,\r\n FunctionTypes.ValuePostMethodAPIWithAllDefaultParams,\r\n ].forEach(fnType => {\r\n if (functions[fnType]) {\r\n result.push(functions[fnType]);\r\n }\r\n });\r\n });\r\n \r\n return result;\r\n}","import { APIDataFetchingConfigurationInterface, FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport { IFunctionUtils } from \"../../t-form-tower-controller/form-tower-controller.service\";\r\nimport { catchError, Observable, of, tap, } from \"rxjs\";\r\nimport { getValueFromValueAccessor } from \"../../t-form-section-controller/Functions/getValueFromPathMap\";\r\nimport { HintType } from \"../../../../../lib/shared/functions/textIconsForUserHints\";\r\nimport { multipleFormInputMapValueToInputsId } from \"./multipleFormInputsMapValueToFormInputId\";\r\n\r\n\r\nexport function getApiDataFetching(inputConfig: FormColumnInputs,\r\n dataFor: \"options\" | \"value\",\r\n utils: IFunctionUtils): Observable<void> {\r\n try {\r\n const fetchOptions = inputConfig.matOptions?.fetch?.[dataFor]\r\n const source = fetchOptions?.source\r\n if (source !== \"api\") {\r\n utils.setInputTemporaryError(inputConfig.id, `Cannot fetch data. Source is not from an API`)\r\n return of()\r\n }\r\n const { httpEndPoint, httpHeaderOptions } = (fetchOptions as APIDataFetchingConfigurationInterface)\r\n utils.setInputStatus(inputConfig.id, '2135bc6a-d957-4af1-9148-e104363afa30', 'Fetching data...');\r\n return utils.httpGetDataFunction(httpEndPoint, httpHeaderOptions).\r\n pipe(\r\n tap((data) => {\r\n utils.removeInputStatus(inputConfig.id, '2135bc6a-d957-4af1-9148-e104363afa30',);\r\n const valueAccessRules = (fetchOptions as APIDataFetchingConfigurationInterface)?.valueAccessRules;\r\n const results = !valueAccessRules || (Array.isArray(valueAccessRules) && valueAccessRules.length === 0)\r\n ? data\r\n : getValueFromValueAccessor(valueAccessRules, data);\r\n console.error(`[getApiDataFetching] results:`, results)\r\n if (dataFor !== \"options\") {\r\n utils.updateValue(inputConfig.id, multipleFormInputMapValueToInputsId(inputConfig, results))\r\n utils.setTemporaryHint(inputConfig.id, `Data fetched successfully`, HintType.SUCCESS)\r\n return\r\n }\r\n const matOptions = {\r\n ...inputConfig.matOptions,\r\n options: results\r\n }\r\n\r\n utils.updateFormInputConfig(inputConfig.id, { matOptions } as any)\r\n utils.setTemporaryHint(inputConfig.id, `Data options fetched successfully`, HintType.DOCUMENT)\r\n\r\n }),\r\n catchError((error) => {\r\n utils.removeInputStatus(inputConfig.id, '2135bc6a-d957-4af1-9148-e104363afa30',);\r\n utils.setInputTemporaryError(inputConfig.id, `Error fetching data from API`)\r\n return of()\r\n }),\r\n )\r\n } catch (error) {\r\n utils.removeInputStatus(inputConfig.id, '2135bc6a-d957-4af1-9148-e104363afa30',);\r\n throw new Error(`Error fetching data from API: ${error}`)\r\n\r\n }\r\n}","import { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nexport const setInputStatus=(self: FormTowerControllerService, inputId: string,statusId:string, statusMessage: string) =>{\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 self.updateFormInputConfig(inputId, { status } as any)\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) =>{\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 self.updateFormInputConfig(inputId, { status } as any)\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 any)","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) => {\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 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 // 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) => {\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?.find((row: any) => 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) => {\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?.find((row: any) => 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 { v4 as uuidv4 } from 'uuid';\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nimport { HintType } from \"../../../../shared/functions/textIconsForUserHints\";\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\r\n const validationResult = validateInnerInputs(self, sectionGroup, inputId, innerInputs);\r\n if (!validationResult.isValid) {\r\n return false;\r\n }\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);\r\n } else {\r\n // Add new row\r\n return addNewRow(self, mainInput, innerInputsValues, inputId);\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\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 invalidInnerInputs = innerInputs.filter(innerInput => {\r\n const control = sectionGroup.get(innerInput.id);\r\n return control?.invalid;\r\n });\r\n\r\n if (invalidInnerInputs.length > 0) {\r\n const firstInvalidInput = invalidInnerInputs[0];\r\n const remainingCount = invalidInnerInputs.length - 1;\r\n const errorMessage = `'${firstInvalidInput?.label || firstInvalidInput?.id}' ${\r\n remainingCount > 0 ? `and ${remainingCount} other field${remainingCount > 1 ? 's' : ''}` : ''\r\n } ${remainingCount > 0 ? 'are' : 'is'} invalid`;\r\n \r\n self.setInputTemporaryError(inputId, errorMessage);\r\n return { isValid: false, invalidInputs: invalidInnerInputs };\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, any> => {\r\n\r\n return innerInputs?.reduce((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 , {} as Record<string, any>);\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, any>,\r\n inputId: string\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.findIndex((row: any) => 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 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, any>,\r\n inputId: string\r\n): boolean => {\r\n // Generate a unique ID for the new row\r\n innerInputsValues[`${inputId}.id`] = uuidv4();\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 \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: undefined as any,\r\n formId: '',\r\n formTitle: '',\r\n\r\n })\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, any>): 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[column.startDateControl!],\r\n end: endValue || initValue[column.endDateControl!]\r\n }\r\n }\r\n }\r\n if (column.element === ElementTypes.MultipleInput) {\r\n const newM = {\r\n ...column,\r\n value: (deepValue || initValue[column.formControlName||''] || column.value || []).map((item: any) => {\r\n\r\n return Object.entries(item).reduce((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\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 type: contentType as any, // Cast to 'any' or your specific InputFileType\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 * This approach avoids a large switch statement and is easier to extend.\r\n */\r\nconst INPUT_TYPE_SAMPLE_GENERATORS: Record<InputTypes, () => any> = {\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 {any} A generated sample value.\r\n */\r\nconst getDefaultSampleValue = (input: FormColumnInputs): any => {\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) => any> = {\r\n [ElementTypes.MultipleInput]: (input) => {\r\n const oneEntry = input.formInputs?.reduce((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)\r\n }\r\n return acc;\r\n }\r\n acc[formInput.formControlName] = getSampleValueForInput(formInput);\r\n return acc;\r\n }, {} as Record<string, any>) || {};\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((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 }, {} as Record<string, any>) || {};\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: false,\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\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\nexport function getPipedValueFromDataType(\r\n dataType: InputDataTypes | undefined | DocumentLitsLabelConfigInterfaceValueType,\r\n value: any,\r\n pipe: FormColumnInputs['pipe'] | undefined\r\n) {\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\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 return url.replace(/\\{\\{(\\$?)(.+?)\\}\\}/g, (match, dollar, p1) => {\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 = (variables as any)[key];\r\n \r\n if (envVar === undefined) {\r\n return match; // Return original if not found\r\n }\r\n \r\n return envVar;\r\n });\r\n }","import { catchError, EMPTY, filter, forkJoin, map, Observable, of, switchMap, tap} from \"rxjs\"\r\n\r\n\r\nimport { assignDeepPropertyToObject } from \"../../../shared\";\r\nimport { APIDataFetchingConfigurationInterface, InClassFormUtilsInterface, FormInterface, FormSubmissionStatus } from 'ngx-t-forms-types';\r\ninterface FileData {\r\n \r\n base64: string;\r\n fileName: string;\r\n type: any,\r\n id:string,\r\n fileExtension?: string\r\n }\r\n \r\n\r\n export 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\n const isFileData = (value: any): value is FileData => {\r\n return (\r\n value &&\r\n typeof value === 'object' &&\r\n 'base64' in value &&\r\n 'fileName' in value &&\r\n 'fileExtension' in value\r\n );\r\n };\r\n \r\n /**\r\n * Recursively finds all file objects in the form data\r\n */\r\n const findFileControls = (\r\n data: any,\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).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\n const setNestedValue = (obj: any, path: string[], value: any): any => {\r\n \r\n return assignDeepPropertyToObject({ ...obj }, path, value) \r\n };\r\n \r\n /**\r\n * Uploads form files to server with support for nested objects and arrays\r\n */\r\n const uploadFormFilesToServer = (\r\n formData: any,\r\n fileUpload: FileUploadFn\r\n ): Observable<any> => {\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') {\r\n return of(formData);\r\n }\r\n \r\n // 3) Find all files in the form data (including nested)\r\n const fileControls = findFileControls(formData);\r\n \r\n if (fileControls.length === 0) {\r\n return of(formData);\r\n }\r\n \r\n // 4) Create observables for file uploads\r\n const uploads = fileControls.map(({ path, fileData }) => \r\n fileUpload(\r\n fileData.base64,\r\n fileData.fileName,\r\n fileData.type,\r\n ).pipe(\r\n map(result => ({ path, result }))\r\n )\r\n );\r\n \r\n // 5) Upload all files and update form data\r\n return forkJoin(uploads).pipe(\r\n map(results => {\r\n let updatedFormData = { ...formData };\r\n \r\n results.forEach(({ path, result }) => {\r\n updatedFormData = setNestedValue(updatedFormData, path, { ...result});\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, any>): 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: any,\r\n Utils: InClassFormUtilsInterface\r\n): Observable<any> => {\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: any, keysString: string): any {\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: any = {};\r\n keys.forEach(key => {\r\n if (key in obj) {\r\n result[key] = obj[key];\r\n\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 {any} - 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 = (api: APIDataFetchingConfigurationInterface, formData: any,passData:any): any => {\r\n\r\n \r\n if(!api?.projectFormData){\r\n if(typeof passData === 'object' && passData !== null){\r\n return {\r\n ...formData,\r\n ...passData\r\n }\r\n }\r\n return formData;\r\n }\r\n\r\n if(typeof passData === 'object' && passData !== null){\r\n return {\r\n ...destructureObject({\"$formValue\":formData}, api.projectFormData),\r\n ...passData\r\n }\r\n }\r\n return destructureObject({\"$formValue\":formData}, api.projectFormData)\r\n\r\n}\r\n\r\nconst executeApiCalls = (\r\n apis: APIDataFetchingConfigurationInterface[],\r\n formData: any,\r\n Utils: InClassFormUtilsInterface,\r\n passData?:any,\r\n): Observable<any[]> => {\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 = (form:FormInterface,formData:any, passData:any, Utils: InClassFormUtilsInterface,): Observable<boolean> => {\r\n try {\r\n const { canSubmitAPI } = form.submissionHandle;\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 = (form:FormInterface,getAllValues:any,passData:any,Utils: InClassFormUtilsInterface,): Observable<any> => {\r\n const { submissionAPI } = form.submissionHandle;\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,Utils,passData))\r\n )\r\n \r\n};\r\n\r\nexport const formHttpSubmissions = (form:FormInterface,formData:any,passData:any,Utils: InClassFormUtilsInterface): Observable<any> => {\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};","import { FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport { IFunctionUtils } from \"../../t-form-tower-controller/form-tower-controller.service\";\r\nimport { Observable, of, throwError } from \"rxjs\";\r\nimport { HintType } from \"../../../../shared/functions/textIconsForUserHints\";\r\nexport function getInputSourcedValue(\r\n inputConfig: FormColumnInputs,\r\n formValue: () => Record<string, any>,\r\n utils: IFunctionUtils\r\n): Observable<void> {\r\n try {\r\n const formVal = formValue();\r\n const inheritValueFromInputId = (inputConfig.matOptions?.fetch.value as any).inputSourceId;\r\n\r\n if (!inheritValueFromInputId) {\r\n throw new Error('Input source ID not specified for Input Sourced Value function.');\r\n }\r\n const sourcedValue = formVal[inheritValueFromInputId];\r\n utils.updateValue( inputConfig.id,sourcedValue);\r\n \r\n return of(void 0)\r\n\r\n } catch (error) {\r\n utils.setTemporaryHint(\r\n inputConfig.id,\r\n error instanceof Error ? error.message : `Failed to prepopulate value`, HintType.ERROR\r\n )\r\n return throwError(() => error instanceof Error ? error.message : `Failed to prepopulate value`);\r\n\r\n }\r\n\r\n}","import { ElementTypes, FormColumnInputs, IFinancialCycles, InputDataTypes } from \"ngx-t-forms-types\";\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: {\r\n id: string;\r\n controlName: string;\r\n label: string;\r\n value: any;\r\n sectionId: string;\r\n}): FormColumnInputs {\r\n return {\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: config.value ? new Date(config.value.toISOString()) : null,\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 } as unknown as FormColumnInputs;\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 }[];\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_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\r\n return inputConfigs\r\n .filter(group => group.condition)\r\n .flatMap(group => group.items.map(item => createDateInput({\r\n id: item.id,\r\n controlName: item.name,\r\n label: `🏢 System: ${item.label}`,\r\n value:globals[item.name],\r\n sectionId\r\n })));\r\n}\r\n\r\nexport enum SystemInputIDs{\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\r\n}","import { take, tap } from \"rxjs\";\r\nimport { FormTowerControllerService } from \"../form-tower-controller.service\";\r\nimport { generateSystemInputs } from \"../../../../components/forms/functions/generateSystemInputs\";\r\n\r\nexport const loadSystemInputs = (self: FormTowerControllerService,) => {\r\n try {\r\n self.NGX_T_FORMS_CONFIG.formBuilder.getFinacialCycles().pipe(\r\n take(1),\r\n tap((globalVariables=>{\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 }))\r\n\r\n ).subscribe()\r\n\r\n } catch (error) {\r\n\r\n }\r\n\r\n}","/**\r\n * Returns input IDs in topological execution order (dependencies first, then target).\r\n * Used when refreshing an input: run upstream dependencies before the target so each\r\n * function reads correct values from its dependencies.\r\n *\r\n * @param targetInputId - The input to refresh (e.g. from allFormInputs)\r\n * @param inputChangeDependencyRecords - inputId → functionType → dependencyId → true\r\n * @param inputFunctionsCollection - Used to filter: only include inputs that have functions to run\r\n * @returns Ordered input IDs to execute in sequence (dependencies first, then target)\r\n */\r\nexport function getTopologicalExecutionOrder(\r\n targetInputId: string,\r\n inputChangeDependencyRecords: Partial<Record<string, Partial<Record<string, Record<string, boolean>>>>>,\r\n inputFunctionsCollection: Record<string, Partial<Record<string, unknown>>>\r\n): string[] {\r\n const visited = new Set<string>();\r\n const recursionStack = new Set<string>();\r\n const order: string[] = [];\r\n\r\n const visit = (id: string): void => {\r\n if (visited.has(id)) return;\r\n if (recursionStack.has(id)) {\r\n return; // Break the cycle\r\n }\r\n\r\n visited.add(id);\r\n recursionStack.add(id);\r\n\r\n const deps = inputChangeDependencyRecords[id];\r\n if (deps) {\r\n for (const fnDeps of Object.values(deps)) {\r\n for (const depId of Object.keys(fnDeps || {})) {\r\n visit(depId);\r\n }\r\n }\r\n }\r\n\r\n recursionStack.delete(id);\r\n\r\n const hasFunctions =\r\n inputFunctionsCollection[id] &&\r\n Object.keys(inputFunctionsCollection[id]).length > 0;\r\n if (hasFunctions) {\r\n order.push(id);\r\n }\r\n };\r\n\r\n const targetDeps = inputChangeDependencyRecords[targetInputId];\r\n if (targetDeps) {\r\n for (const fnDeps of Object.values(targetDeps)) {\r\n for (const depId of Object.keys(fnDeps || {})) {\r\n visit(depId);\r\n }\r\n }\r\n }\r\n\r\n if (!order.includes(targetInputId)) {\r\n order.push(targetInputId);\r\n }\r\n\r\n return order;\r\n}\r\n","import { Observable, of, from, concatMap, forkJoin, catchError, tap, last, map } from 'rxjs';\r\nimport { FormTowerControllerService } from '../form-tower-controller.service';\r\nimport { getTopologicalExecutionOrder } from './getTopologicalExecutionOrder';\r\nimport { FunctionTypes } from './getAllFunctionTypes';\r\nimport { getFormValue } from './getFormValue';\r\nimport { HintType } from '../../../../shared/functions/textIconsForUserHints';\r\n\r\n/** Shape for accessing protected members (avoids `any`; cast via unknown) */\r\ntype TowerControllerInternals = FormTowerControllerService & {\r\n _inputChangeDependencyRecords: Partial<Record<string, Partial<Record<string, Record<string, boolean>>>>>;\r\n _formValue: Record<string, unknown>;\r\n};\r\n\r\nconst REFRESH_FUNCTION_TYPES = [\r\n FunctionTypes.ValueCalculation,\r\n FunctionTypes.ValuePostMethodAPI,\r\n FunctionTypes.OptionsPostMethodAPI,\r\n FunctionTypes.ValueGetMethodAPI,\r\n FunctionTypes.OptionsGetMethodAPI,\r\n FunctionTypes.InputSourcedValue,\r\n FunctionTypes.ValuePostMethodAPIWithAllDefaultParams,\r\n FunctionTypes.OptionsPostMethodAPIWithAllDefaultParams,\r\n];\r\n\r\n/**\r\n * Returns true if the input has refresh functions that can be run.\r\n *\r\n * @param self The FormTowerControllerService instance\r\n * @param inputId The ID of the input to check\r\n * @returns true if the input has at least one refresh function\r\n */\r\nexport function canRefresh(self: FormTowerControllerService, inputId: string): boolean {\r\n const fns = self.inputFunctionsCollection[inputId];\r\n if (!fns) return false;\r\n return REFRESH_FUNCTION_TYPES.some((t) => Boolean(fns[t]));\r\n}\r\n\r\nexport function canRefreshSectionFn(self: FormTowerControllerService, sectionId: string): boolean {\r\n const allInputs = self.allFormInputs();\r\n if (!allInputs) return false;\r\n const inputsInSection = allInputs.filter((input) => input.sectionId === sectionId);\r\n return inputsInSection.some((input) => canRefresh(self, input.id));\r\n}\r\n\r\n/**\r\n * Refreshes a specified input by running its functions and all upstream dependencies\r\n * in topological order. Simulates that the input's dependencies changed, so each\r\n * function runs with correct values from its dependencies.\r\n *\r\n * @param self The FormTowerControllerService instance\r\n * @param inputId The ID of the input to refresh\r\n * @returns Observable that completes when all refresh functions have run\r\n */\r\nexport function refreshInputWithDependencies(self: FormTowerControllerService, inputId: string) {\r\n const ctrl = self as unknown as TowerControllerInternals;\r\n const order = getTopologicalExecutionOrder(\r\n inputId,\r\n ctrl._inputChangeDependencyRecords,\r\n self.inputFunctionsCollection\r\n );\r\n\r\n if (order.length === 0) return of(void 0);\r\n\r\n return from(order).pipe(\r\n concatMap((id) => {\r\n const fns = self.inputFunctionsCollection[id];\r\n if (!fns) return of(void 0);\r\n\r\n const observables = REFRESH_FUNCTION_TYPES\r\n .map((t) => fns[t])\r\n .filter((obs): obs is Observable<void> => Boolean(obs))\r\n .map((obs$) =>\r\n obs$.pipe(\r\n catchError(() => {\r\n return of(void 0);\r\n })\r\n )\r\n );\r\n\r\n return observables.length > 0\r\n ? forkJoin(observables).pipe(map(() => void 0))\r\n : of(void 0);\r\n }),\r\n tap(() => {\r\n ctrl._formValue = getFormValue(self);\r\n ctrl.setTemporaryHint(inputId, 'Field Refreshed', HintType.LOADING );\r\n }),\r\n last()\r\n );\r\n}\r\n\r\n/**\r\n * Refreshes all inputs within a given section.\r\n * This is achieved by collecting all refresh observables for the inputs in the section and running them in parallel.\r\n *\r\n * @param self The FormTowerControllerService instance\r\n * @param sectionId The ID of the section to refresh\r\n * @returns An observable that completes when all inputs in the section have been refreshed.\r\n */\r\nexport function refreshSectionInput(self: FormTowerControllerService, sectionId: string): Observable<void> {\r\n const allInputs = self.allFormInputs();\r\n if (!allInputs) return of(void 0);\r\n\r\n const refreshObservables = allInputs\r\n .filter((input) => input.sectionId === sectionId && canRefresh(self, input.id))\r\n .map(input => refreshInputWithDependencies(self, input.id));\r\n\r\n if (refreshObservables.length === 0) return of(void 0);\r\n\r\n return forkJoin(refreshObservables).pipe(map(() => void 0));\r\n}","import { Directive, inject, Inject, OnDestroy } from '@angular/core';\r\nimport { FormColumnInputs, FormInterface, FormSubmissionStatus, IFormChangeHistory, InClassFormUtilsInterface } from 'ngx-t-forms-types';\r\n\r\n\r\nimport { FormGroup } from '@angular/forms';\r\nimport { formGenerator, } from '../t-form-section-controller/Functions/formGenerator';\r\nimport { startTowerFormChangesEventListener } from './functions/startTowerFormChangesEventListener';\r\nimport { catchError, forkJoin, Observable, of, Subject, take, tap } from 'rxjs';\r\nimport { createInputChangeDependency, FunctionTypes, getAllFunctionTypes } from './functions/getAllFunctionTypes';\r\nimport { calculateInput } from '../t-form-controller/function/calculateInputValue';\r\nimport { ElementTypes } from \"ngx-t-forms-types\"\r\nimport { HintType } from '../../../shared/functions/textIconsForUserHints';\r\nimport { inputGetApiPostData } from '../t-form-controller/function/postApiDataFetching';\r\n\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { selectAllFormTours, selectFormSteps } from './functions/selectFormSteps';\r\nimport { allFormInputs } from './functions/allFormInputs';\r\nimport { formProgress, formSubmissionMessage } from './functions/getSubmissionStatus';\r\nimport { setInputError, setInputTemporaryError, setTemporaryHint } from './functions/setInputError';\r\nimport { updateFormInputConfig } from './functions/updateFormInputConfig';\r\nimport { updateValue } from './functions/updateValue';\r\nimport { setInputAsTouchedAndDirty } from './functions/setInputAsTouchedAndDirty';\r\nimport { setSectionAsActive, setSectionAsSeen } from './functions/setSectionAsSeen';\r\nimport { getFormValue, getFormValueAsFormControlBasedObject, unFlattenFormValue } from './functions/getFormValue';\r\nimport { updateChangeHistory } from './functions/updateChangeHistory';\r\nimport { extractSpecificFunctionTypes } from './functions/extractInitFunctions';\r\nimport { getApiDataFetching } from '../t-form-controller/function/getApiDataFetching';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../injection-tokens';\r\nimport { removeInputStatus, setInputStatus } from './functions/setInputStatus';\r\nimport { multipleInputDuplicateRow, multipleInputEditRow, toggleMultipleInput } from './functions/toggleMultipleInput';\r\nimport { handleStepChange } from './functions/handleStepChange';\r\nimport { StepperSelectionEvent } from '@angular/cdk/stepper';\r\nimport { saveMultipleInputForm } from './functions/saveMultipleInputForm';\r\nimport { prepPopulateForm } from './functions/prePoPulateForm';\r\nimport { formHttpSubmissions } from '../../../components/forms/functions/formHttpSubmissions';\r\nimport { safeReturnDeepProperty } from '../../../shared';\r\nimport { getInputSourcedValue } from '../t-form-controller/function/getInputSourcedValue';\r\nimport { _isEqual } from '../../../shared/functions/isEqual';\r\nimport { loadSystemInputs } from './functions/loadSystemInputs';\r\nimport { canRefresh, canRefreshSectionFn, refreshInputWithDependencies, refreshSectionInput } from './functions/refreshInputWithDependencies';\r\n\r\n\r\n\r\n\r\ninterface DependentInput {\r\n inputId: string;\r\n functionType: FunctionTypes;\r\n}\r\nexport interface IFunctionUtils {\r\n setInputTemporaryError: (inputId: string, message: string) => void,\r\n setTemporaryHint: (inputId: string, message: string, type: HintType) => void,\r\n setInputStatus: (inputId: string, statusId: string, status: string) => void,\r\n removeInputStatus: (inputId: string, statusId: string) => void,\r\n updateValue: (inputId: string, value: any) => void,\r\n httpPostDataFunction: (url: string, data: any, options?: any) => Observable<any>,\r\n httpGetDataFunction: (url: string, options?: any) => Observable<any>,\r\n updateFormInputConfig: (inputId: string, config: FormColumnInputs) => void,\r\n fileUpload: (file: string, fileName: string, fileType: string) => Observable<{ url: string }>,\r\n}\r\n@Directive()\r\nexport abstract class FormTowerControllerService implements OnDestroy {\r\n readonly NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN)\r\n readonly getFinacialCycles = this.NGX_T_FORMS_CONFIG.formBuilder.getFinacialCycles\r\n constructor(@Inject(HttpClient) private _http: HttpClient) { }\r\n\r\n protected _destroyed$ = new Subject<void>();\r\n protected _form: FormInterface | undefined;\r\n protected _mainForm: FormGroup | undefined;\r\n \r\n // Keep form record for non-FormControl based operation, like calculations and API calls\r\n protected _formValue: Record<string, any> = {}\r\n protected _initialFormValue: Record<string, any> = {}\r\n protected _systemInputs:FormColumnInputs[] = []\r\n // Collection of functions for each input ID and function type\r\n protected _inputFunctionsCollection: Record<string, Partial<Record<FunctionTypes, Observable<void>>>> = {};\r\n // Regular dependency records: inputId -> functionType -> dependencyId -> boolean\r\n protected _inputChangeDependencyRecords: Partial<Record<string, Partial<Record<FunctionTypes, Record<string, boolean>>>>> = {};\r\n // Reverse dependency map: dependencyId -> array of {inputId, functionType}\r\n // This tells us: \"When input X changes, these inputs depend on it and need their functions run\"\r\n protected _reverseDependencyMap: Record<string, DependentInput[]> = {};\r\n protected _changeHistory: IFormChangeHistory[] = [];\r\n // local Status properties \r\n submittingStatus: FormSubmissionStatus | undefined\r\n submittingForm: boolean = false\r\n public get form(): FormInterface | undefined {\r\n return this._form;\r\n }\r\n set form(value: FormInterface | undefined) {\r\n this._form = value;\r\n }\r\n set systemInputs(value:FormColumnInputs[]){\r\n this._systemInputs = value\r\n }\r\n get systemInputs(){\r\n return this._systemInputs\r\n }\r\n public get mainForm(): FormGroup | undefined {\r\n return this._mainForm;\r\n }\r\n\r\n get changeHistory(): IFormChangeHistory[] {\r\n return this._changeHistory;\r\n }\r\n set changeHistory(value: IFormChangeHistory[]) {\r\n this._changeHistory = value;\r\n }\r\n get inputFunctionsCollection(): Record<string, Partial<Record<FunctionTypes, Observable<void>>>> {\r\n return this._inputFunctionsCollection;\r\n }\r\n\r\n\r\n ngOnDestroy(): void {\r\n this._destroyed$.next();\r\n this._destroyed$.complete();\r\n this.clearFormState();\r\n Object.values(this._hintTimeoutIds).forEach(timeout => clearTimeout(timeout));\r\n this._hintTimeoutIds = {};\r\n Object.values(this._errorTimeoutIds).forEach(timeout => clearTimeout(timeout));\r\n this._errorTimeoutIds = {};\r\n }\r\n\r\n initialize = async (form: FormInterface) => {\r\n // .1 Clean up for State \r\n this.clearFormState();\r\n // .2 Initialize the form. Create an empty form if none is provided.\r\n\r\n \r\n\r\n this._form = { ...(prepPopulateForm(form, this._initialFormValue)) };\r\n loadSystemInputs(this)\r\n this.setFirstStepAsActive();\r\n // .3 Create the main form Group\r\n const allFormInputs = this.allFormInputs() || [];\r\n this._mainForm = formGenerator(allFormInputs, this.getFormValue.bind(this));\r\n\r\n // .4 crete change reaction functions\r\n this.createAllInputDependencies();\r\n this.createInputFunctionsCollection();\r\n this.buildReverseDependencyMap();\r\n\r\n // 5. run input composition functions that have no dependencies\r\n\r\n\r\n // .5 Start the form changes event listener from the main form and call the change monitor function.\r\n startTowerFormChangesEventListener(this._mainForm, this._destroyed$, this.changeMonitor.bind(this));\r\n //Due to race conditions between form generation and change detection, we need to trigger a refresh of the active section to ensure all calculated fields and API data fetching are up to date on form load.\r\n this.refreshActiveSection()\r\n this.executeInputFunctionsWithoutDependencies();\r\n \r\n\r\n\r\n }\r\n setFirstStepAsActive = () => {\r\n const firstStep = this.selectFormSteps()?.[0];\r\n if (!firstStep) return;\r\n this.setSectionAsActive(firstStep.sectionId);\r\n }\r\n\r\n\r\n getFormValueNames = (): Record<string, any> => getFormValueAsFormControlBasedObject(this)\r\n readonly allFormInputs = () => [...this.systemInputs ,...(allFormInputs(this.form!)??[])] \r\n // CHANGE MONITOR\r\n prevValue: any;\r\n // CHANGE MONITOR - Improved version\r\n protected changeMonitor = (newFormValue: any): Observable<any> => {\r\n // Find changed inputs by comparing with previous values\r\n updateChangeHistory(this, newFormValue).then();\r\n this.NGX_T_FORMS_CONFIG.formBuilder.saveFormData(this.form?.formId, this.getFormValueNames())\r\n const changedInputIds = Object.keys(newFormValue)\r\n\r\n if (changedInputIds.length === 0) {\r\n return of(null); // No changes detected\r\n }\r\n\r\n\r\n this._formValue = getFormValue(this)\r\n // For each changed input, find and execute dependent functions\r\n const functionsToExecute: Observable<void>[] = [];\r\n const executedFunctions = new Set<string>(); // To prevent duplicate executions\r\n\r\n for (const changedInputId of changedInputIds) {\r\n this.setInputAsTouchedAndDirty(changedInputId);\r\n // Find all dependent inputs\r\n\r\n const dependentInputs = this._reverseDependencyMap[changedInputId] || [];\r\n\r\n\r\n for (const { inputId, functionType } of dependentInputs) {\r\n // Create a unique key to prevent duplicate function executions\r\n const functionKey = `${inputId}:${functionType}`;\r\n\r\n if (!executedFunctions.has(functionKey)) {\r\n executedFunctions.add(functionKey);\r\n\r\n const fn: Observable<void> | undefined = this._inputFunctionsCollection[inputId]?.[functionType]\r\n if (fn) {\r\n functionsToExecute.push(fn);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n return functionsToExecute.length > 0\r\n ? forkJoin(functionsToExecute)\r\n : of(null);\r\n };\r\n\r\n\r\n\r\n createInputFunctionsCollection = () => {\r\n const allInputs = this.allFormInputs() \r\n for (const input of allInputs || []) {\r\n if (input.element === ElementTypes.SectionTitle) continue;\r\n const inputFunctions: Partial<Record<FunctionTypes, boolean>> = getAllFunctionTypes(input);\r\n\r\n this._inputFunctionsCollection[input.id] = Object.keys(inputFunctions).reduce((acc, key) => {\r\n if (!!inputFunctions[key as FunctionTypes]) {\r\n // Store the function that RETURNS an Observable, not a function reference\r\n (acc as any)[key as FunctionTypes] = this.getFunctionByType(key as FunctionTypes, input);\r\n }\r\n return acc;\r\n }, {})\r\n \r\n }\r\n }\r\n // Build a reverse dependency map for efficient lookups\r\n private buildReverseDependencyMap(): void {\r\n this._reverseDependencyMap = {};\r\n\r\n // For each input in our form\r\n Object.entries(this._inputChangeDependencyRecords).forEach(([inputId, functionDependencies]) => {\r\n // For each function type this input has\r\n Object.entries(functionDependencies || {}).forEach(([functionType, dependencies]) => {\r\n // For each dependency of this input for this function type\r\n Object.keys(dependencies || {}).forEach(dependencyId => {\r\n // Initialize array if needed\r\n if (!this._reverseDependencyMap[dependencyId]) {\r\n this._reverseDependencyMap[dependencyId] = [];\r\n }\r\n\r\n // Add this input as dependent on the dependencyId\r\n this._reverseDependencyMap[dependencyId].push({\r\n inputId,\r\n functionType: functionType as FunctionTypes\r\n });\r\n });\r\n });\r\n });\r\n\r\n \r\n }\r\n\r\n\r\n createAllInputDependencies = () => {\r\n const allInputs = this.allFormInputs();\r\n for (const input of allInputs || []) {\r\n if (input.element === ElementTypes.SectionTitle) continue;\r\n this._inputChangeDependencyRecords[input.id] = createInputChangeDependency(input);\r\n }\r\n }\r\n\r\n\r\n setInputStatus = (inputId: string, statusId: string, status: string) => setInputStatus(this, inputId, statusId, status);\r\n removeInputStatus = (inputId: string, statusId: string) => removeInputStatus(this, inputId, statusId);\r\n updateValue = (inputId: string, value: any) => updateValue(this, inputId, value);\r\n getFunctionByType(fn: FunctionTypes, input: FormColumnInputs): Observable<void> {\r\n return new Observable<void>(observer => {\r\n\r\n const utils: IFunctionUtils = {\r\n setTemporaryHint: this.setTemporaryHint.bind(this),\r\n\r\n updateValue: this.updateValue.bind(this),\r\n httpPostDataFunction: this.httpPostDataFunction.bind(this),\r\n setInputTemporaryError: this.setInputTemporaryError.bind(this),\r\n httpGetDataFunction: this.httpGetDataFunction.bind(this),\r\n updateFormInputConfig: this.updateFormInputConfig.bind(this),\r\n setInputStatus: this.setInputStatus.bind(this),\r\n removeInputStatus: this.removeInputStatus.bind(this),\r\n fileUpload: this.NGX_T_FORMS_CONFIG.formBuilder.fileUpload.bind(this)\r\n }\r\n // Call calculateInput with the latest utils and form value function\r\n // to create a fresh Observable\r\n let obs$: Observable<void> | undefined;\r\n switch (fn) {\r\n case FunctionTypes.ValueCalculation:\r\n obs$ = calculateInput(input, this.getFormValue.bind(this), utils);\r\n break;\r\n case FunctionTypes.ValuePostMethodAPI:\r\n obs$ = inputGetApiPostData(input, this.getFormValue.bind(this), 'value', utils);\r\n break;\r\n case FunctionTypes.ValuePostMethodAPIWithAllDefaultParams:\r\n obs$ = inputGetApiPostData(input, this.getFormValue.bind(this), 'value', utils);\r\n break;\r\n case FunctionTypes.OptionsPostMethodAPI:\r\n obs$ = inputGetApiPostData(input, this.getFormValue.bind(this), 'options', utils);\r\n break;\r\n case FunctionTypes.OptionsPostMethodAPIWithAllDefaultParams:\r\n obs$ = inputGetApiPostData(input, this.getFormValue.bind(this), 'options', utils);\r\n break;\r\n case FunctionTypes.ValueGetMethodAPI:\r\n obs$ = getApiDataFetching(input, 'value', utils);\r\n break;\r\n case FunctionTypes.InputSourcedValue :\r\n obs$ = getInputSourcedValue(input, this.getFormValue.bind(this), utils);\r\n break;\r\n case FunctionTypes.OptionsGetMethodAPI:\r\n obs$ = getApiDataFetching(input, 'options', utils);\r\n break;\r\n\r\n default:\r\n console.error(`Function type ${fn} not recognized.`);\r\n break;\r\n }\r\n if (!obs$) {\r\n observer.next();\r\n observer.complete();\r\n return\r\n }\r\n\r\n obs$.pipe(take(1)).subscribe({\r\n next: () => {\r\n\r\n observer.next();\r\n observer.complete();\r\n },\r\n error: (err) => observer.error(err)\r\n });\r\n\r\n\r\n })\r\n\r\n\r\n }\r\n getFormValue = () => this._formValue;\r\n clearFormState = () => {\r\n this._form = undefined;\r\n this._mainForm = undefined;\r\n this._inputFunctionsCollection = {};\r\n this._inputChangeDependencyRecords = {};\r\n this._reverseDependencyMap = {};\r\n this._destroyed$.next();\r\n };\r\n\r\n executeInputFunctionsWithoutDependencies = () => {\r\n const funcs$: Observable<void>[] = extractSpecificFunctionTypes(this._inputFunctionsCollection)\r\n funcs$.forEach(fn => {\r\n fn.pipe(take(1)).subscribe({\r\n next: () => console.error(`Executed function`),\r\n error: (err) => console.error(`Error executing function`, err)\r\n });\r\n })\r\n }\r\n _hintTimeoutIds: Record<string, any> = {};\r\n setTemporaryHint = (inputId: string, hint: string, type: HintType): void => setTemporaryHint(this, inputId, hint, type);\r\n \r\n _onFormInputConfigChange?: (inputId: string, config: FormColumnInputs) => void;\r\n registerFormInputConfigChangeFn = (fn: (inputId: string, config: FormColumnInputs) => void) => this._onFormInputConfigChange = fn;\r\n \r\n httpPostDataFunction = (url: string, data: any, options: any) => this.NGX_T_FORMS_CONFIG.formBuilder.httpPostDataFunction(url, data, options) || this._http.post(url, data);\r\n httpGetDataFunction = (url: string, options: any) => this.NGX_T_FORMS_CONFIG.formBuilder.httpGetDataFunction(url, options) || this._http.get(url);\r\n _errorTimeoutIds: Record<string, any> = {};\r\n setInputTemporaryError = (inputId: string, message: string) => setInputTemporaryError(this, inputId, message);\r\n setInputError = (err: Record<string, any>, inputId: string) => setInputError(this, err, inputId);\r\n updateFormInputConfig = (inputId: string, config: FormColumnInputs) => updateFormInputConfig(this, inputId, config);\r\n handleStepChange = (event: StepperSelectionEvent) => handleStepChange(this, event);\r\n selectFormSteps = () => selectFormSteps(this);\r\n selectAllFormTours = () => selectAllFormTours(this);\r\n setSectionAsSeen = (sectionId: string) => setSectionAsSeen(this, sectionId);\r\n setSectionAsActive = (sectionId: string) => setSectionAsActive(this, sectionId);\r\n setInputAsTouchedAndDirty = (inputId: string) => setInputAsTouchedAndDirty(this, inputId);\r\n formProgress = () => formProgress(this);\r\n formSubmissionMessage = () => formSubmissionMessage(this);\r\n setSubmissionStatusValue = (status: FormSubmissionStatus) => this.submittingStatus = status;\r\n initializeFormValues = (initialValues: Record<string, any>) => {\r\n this._initialFormValue = initialValues;\r\n if (this._mainForm === undefined) {\r\n return\r\n }\r\n const allInputs = this.allFormInputs();\r\n if (!allInputs) return\r\n for (const input of allInputs || []) {\r\n\r\n const value = safeReturnDeepProperty(initialValues, input.formControlName.split('.')).value || initialValues[input.formControlName];\r\n const isMultipleInput = input.element === ElementTypes.MultipleInput;\r\n\r\n if (value !== undefined && !isMultipleInput) {\r\n this.updateValue(input.id, value);\r\n continue\r\n }\r\n if (isMultipleInput) {\r\n const v = (value || []).map((item: any) => {\r\n return Object.entries(item).reduce((acc, [key, val]) => {\r\n const inp = allInputs.find((i) => i.formControlName === key);\r\n if (key === 'id') {\r\n acc[`${input.id}.id`] = val;\r\n\r\n } else {\r\n acc[`${inp?.id}`] = val;\r\n }\r\n\r\n return acc;\r\n }, {} as any);\r\n })\r\n v[`${input.id}.id`] = initialValues[input.id]\r\n console.error(`Setting multiple input value`, v)\r\n this.updateValue(input.id, v);\r\n continue\r\n }\r\n\r\n\r\n this.updateValue(input.id, '');\r\n\r\n }\r\n }\r\n reset() {\r\n const form = this._form\r\n const initialFormValues = this._initialFormValue\r\n this.clearFormState()\r\n this.initialize(form as FormInterface)\r\n this.initializeFormValues(initialFormValues)\r\n\r\n }\r\n revertBackHistory = () => {\r\n console.error(`Reverting back history`, this._changeHistory);\r\n // remove the last change\r\n const lastChange = this._changeHistory.pop();\r\n if (!lastChange) return;\r\n // get the latest record after the last change\r\n const latestRecord = this._changeHistory[this._changeHistory.length - 1];\r\n if (!latestRecord) return;\r\n // update the form value to the latest record\r\n Object.entries(latestRecord).forEach(([key, value]) => {\r\n this.updateValue(key, value);\r\n this.setTemporaryHint(key, 'Reverted back to previous value', HintType.HISTORY);\r\n })\r\n\r\n\r\n }\r\n /**\r\n * Form Submissions\r\n */\r\n submitForm = (passData: Record<string, any>) => {\r\n try {\r\n if (!this.form) return;\r\n const valueAsFormControlNames = this.getFormValueNames();\r\n const transformedForm = {\r\n ...this._initialFormValue,\r\n // Ensure that form values are not overwritten by the initial values\r\n ...unFlattenFormValue(valueAsFormControlNames)\r\n }\r\n\r\n const utils: InClassFormUtilsInterface = {\r\n fileUpload: this.NGX_T_FORMS_CONFIG.formBuilder.fileUpload.bind(this),\r\n httpGetDataFunction: this.httpGetDataFunction.bind(this),\r\n httpPostDataFunction: this.httpPostDataFunction.bind(this),\r\n setSubmissionStatusValue: this.setSubmissionStatusValue.bind(this),\r\n submitForm: function (): Observable<void> {\r\n throw new Error('Function not implemented.');\r\n },\r\n saveFormData: () => this.NGX_T_FORMS_CONFIG.formBuilder.saveFormData(this.form?.formId, this.getFormValueNames()),\r\n runPipeLine: this.NGX_T_FORMS_CONFIG.formBuilder.runMongoDbPipeLine.bind(this),\r\n getUserSignature: this.NGX_T_FORMS_CONFIG.formBuilder.getUserSignature.bind(this),\r\n saveUserSignature: this.NGX_T_FORMS_CONFIG.formBuilder.saveUserSignature.bind(this),\r\n }\r\n if (utils.httpGetDataFunction === undefined || utils.httpPostDataFunction === undefined) {\r\n\r\n this.NGX_T_FORMS_CONFIG.formBuilder.toastError(\"Http functions not defined\")\r\n return\r\n }\r\n formHttpSubmissions(this.form!, transformedForm, passData, utils).pipe(\r\n take(1),\r\n tap(() => {\r\n this.setSubmissionStatusValue(FormSubmissionStatus.SUBMITTING);\r\n this.submittingForm = false;\r\n this.NGX_T_FORMS_CONFIG.formBuilder.formSubmittedSuccessfully(this.form?.formId);\r\n }),\r\n catchError((error) => {\r\n this.submittingStatus = FormSubmissionStatus.FAILED;\r\n return of(null)\r\n })\r\n ).subscribe()\r\n } catch (error) {\r\n console.error(`Error submitting form:`, error);\r\n this.submittingStatus = FormSubmissionStatus.FAILED;\r\n this.submittingForm = false;\r\n\r\n }\r\n }\r\n /**\r\n * Toggles a multiple input element and its associated form controls.\r\n * When toggled on, adds controls to the form. When toggled off, removes them.\r\n * \r\n * @param inputId The ID of the multiple input to toggle\r\n * @returns boolean indicating success or failure\r\n */\r\n toggleMultipleInput = (inputId: string, open: boolean, rowInEditId?: string): boolean => toggleMultipleInput(this, this._mainForm, inputId, open, rowInEditId);\r\n saveMultipleInputForm = (inputId: string): boolean => saveMultipleInputForm(this, this._mainForm, inputId);\r\n multipleInputEditRow = (inputId: string, rowId: string) => multipleInputEditRow(this, this._mainForm, inputId, rowId);\r\n multipleInputDuplicateRow = (inputId: string, rowId: string) => multipleInputDuplicateRow(this, this._mainForm, inputId, rowId);\r\n refreshSection = (sectionId: string) => refreshSectionInput(this, sectionId);\r\n refreshActiveSection = () => {\r\n const activeSectionId = this.form?.slides.find(s => s.isActive)?.sectionId;\r\n if (activeSectionId) {\r\n this.refreshSection(activeSectionId).pipe(take(1)).subscribe();\r\n }\r\n }\r\n refreshInput = (inputId: string) => refreshInputWithDependencies(this, inputId);\r\n canRefreshFn = (inputId: string) => canRefresh(this, inputId);\r\n canRefreshSection = (sectionId: string) => canRefreshSectionFn(this, sectionId);\r\n}\r\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\nexport function testAgainstItem(test: ConfigurationValidTestInterface, item: any):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);\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\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 = getSectionElements(section.elements, inputInEdit, NGX_T_FORMS_CONFIG, utils, errors) as ElementEditorInnerSectionElementInterface[]\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: 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\nexport function getSectionElements(elements: ElementEditorInnerSectionElementInterface[],\r\n inputInEdit: (FormColumnInputs) | undefined, NGX_T_FORMS_CONFIG: NgxTFormsConfig,\r\n utils: InClassFormUtilsInterface, errors: ValidationError[] = []) {\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 const filteredElements = processedElements.filter(el => isElementApplicable(inputInEdit, defaultInput?.properties, el as any))\r\n return filteredElements\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[] = []) {\r\n const defaultInputs: DefaultInputConfigInterface = { ...DefaultInputConfig }\r\n if (!inputInEdit) return []\r\n const defaultInput = defaultInputs[inputInEdit?.element]\r\n return {\r\n ...element,\r\n computedErrors: computedErrors(element, errors),\r\n required: defaultInput?.requiredProperties?.includes(element.name as any),\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) {\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: any,\r\n inputProperties: (FormInputKeys | SpecialElementKeys | AllFormInputPrimaryKeys)[] | 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\r\n const isInputProperty = inputProperties?.includes(name as any);\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) {\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 if (!editingNewInput) {\r\n return validateFormColumnInputsWithRequired({\r\n data: inputInEdit as any,\r\n requiredKeys: (defaultInputs[inputInEdit.element]?.requiredProperties || []) as any[]\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: inputInEdit as any,\r\n requiredKeys: (defaultInputs[inputInEdit.element]?.requiredProperties || []) as any[]\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 { 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@NgModule({\r\n declarations: [\r\n\r\n ],\r\n imports: [],\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 { Component, inject } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { DialogConfig } from \"ngx-t-forms-types\";\r\nimport { MatModulesModule } from '../../shared/modules/mat-modules.module';\r\n\r\n@Component({\r\n selector: 'lib-dialog-template',\r\n standalone: true,\r\n imports: [MatModulesModule],\r\n templateUrl: './dialog-template.component.html',\r\n styleUrl: './dialog-template.component.css'\r\n})\r\nexport class DialogTemplateComponent {\r\nreadonly dialogRef = inject(MatDialogRef< DialogTemplateComponent>);\r\nreadonly data = inject< DialogConfig>(MAT_DIALOG_DATA);\r\nproceed(){\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>","export function daysAgoTransformDate(value:Date){\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: any = {\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]);\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\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}","\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 { catchError, EMPTY, map, Observable, of, switchMap, concat, concatMap, finalize,} from \"rxjs\";\r\nimport { FormsStoreService } from \"./forms-store.service\";\r\nimport { DatabaseFormInterface, FormInterface } 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 const newForm = initFormConfigToV2({ ...form } as any)\r\n\r\n return newForm\r\n } catch {\r\n return {\r\n slides: [],\r\n submissionHandle: undefined,\r\n formId: undefined,\r\n formTitle: ''\r\n } as any\r\n }\r\n}\r\n\r\nexport function formsStoreEffects(store: FormsStoreService) {\r\n const createForm$ = store.effect((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.effect((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 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.effect((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.effect((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 newForm = {\r\n form: {\r\n slides: [],\r\n submissionHandle: undefined,\r\n formId: undefined,\r\n formTitle: ''\r\n } as unknown as FormInterface\r\n } as DatabaseFormInterface\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 delete (newForm.form as any)._id\r\n store.actions.loadFormSuccess({ form: newForm});\r\n \r\n store.createFormPlaceHolderFormGroups(form.form)\r\n store.refreshExternalFormStates?.(convertOldFormToNewForm(newForm.form))\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.effect((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 store.actions.setError({ error: msg, type: FormStateErrors.UpdateForm });\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.effect((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 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.effect((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 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.effect((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 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.effect((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 { 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: any[]): 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 { catchError, distinctUntilChanged, map, of, switchMap } from \"rxjs\";\r\nimport { FormsStoreService } from \"./forms-store.service\";\r\n\r\nimport { DefaultInputConfig, DefaultInputConfigInterface, ElementTypes, validateForm } from 'ngx-t-forms-types';;\r\nimport { validateFormColumnInputsWithRequired } from 'ngx-t-forms-types';;\r\nimport { missingConfig } from \"../../../services/core/t-form-builder/functions/formCanSave\";\r\nimport { inputElementEditorConfigs } from \"../../../services/core/t-form-builder/functions/inputElementEditorConfigs\";\r\nimport { validateFormSlide } from \"ngx-t-forms-types\";\r\nimport { returnAnyFormInputFromForm } from \"../functions/findFormInput\";\r\nimport { allFormInputs } from \"../../../services/core/t-form-tower-controller/functions/allFormInputs\";\r\nimport { generateSystemInputs } from \"../functions/generateSystemInputs\";\r\nimport { _isEqual } from \"../../../shared/functions/isEqual\";\r\n\r\n\r\nexport function formsFormBuilderStoreSelectors(store: FormsStoreService) {\r\n const defaultInputs: DefaultInputConfigInterface = { ...DefaultInputConfig }\r\n try {\r\n\r\n const selectFormInEdit$ = store.selectors.selectFormInEdit$.pipe(map(form => form?.form))\r\n const selectFormSlides$ = selectFormInEdit$.pipe(map(form => [...form?.slides || []]))\r\n const selectFormSlideSections$ = selectFormSlides$.pipe(map(slides => slides.map(slide => ({\r\n ...slide,\r\n inputConfigErrors: validateFormSlide(slide)\r\n }))))\r\n const missingConfig$ = selectFormInEdit$.pipe(map(form => missingConfig(form)))\r\n const canSaveForm$ = store.selectors.selectFormBuilderIsBusy$.pipe(switchMap(isBusy => isBusy ? of(false) : selectFormInEdit$.pipe(\r\n map(form => form !== undefined ? validateForm(form).length === 0 : false)\r\n )))\r\n const hasMissingConfigs$ = canSaveForm$.pipe(map((canSave) => !canSave))\r\n const isNewForm$ = selectFormInEdit$.pipe(map((form) => !form?.formId))\r\n const formErrors$ = selectFormInEdit$.pipe(map(form => form === null ? [{\r\n message: 'Form is empty',\r\n key: 'form'\r\n }] : validateForm(form!)))\r\n const formValidationErrorsMessages$ = formErrors$.pipe(map(formErrors => {\r\n const errors = formErrors || [];\r\n const errorCounts = errors.reduce((acc: { [x: string]: any; }, error: { message: string | number; }) => {\r\n acc[error.message] = (acc[error.message] || 0) + 1;\r\n return acc;\r\n }, {} as Record<string, number>);\r\n return Object.entries(errorCounts).map(([message, count]) =>\r\n count as any > 1 ? `${message} × ( ${count} )` : message\r\n );\r\n }))\r\n const inputInEdit$ = store.selectors.selectInputInEditId$.pipe(\r\n switchMap((inputInEditId) => {\r\n return selectFormInEdit$.pipe(\r\n map(form => form && inputInEditId !== null ? returnAnyFormInputFromForm(form, inputInEditId) : undefined),\r\n distinctUntilChanged((prev, curr) => _isEqual(prev, curr))\r\n )\r\n\r\n }),\r\n\r\n );\r\n const defaultInputInEdit$ = inputInEdit$.pipe(map((inputInEdit) => (!inputInEdit) ? null : (defaultInputs as any)[(inputInEdit as any).element]))\r\n const inputInEditValidationErrors$ = selectFormInEdit$.pipe(switchMap(form => {\r\n return inputInEdit$.pipe(map(inputInEdit => {\r\n\r\n const 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\r\n const editingNewInput = !inputInEdit?.id\r\n if (!editingNewInput) {\r\n return validateFormColumnInputsWithRequired({\r\n data: inputInEdit as any,\r\n requiredKeys: (defaultInputs[inputInEdit.element]?.requiredProperties || []) as any[]\r\n })\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: inputInEdit as any,\r\n requiredKeys: (defaultInputs[inputInEdit.element]?.requiredProperties || []) as any[]\r\n })]\r\n }))\r\n\r\n })\r\n )\r\n const selectFormTitle$ = selectFormInEdit$.pipe(map((form) => form?.formTitle))\r\n\r\n\r\n const getAllFormInputs$ = selectFormInEdit$.pipe(\r\n switchMap(form => {\r\n // Antifragile: Handle null form immediately\r\n if (!form) return of([]);\r\n\r\n const globalDates$ = store?.NGX_T_FORMS_CONFIG.formBuilder.getFinacialCycles() || of(null);\r\n\r\n return globalDates$.pipe(\r\n map(globalVariables => {\r\n const existingInputs = (allFormInputs(form) ?? []).filter(input => input.element !== ElementTypes.SectionTitle)\r\n\r\n // Safety: Centralize the fallback ID\r\n const firstSectionId = form?.slides?.[0]?.columns?.[0]?.sectionId\r\n ?? \"f5d2b4ad-f6e1-49d2-b7eb-00acab05eb76\";\r\n\r\n const systemDefaultInputs = generateSystemInputs(globalVariables, firstSectionId);\r\n return [...existingInputs, ...systemDefaultInputs];\r\n }),\r\n // Error Catching: Ensure the stream doesn't die if mapping fails\r\n catchError(() => {\r\n return of(allFormInputs(form) ?? []);\r\n })\r\n );\r\n }),\r\n // Performance: Only emit if the resulting input array actually changes\r\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\r\n catchError(() => {\r\n return of([]);\r\n })\r\n );\r\n\r\n\r\n\r\n\r\n const inputElementEditorConfigs$ = inputInEdit$.pipe(switchMap((inputInEdit) => selectFormInEdit$.pipe(\r\n map(form => inputElementEditorConfigs(form, inputInEdit, store.NGX_T_FORMS_CONFIG, store.utils))\r\n )))\r\n\r\n\r\n return {\r\n\r\n\r\n selectFormSlides$,\r\n missingConfig$,\r\n canSaveForm$,\r\n isNewForm$,\r\n hasMissingConfigs$,\r\n formErrors$,\r\n formValidationErrorsMessages$,\r\n\r\n inputInEdit$,\r\n defaultInputInEdit$,\r\n inputInEditValidationErrors$,\r\n selectFormTitle$,\r\n getAllFormInputs$,\r\n\r\n inputElementEditorConfigs$,\r\n selectFormSlideSections$\r\n\r\n }\r\n } catch (error) {\r\n throw error\r\n }\r\n\r\n}","import { CdkDragDrop, } from \"@angular/cdk/drag-drop\";\r\nimport { FormInterface } from \"ngx-t-forms-types\";\r\n\r\n\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 } from '@angular/cdk/drag-drop';\r\nimport { FormInterface } from 'ngx-t-forms-types';\r\n\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 const prevItem = columns[event.previousIndex];\r\n const currItem = columns[event.currentIndex];\r\n\r\n if (prevItem && currItem) {\r\n columns[event.previousIndex] = currItem;\r\n columns[event.currentIndex] = prevItem;\r\n }\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\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 const prevItem = columns[event.previousIndex];\r\n const currItem = columns[event.currentIndex];\r\n if (prevItem && currItem) {\r\n columns[event.previousIndex] = currItem;\r\n columns[event.currentIndex] = prevItem;\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 === 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","\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, ElementTypes, FormInterface } from \"ngx-t-forms-types\";\r\nimport { returnAnyFormInputFromForm } from \"./findFormInput\";\r\nconst defaultInputConfig = { ...DefaultInputConfig }\r\nexport const getElementTemplate = (element: ElementTypes): any => {\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 elementTemplate = JSON.parse(JSON.stringify(defaultInputConfig[element].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: any): 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: any, 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 = 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 newForm= elementConfigurationChangedFn(form,inputId,element,event.target.value)\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 any,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 { FormColumnInputs, FormInterface } 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 const newInput = {\r\n id: uuidv4(),\r\n sectionId,\r\n \r\n } as FormColumnInputs;\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 as any]\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 { map, of, switchMap, take, tap } from \"rxjs\";\r\nimport { FormsStoreService } from \"./forms-store.service\";\r\nimport { CdkDragDrop } from \"@angular/cdk/drag-drop\";\r\nimport { DatabaseFormInterface, FormColumnInputs, } from 'ngx-t-forms-types';;\r\nimport { APIDataFetchingConfigurationInterface, ElementTypes, IMultipleInputCal } from 'ngx-t-forms-types';;\r\n\r\nimport { FormInterface } from 'ngx-t-forms-types';;\r\n\r\nimport { ElementEditorInnerSectionElementInterface } from 'ngx-t-forms-types';;\r\nimport { assignDeepPropertyToObject } from \"../../../shared\";\r\n\r\nimport { sectionDrop } from \"../../../services/core/t-form-builder/functions/sectionDrop\";\r\nimport { moveFormInput, moveMultipleInputInput } from \"../../../services/core/t-form-builder/functions/moveFormInput\";\r\nimport { addNewSection } from \"../../../services/core/t-form-builder/functions/addNewSection\";\r\nimport { stepTitleChangeStepFn } from \"../../../services/core/t-form-builder/functions/stepTitleChangeStep\";\r\nimport { removeItem } from \"../../../services/core/t-form-builder/functions/removeItem\";\r\nimport { multipleInputToggleLabelFn } from \"../../../services/core/t-form-builder/functions/multipleInputToggleLabel\";\r\nimport { addMultipleInputFunction } from \"../../../services/core/t-form-builder/functions/addMultipleInputFunction\";\r\nimport { deleteActiveSection, deleteActiveSectionInputs } from \"../../../services/core/t-form-builder/functions/deleteSection\";\r\nimport { moveInputToSectionFn } from \"../../../services/core/t-form-builder/functions/moveInputToDiffSection\";\r\nimport { clearInputInEditFn, cloneCopyFormInputFn } from \"../functions/cloneCopyFormInput\";\r\nimport { addFormInputToForm, addMultipleFormInputFn } from \"../../../services/core/t-form-builder/functions/addFormInputToForm\";\r\nimport { selectInputTemplateFn } from \"../functions/selectInputTemplate\";\r\nimport { elementConfigurationChangedFn } from \"../functions/elementConfigurationChanged\";\r\nimport { elementBlurFn } from \"../functions/elementBlur\";\r\nimport { FormControl } from '@angular/forms';\r\nimport { HintType } from \"../../../shared/functions/textIconsForUserHints\";\r\nimport { addScoaExtensionInput } from \"../../../services/core/t-form-builder/functions/addScoaExtensionInput\";\r\nimport { deepMerge } from \"../../../services/core/t-form-tower-controller/functions/updateFormInputConfig\";\r\n\r\nexport function formBuilderStoreActions(store: FormsStoreService) {\r\n\r\n\r\n const form$ = store.selectors.selectFormInEdit$\r\n const handelSaveForm = () => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return;\r\n const _id = form?._id\r\n if (_id) {\r\n store.effects.updateForm$(of({ form: { ...form.form, formId: _id }, versionNumber: form.__v || 0 }))\r\n store.showMessage('Form updated successfully', HintType.SUCCESS)\r\n } else {\r\n store.effects.createForm$(of(form.form))\r\n store.showMessage('Form saved successfully', HintType.SUCCESS)\r\n }\r\n })\r\n ).subscribe()\r\n }\r\n const setFormTitle = (title: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return;\r\n const newForm = {\r\n ...form.form,\r\n formTitle: title\r\n\r\n } as FormInterface\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n\r\n\r\n })\r\n ).subscribe()\r\n }\r\n const handleSectionDragDrop = (event: CdkDragDrop<any, any, any>) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return;\r\n const newForm = sectionDrop(event, form.form)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n\r\n })\r\n ).subscribe()\r\n }\r\n const handleInputDragDrop = (event: CdkDragDrop<any, any, any>, sectionId: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return;\r\n const newForm = moveFormInput(event, sectionId, form.form)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n\r\n })\r\n ).subscribe()\r\n }\r\n const handleAddSection = () => {\r\n form$.pipe(\r\n take(1),\r\n tap(async (form) => {\r\n if (!form) return;\r\n const newForm = addNewSection(form.form)\r\n if (!newForm) return\r\n const newSection = newForm.slides[newForm.slides.length - 1]?.sectionId\r\n store.sectionPlaceholder[newSection!] = new FormControl()\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n\r\n store.showMessage('Section added, proceed to add section inputs', HintType.DOCUMENT)\r\n\r\n })\r\n ).subscribe()\r\n }\r\n const stepTitleChangeStep = (sectionId: string, title: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return;\r\n const newForm = stepTitleChangeStepFn(sectionId, title, form.form)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n })\r\n ).subscribe()\r\n }\r\n\r\n const formDeleteInput = (item: FormColumnInputs) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = removeItem(item, form.form)\r\n\r\n if (!newForm) return\r\n\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n store.showMessage('Input deleted. Add new inputs.', HintType.CRITICAL)\r\n\r\n })).subscribe()\r\n }\r\n const multipleInputToggleLabel = (item: FormColumnInputs) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = multipleInputToggleLabelFn(item, form.form)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n })).subscribe()\r\n }\r\n const editInput = (item: FormColumnInputs) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n\r\n if (!form) return\r\n\r\n\r\n store.actions.setInputInEditId(of({\r\n // Because the originalId is the id of the input before it was cloned \r\n inputInEdit: item.originalId || item.id\r\n }))\r\n\r\n store.showMessage('Configure input settings in the edit panel', HintType.SUCCESS)\r\n\r\n })).subscribe()\r\n }\r\n const addMultipleInputValueCalculationFunction = (item: IMultipleInputCal, multipleInputId: string | undefined) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = addMultipleInputFunction(item, multipleInputId, form.form)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n\r\n })).subscribe()\r\n }\r\n const formDeleteSection = (sectionId: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = deleteActiveSection(form.form, sectionId)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n delete store.sectionPlaceholder[sectionId]\r\n store.refreshExternalFormStates?.(newForm)\r\n store.showMessage('Section deleted', HintType.CRITICAL)\r\n\r\n })).subscribe()\r\n }\r\n const formDeleteSectionInputs = (sectionId: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = deleteActiveSectionInputs(form.form, sectionId)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n store.showMessage('Section inputs deleted', HintType.CRITICAL)\r\n\r\n })\r\n ).subscribe()\r\n }\r\n\r\n\r\n const moveInputToSection = (inputId: string, targetSectionId: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = moveInputToSectionFn(form.form, inputId, targetSectionId)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n })).subscribe()\r\n }\r\n const reorderMultipleInputItems = (event: CdkDragDrop<FormColumnInputs[], any, any>, multipleInputId: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = moveMultipleInputInput(multipleInputId, event, form.form)\r\n if (!newForm) return\r\n\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n })).subscribe()\r\n }\r\n const cloneCopyFormInput = (inputId: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = cloneCopyFormInputFn(form.form, inputId)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n store.showMessage('Input cloned, proceed to configure the new input', HintType.SUCCESS)\r\n\r\n })).subscribe()\r\n }\r\n\r\n const saveInput = (sectionId: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = addFormInputToForm(form.form, sectionId)\r\n if (!newForm) return\r\n\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n store.showMessage('Input added! Complete the configuration below.', HintType.CRITICAL)\r\n\r\n })).subscribe()\r\n }\r\n const addMultipleFormInput = (sectionId: string, multipleInputInEditId: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = addMultipleFormInputFn(form.form, sectionId, multipleInputInEditId)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n })).subscribe(\r\n )\r\n\r\n }\r\n const addInputToScoaSelection = (sectionId: string, scoaInputId: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = addScoaExtensionInput(form.form, sectionId, scoaInputId)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n })).subscribe()\r\n }\r\n const applyFormTemplate = (form: FormInterface) => {\r\n form$.pipe(\r\n take(1),\r\n tap(() => {\r\n\r\n if (!form) return;\r\n const newForm = {\r\n systemDefault: false,\r\n defaultDepartment: \"\",\r\n form: {\r\n\r\n formId: undefined,\r\n formTitle: `${form?.formTitle} - Copy`,\r\n slides: [...[], ...form.slides],\r\n\r\n },\r\n } as DatabaseFormInterface\r\n\r\n\r\n\r\n store.actions.loadFormSuccess(of({\r\n form: newForm\r\n }))\r\n // Refresh external form states \r\n store.refreshExternalFormStates?.(form)\r\n return\r\n })).subscribe()\r\n }\r\n const selectInputTemplate = (inputId: string, element: ElementTypes) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return;\r\n const newForm = selectInputTemplateFn(form.form, inputId, element)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n })).subscribe()\r\n }\r\n const formInputChange = (ele: ElementEditorInnerSectionElementInterface, value: any) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n //REVIEW - This method changes inputs by changing the form object directly. This wont work for nested inputs\r\n\r\n if (!form) return;\r\n if (!form) return\r\n const applyTo: FormInterface = { ...form?.form }\r\n if (ele.clearOnChange) {\r\n ele.clearOnChange.forEach((clear: string[]) => {\r\n assignDeepPropertyToObject(\r\n applyTo,\r\n clear,\r\n undefined\r\n );\r\n })\r\n }\r\n if (ele.deepBind) {\r\n assignDeepPropertyToObject(\r\n applyTo,\r\n ele.deepBind,\r\n value\r\n );\r\n }\r\n const newForm = new Object({ ...applyTo }) as any\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n })).subscribe()\r\n }\r\n const saveSubmitApi = (dataPlaceholder: undefined | {\r\n data: APIDataFetchingConfigurationInterface\r\n }, keyInEdit: 'submissionAPI' | 'canSubmitAPI' | undefined) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const formClone: FormInterface = {\r\n ...form?.form,\r\n submissionHandle: {\r\n ...form?.form?.submissionHandle\r\n }\r\n } as any\r\n\r\n const old = (formClone?.submissionHandle?.[keyInEdit || 'submissionAPI'] || []) as APIDataFetchingConfigurationInterface[]\r\n // Check if API with same _id already exists\r\n const isDuplicate = old.some(api =>\r\n api._id === dataPlaceholder?.data._id\r\n\r\n );\r\n if (isDuplicate) {\r\n // Update existing API instead of adding new one\r\n const newApis = old.map(api =>\r\n api._id === dataPlaceholder?.data._id\r\n ? dataPlaceholder?.data\r\n : api\r\n\r\n );\r\n\r\n assignDeepPropertyToObject(\r\n formClone,\r\n ['submissionHandle', keyInEdit || 'submissionAPI'],\r\n newApis\r\n );\r\n } else {\r\n // Add new API\r\n const newApis = [...old, dataPlaceholder?.data];\r\n assignDeepPropertyToObject(\r\n formClone,\r\n ['submissionHandle', keyInEdit || 'submissionAPI'],\r\n newApis\r\n );\r\n }\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: formClone }))\r\n store.refreshExternalFormStates?.(formClone)\r\n store.showMessage(\"API configuration saved. Test your integration when ready\", HintType.SUCCESS)\r\n\r\n })).subscribe()\r\n }\r\n const removeSubmissionApi = (api: APIDataFetchingConfigurationInterface, keyInEdit: 'submissionAPI' | 'canSubmitAPI' | undefined) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const formClone = form?.form\r\n if (!form) return;\r\n const key = keyInEdit || 'submissionAPI'\r\n const old = (formClone?.submissionHandle[key] || []) as any[]\r\n const newApis = old.filter((a) => a._id !== api._id)\r\n assignDeepPropertyToObject(\r\n formClone,\r\n ['submissionHandle', key],\r\n newApis\r\n );\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: formClone }))\r\n store.refreshExternalFormStates?.(formClone)\r\n store.showMessage(\"API configuration removed. Update your integrations accordingly.\", HintType.CRITICAL)\r\n })).subscribe()\r\n\r\n }\r\n const elementConfigurationChanged = (\r\n inputId: string,\r\n value: any,\r\n ele: ElementEditorInnerSectionElementInterface\r\n ) => {\r\n form$.pipe(\r\n take(1),\r\n switchMap((form) => {\r\n const isWorkflowPickerConfigWkIdChange = ele.deepBind.join('.') === 'workflowPickerConfig.workflowId'\r\n const getWorkflowDocuments = store.NGX_T_FORMS_CONFIG.formBuilder.getWorkflowDocuments\r\n if (isWorkflowPickerConfigWkIdChange && typeof getWorkflowDocuments === 'function') {\r\n const workflowId = value as string\r\n return getWorkflowDocuments(\r\n workflowId,\r\n 1,\r\n 10,\r\n { 'createdAt': -1 },\r\n undefined,\r\n {}\r\n\r\n ).pipe(\r\n map((res) => ({ form, documents: res, isWorkflowPickerConfigWkIdChange }))\r\n )\r\n }\r\n return of({ form, documents: undefined, isWorkflowPickerConfigWkIdChange: false })\r\n }),\r\n tap((payload) => {\r\n const { form, documents, isWorkflowPickerConfigWkIdChange } = payload\r\n if (!form) return\r\n console.error('elementConfigurationChanged', inputId, value, ele)\r\n let newForm\r\n if (isWorkflowPickerConfigWkIdChange) {\r\n const sampleDocument = documents?.formValues.reduce((acc, curr) => {\r\n\r\n return {\r\n ...deepMerge(curr, curr)\r\n }\r\n }, {} as Record<string, unknown>)\r\n newForm = elementConfigurationChangedFn(form.form, inputId, {\r\n ...ele,\r\n deepBind: ['workflowPickerConfig']\r\n }, {\r\n sampleDocument,\r\n workflowId: value as string\r\n\r\n })\r\n\r\n } else {\r\n newForm = elementConfigurationChangedFn(form.form, inputId, ele, value)\r\n }\r\n\r\n\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n })).subscribe()\r\n }\r\n const elementBlur = (inputId: string, event: any, element: ElementEditorInnerSectionElementInterface) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const { blurHandle } = element\r\n if (!blurHandle) {\r\n return\r\n }\r\n\r\n const newForm = elementBlurFn(form.form, inputId, event, element)\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n\r\n })).subscribe()\r\n }\r\n const clearInputInEdit = (inputId: string) => {\r\n form$.pipe(\r\n take(1),\r\n tap((form) => {\r\n if (!form) return\r\n const newForm = clearInputInEditFn(form.form, inputId)\r\n if (!newForm) return\r\n store.actions.handleEditorUpdateFormInEdit(of({ form: newForm }))\r\n store.refreshExternalFormStates?.(newForm)\r\n store.showMessage(\"Input configuration cleared. Start fresh with new settings\", HintType.CRITICAL)\r\n\r\n })).subscribe()\r\n }\r\n return {\r\n handelSaveForm,\r\n setFormTitle,\r\n handleSectionDragDrop,\r\n handleInputDragDrop,\r\n handleAddSection,\r\n stepTitleChangeStep,\r\n formDeleteInput,\r\n multipleInputToggleLabel,\r\n editInput,\r\n addMultipleInputValueCalculationFunction,\r\n formDeleteSection,\r\n formDeleteSectionInputs,\r\n moveInputToSection,\r\n reorderMultipleInputItems,\r\n cloneCopyFormInput,\r\n saveInput,\r\n applyFormTemplate,\r\n selectInputTemplate,\r\n formInputChange,\r\n saveSubmitApi,\r\n removeSubmissionApi,\r\n elementConfigurationChanged,\r\n elementBlur,\r\n addMultipleFormInput,\r\n clearInputInEdit,\r\n addInputToScoaSelection,\r\n\r\n }\r\n\r\n\r\n}","import { inject, Injectable } from '@angular/core';\r\nimport { ComponentStore } from '@ngrx/component-store';\r\nimport { FormListSection, FormsStoreSelectorsInterface, IFormsInitStateInterface, InClassFormUtilsInterface, IStoreFunctions } from \"ngx-t-forms-types\";;\r\nimport { formsStoreSelectors } from './Forms-selectors';\r\nimport { formsStoreActions } from './Forms-Actions';\r\nimport { Observable } from 'rxjs';\r\nimport { FormInterface, NgxTFormsConfig } from \"ngx-t-forms-types\";;\r\n\r\nimport { formsStoreEffects } from './Forms-Effects';\r\nimport { HttpClient } from '@angular/common/http';\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\n providedIn: 'root'\r\n})\r\nexport class FormsStoreService extends ComponentStore<IFormsInitStateInterface> {\r\n\r\n httpClient = inject(HttpClient)\r\n snackBar = inject(MatSnackBar)\r\n sectionPlaceholder: Record<string, AbstractControl> = {}\r\n public readonly NGX_T_FORMS_CONFIG!: NgxTFormsConfig\r\n constructor() {\r\n super(initialUIState);\r\n this.NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN)\r\n //if environment is development, setup dev tools\r\n this.setupDevTools();\r\n }\r\n utils: InClassFormUtilsInterface = {\r\n httpGetDataFunction: (url: string, options: any) => this.NGX_T_FORMS_CONFIG.formBuilder.httpGetDataFunction(url, options),\r\n httpPostDataFunction: (url: string, data: any, options: any) => this.NGX_T_FORMS_CONFIG.formBuilder.httpPostDataFunction(url, data, options),\r\n submitForm: () => new Observable<void>(subscriber => { subscriber.complete(); }),\r\n setSubmissionStatusValue: (status: any) => { },\r\n saveFormData: function (): Observable<void> {\r\n throw new Error('Function not implemented.');\r\n },\r\n runPipeLine: function (pipeline: any, workflowId: string): Observable<{ results: any; 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) {\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 private setupDevTools() {\r\n this.state$.subscribe(() => {});\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 readonly selectors: FormsStoreSelectorsInterface = formsStoreSelectors(this)\r\n readonly formBuilderSelectors = formsFormBuilderStoreSelectors(this)\r\n readonly actions = formsStoreActions(this)\r\n readonly actionsFormBuilder = formBuilderStoreActions(this)\r\n readonly effects = formsStoreEffects(this)\r\n refreshExternalFormStates?: (form: FormInterface) => void\r\n registerFormChangeFn(fn: (form: FormInterface) => void) {\r\n\r\n this.refreshExternalFormStates = fn\r\n }\r\n createFormPlaceHolderFormGroups(form: FormInterface) {\r\n form.slides.forEach(slide => {\r\n this.sectionPlaceholder[slide.sectionId] = new FormControl()\r\n })\r\n }\r\n}\r\n","import { Component, inject, Input, OnDestroy, OnInit } from '@angular/core';\r\n\r\nimport { map,of,Subscription,take,} from 'rxjs';\r\nimport { CommonModule, } from '@angular/common';\r\nimport { FormsStoreService } from '../forms/store/forms-store.service';\r\nimport { MatModulesModule } from '../../shared/modules/mat-modules.module';\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 { ActivatedRoute, ActivatedRouteSnapshot, RouterModule } from '@angular/router';\r\nimport _ from 'lodash';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../injection-tokens';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\n\r\n@Component({\r\n selector: 'app-form-builder',\r\n templateUrl: './form-builder.component.html',\r\n styleUrl: './form-builder.component.scss',\r\n standalone: true,\r\n imports: [CommonModule,\r\n MatModulesModule,\r\n FormsBuilderMenuComponent,\r\n InputEditorComponent,\r\n FormSectionStepperComponent,\r\n FormsModule,\r\n MissingFormConfigsComponent, \r\n RouterModule],\r\n providers: [\r\n FormsStoreService\r\n ]\r\n})\r\n\r\n\r\nexport class FormBuilderComponent implements OnDestroy, OnInit {\r\n subscription$ = new Subscription()\r\n private store = inject(FormsStoreService)\r\n private route = inject(ActivatedRoute)\r\n \r\n\r\n selectLoadingForm = toSignal(this.store.selectors.selectLoadingForm$,{\r\n initialValue:false\r\n })\r\n selectFormBuilderIsBusy = toSignal(this.store.selectors.selectFormBuilderIsBusy$,{\r\n initialValue:false\r\n })\r\n selectFormUpdated = toSignal(\r\n this.store.selectors.selectFormUpdated$,\r\n {\r\n initialValue: null\r\n }\r\n )\r\n canSaveForm = toSignal(\r\n this.store.formBuilderSelectors.canSaveForm$,\r\n {\r\n initialValue: false\r\n }\r\n )\r\n isNewForm = toSignal(\r\n this.store.formBuilderSelectors.isNewForm$,\r\n {\r\n initialValue: false\r\n }\r\n )\r\n @Input() set formId(value: string) {\r\n this.store.effects.loadForm$(of(value))\r\n }\r\n selectHasFormId = toSignal(this.store.selectors.selectFormId$.pipe(map((formId) => !!formId)),{\r\n initialValue: false\r\n })\r\n hasMissingConfigs = toSignal(this.store.formBuilderSelectors.hasMissingConfigs$,{ \r\n initialValue: false\r\n })\r\n \r\n elementEditorOpen = toSignal( this.store.formBuilderSelectors.inputInEdit$.pipe(\r\n map(inputInEdit => !!inputInEdit)\r\n ),{\r\n initialValue: null\r\n })\r\n\r\n constructor(\r\n\r\n ) {\r\n\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 ngOnInit(): void {\r\n this.subscription$.add(\r\n this.route.data.subscribe(data => {\r\n const routeState: ActivatedRouteSnapshot = data['route'];\r\n const params = routeState.params\r\n this.store.actions.handleRouterStateChange(of(data['route']))\r\n this.store.effects.loadForm$(of(params['formId']))\r\n // Use formId here\r\n })\r\n )\r\n\r\n }\r\n ngOnDestroy(): void {\r\n this.subscription$.unsubscribe()\r\n\r\n }\r\n saveForm = () => this.store.actionsFormBuilder.handelSaveForm()\r\n\r\n\r\n _title = ''\r\n set titleValue(value: string) {\r\n this.store.actionsFormBuilder.setFormTitle(value)\r\n this._title = value\r\n }\r\n initiatedTitle = false\r\n get titleValue(): string | undefined {\r\n if (this._title === '' && !this.initiatedTitle) {\r\n this.store.formBuilderSelectors.selectFormTitle$.pipe(\r\n take(1),\r\n ).subscribe((title) => {\r\n this._title = title || ''\r\n this.initiatedTitle = true\r\n })\r\n\r\n }\r\n return this._title\r\n }\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\" 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 <app-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 <!-- Save/Update button with optimized reactive state -->\r\n <button mat-raised-button color=\"accent\" class=\"save-button\" [disabled]=\"!(canSaveForm())\" (click)=\"saveForm()\">\r\n\r\n <mat-icon>\r\n {{(isNewForm()) ? 'save' : 'update'}}\r\n </mat-icon>\r\n\r\n @if (selectFormBuilderIsBusy()) {\r\n {{(isNewForm()) ? '..Saving new form' : '..Updating Form'}}\r\n } @else {\r\n {{(isNewForm()) ? 'Save' : 'Update'}}\r\n }\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 <app-form-section-stepper />\r\n }\r\n <br>\r\n @if ((hasMissingConfigs()) && !(selectLoadingForm())) {\r\n <app-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 <app-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}","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 transform(value: any, args?: any): any {\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: any = {\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]);\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 transform(value: any, args?: any): any {\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 */\r\nexport function fuzzySearch(query: string, text: string): boolean {\r\n const regex = createFuzzyRegExp(query);\r\n return regex.test(text);\r\n}\r\n","import { Component, inject, Inject, OnDestroy, OnInit } from '@angular/core';\r\n\r\n\r\n\r\nimport { CommonModule, DOCUMENT } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FormsStoreService } from './store/forms-store.service';\r\nimport { getAvatar } from '../../shared/functions/getAvatar';\r\nimport { MatModulesModule } from '../../shared/modules/mat-modules.module';\r\nimport { ActivatedRoute, ActivatedRouteSnapshot, Router, RouterModule } from '@angular/router';\r\nimport { FormListSection, LocalFormStateSelectorInterface } from \"ngx-t-forms-types\";\r\nimport { BehaviorSubject, combineLatest, map, Observable, of, Subscription, } from 'rxjs';\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@Component({\r\n selector: 'app-forms',\r\n templateUrl: './forms.component.html',\r\n styleUrl: './forms.component.scss',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, MatModulesModule, DaysAgoPipe, RouterModule],\r\n providers: [\r\n FormsStoreService,\r\n\r\n ]\r\n})\r\nexport class FormsComponent implements OnInit, OnDestroy {\r\n subscription$ = new Subscription()\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, any[]>))\r\n );\r\n\r\n private 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$: Observable<any> = 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 constructor(private route: ActivatedRoute, private store: FormsStoreService, @Inject(DOCUMENT) private document: Document) {\r\n\r\n\r\n }\r\n ngOnDestroy(): void {\r\n this.subscription$.unsubscribe()\r\n }\r\n get formListSections() {\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.subscription$.add(\r\n this.route.data.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 })\r\n )\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 ]\r\n activeForm: string | null = null;\r\n getCols() {\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) {\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 const userConfirmed = 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\r\n async unarchive(form: LocalFormStateSelectorInterface, event: Event): Promise<void> {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const userConfirmed = 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 }\r\n async delete(form: LocalFormStateSelectorInterface, event: Event): Promise<void> {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const userConfirmed = 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() {\r\n this.store.effects.loadForms$()\r\n }\r\n router = inject(Router)\r\n activatedRoute = inject(ActivatedRoute)\r\n setSection(value: FormListSection) {\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) {\r\n this.NGX_T_FORMS_CONFIG.formBuilder.editForm(form._id)\r\n }\r\n addNewForm() {\r\n this.NGX_T_FORMS_CONFIG.formBuilder.addNewForm()\r\n }\r\n\r\n clearSearch() {\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 { 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 transform(value: any[], searchKey?: string | null): any {\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).some(value => {\r\n if(typeof value === 'object' && value !== null) {\r\n return Object.values(value).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';\r\nimport { validateExpressionSyntax } from '../../../../../shared/modules/stringJsonValidator/getObjectValidations';\r\n\r\n// This is a placeholder for your actual validation logic.\r\n// It can either:\r\n// 1. Return `true` or `false`.\r\n// 2. Throw an Error with a descriptive message.\r\n\r\n/**\r\n * Creates a validator that checks for valid expression syntax.\r\n * @returns {ValidatorFn} A validator function.\r\n */\r\nexport function expressionSyntaxValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n // If the control is empty, don't perform validation.\r\n // Use Validators.required alongside this validator if the field is mandatory.\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n const expression = control.value as string;\r\n\r\n try {\r\n const isValid = validateExpressionSyntax(expression);\r\n if(isValid === null ) return null;\r\n // If the validation function returns false, return an error object.\r\n \r\n;\r\n // If no error is thrown and the result is not false, the expression is valid.\r\n return { invalidExpression :isValid || 'The expression syntax is invalid.' };\r\n\r\n } catch (error) {\r\n // Log the actual error for debugging purposes.\r\n\r\n\r\n // Capture the error message to display it in the UI.\r\n const invalidExpression = error instanceof Error ? error.message : 'An unexpected validation error occurred.';\r\n \r\n return { invalidExpression };\r\n }\r\n };\r\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 { 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: any, parentPath: string[] = [],): TreeNode[] {\r\n\r\n function handleArray(value: any[], 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 any,\r\n keyIsArrayIndex: true,\r\n path: [...currentPath, index.toString()],\r\n children: convertToTree(item, [...currentPath, index.toString()])\r\n }));\r\n } catch (error) {\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).map(([key, value]) => {\r\n const currentPath = [...parentPath, key];\r\n const node: TreeNode = { key, value,name:key, path: currentPath, functions: [] as any };\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 // Emit the changes\r\n\r\n \r\n \r\n }\r\n return \r\n }\r\n resetNode() {\r\n this.pathInEdit!.functions = (this.pathInEdit?.functions || []).map(f => ({\r\n ...f,\r\n expression: '',\r\n function: '' as any,\r\n inEdit: false\r\n }))\r\n this.activePath = this.activePath.map((pathPart, index) => {\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 this.pathInEdit!.functions = (this.pathInEdit?.functions || []).filter(f => f.id !== id)\r\n this.activePath = this.activePath.map((pathPart, index) => {\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 this.pathInEdit!.functions = (this.pathInEdit?.functions || []).map(f => ({ ...f, inEdit: false }))\r\n this.activePath = this.activePath.map((pathPart, index) => {\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\r\n const isActive = node.path.join('.') === this.activePath.join('.')\r\n if (isActive) {\r\n return true\r\n }\r\n\r\n const activePath = this.activePath.map(a => a.key)\r\n const isActiveNodeAncestor = node.path.every((pathPart, index) => pathPart === activePath[index])\r\n return isActiveNodeAncestor\r\n\r\n\r\n\r\n\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: any\r\n constructor() {\r\n\r\n }\r\n\r\n computeTreeData(dynamicObject: any) {\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 &&!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: any = {\r\n expression: '',\r\n id: uuidv4(),\r\n inEdit: true,\r\n 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 const functions = this.pathInEdit!.functions.find(f => f.inEdit) || {} as any\r\n functions.function =value\r\n this.pathInEdit!.functions.map(f => {\r\n if (f.inEdit) {\r\n return functions\r\n }\r\n return f\r\n })\r\n }\r\n}","export function searchAndOrderArray(\r\n arr: any[],\r\n searchTerm: string,\r\n filterBy: string\r\n): any[] {\r\n // Filter the array based on the search term\r\n const filteredArr = arr.filter((obj) =>\r\n searchTerm\r\n ? obj[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 a[filterBy].localeCompare(b[filterBy])\r\n );\r\n\r\n return orderedArr;\r\n}\r\n","import { Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\r\n\r\n\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n\r\n\r\nimport { TreeComponent } from '../../functions/convertDataToTree';\r\nimport { FlatNode, TreeNode } from 'ngx-t-forms-types';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { searchAndOrderArray } from '../../../../../../shared/functions/searchArray';\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';;\r\nimport { MatSelectChange } from '@angular/material/select';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\n\r\n\r\n@Component({\r\n selector: 'app-data-tree',\r\n templateUrl: './data-tree.component.html',\r\n styleUrls: ['./data-tree.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule, FormsModule]\r\n})\r\nexport class DataTreeComponent implements OnInit {\r\n treeClass!: TreeComponent\r\n\r\n @Input() set data(value: any) {\r\n if (_isEqual(this._data, value)) return;\r\n this._data = value;\r\n\r\n this.treeClass.computeTreeData(value)\r\n\r\n if (this.value && Array.isArray(this.value) && this.value.length > 0 && 'functions' in (this.value?.[0] || {})) {\r\n this.treeClass.updateStateFromPath(this.value as TreeNode[])\r\n }\r\n }\r\n get data(): any {\r\n return this._data;\r\n }\r\n @Input() set value(value: TreeNode[] | string) {\r\n if (_isEqual(this._value, value)) return;\r\n this._value = value;\r\n if (Array.isArray(value)) {\r\n this.treeClass.updateStateFromPath(value as TreeNode[])\r\n }\r\n\r\n\r\n\r\n\r\n }\r\n get value(): TreeNode[] | string {\r\n\r\n return this._value;\r\n }\r\n @Input() formInputs: FormColumnInputs[] = []\r\n @Output() pathChanged = new EventEmitter<TreeNode[] | string>()\r\n\r\n constructor() {\r\n this.treeClass = new TreeComponent();\r\n }\r\n private _data: any\r\n private _value: TreeNode[] | string = []\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n //@ViewChild('textarea', { static: false }) textareaRef!: HTMLTextAreaElement\r\n @ViewChild('textarea', { read: ElementRef, static: false }) textareaElementRef!: ElementRef;\r\n\r\n\r\n showSuggestions = false;\r\n suggestions = ['$option1', '$option2', '$option3', '$custom'];\r\n filteredSuggestions: string[] = [];\r\n cursorPosition = 0;\r\n valueChangedSetPath(newPath: TreeNode[] | string) {\r\n const isSameAsNewPath = _isEqual(this.value, newPath);\r\n if (!isSameAsNewPath && Array.isArray(newPath)) {\r\n this.value = newPath\r\n\r\n this.treeClass.updateStateFromPath(newPath as TreeNode[])\r\n }\r\n }\r\n async onTextChange(event: Event) {\r\n const newValue = (event.target as HTMLInputElement).value;\r\n const functions = this.treeClass.pathInEdit!.functions!.find(f => f.inEdit)\r\n functions!.expression = newValue;\r\n this.treeClass.pathInEdit!.functions.map(f => {\r\n if (f.inEdit) {\r\n return functions\r\n }\r\n return f\r\n })\r\n const textarea = this.textareaElementRef.nativeElement;\r\n this.cursorPosition = textarea.selectionStart || 0;\r\n\r\n const lastChar = newValue[this.cursorPosition - 1];\r\n if (lastChar === '$') {\r\n this.showSuggestions = true;\r\n this.filteredSuggestions = this.suggestions;\r\n } else {\r\n this.showSuggestions = false;\r\n }\r\n }\r\n functionChanged(event: MatSelectChange) {\r\n this.treeClass.functionChanged(event.value)\r\n }\r\n addNewFunction() {\r\n\r\n this.treeClass.addNewFunction()\r\n\r\n }\r\n editFunction(id: string) {\r\n\r\n\r\n this.treeClass.pathInEdit!.functions = this.treeClass.pathInEdit!.functions?.map(f => {\r\n if (f.id === id) {\r\n return { ...f, inEdit: true }\r\n }\r\n return { ...f, inEdit: false }\r\n\r\n })\r\n\r\n }\r\n selectSuggestionInput(suggestion: string) {\r\n\r\n const functions = this.treeClass.pathInEdit!.functions.find(f => f.inEdit) || {} as any\r\n const value = functions?.expression || ''\r\n const beforeCursor = value.slice(0, this.cursorPosition - 1);\r\n const afterCursor = value.slice(this.cursorPosition);\r\n functions.expression = beforeCursor + suggestion + ' ' + afterCursor;\r\n this.treeClass.pathInEdit!.functions.map(f => {\r\n if (f.inEdit) {\r\n return functions\r\n }\r\n return f\r\n })\r\n this.showSuggestions = false;\r\n\r\n const textarea = this.textareaElementRef.nativeElement;\r\n textarea.focus();\r\n const newCursorPosition = this.cursorPosition + suggestion.length;\r\n setTimeout(() => {\r\n textarea.setSelectionRange(newCursorPosition, newCursorPosition);\r\n }, 0);\r\n }\r\n\r\n onFocus(event: FocusEvent) {\r\n const textarea = this.textareaElementRef.nativeElement;\r\n this.cursorPosition = textarea.selectionStart || 0;\r\n }\r\n nodeIsChecked(node: FlatNode) {\r\n return this.treeClass.nodeIsChecked(node)\r\n }\r\n hasANodeInEdit() {\r\n return this.treeClass.hasANodeInEdit()\r\n }\r\n showNode(node: FlatNode) {\r\n return this.treeClass.showNode(node)\r\n }\r\n onSearchChange(event: Event) {\r\n this.optionsSearch = (event.target as HTMLInputElement).value;\r\n\r\n }\r\n\r\n methods = [\r\n // Logical Operators\r\n {\r\n label: 'logical AND (&&)',\r\n value: '&&'\r\n },\r\n {\r\n label: 'logical OR (||)',\r\n value: '||'\r\n },\r\n\r\n // Comparison Operators\r\n {\r\n label: 'strict equality (===)',\r\n value: '==='\r\n },\r\n {\r\n label: 'loose equality (==)',\r\n value: '=='\r\n },\r\n {\r\n label: 'strict inequality (!==)',\r\n value: '!=='\r\n },\r\n {\r\n label: 'loose inequality (!=)',\r\n value: '!='\r\n },\r\n {\r\n label: 'greater than (>)',\r\n value: '>'\r\n },\r\n {\r\n label: 'less than (<)',\r\n value: '<'\r\n },\r\n {\r\n label: 'greater than or equal to (>=)',\r\n value: '>='\r\n },\r\n {\r\n label: 'less than or equal to (<=)',\r\n value: '<='\r\n }\r\n ];\r\n getMethods() {\r\n return searchAndOrderArray(this.methods, this.optionsSearch, 'label');\r\n }\r\n getNodeValueColor(v: any) {\r\n const valueType = typeof v\r\n switch (valueType) {\r\n case 'string':\r\n return '#c56100'\r\n case 'number':\r\n return 'mediumblue'\r\n case 'boolean':\r\n return 'forestgreen'\r\n case 'object':\r\n return '#005959'\r\n default:\r\n return 'currentcolor'\r\n }\r\n }\r\n setupPath(node: TreeNode) {\r\n return this.treeClass.setupPath(node)\r\n }\r\n trackByFn(index: number, node: TreeNode): string {\r\n return node.path.join('.')\r\n }\r\n showValue: boolean = false\r\n optionsSearch!: string\r\n getAllInputs() {\r\n const inputs = this.formInputs\r\n .filter((inp) => !inp.multipleInputInEditId);\r\n return searchAndOrderArray(inputs || [], this.optionsSearch, 'label');\r\n }\r\n getValueVariables(): string[] {\r\n const isObject = typeof this.value === 'object'\r\n if (!this.value) {\r\n return []\r\n }\r\n if (!isObject && !!this.value) {\r\n return [this.value as any]\r\n }\r\n if (Array.isArray(this.value)) {\r\n return this.value.map((v, i) => (i)) as any\r\n }\r\n return Object.keys(this.value)\r\n }\r\n saveNodeInEdit() {\r\n const newP = this.treeClass.saveNodeInEdit()\r\n if (newP) {\r\n this.pathChanged.emit(newP)\r\n }\r\n\r\n }\r\n closeEdit() {\r\n this.treeClass.closeEdit()\r\n\r\n\r\n }\r\n reset() {\r\n this.treeClass.resetNode()\r\n }\r\n getFunctionInEdit() {\r\n const node = this.treeClass.pathInEdit\r\n return node?.functions?.find(f => f.inEdit)\r\n }\r\n get getValue() {\r\n return this.treeClass.getValue()\r\n }\r\n removeFunction(id: string) {\r\n this.treeClass.removeFunction(id)\r\n }\r\n update(node: any) {\r\n\r\n const path = this.treeClass.selectNode(node)?.map(p => ({\r\n ...p,\r\n children: undefined,\r\n value: undefined\r\n }))\r\n\r\n\r\n this.pathChanged.emit(path)\r\n }\r\n}\r\n","<mat-accordion multi>\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">dataset_linked</mat-icon>\n <span style=\"font-size: 0.75em;line-height:normal\">\n Navigate and select data fields for mapping\n </span>\n\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <div class=\"tree-instructions\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>Click checkboxes to select fields for mapping. Selected paths will be highlighted.</span>\n </div>\n <mat-divider></mat-divider>\n\n <mat-tree [dataSource]=\"treeClass.dataSource\" [treeControl]=\"treeClass.treeControl\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\n <button disabled class=\"node-spacer\" aria-hidden=\"true\" mat-icon-button>\n\n </button>\n <mat-checkbox (change)=\"update(node)\" [checked]=\"nodeIsChecked(node)\" class=\"node-checkbox\"\n [matTooltip]=\"'Map data field: ' + node.key\">\n <span class=\"node-key\" [attr.aria-label]=\"'Field name: ' + node.key\">{{ node.key }}:</span>\n <span [attr.aria-label]=\"'Field value: ' + node.value\" style=\" white-space: nowrap;\" class=\"node-value\"\n [style.color]=\"getNodeValueColor(node.value)\">\n {{ node.value }}\n </span>\n </mat-checkbox>\n </mat-tree-node>\n\n <mat-tree-node *matTreeNodeDef=\"let node; when: treeClass.hasChild\" matTreeNodePadding>\n <button style=\"padding: 0px; \n width: 24px;\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.key\">\n <mat-icon>\n {{ treeClass.treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </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 <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">rebase_edit</mat-icon>\n <span style=\"font-size: 0.75em;line-height:normal\">\n Configure and transform your data path\n </span>\n\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <div class=\"tree-instructions\" *ngIf=\"treeClass.activePath.length === 0\">\n <mat-icon class=\"info-icon\" color=\"primary\">info</mat-icon>\n <span>Select a node from the tree above to begin mapping data</span>\n </div>\n <mat-divider></mat-divider>\n <mat-toolbar style=\" height: fit-content; background: inherit;\">\n <div class=\"breadcrumb-container\">\n\n <ng-container *ngFor=\"let path of treeClass.activePath; trackBy: trackByFn; last as isLast; index as i\">\n <button *ngIf=\"!path.inEdit\" matTooltip=\"Click to edit\" (click)=\"setupPath(path)\" mat-button\n [disabled]=\"!path.keyIsArrayIndex\" [color]=\"path.functions.length> 0 ? 'accent' : ''\"\n class=\"breadcrumb-item\">\n <mat-icon>{{ path.keyIsArrayIndex ? 'filter_none' : 'folder' }}</mat-icon>\n <span>{{ path.key }}</span>\n </button>\n\n\n <button *ngIf=\"!!path.inEdit\" matTooltip=\"Currently editing\" (click)=\"removeFunction(path.key)\"\n mat-raised-button color=\"primary\" class=\"breadcrumb-item\">\n <mat-icon>check_circle</mat-icon>\n <span>{{ path.key }}</span>\n </button>\n <mat-icon *ngIf=\"!isLast\" class=\"breadcrumb-separator\">chevron_right</mat-icon>\n </ng-container>\n </div>\n </mat-toolbar>\n <div *ngIf=\"!!hasANodeInEdit()\">\n\n <mat-nav-list>\n\n <ng-container *ngFor=\"let function of this.treeClass.pathInEdit?.functions;index as i\">\n <mat-list-item [activated]=\"!!function.inEdit\" class=\"functions\" style=\"height: fit-content;\">\n <span matListItemIcon class=\"function-number\">\n <strong> {{i+1}} </strong>\n </span>\n <a (click)=\"editFunction(function.id)\"\n style=\"font-size: 0.875em; white-space: nowrap;overflow: hidden;text-overflow: ellipsis;\" matListItemTitle>\n {{ (function.function |titlecase) ||\n 'Function configurations required'}}</a>\n <button mat-icon-button (click)=\"removeFunction(function.id)\" matListItemMeta>\n\n <mat-icon [color]=\"function.function && function.expression?'':'warn'\">{{!function.inEdit?\n 'close':'check_circle'}}</mat-icon>\n </button>\n\n\n </mat-list-item>\n\n <div class=\"function-edit-container\" *ngIf=\"function.inEdit\">\n <mat-divider></mat-divider>\n <mat-form-field subscriptSizing=\"dynamic\" style=\" margin-bottom: 8px;\" appearance=\"outline\"\n *ngIf=\"this.treeClass.pathInEdit?.functions\">\n <mat-label>Array function</mat-label>\n <mat-select matNativeControl [value]=\"getFunctionInEdit()?.function\"\n (selectionChange)=\"functionChanged($event)\" placeholder=\"ChooseFunctionToRun\">\n <mat-option value=\"filter\">filter</mat-option>\n <mat-option value=\"find\">find</mat-option>\n <mat-option value=\"map\">map</mat-option>\n </mat-select>\n <mat-hint>\n Choose a function to run on the array\n </mat-hint>\n </mat-form-field>\n <mat-form-field appearance=\"outline\" *ngIf=\"this.treeClass.pathInEdit?.functions\">\n <mat-label>Condition expression</mat-label>\n <textarea matInput #textarea [value]=\"getFunctionInEdit()?.expression\" (input)=\"onTextChange($event)\"\n (focus)=\"onFocus($event)\" placeholder=\"Enter a validation string for the function\"></textarea>\n <mat-hint>\n {{ showSuggestions ? 'Suggestions are enabled' : 'Enter a condition expression to transform the array'\n }}\n </mat-hint>\n </mat-form-field>\n <section *ngIf=\"showSuggestions\" class=\"showSuggestionContainer\">\n <!-- <mat-toolbar class=\"search-container\" style=\"background: inherit;\">\n \n \n <input type=\"search\" \n placeholder=\"Search api\" \n class=\"search-field\"\n (change)=\"onSearchChange($event)\"> \n \n <mat-icon>\n search\n </mat-icon>\n </mat-toolbar> -->\n <mat-divider></mat-divider>\n <div style=\"padding: 8px;\" class=\"\">\n <div class=\"suggestion-container\">\n <div class=\"suggestion-column\">\n <h5>Logical Operators</h5>\n <div class=\"button-container\">\n <button color=\"primary\" mat-flat-button *ngFor=\"let method of getMethods()\"\n (click)=\"selectSuggestionInput(method.value)\" class=\"suggestion-button\">\n {{ method.label | titlecase }}\n </button>\n </div>\n </div>\n <div class=\"suggestion-column\">\n <h5>Add Input as a Variable</h5>\n <div class=\"button-container\">\n <button *ngFor=\"let input of getAllInputs()\" mat-flat-button\n (click)=\"selectSuggestionInput(input.formControlName)\" class=\"suggestion-button\">\n {{ input.label | titlecase }}\n </button>\n </div>\n </div>\n <!-- <div class=\"suggestion-column\">\n <h5>Array path Object </h5>\n <div class=\"button-container\">\n <button *ngFor=\"let input of getValueVariables()\"\n color=\"accent\"\n mat-flat-button\n (click)=\"selectSuggestionInput(input)\" class=\"suggestion-button\">\n {{ input}}\n </button>\n </div>\n </div> -->\n </div>\n <div class=\"suggestion-container\">\n\n </div>\n\n </div>\n </section>\n\n\n <mat-toolbar style=\"background:none\">\n <span class=\"spacer\"></span>\n\n <button (click)=\"reset()\" mat-flat-button>\n reset\n </button>\n <button (click)=\"saveNodeInEdit()\" [disabled]=\"!function.expression && !function.function\"\n mat-flat-button color=\"primary\">\n save\n </button>\n\n </mat-toolbar>\n </div>\n <mat-divider></mat-divider>\n </ng-container>\n\n </mat-nav-list>\n <ol>\n\n </ol>\n <button (click)=\"addNewFunction()\" mat-button>+ Add function </button>\n </div>\n </div>\n </mat-expansion-panel>\n\n <mat-expansion-panel>\n <mat-expansion-panel-header>\n <mat-panel-title>\n <mat-icon class=\"title-icon\">dataset</mat-icon>\n <span style=\"font-size: 0.75em;line-height:normal\">\n Mapped Data Value Based on the Active Path\n </span>\n\n </mat-panel-title>\n\n </mat-expansion-panel-header>\n\n <div class=\"content\">\n <mat-divider></mat-divider>\n\n <div style=\"padding: 16px;background: black;\n color: cadetblue; border-radius:8px;min-width:fit-content\">\n <pre>{{getValue|json}}</pre>\n </div>\n </div>\n </mat-expansion-panel>\n\n\n</mat-accordion>","import { IFolderItem } from 'ngx-t-forms-types';\r\nimport { 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 any };\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 { CommonModule } from '@angular/common';\nimport { Component, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChanges, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { debounceTime, Subscription } from 'rxjs';\n\n@Component({\n selector: 'app-json-editor',\n templateUrl: './json-editor.component.html',\n styleUrls: ['./json-editor.component.scss'],\n standalone: true,\n encapsulation: ViewEncapsulation.None, // Required for dynamic innerHTML styling\n imports: [\n CommonModule,\n MatIconModule,\n MatButtonModule,\n FormsModule,\n ReactiveFormsModule\n ]\n})\nexport class JsonEditorComponent implements OnChanges, OnDestroy {\n\n @Input() value!: Object;\n @Output() valueChange = new EventEmitter<{ value: Object | Array<any>, valid: boolean }>();\n\n @ViewChild('backdrop') backdrop!: ElementRef<HTMLDivElement>;\n @ViewChild('textarea') textarea!: ElementRef<HTMLTextAreaElement>;\n\n jsonForm: FormGroup;\n subscriptions = new Subscription();\n errorMessage: string | null = null;\n highlightedHtml: string = '';\n \n private _value: any;\n\n constructor(private fb: FormBuilder) {\n this.jsonForm = this.fb.group({\n jsonText: ['', Validators.required]\n });\n this.init();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['value'] && changes['value'].currentValue !== this._value) {\n this._value = changes['value'].currentValue;\n // Hard set on external change\n this.formatAndSet(this._value, true);\n }\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n init() {\n this.subscriptions.add(\n this.jsonForm.get('jsonText')!.valueChanges\n .pipe(debounceTime(300)) // Faster feedback for validation\n .subscribe(text => {\n this.handleInput(text);\n })\n );\n }\n\n /**\n * Core logic to handle input changes:\n * 1. Updates syntax highlighting\n * 2. Validates JSON\n * 3. Emits changes\n */\n private handleInput(text: string): void {\n // 1. Update visual highlighting immediately\n this.highlightedHtml = this.syntaxHighlight(text);\n\n // 2. Validate\n try {\n const parsedJson = JSON.parse(text);\n this.errorMessage = null;\n this.valueChange.emit({ value: parsedJson, valid: true });\n } catch (error) {\n if (error instanceof SyntaxError) {\n this.errorMessage = this.getDetailedJsonError(text, error.message);\n } else {\n this.errorMessage = 'Invalid JSON format';\n }\n this.valueChange.emit({ value: JSON.parse(text), valid: false });\n }\n }\n\n /**\n * Formats the current JSON content (Prettify)\n */\n public prettify(): void {\n const currentText = this.jsonForm.get('jsonText')?.value;\n try {\n const parsed = JSON.parse(currentText);\n this.formatAndSet(parsed, false);\n } catch (e) {\n // If invalid, we can't prettify, just leave as is\n }\n }\n\n /**\n * Sets the value to the form and updates highlights\n */\n private formatAndSet(jsonValue: any, emitEvent: boolean = false): void {\n try {\n // 4-space indentation for modern readability\n const beautified = JSON.stringify(jsonValue, null, 4);\n \n this.jsonForm.get('jsonText')?.setValue(beautified, { emitEvent: emitEvent });\n this.highlightedHtml = this.syntaxHighlight(beautified);\n this.errorMessage = null;\n } catch (e) {\n // Fallback if value isn't parseable object (e.g. empty string)\n this.jsonForm.get('jsonText')?.setValue(jsonValue, { emitEvent: emitEvent });\n }\n }\n\n /**\n * Syncs the scroll position of the background highlights with the foreground textarea\n */\n syncScroll(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n if (this.backdrop && this.backdrop.nativeElement) {\n this.backdrop.nativeElement.scrollTop = target.scrollTop;\n this.backdrop.nativeElement.scrollLeft = target.scrollLeft;\n }\n }\n\n /**\n * Handles Tab key to insert spaces instead of changing focus\n */\n handleTab(event: KeyboardEvent): void {\n if (event.key === 'Tab') {\n event.preventDefault();\n const textarea = event.target as HTMLTextAreaElement;\n const start = textarea.selectionStart;\n const end = textarea.selectionEnd;\n\n // Insert 4 spaces\n const value = textarea.value;\n const newValue = value.substring(0, start) + ' ' + value.substring(end);\n \n this.jsonForm.get('jsonText')?.setValue(newValue);\n \n // Move cursor\n setTimeout(() => {\n textarea.selectionStart = textarea.selectionEnd = start + 4;\n });\n }\n }\n\n /**\n * Simple regex-based JSON syntax highlighter\n */\n private syntaxHighlight(json: string): string {\n if (!json) return '';\n\n // Escape HTML entities to prevent injection\n json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\n return json.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 (/^\"/.test(match)) {\n if (/:$/.test(match)) {\n cls = 'json-key';\n } else {\n cls = 'json-string';\n }\n } else if (/true|false/.test(match)) {\n cls = 'json-boolean';\n } else if (/null/.test(match)) {\n cls = 'json-null';\n }\n return `<span class=\"${cls}\">${match}</span>`;\n }\n );\n }\n\n private getDetailedJsonError(value: string, message: string): string {\n const positionMatch = message.match(/position (\\d+)/);\n if (positionMatch?.[1]) {\n const position = parseInt(positionMatch[1], 10);\n const excerpt = this.getErrorExcerpt(value, position);\n return `Error at position ${position} near \"${excerpt}\"`;\n }\n return message;\n }\n\n private getErrorExcerpt(value: string, position: number, excerptLength: number = 20): string {\n const start = Math.max(0, position - excerptLength);\n const end = Math.min(value.length, position + excerptLength);\n return value.substring(start, end).replace(/\\n/g, '↵');\n }\n}","<div class=\"json-editor-wrapper\">\n \n <!-- Toolbar -->\n <div class=\"editor-toolbar\">\n <div class=\"toolbar-label\">\n <mat-icon class=\"icon-sm\">code</mat-icon> JSON Editor\n </div>\n <div class=\"toolbar-actions\">\n <div *ngIf=\"errorMessage\" class=\"status-indicator error\" [title]=\"errorMessage\">\n <mat-icon>error_outline</mat-icon> Invalid JSON\n </div>\n <div *ngIf=\"!errorMessage\" class=\"status-indicator valid\">\n <mat-icon>check_circle</mat-icon> Valid\n </div>\n <button mat-button class=\"prettify-btn\" (click)=\"prettify()\" [disabled]=\"!!errorMessage\">\n Format JSON\n </button>\n </div>\n </div>\n\n <!-- Editor Container -->\n <div class=\"editor-container\">\n <form [formGroup]=\"jsonForm\" class=\"editor-form\">\n \n <!-- Backdrop for Syntax Highlighting -->\n <div #backdrop class=\"editor-backdrop\">\n <div class=\"highlights\" [innerHTML]=\"highlightedHtml\"></div>\n </div>\n\n <!-- Foreground Textarea -->\n <textarea\n #textarea\n formControlName=\"jsonText\"\n class=\"editor-textarea\"\n spellcheck=\"false\"\n (scroll)=\"syncScroll($event)\"\n (keydown)=\"handleTab($event)\"\n placeholder=\"Paste JSON here...\"></textarea>\n \n </form>\n </div>\n\n <!-- Footer / Error Message Panel -->\n <div class=\"editor-footer\" *ngIf=\"errorMessage\">\n <mat-icon color=\"warn\">warning</mat-icon>\n <span>{{ errorMessage }}</span>\n </div>\n\n</div>","import {\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n inject,\r\n Input,\r\n\r\n Optional,\r\n\r\n Output,\r\n Self,\r\n} from '@angular/core';\r\nimport { TreeNode } from \"ngx-t-forms-types\";\r\nimport { CommonModule } from '@angular/common';\r\nimport { DataTreeComponent } from './elements/data-tree/data-tree.component';\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { catchError, Subject, Subscription, take, tap, throwError } from 'rxjs';\r\nimport { FormsModule, NgControl } from '@angular/forms';\r\nimport { IConfigElementError } from '../../t-dynamic-data-edit.component';\r\nimport { IFolderItem, IGetPostmanCollections, IPostmanCollectionConfig } from \"ngx-t-forms-types\";\r\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport _ from 'lodash';\r\nimport { flatApiList } from '../postman-collections/functions/convertPostmanCollectionToTree';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\nimport { JsonEditorComponent } from '../json-editor/json-editor.component';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { _isEqual } from '../../../../shared/functions/isEqual';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../injection-tokens';\r\n\r\n\r\nexport type ViewMode = 'map' | 'sync';\r\n\r\n\r\n@Component({\r\n selector: 'app-api-value-access-rules',\r\n templateUrl: './api-value-access-rules.component.html',\r\n styleUrls: ['./api-value-access-rules.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, DataTreeComponent, OverlayModule, JsonEditorComponent, MatButtonToggleModule, MatModulesModule, FormsModule],\r\n providers: [{ provide: MatFormFieldControl, useExisting: ApiValueAccessRulesComponent }],\r\n})\r\nexport class ApiValueAccessRulesComponent implements MatFormFieldControl<TreeNode[] | string | { [key: string]: TreeNode[] | string }> {\r\n static nextId = 0;\r\n\r\n // -- MatFormFieldControl Boilerplate --\r\n stateChanges = new Subject<void>();\r\n @HostBinding() id = `app-api-value-access-rules-${ApiValueAccessRulesComponent.nextId++}`;\r\n placeholder: string = '';\r\n focused: boolean = false;\r\n touched: boolean = false;\r\n controlType?: string | undefined;\r\n autofilled?: boolean | undefined;\r\n userAriaDescribedBy?: string | undefined;\r\n disableAutomaticLabeling?: boolean | undefined;\r\n required: boolean = false;\r\n\r\n // -- Component State --\r\n error: HttpErrorResponse | undefined;\r\n loading: boolean = false;\r\n inSyncMode: ViewMode = 'map';\r\n postManFolderItems: IFolderItem[] = [];\r\n\r\n // Cached parsed bodies to avoid JSON.parse on every change detection cycle\r\n parsedResponseBody: any = undefined;\r\n parsedRequestBody: any = undefined;\r\n\r\n private _postManCollectionConfig: IPostmanCollectionConfig | undefined;\r\n private _mapToData: any;\r\n private _subscriptions: Subscription = new Subscription();\r\n\r\n constructor(\r\n @Optional() @Self() public ngControl: NgControl,\r\n private _elementRef: ElementRef<HTMLElement>,\r\n private readonly httpClient: HttpClient\r\n ) {\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n this._subscriptions.unsubscribe();\r\n }\r\n\r\n // -- Inputs --\r\n\r\n @Input() disabled: boolean = false;\r\n @Input() multipleBind: string[] | undefined;\r\n @Input() errors: IConfigElementError[] | undefined = [];\r\n @Input() value: TreeNode[] | string | { [key: string]: TreeNode[] | string } = [];\r\n @Input() formInputs: FormColumnInputs[] = [];\r\n\r\n // Intercept mapToData changes to update cached body content\r\n @Input()\r\n get mapToData(): any {\r\n return this._mapToData;\r\n }\r\n set mapToData(val: any) {\r\n this._mapToData = val;\r\n this.updateParsedBodies();\r\n }\r\n\r\n // Intercept config changes to trigger data fetch\r\n @Input()\r\n set postmanCollectionConfig(postmanCollectionConfig: IPostmanCollectionConfig | undefined) {\r\n // Replaced _.isEqual with local helper\r\n if (!_isEqual(this._postManCollectionConfig, postmanCollectionConfig)) {\r\n this._postManCollectionConfig = postmanCollectionConfig;\r\n this.initializePostmanService();\r\n }\r\n }\r\n get postmanCollectionConfig(): IPostmanCollectionConfig | undefined {\r\n return this._postManCollectionConfig;\r\n }\r\n\r\n // -- Outputs --\r\n @Output() valueChanged = new EventEmitter();\r\n @Output() reload = new EventEmitter();\r\n\r\n // -- Getters for Template --\r\n\r\n get empty() {\r\n return !this.value;\r\n }\r\n\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n get errorState(): boolean {\r\n const hasError = !!this.ngControl?.control?.errors || ((this.errors || []).length > 0 && this.touched);\r\n return (!this.value && !!this.required) || hasError;\r\n }\r\n\r\n get computedValue(): any {\r\n const invalidType = this.value instanceof Array || typeof this.value === 'string';\r\n if (this.multipleBind && invalidType && !this.value) {\r\n return {};\r\n }\r\n return this.value;\r\n }\r\n\r\n // -- Methods --\r\n\r\n setDescribedByIds(ids: string[]) {\r\n // Ensure the component view is initialized\r\n if (this._elementRef && this._elementRef.nativeElement) {\r\n const controlElement = this._elementRef.nativeElement.querySelector('.app-api-value-access-rules');\r\n if (controlElement) {\r\n controlElement.setAttribute('aria-describedby', ids.join(' '));\r\n }\r\n }\r\n }\r\n\r\n onContainerClick(event: MouseEvent): void {\r\n this.markAsTouched();\r\n this.stateChanges.next();\r\n }\r\n\r\n onTouched = () => { };\r\n\r\n markAsTouched() {\r\n if (!this.touched) {\r\n this.onTouched();\r\n this.touched = true;\r\n }\r\n }\r\n\r\n // Implements WriteValue for ControlValueAccessor (via MatFormFieldControl usage)\r\n writeValue(value: any): void {\r\n this.value = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n // Handled by parent or ngControl usually, but good practice to have stub\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n pathChanged(path: TreeNode[] | string, control?: string) {\r\n if (!Array.isArray(path)) {\r\n return;\r\n }\r\n if (!control) {\r\n this.valueChanged.emit(path);\r\n return;\r\n }\r\n if (this.value instanceof Array || typeof this.value === 'string') {\r\n this.value = {};\r\n }\r\n const newValue: any = { ...this.value };\r\n newValue[control] = path;\r\n this.valueChanged.emit(newValue);\r\n }\r\n\r\n private isValidConfig(config: IPostmanCollectionConfig | undefined): boolean {\r\n return Boolean(config?.collectionUrl && config?.collectionKey);\r\n }\r\n\r\n private initializePostmanService(): void {\r\n const isValidConfig = this.isValidConfig(this.postmanCollectionConfig);\r\n\r\n if (!isValidConfig) {\r\n this.error = new HttpErrorResponse({\r\n error: 'Invalid Postman Collection Config',\r\n });\r\n return;\r\n }\r\n\r\n const { collectionUrl, collectionKey } = this.postmanCollectionConfig!;\r\n\r\n const requestOptions = {\r\n params: {\r\n apikey: collectionKey,\r\n clearSystemHeaders: 'true' // ensure string for http params often\r\n },\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n }\r\n };\r\n\r\n this.loading = true;\r\n\r\n // Use take(1) so we don't need to manually unsubscribe from this specific http call\r\n this.httpClient.get<IGetPostmanCollections>(\r\n collectionUrl,\r\n requestOptions\r\n ).pipe(\r\n take(1),\r\n tap((data) => {\r\n // Uses the mock/stub function now\r\n this.postManFolderItems = flatApiList(data.collection.item);\r\n this.error = undefined;\r\n this.loading = false;\r\n this.updateParsedBodies();\r\n }),\r\n catchError((err: HttpErrorResponse) => {\r\n this.loading = false;\r\n this.error = err;\r\n return throwError(() => err);\r\n })\r\n ).subscribe();\r\n }\r\n\r\n /**\r\n * Updates the cached parsed request/response bodies.\r\n * Called when postManFolderItems changes (load) or mapToData changes (input).\r\n */\r\n private updateParsedBodies(): void {\r\n if (!this.postManFolderItems || !this.mapToData) {\r\n this.parsedResponseBody = undefined;\r\n this.parsedRequestBody = undefined;\r\n return;\r\n }\r\n\r\n const item = this.postManFolderItems.find((i) => i.id === this.mapToData);\r\n\r\n if (!item) {\r\n this.parsedResponseBody = undefined;\r\n this.parsedRequestBody = undefined;\r\n return;\r\n }\r\n\r\n // Parse Response Body\r\n try {\r\n // Safely handle if body is not string in mock\r\n const bodySource = item.response?.[0]?.body;\r\n const responseBody = typeof bodySource === 'string' ? JSON.parse(bodySource || '{}') : bodySource;\r\n this.parsedResponseBody = responseBody && Object.keys(responseBody).length > 0 ? responseBody : undefined;\r\n } catch (error) {\r\n this.parsedResponseBody = undefined;\r\n }\r\n\r\n // Parse Request Body\r\n try {\r\n const body: any = item.request?.body || {};\r\n const raw = body?.raw || '';\r\n if (body.mode === 'raw') {\r\n // Safely handle if raw is already object in mock\r\n this.parsedRequestBody = typeof raw === 'string' ? JSON.parse(raw) : raw;\r\n } else {\r\n this.parsedRequestBody = undefined;\r\n }\r\n } catch (error) {\r\n this.parsedRequestBody = undefined;\r\n }\r\n }\r\n\r\n\r\n requestBodyChanged(newBody: any): void {\r\n if (_isEqual(this.parsedRequestBody, {\r\n ...newBody.value\r\n })) return;\r\n this.parsedRequestBody = {\r\n ...newBody.value\r\n }\r\n }\r\n readonly NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN)\r\n postFn = this.NGX_T_FORMS_CONFIG.formBuilder.httpPostDataFunction\r\n getFn = this.NGX_T_FORMS_CONFIG.formBuilder.httpGetDataFunction\r\n runApiCall(): void {\r\n const item = this.postManFolderItems.find((i) => i.id === this.mapToData);\r\n const url = item?.request?.url?.raw\r\n if (!url) return;\r\n // const headers = item?.request?.header\r\n const method = item?.request?.method\r\n let req$\r\n if (method === 'GET') {\r\n req$ = this.getFn(url)\r\n } else {\r\n req$ = this.postFn(url, {\r\n ...this.parsedRequestBody\r\n })\r\n }\r\n this.loading = true\r\n req$.pipe(\r\n take(1),\r\n tap(\r\n (response) => {\r\n this.loading = false\r\n this.error = undefined\r\n this.inSyncMode = 'map'\r\n this.parsedResponseBody = response\r\n\r\n }\r\n ),\r\n catchError((err: HttpErrorResponse) => {\r\n this.loading = false;\r\n this.error = err;\r\n return throwError(() => err);\r\n })\r\n ).subscribe()\r\n\r\n\r\n\r\n\r\n\r\n\r\n }\r\n}","<div class=\"toggle-container\">\r\n <mat-button-toggle-group name=\"menuType\" aria-label=\"Value Access Mode\">\r\n <mat-button-toggle (click)=\"inSyncMode = 'map'\" [checked]=\"inSyncMode === 'map'\" value=\"map\">Value\r\n Mapping</mat-button-toggle>\r\n <mat-button-toggle (click)=\"inSyncMode = 'sync'\" [checked]=\"inSyncMode === 'sync'\" value=\"sync\">Data\r\n Sync</mat-button-toggle>\r\n </mat-button-toggle-group>\r\n</div>\r\n\r\n@switch (inSyncMode) {\r\n@case ('sync') {\r\n@if(parsedRequestBody) {\r\n<app-json-editor (valueChange)=\"requestBodyChanged($event)\" [value]=\"parsedRequestBody\"></app-json-editor>\r\n\r\n} @else {\r\n<div class=\"empty-state\">No request body found in the selected API request.</div>\r\n}\r\n<mat-toolbar>\r\n <span style=\" font-size: 0.75em;\r\n line-height: normal;\r\n font-weight: 500;\r\n white-space: break-spaces;\r\n opacity: 0.8;\">Click the button to execute the API call with the body above.</span>\r\n <span class=\"spacer\"></span>\r\n <button mat-stroked-button [disabled]=\"loading\" (click)=\"runApiCall()\">\r\n <mat-icon>play_arrow</mat-icon>\r\n <span style=\"display: flex;justify-content: center;\">\r\n {{loading?'Running Api...':'Run API Call'}}\r\n @if(loading){\r\n <mat-spinner diameter=\"16\"></mat-spinner>\r\n }\r\n </span>\r\n\r\n </button>\r\n</mat-toolbar>\r\n}\r\n@case ('map') {\r\n@if (multipleBind) {\r\n@for (controlName of multipleBind; track controlName) {\r\n<section class=\"mapping-section\">\r\n <label [for]=\"controlName\">Map <strong>{{controlName}}</strong></label>\r\n <app-data-tree [formInputs]=\"formInputs\" (pathChanged)=\"pathChanged($event, controlName)\"\r\n [data]=\"parsedResponseBody || mapToData\" [value]=\"computedValue[controlName] || ''\">\r\n </app-data-tree>\r\n</section>\r\n}\r\n} @else {\r\n<app-data-tree (pathChanged)=\"pathChanged($event)\" [formInputs]=\"formInputs\" [data]=\"parsedResponseBody || mapToData\"\r\n [value]=\"computedValue\">\r\n</app-data-tree>\r\n}\r\n}\r\n}\r\n\r\n<!-- Overlay for disabled state -->\r\n<ng-template cdkConnectedOverlay [cdkConnectedOverlayOpen]=\"disabled\">\r\n <div class=\"disabled-overlay\"></div>\r\n</ng-template>","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core';\r\n\r\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { distinctUntilChanged, Subscription, tap } from 'rxjs';\r\nimport { FormColumnInputs, TreeNode } from 'ngx-t-forms-types';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\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@Component({\r\n selector: 'lib-validation-expressio-creator',\r\n imports: [CommonModule, MatModulesModule, ReactiveFormsModule, SearchListPipe, ApiValueAccessRulesComponent],\r\n templateUrl: './validation-expressio-creator.component.html',\r\n styleUrl: './validation-expressio-creator.component.css'\r\n})\r\nexport class ValidationExpressioCreatorComponent implements OnDestroy, OnInit {\r\n @Input() hint: string = ' An expression that evaluates to true or false to determine if this path is taken.'\r\n @Input() label: string = 'Validation Expression';\r\n @Input() formInputs: FormColumnInputs[] = []\r\n _data: any = {};\r\n @Input() set data(value: any) {\r\n this._data = value;\r\n }\r\n get data(): any {\r\n return this._data;\r\n }\r\n @Input() set expression(value: string) {\r\n this.expressionControl.setValue(value);\r\n this.expressionControl.markAsPristine();\r\n this.expressionControl.markAsUntouched();\r\n }\r\n _valueAccessRules: Record<string, TreeNode[]> = {};\r\n @Input() set valueAccessRules(value: Record<string, TreeNode[]>) {\r\n this._valueAccessRules = value;\r\n\r\n }\r\n get valueAccessRules(): Record<string, TreeNode[]> {\r\n return this._valueAccessRules;\r\n }\r\n\r\n subscription$ = new Subscription();\r\n ngOnDestroy(): void {\r\n this.subscription$.unsubscribe();\r\n }\r\n @Output() expressionChange = new EventEmitter<{\r\n expression: string | null;\r\n valueAccessRules: Record<string, TreeNode[]>;\r\n }>();\r\n\r\n ngOnInit(): void {\r\n this.subscription$.add(\r\n this.expressionControl.valueChanges.pipe(\r\n distinctUntilChanged((prev, curr) => prev === curr),\r\n tap(\r\n (value) => {\r\n this.onTextChange(value || '').then(() => {\r\n this.expressionChange.emit(\r\n {\r\n expression: this.expressionControl.value,\r\n valueAccessRules: this.valueAccessRules\r\n })\r\n });\r\n }\r\n )\r\n ).subscribe()\r\n )\r\n }\r\n\r\n @ViewChild('textarea', { read: ElementRef, static: false }) textareaElementRef!: ElementRef;\r\n expressionControl = new FormControl('', [Validators.required, expressionSyntaxValidator()]);\r\n cursorPosition = 0;\r\n showSuggestions = false;\r\n optionsSearch!: string\r\n async onTextChange(expression: string) {\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(operators.map(op => `\\\\${op.split('').join('\\\\')}`).join('|'));\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 = textAfterDollar;\r\n // Check if the extracted text contains only letters and spaces.\r\n // This regex allows:\r\n // - An empty string \"\" (for when '$' is the last character).\r\n // - A string with letters (\"hello\").\r\n // - A string with letters and spaces (\"hello world\").\r\n const isValidFormat = /^[a-zA-Z\\s]*$/.test(textAfterDollar);\r\n\r\n // Check if any of the disallowed operators are present\r\n const containsOperator = operatorRegex.test(textAfterDollar);\r\n\r\n // Show suggestions ONLY if the format is valid (letters/spaces)\r\n // AND it does NOT contain any of the forbidden operators.\r\n if (isValidFormat && !containsOperator) {\r\n\r\n this.showSuggestions = true;\r\n } else {\r\n this.showSuggestions = false;\r\n }\r\n } else {\r\n // If no '$' is found before the cursor, hide suggestions\r\n this.optionsSearch = '';\r\n this.showSuggestions = false;\r\n }\r\n this.cleanValueAccessRules();\r\n }\r\n cleanValueAccessRules() {\r\n const expression = this.expressionControl.value || '';\r\n const originalRules = this.valueAccessRules;\r\n\r\n // 1. Tokenize the expression to get a list of all potential variable names.\r\n // This regex finds sequences of letters, numbers, and underscores.\r\n // It correctly treats \"nationalKPA%\" and \"nationalKPA\" as different tokens.\r\n const expressionTokens: RegExpMatchArray | null = expression.match(/[a-zA-Z0-9_]+/g);\r\n\r\n // 2. Filter the existing rules, keeping only those whose keys are exact tokens in the expression.\r\n this.valueAccessRules = Object.keys(originalRules)\r\n .filter((key: string) => expressionTokens?.includes(key))\r\n .reduce((newRules, key) => {\r\n newRules[key] = originalRules[key];\r\n return newRules;\r\n }, {} as any); // Assuming TypeScript context from your edit\r\n\r\n // 3. Find which inputs need to be added.\r\n const inputsToAdd = this.formInputs.filter(input =>\r\n expressionTokens?.includes(input.formControlName) &&\r\n !this.valueAccessRules[input.formControlName]\r\n );\r\n\r\n // 4. Efficiently build a single object with all the new rules.\r\n const newRulesToAdd = inputsToAdd.reduce((acc, input) => {\r\n acc[input.formControlName] = [{\r\n value: input.formControlName,\r\n key: input.formControlName,\r\n name: input.label,\r\n path: [input.formControlName],\r\n functions: []\r\n }];\r\n return acc;\r\n }, {} as any);\r\n\r\n // 5. Merge the new rules into the main object in a single, efficient operation.\r\n this.valueAccessRules = {\r\n ...this.valueAccessRules,\r\n ...newRulesToAdd,\r\n };\r\n }\r\n selectSuggestionInput(suggestion: string) {\r\n const originalValue = this.expressionControl.value || '';\r\n\r\n // Find the position of the last '$' that triggered the suggestions.\r\n // This is the same logic used in onTextChange.\r\n const lastDollarIndex = originalValue.substring(0, this.cursorPosition).lastIndexOf('$');\r\n\r\n if (lastDollarIndex !== -1) {\r\n // Construct the new value by replacing from the '$' to the cursor\r\n const beforeDollar = originalValue.slice(0, lastDollarIndex);\r\n const afterCursor = originalValue.slice(this.cursorPosition);\r\n\r\n // The new value is the part before the $, the suggestion, a space, and the part after the cursor.\r\n const newValue = beforeDollar + suggestion + ' ' + afterCursor;\r\n\r\n this.expressionControl.setValue(newValue);\r\n this.expressionControl.markAsDirty();\r\n this.showSuggestions = false;\r\n\r\n // --- Cursor repositioning logic ---\r\n const textarea = this.textareaElementRef.nativeElement;\r\n textarea.focus();\r\n\r\n // Calculate the new cursor position\r\n const newCursorPosition = (beforeDollar + suggestion + ' ').length;\r\n\r\n // Use setTimeout to ensure the cursor is set after the view updates\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 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 // Note: It's good practice to decide what happens if lastDollarIndex is -1,\r\n\r\n }\r\n get getAllInputs() {\r\n\r\n return this.formInputs\r\n .filter((inp) => !inp.multipleInputInEditId);\r\n }\r\n\r\n onFocus(event: FocusEvent) {\r\n const textarea = this.textareaElementRef.nativeElement;\r\n this.cursorPosition = textarea.selectionStart || 0;\r\n }\r\n\r\n methods = [\r\n // Logical Operators\r\n {\r\n label: '&&',\r\n hint: \" logical AND . Returns true if both operands are true.\",\r\n value: '&&'\r\n },\r\n {\r\n label: '||',\r\n hint: \" logical OR. Returns true if at least one operand is true.\",\r\n value: '||'\r\n },\r\n\r\n // Comparison Operators\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 getMethods() {\r\n return this.methods\r\n }\r\n variableInEdit: string | null = null;\r\n 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 get valueAccessOptions(): string[] {\r\n return Object.keys(this.valueAccessRules)\r\n }\r\n activeVariableChanged(value: TreeNode[] | string) {\r\n \r\n this.expressionChange.emit(\r\n {\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($event)\"\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 <button matTooltipPosition=\"left\" [matTooltip]=\"method.hint\" color=\"primary\" mat-button\r\n *ngFor=\"let method of getMethods()|searchList:optionsSearch\"\r\n (click)=\"selectSuggestionInput(method.value)\" class=\"suggestion-button\">\r\n {{ method.label | titlecase }}\r\n </button>\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 <button *ngFor=\"let input of getAllInputs|searchList:optionsSearch\" mat-button\r\n matTooltipPosition=\"right\" [matTooltip]=\"'Add Variable - '+ input.label \"\r\n (click)=\"selectSuggestionInput(input.formControlName)\" class=\"suggestion-button\">\r\n {{ input.label | titlecase }}\r\n </button>\r\n </div>\r\n </div>\r\n <!-- <div class=\"suggestion-column\">\r\n <h5>Array path Object </h5>\r\n <div class=\"button-container\">\r\n <button *ngFor=\"let input of getValueVariables()\"\r\n color=\"accent\"\r\n mat-flat-button\r\n (click)=\"selectSuggestionInput(input)\" class=\"suggestion-button\">\r\n {{ input}}\r\n </button>\r\n </div>\r\n </div> -->\r\n </div>\r\n\r\n\r\n </div>\r\n </section>\r\n\r\n\r\n }\r\n }\r\n\r\n\r\n </mat-hint>\r\n\r\n\r\n</mat-form-field>\r\n\r\n@if(valueAccessOptions.length>0){\r\n\r\n\r\n<mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" style=\"width: 100%;margin-top:12px\" floatLabel=\"always\"\r\n 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 \r\n (click)=\"variableInEdit === variable ? variableInEdit = null : variableInEdit = variable\"\r\n [aria-description]=\"'press enter to edit ' + variable\">\r\n {{variable}}\r\n\r\n </mat-chip-option >\r\n\r\n }\r\n <input placeholder=\"\" style=\"display: none;\" [matChipInputFor]=\"chipGrid\" />\r\n </mat-chip-grid>\r\n @if(variableInEdit !== null ){\r\n <app-api-value-access-rules \r\n [value]=\"valueAccessRules[variableInEdit]||[]\"\r\n [errors]=\"[]\" [formInputs]=\"formInputs ||[]\"\r\n [mapToData]=\"data\"\r\n (valueChanged)=\"activeVariableChanged($event)\">\r\n </app-api-value-access-rules>\r\n \r\n \r\n\r\n\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>}","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 { Component, EventEmitter, Input, NgZone, OnDestroy, Output } from '@angular/core';\r\nimport { AllFormInputPrimaryKeys, BlurHandleTypes, ElementEditorInnerSectionElementInterface, ElementEditorTypes, ElementTypes, IGetTreeResponse, IWorkflowOption } from \"ngx-t-forms-types\";\r\n\r\nimport {\r\n BehaviorSubject,\r\n combineLatest,\r\n debounceTime,\r\n\r\n distinctUntilChanged,\r\n\r\n map,\r\n\r\n Observable,\r\n\r\n of,\r\n\r\n Subscription, switchMap, take, tap,\r\n withLatestFrom\r\n} from 'rxjs';\r\nimport { assignDeepPropertyToObject } from '../../shared';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../shared/modules/mat-modules.module';\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 { 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\n\r\n\r\nexport interface IConfigElementError {\r\n\r\n key: string;\r\n message: string;\r\n}\r\n\r\n@Component({\r\n selector: 'lib-t-dynamic-data-edit',\r\n standalone: true,\r\n imports: [CommonModule,\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 MatModulesModule,\r\n ChipOptionsCreatorEditorComponent,\r\n DataSourcePickerComponent,\r\n DocumentListLabelConfigEditorComponent,\r\n TWorkflowPickerComponent,\r\n EditorJsInputComponent,\r\n RecordListManagerComponent,\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\r\n})\r\nexport class TDynamicDataEditComponent implements OnDestroy {\r\n private editorInitiated: boolean = false;\r\n constructor(private ngZone: NgZone) { }\r\n ngOnDestroy(): void {\r\n this.subscription.unsubscribe();\r\n\r\n }\r\n private valueChanges: BehaviorSubject<unknown> | undefined = new BehaviorSubject<unknown>('');\r\n private subscription = new Subscription();\r\n elementEditorTypes = ElementEditorTypes\r\n private _editorConfig = new BehaviorSubject<ElementEditorInnerSectionElementInterface | undefined>(undefined)\r\n private _data = new BehaviorSubject<any>(undefined)\r\n @Input() set editorConfig(config: ElementEditorInnerSectionElementInterface | undefined) {\r\n this._editorConfig.next(config)\r\n }\r\n _formInputs$ = new BehaviorSubject<FormColumnInputs[]>([])\r\n _formInputs: FormColumnInputs[] = []\r\n @Input() set formInputs(inputs: Array<FormColumnInputs>) {\r\n this._formInputs = inputs\r\n }\r\n get formInputs() {\r\n return this._formInputs\r\n }\r\n @Input() set data(data: any) {\r\n if(_isEqual(this._data.getValue(),data)) return;\r\n this._data.next(data)\r\n if (!this.editorInitiated) {\r\n this.editorInitiated = true\r\n this.initializeValueChanges(data);\r\n\r\n }\r\n\r\n }\r\n get data() {\r\n return this._data.getValue()\r\n }\r\n @Input() validationErrors: IConfigElementError[] | null = null\r\n @Output() valueChange = new EventEmitter<unknown>()\r\n @Output() blur = new EventEmitter<any>()\r\n\r\n\r\n editorConfigValue$ = this._editorConfig.asObservable()\r\n dataValue$ = this._data.asObservable()\r\n 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 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 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 && !!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\r\n 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 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\r\n\r\n private 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 // Filter out undefined/null values to prevent processing invalid data\r\n\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, data, 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, data, 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\r\n this.ngZone.run(() => {\r\n let value = result ?? defaultValue;\r\n this.valueChange.emit(value);\r\n });\r\n return;\r\n \r\n\r\n\r\n\r\n })\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 private 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\r\n inputChange(event: any): void {\r\n const value = event.target.value;\r\n\r\n this.valueChanges?.next(value);\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 }\r\n this.valueChanges?.next(value)\r\n\r\n\r\n\r\n }\r\n manualValueChange(event: { value: unknown, deepBind: Array<string> }) {\r\n const { value, deepBind } = event\r\n this.dataValue$.pipe(\r\n take(1),\r\n tap((data) => {\r\n if (!data) return;\r\n const updated = { ...data };\r\n assignDeepPropertyToObject(updated, deepBind || [], value);\r\n this.valueChange.emit(updated)\r\n }),\r\n ).subscribe()\r\n\r\n }\r\n\r\n // Optimize blur handling\r\n blurOff: boolean = false;\r\n elementBlur(event: any): void {\r\n if (this.blurOff) return;\r\n \r\n this.ngZone.run(() => this.blur.emit(event));\r\n\r\n }\r\n get inputHasBlurFunction$(): Observable<BlurHandleTypes | undefined> {\r\n\r\n return this.editorConfigValue$.pipe(\r\n map((config) => config?.blurHandle)\r\n )\r\n\r\n }\r\n blurFunctionTooltip(blurHandle: BlurHandleTypes | undefined) {\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 formatLabel = (value: number) => value as any;\r\n 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 ]\r\n ).pipe(\r\n map(([editorConfigValue, value, dataOptions, disabled, inputHasBlurFunction, dataValue]) => {\r\n const inputConfig: any = {\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\r\n workflowFormForScoreSheet: '',\r\n\r\n adjudicationPointTypes: [],\r\n adjudicationReviewFeedbackTemplate: undefined\r\n }\r\n return {\r\n editorConfigValue,\r\n value,\r\n dataOptions,\r\n disabled,\r\n inputHasBlurFunction,\r\n dataValue,\r\n inputConfig\r\n\r\n }\r\n })\r\n )\r\n\r\n}\r\n","@defer {\r\n<ng-container *ngIf=\"( vm$ |async) as vm\">\r\n\r\n <mat-form-field appearance=\"outline\" [color]=\"((validationErrors)||[]||[]).length>0 ? 'warn' : 'primary'\"\r\n [floatLabel]=\"'always'\" [subscriptSizing]=\"'dynamic'\" [hintLabel]=\"vm.editorConfigValue?.hint||''\">\r\n <mat-label> {{ (vm. editorConfigValue)?.label }} </mat-label>\r\n @switch ((vm. editorConfigValue)?.editType) {\r\n @default {\r\n <lib-input-custom \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [inputConfig]=\"vm.inputConfig\"\r\n [placeholder]=\"(vm. editorConfigValue)?.placeholder ||'Enter value'\"\r\n [required]=\"!!(vm. editorConfigValue)?.required\"\r\n [disabled]=\"!!(vm.disabled)\"\r\n [ngModel]=\"(vm.value)\"\r\n (blur)=\"elementBlur($event)\"\r\n (input)=\"inputChange($event)\" ></lib-input-custom>\r\n \r\n\r\n }\r\n @case ( elementEditorTypes.Toggle) {\r\n <lib-mat-slider-toggle-editor\r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [name]=\"((vm. editorConfigValue)?.name||'') \"\r\n [label]=\"((vm. editorConfigValue)?.label||'')\" [disabled]=\"(vm.disabled)||false\"\r\n (valueChange)=\"valueChanged(!!$event)\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\">\r\n </lib-mat-slider-toggle-editor>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.Range) {\r\n\r\n\r\n <lib-mat-slider-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [format]=\"( vm.editorConfigValue)?.format \" [formatLabel]=\" formatLabel\"\r\n [disabled]=\"(vm.disabled)||false\" [max]=\"( vm.editorConfigValue)?.max || 100\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [min]=\"( vm.editorConfigValue)?.min || 0\"\r\n (valueChange)=\"inputChange($event)\" [step]=\"( vm.editorConfigValue)?.step || 1\"\r\n tickInterval=\"( vm.editorConfigValue)?.step || 1\">\r\n\r\n\r\n </lib-mat-slider-editor>\r\n\r\n\r\n\r\n }\r\n\r\n @case (elementEditorTypes.ChipSelect) {\r\n <lib-mat-chip-list-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [disabled]=\"(vm.disabled)||false\"\r\n [options]=\"(vm.editorConfigValue)?.options || vm.dataOptions\"\r\n [required]=\"!!( vm.editorConfigValue)?.required\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"\r\n (valueChange)=\" valueChanged($event)\"></lib-mat-chip-list-editor>\r\n\r\n\r\n }\r\n\r\n @case (elementEditorTypes.OptionSelect) {\r\n\r\n <mat-select \r\n \r\n [value]=\"(vm.value)\" (selectionChange)=\"valueChanged($event.value)\"\r\n [disabled]=\"(vm.disabled)||false\">\r\n @for(option of ( vm.editorConfigValue)?.options || vm.dataOptions;track option.value){\r\n <mat-option [value]=\"option.value\">{{option.label}}</mat-option>\r\n }\r\n </mat-select>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.RichTextEditor) {\r\n <lib-editor-js-input \r\n \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [value]=\"(vm.value)\" (valueChanged)=\"valueChanged($event)\"\r\n [disabled]=\"(vm.disabled)||false\" [inputConfig]=\"data\">\r\n </lib-editor-js-input>\r\n }\r\n\r\n\r\n @case (elementEditorTypes.SelectionOptions) {\r\n\r\n <app-selection-options-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [errors]=\"(validationErrors)||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\"\r\n [options]=\"(vm.value) || []\" (valueChanged)=\"valueChanged($event)\"></app-selection-options-editor>\r\n }\r\n\r\n @case (\r\n elementEditorTypes.ApiCall) {\r\n\r\n <lib-rest-api-call-setup \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\"\r\n [httpGetDataFunction]=\"(vm.editorConfigValue)?.httpGetDataFunction\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\">\r\n\r\n </lib-rest-api-call-setup>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.MongoPipelineBuilder) {\r\n\r\n <app-pipeline-generator [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getWorkflowOptions]=\"getWorkflowOptions$\"\r\n (valueChanged)=\"valueChanged($event)\"></app-pipeline-generator>\r\n\r\n }\r\n @case (elementEditorTypes.MapMatOptionsKeys) {\r\n <lib-map-mat-options-keys [disabled]=\"(vm.disabled)||false\"\r\n [value]=\"(vm.value)\"\r\n [formInputs]=\"formInputs || []\"\r\n [mapToData]=\"vm.dataOptions\"\r\n [errors]=\"(validationErrors)||[]\"\r\n (valueChanged)=\"valueChanged($event)\">\r\n </lib-map-mat-options-keys>\r\n <pre>\r\n {{vm.inputConfig.matOptions|json}}\r\n </pre>\r\n \r\n }\r\n @case (elementEditorTypes.ApiValueAccessRules) {\r\n\r\n\r\n\r\n <app-api-value-access-rules [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" \r\n [formInputs]=\"formInputs ||[]\"\r\n \r\n [postmanCollectionConfig]=\"(vm.editorConfigValue)?.postmanCollectionConfig\" [mapToData]=\"vm.dataOptions\"\r\n (valueChanged)=\"valueChanged($event)\">\r\n </app-api-value-access-rules>\r\n\r\n }\r\n\r\n @case (elementEditorTypes.FormInputSelector)\r\n {\r\n\r\n <lib-form-input-selector [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [formInputs]=\"formInputs ||[]\"\r\n [errors]=\"(validationErrors)||[]\" [value]=\"(vm.value) || []\" (change)=\"valueChanged($event)\">\r\n </lib-form-input-selector>\r\n }\r\n\r\n @case (\r\n elementEditorTypes.RequiredInputs\r\n ){\r\n\r\n <app-required-inputs [formInputs]=\"formInputs ||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\">\r\n </app-required-inputs>\r\n }\r\n\r\n @case(elementEditorTypes.CalculatedFieldRules){\r\n\r\n <app-calculated-field-rules [formInputs]=\"formInputs ||[]\" [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\"\r\n [mapToData]=\"vm.dataOptions\"></app-calculated-field-rules>\r\n }\r\n\r\n @case(elementEditorTypes.Validators){\r\n\r\n <app-validators-config [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" (valueChanged)=\"valueChanged($event)\" [formInputs]=\"formInputs ||[]\"\r\n [mapToData]=\"vm.dataOptions\">\r\n </app-validators-config>\r\n\r\n }\r\n @case(elementEditorTypes.ConfigMscoaSegments){\r\n\r\n <app-mscoa-segment-config [disabled]=\"(vm.disabled)||false\" [id]=\"((vm.editorConfigValue)?.id)\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getMscoaTree]=\"getMscoaTree$\" [dataValue]=\"vm.dataValue\"\r\n [isCashSegmentConfig]=\"vm.editorConfigValue?.deepBind?.at(-1) === 'cashSegments'\"\r\n [showAllSegments]=\"vm.dataOptions\" (valueChanged)=\"valueChanged($event)\"></app-mscoa-segment-config>\r\n }\r\n @case(elementEditorTypes.ConfigMscoaAdditionalInputs){\r\n\r\n <app-config-mscoa-additional-inputs [disabled]=\"(vm.disabled)||false\"\r\n [id]=\"((vm.editorConfigValue)?.label||'')+((vm.editorConfigValue)?.editType||'')\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\" [getMscoaTree]=\"getMscoaTree$\" [mapToData]=\"vm.dataOptions\">\r\n (valueChanged)=\"valueChanged($event)\">\r\n </app-config-mscoa-additional-inputs>\r\n\r\n }\r\n @case (elementEditorTypes.ChipOptionsCreator) {\r\n <lib-chip-options-creator-editor [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" (valueChange)=\"valueChanged($event)\"\r\n [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\">\r\n\r\n </lib-chip-options-creator-editor>\r\n\r\n }\r\n @case (elementEditorTypes.DataSourcePicker) {\r\n <lib-data-source-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [editorConfig]=\"vm. editorConfigValue\"\r\n (valueChange)=\"valueChanged($event)\" [formInputs]=\"formInputs ||[]\" [value]=\"(vm.value)\"\r\n [errors]=\"(validationErrors)||[]\">\r\n </lib-data-source-picker>\r\n }\r\n @case (elementEditorTypes.ListLabelConfigEditor) {\r\n <lib-document-list-label-config-editor \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [formInputs]=\"formInputs ||[]\"\r\n [disabled]=\"(vm.disabled)||false\" \r\n [editorConfig]=\"vm. editorConfigValue\"\r\n (valueChange)=\"valueChanged($event)\" \r\n [value]=\"(vm.value)\" [mapToData]=\"vm.dataOptions\"\r\n [errors]=\"(validationErrors)||[]\">\r\n\r\n </lib-document-list-label-config-editor>\r\n }\r\n @case(\r\n elementEditorTypes.WorkflowPicker\r\n ){\r\n <lib-t-workflow-picker [id]=\"((vm.editorConfigValue)?.id)\" [disabled]=\"(vm.disabled)||false\" [getWorkflowOptions]=\"getWorkflowOptions$\"\r\n (valueChanged)=\"valueChanged($event)\" [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"\r\n [value]=\"(vm.value)\"></lib-t-workflow-picker>\r\n }\r\n @case (\r\n elementEditorTypes.RecordListManager\r\n ) {\r\n <lib-record-list-manager \r\n [id]=\"((vm.editorConfigValue)?.id)\"\r\n [editorConfig]=\"vm.editorConfigValue\" [disabled]=\"(vm.disabled)||false\"\r\n [formInputs]=\"formInputs ||[]\" [mapToData]=\"vm.dataOptions\" (valueChange)=\"valueChanged($event)\"\r\n \r\n [value]=\"(vm.value)\" [errors]=\"(validationErrors)||[]\"></lib-record-list-manager>\r\n }\r\n }\r\n\r\n <button [matTooltip]=\"blurFunctionTooltip((vm.editorConfigValue)?.blurHandle)\" *ngIf=\"(vm.inputHasBlurFunction)\"\r\n [disabled]=\"(vm.disabled)\" [color]=\"blurOff?'':'primary'\" (click)=\"blurOff=!blurOff\" matSuffix\r\n mat-icon-button>\r\n <mat-icon>{{\r\n blurOff?'blur_off':'blur_on'\r\n }}\r\n\r\n\r\n </mat-icon>\r\n </button>\r\n </mat-form-field>\r\n\r\n @if (!(vm.value) && (vm. editorConfigValue)?.required ) {\r\n <mat-error>\r\n {{ (vm. editorConfigValue)?.label }}'s is required\r\n </mat-error>}\r\n\r\n <mat-error style=\" font-size: 0.75em;\r\n margin-left: 14px;\r\n \" *ngFor=\"let error of (validationErrors)||[]\">\r\n\r\n {{error.message}}</mat-error>\r\n\r\n</ng-container>\r\n\r\n}@error {\r\n<mat-card>\r\n <mat-card-content>\r\n\r\n <span>\r\n Failed to load form inputs\r\n </span>\r\n </mat-card-content>\r\n</mat-card>\r\n}\r\n\r\n\r\n\r\n<!-- - \r\n `TableConfigSetup`\r\n- `ConditionalInputConfig`\r\n- `MatrixTable`-->","import { Component, Input, SimpleChanges } from '@angular/core';\r\nimport { TreeComponent } from '../t-dynamic-data-edit/elements/api-value-access-rules/functions/convertDataToTree';\r\nimport { MatModulesModule } from '../../shared/modules/mat-modules.module';\r\n\r\n@Component({\r\n selector: 'lib-t-dynamic-data-view',\r\n standalone: true,\r\n imports: [MatModulesModule,],\r\n templateUrl: './t-dynamic-data-view.component.html',\r\n styleUrl: './t-dynamic-data-view.component.css'\r\n})\r\nexport class TDynamicDataViewComponent {\r\n treeClass: TreeComponent = new TreeComponent()\r\n @Input() data: any;\r\n constructor() { }\r\n _data: any\r\n ngOnInit() {}\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['data']) {\r\n if (JSON.stringify(this._data) !== JSON.stringify(changes['data'].currentValue)) {\r\n this._data = changes['data'].currentValue\r\n this.treeClass.computeTreeData(changes['data'].currentValue)\r\n \r\n }\r\n\r\n }\r\n \r\n }\r\n getNodeValueColor(value: any) {\r\n if (typeof value === 'string') {\r\n return 'green'\r\n }\r\n if (typeof value === 'number') {\r\n return 'blue'\r\n }\r\n if (typeof value === 'boolean') {\r\n return 'purple'\r\n }\r\n \r\n return 'black'\r\n }\r\n}\r\n","<mat-tree [dataSource]=\"treeClass.dataSource\" [treeControl]=\"treeClass.treeControl\">\r\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding>\r\n <button disabled style=\"padding: 0px; \r\n width: 24px;\" mat-icon-button>\r\n\r\n </button>\r\n <div style=\"display: flex;align-items: center;\">\r\n <span class=\"node-key\">{{ node.key }}</span>\r\n <span>\r\n :\r\n </span>\r\n <span \r\n style=\" white-space: nowrap;\"\r\n [style.color]=\"getNodeValueColor(node.value)\"\r\n class=\"node-value\" >\r\n {{ node.value }}\r\n </span>\r\n </div>\r\n \r\n </mat-tree-node>\r\n\r\n <mat-tree-node *matTreeNodeDef=\"let node; when: treeClass.hasChild\" matTreeNodePadding>\r\n <button style=\"padding: 0px; \r\n width: 24px;\" mat-icon-button matTreeNodeToggle [attr.aria-label]=\"'Toggle ' + node.key\">\r\n <mat-icon>\r\n {{ treeClass.treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n <span class=\"node-key\"> <strong>{{ node.key }}</strong></span>\r\n \r\n </mat-tree-node>\r\n </mat-tree>","import { Component, Input } from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../shared/modules/mat-modules.module';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\n@Component({\r\n selector: 'lib-t-form-input-status',\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule],\r\n templateUrl: './t-form-input-status.component.html',\r\n styleUrl: './t-form-input-status.component.css'\r\n})\r\nexport class TFormInputStatusComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n recentlyUpdated() {\r\n if(!this.inputConfig){\r\n return false;\r\n }\r\n const valueUpdatedAt = this.inputConfig.valueUpdatedAt;\r\n if(!valueUpdatedAt) return false;\r\n const now = new Date();\r\n const updated = new Date(valueUpdatedAt);\r\n const diffInSeconds = Math.floor((now.getTime() - updated.getTime()) / 1000);\r\n\r\n return diffInSeconds < 30; // Consider \"a few seconds\" as less than 30 seconds\r\n }\r\n get busy(): boolean {\r\n const statusObj = this.inputConfig?.status || {};\r\n const hasActiveBusyStatus = Object.entries(statusObj)\r\n .some(([_, value]) => Boolean(value));\r\n \r\n \r\n return hasActiveBusyStatus;\r\n }\r\n get busyMessage(): string {\r\n //combine status values into a single string\r\n const statusObj = this.inputConfig?.status || {};\r\n const busyMessages = Object.entries(statusObj)\r\n .filter(([_, value]) => Boolean(value))\r\n .map(([key,value]) => value);\r\n return busyMessages.join(', ');\r\n }\r\n get isReadOnly(){\r\n return Boolean(this.inputConfig?.readonly || false)\r\n }\r\n}\r\n","\r\n\r\n <mat-icon color=\"primary\" \r\n matTooltip=\"recently updated\"\r\n *ngIf=\"!busy && recentlyUpdated()\">update\r\n </mat-icon>\r\n @if (isReadOnly) {\r\n <mat-icon \r\n style=\"opacity:0.5;\" \r\n matTooltip=\"Read only\"\r\n >\r\n edit_off\r\n </mat-icon>\r\n }\r\n \r\n @if(busy === true) { \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 }\r\n\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 { Component, inject, OnInit } 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 { FormColumnInputs, FormInterface } from \"ngx-t-forms-types\";\r\n\r\nimport { DataSources } from \"ngx-t-forms-types\";\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../../lib/injection-tokens';\r\n\r\n\r\n@Component({\r\n selector: 'app-scoa-input',\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule, ReactiveFormsModule,\r\n \r\n ...TourMatMenu,],\r\n templateUrl: './scoa-input.component.html',\r\n styleUrl: './scoa-input.component.scss',\r\n\r\n\r\n})\r\nexport class ScoaInputComponent implements OnInit {\r\n ngOnInit(): void {\r\n\r\n }\r\n saveFormData = (data: any) => {\r\n return of(data)\r\n }\r\n createForm(): FormInterface {\r\n\r\n return {\r\n formId: this.inputConfig.id,\r\n \r\n submissionHandle:{\r\n submissionAPI: [{\r\n _id: '',\r\n name: '',\r\n httpEndPoint: '',\r\n inputSourceId: '',\r\n httpMethod: 'GET',\r\n postFormData: false,\r\n\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 \r\n slides: [{\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 activeFormClass= undefined\r\n dataInjected = inject(MAT_DIALOG_DATA);\r\n inputConfig:FormColumnInputs = this.dataInjected.input;\r\n formGroup: FormGroup = this.dataInjected.formGroup\r\n value: any = this.dataInjected.value;\r\n heading = this.dataInjected.heading\r\n subHeading = this.dataInjected.subHeading\r\n\r\n get hasError() {\r\n const isRequired = this.inputConfig.validators.includes('required') || this.inputConfig.required\r\n return isRequired && !this.value\r\n }\r\n\r\n // private formActions = {\r\n // submitForm: (data: { [key: string]: any }) => this.save(data),\r\n // saveForm: function (formId:string,data: { [key: string]: any; }): Observable<void> {\r\n // console.warn('not implemented')\r\n // return of()\r\n // },\r\n \r\n // }\r\n NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN)\r\n constructor(public dialogRef: MatDialogRef<ScoaInputComponent>) {\r\n this.createForm()\r\n\r\n // this.activeFormClass = new TFormControllerService(form,this.NGX_T_FORMS_CONFIG,this.formActions,this.httpClient)\r\n }\r\n\r\n getContentInput() {\r\n // const slides: TFormControllerService = this.activeFormClass || ({} as TFormControllerService)\r\n // return Object.keys(slides).length > 0 ? (slides?.getContentInput() as TInputControllerService[]) : ([] as TInputControllerService[]);\r\n return [] as any\r\n }\r\n trackByFn(index: number, item: any) {\r\n return item.input.id\r\n }\r\n\r\n save(data:any): Observable<void> {\r\n // const value = this.activeFormClass?.activeFormGroup()?.value\r\n // this.dialogRef.close(value)\r\n return of()\r\n }\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 { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, inject, Input, Output } from '@angular/core';\r\n\r\nimport { SCOA_ACCOUNT_COLUMNS } from '../../store/accountConstants';\r\n\r\nimport { ScoaInputComponent } from '../scoa-input/scoa-input.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { take } from 'rxjs';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { IScoaAccount } from \"ngx-t-forms-types\";\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';;\r\n\r\n@Component({\r\n selector: 'app-account-value',\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule],\r\n templateUrl: './account-value.component.html',\r\n styleUrl: './account-value.component.scss'\r\n})\r\nexport class AccountValueComponent {\r\n @Input() mscoaAccount: IScoaAccount | undefined;\r\n @Input() accountInputs: FormColumnInputs[] = [];\r\n @Input() userCanClearAccount = false;\r\n @Output() clearSelectedAccount = new EventEmitter<void>();\r\n @Output() updateAccount = new EventEmitter<IScoaAccount>();\r\n get accountDetails() {\r\n if (!this.mscoaAccount) return [];\r\n const descriptions = Object.keys(this.mscoaAccount).filter(key => key.includes('_description')).map(\r\n key => {\r\n return {\r\n label: key.replace('_', ' '),\r\n key\r\n };\r\n }\r\n );\r\n const li = [...SCOA_ACCOUNT_COLUMNS,...descriptions].map(col => ({\r\n label: col.label,\r\n value: (this.mscoaAccount || {})[col.key as keyof IScoaAccount] ,\r\n input: false,\r\n })).filter(item => item.value !== undefined);\r\n const inputs = this.accountInputs.map(input => ({\r\n label: input.label,\r\n value: this.mscoaAccount?.[input.formControlName as keyof IScoaAccount],\r\n formControlName: input.formControlName,\r\n input: true,\r\n }));\r\n const version = {\r\n label:\"Scoa Version\",\r\n value:( this.mscoaAccount as any)?.version.versionNumber,\r\n formControlName: \"versionNumber\",\r\n input: false,\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 isLongText(value: any): 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 isLongDescription(value: any): 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 clearAccount() {\r\n this.clearSelectedAccount.emit();\r\n }\r\n readonly dialog = inject(MatDialog);\r\n openValueEdit(inpu: any) {\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: this.mscoaAccount?.[inpu.formControlName as keyof IScoaAccount]\r\n },\r\n heading: `${this.mscoaAccount?.SCOAAccount} - ${inpu.label}`,\r\n value: this.mscoaAccount?.[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.afterClosed().pipe(take(1)).subscribe(result => {\r\n if (result) {\r\n this.mscoaAccount = {\r\n ...this.mscoaAccount,\r\n [inpu.formControlName]: result\r\n } as any\r\n this.updateAccount.emit(this.mscoaAccount);\r\n\r\n }\r\n\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]=\"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 { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { MatPaginator } from '@angular/material/paginator';\r\nimport { MatSort } from '@angular/material/sort';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { MatCheckboxChange } from '@angular/material/checkbox';\r\nimport { MIN_ACCOUNT_DETAILS, SCOA_ACCOUNT_COLUMNS } from '../../store/accountConstants';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { IScoaAccount } from \"ngx-t-forms-types\";\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\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@Component({\r\n selector: 'app-scoa-account-table',\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule,ReactiveFormsModule],\r\n templateUrl: './scoa-account-table.component.html',\r\n styleUrl: './scoa-account-table.component.scss'\r\n})\r\nexport class ScoaAccountTableComponent implements OnChanges, OnInit {\r\n @Input() data: { accounts: IScoaAccount[], account: string } | undefined;\r\n @Output() accountSelected = new EventEmitter<IScoaAccount | null>();\r\n dataSource: MatTableDataSource<IScoaAccount>;\r\n searchControl = new FormControl('');\r\n @Input() selectedAccount: IScoaAccount | null = null;\r\n @Input() segment: string | undefined\r\n\r\n minViewCol: string[] = [];\r\n\r\n scoaAccountColumns: any[] = [];\r\n colDisplayChanged(event: MatCheckboxChange, col: string) {\r\n const checked = event.checked\r\n if (checked) {\r\n this.minViewCol.push(col)\r\n return\r\n }\r\n\r\n this.minViewCol = this.minViewCol.filter(d => d !== col)\r\n\r\n }\r\n showFullAccountDetails: boolean = false\r\n get displayColumns() {\r\n const cols = this.scoaAccountColumns.map(h => h.key)\r\n if (!this.showFullAccountDetails) {\r\n return cols.filter(c => this.minViewCol.includes(c))\r\n }\r\n return [...cols,'selected']\r\n }\r\n colIsChecked(col: string) {\r\n return this.minViewCol.includes(col)\r\n }\r\n\r\n @ViewChild(MatSort, { static: true }) sort!: MatSort;\r\n @ViewChild(MatPaginator, { static: true }) paginator!: MatPaginator;\r\n constructor() {\r\n this.dataSource = new MatTableDataSource<IScoaAccount>([]);\r\n }\r\n\r\n ngOnInit() {\r\n this.scoaAccountColumns = SCOA_ACCOUNT_COLUMNS\r\n this.minViewCol = MIN_ACCOUNT_DETAILS\r\n this.dataSource.sort = this.sort;\r\n this.dataSource.paginator = this.paginator;\r\n this.searchControl.valueChanges.subscribe(value => {\r\n this.applyFilter(value || '');\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['data'] && changes['data'].currentValue) {\r\n const newData = changes['data'].currentValue.accounts;\r\n this.dataSource.data = this.mapAccounts(newData);\r\n // Ensure paginator is connected after data changes\r\n if (this.paginator && this.dataSource.paginator !== this.paginator) {\r\n this.dataSource.paginator = this.paginator;\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Checks if paginator should be shown\r\n */\r\n get shouldShowPaginator(): boolean {\r\n return this.dataSource && this.dataSource.data && this.dataSource.data.length > 0;\r\n }\r\n\r\n mapAccounts(accounts: 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 removeTrailingZeros(str: string) {\r\n // Use a regular expression to remove trailing zeros\r\n return str.replace(/0+$/, '');\r\n }\r\n applyFilter(filterValue: string) {\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\r\n selectAccount(account: IScoaAccount) {\r\n const isActive = this.rowIsActivated(account)\r\n if (!isActive) {\r\n return\r\n }\r\n if (this.selectedAccount && this.selectedAccount.SCOAid === account.SCOAid) {\r\n this.accountSelected.emit(null)\r\n return\r\n }\r\n this.accountSelected.emit(account)\r\n }\r\n clearSearch() {\r\n this.searchControl.setValue('');\r\n \r\n }\r\n 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 showMinMal: boolean = true\r\n toogleDetails() {\r\n this.showMinMal = !this.showMinMal\r\n if (this.showMinMal) {\r\n\r\n this.minViewCol = MIN_ACCOUNT_DETAILS\r\n return\r\n } else {\r\n this.minViewCol = SCOA_ACCOUNT_COLUMNS.map(h => h.key)\r\n }\r\n\r\n }\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 <ng-container *ngFor=\"let column of scoaAccountColumns\" \r\n [matColumnDef]=\"column.key\"\r\n [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 <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>","import { CommonModule } from '@angular/common';\nimport { Component, HostListener, inject, OnDestroy, OnInit } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { catchError, debounceTime, distinctUntilChanged, finalize, map, Observable, of, shareReplay, startWith, Subject, takeUntil, tap } from 'rxjs';\n\nimport { FlatTreeControl } from '@angular/cdk/tree';\nimport { MatTreeFlattener, MatTreeFlatDataSource } from '@angular/material/tree';\n\nimport _ from 'lodash';\n\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { IIncludedSegmentConfig, IScoaAccount, ScoaAccountTree, TreeNode } from \"ngx-t-forms-types\";\nimport { convertToTree, ObjectTreeFlatNode, ObjectTreeNode } from '../../../../../t-dynamic-data-edit/elements/api-value-access-rules/functions/convertDataToTree';\nimport { FormColumnInputs } from 'ngx-t-forms-types';\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\nimport { AccountValueComponent } from '../account-value/account-value.component';\nimport { ScoaAccountTableComponent } from '../scoa-account-table/scoa-account-table.component';\nimport { FormControl, ReactiveFormsModule, ɵInternalFormsSharedModule } from '@angular/forms';\nimport { fuzzySearch } from '../../../../../../shared/functions/fuzzyTextSearch';\n\nexport interface IMscoaComputationComponentData {\n data: ScoaAccountTree;\n segment: string;\n value: IScoaAccount | undefined;\n accountInputs: FormColumnInputs[];\n activeColumn: string | undefined;\n segmentConfig: IIncludedSegmentConfig | undefined;\n readonly: boolean;\n isCashSelection: boolean;\n getSCOAAccount: (account: string) => Observable<{ accounts: IScoaAccount[] }>;\n}\n\n\n@Component({\n selector: 'app-mscoa-computation',\n standalone: true,\n imports: [CommonModule,\n MatModulesModule,\n AccountValueComponent,\n ReactiveFormsModule,\n ScoaAccountTableComponent, ɵInternalFormsSharedModule],\n\n templateUrl: './mscoa-computation.component.html',\n styleUrl: './mscoa-computation.component.scss'\n})\n/**\n * Component for selecting SCOA (Standard Chart of Accounts) accounts from a hierarchical tree structure.\n * Opens as a dialog and allows users to browse, search, and select accounts.\n */\nexport class MscoaComputationComponent implements OnInit, OnDestroy {\n // Injected dependencies\n private readonly dataInjected = inject(MAT_DIALOG_DATA) as IMscoaComputationComponentData;\n private readonly sanitizer = inject(DomSanitizer);\n readonly dialogRef: MatDialogRef<MscoaComputationComponent>;\n\n // Component data from injection\n readonly data: ScoaAccountTree | undefined;\n readonly segment: string | undefined;\n readonly value: IScoaAccount | undefined;\n readonly accountInputs: FormColumnInputs[];\n readonly activeColumn: string | undefined;\n readonly isCashSelection: boolean;\n readonly readonly: boolean;\n readonly segmentConfig: IIncludedSegmentConfig | undefined;\n\n // Tree structure\n readonly treeControl: FlatTreeControl<ObjectTreeFlatNode>;\n private readonly treeFlattener: MatTreeFlattener<ObjectTreeNode, ObjectTreeFlatNode>;\n readonly dataSource: MatTreeFlatDataSource<ObjectTreeNode, ObjectTreeFlatNode>;\n\n // State management\n selectedTreeNode: ObjectTreeFlatNode | undefined;\n selectedAccount: IScoaAccount | null = null;\n searchAccounts: IScoaAccount[] = [];\n searchingAccounts: boolean = false;\n currentAccountPath: string | undefined;\n showSearchBar: boolean = false;\n\n // Form controls\n readonly accountSearchTextControl = new FormControl('');\n readonly searchedPaths$: Observable<string[][]>;\n\n // Lifecycle management\n private readonly destroy$ = new Subject<void>();\n\n // API result cache to prevent redundant calls\n private readonly accountCache = new Map<string, IScoaAccount[]>();\n\n // Error state\n errorMessage: string | null = null;\n hasError: boolean = false;\n\n constructor(dialogRef: MatDialogRef<MscoaComputationComponent>) {\n this.dialogRef = dialogRef;\n\n const injected = this.dataInjected ?? ({} as Partial<IMscoaComputationComponentData>);\n // Initialize component data (guard against undefined MAT_DIALOG_DATA)\n this.data = injected.data;\n this.segment = injected.segment;\n this.value = injected.value;\n this.accountInputs = injected.accountInputs ?? [];\n this.activeColumn = injected.activeColumn;\n this.isCashSelection = injected.isCashSelection ?? false;\n this.readonly = injected.readonly ?? false;\n this.segmentConfig = injected.segmentConfig;\n\n // Initialize tree structure\n this.treeControl = new FlatTreeControl<ObjectTreeFlatNode>(\n node => node.level,\n node => node.expandable\n );\n\n this.treeFlattener = new MatTreeFlattener(\n this.transformer,\n node => node.level,\n node => node.expandable,\n node => node.children\n );\n \n this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);\n\n // Initialize search observable with proper unsubscription\n this.searchedPaths$ = this.accountSearchTextControl.valueChanges.pipe(\n startWith(''),\n debounceTime(300),\n distinctUntilChanged(),\n map(text => this.searchTree(text || '')),\n shareReplay(1),\n takeUntil(this.destroy$)\n );\n }\n\n ngOnInit(): void {\n this.selectedAccount = this.value || null;\n this.dataSource.data = convertToTree(this.data) as unknown as ObjectTreeNode[];\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Checks if a tree node has children (is expandable)\n */\n hasChild = (_: number, node: ObjectTreeFlatNode): boolean => node.expandable;\n\n /**\n * Transforms a tree node into a flat node for the Material tree\n */\n private transformer = (node: ObjectTreeNode, level: number): ObjectTreeFlatNode => {\n return {\n expandable: !!node.children && node.children.length > 0,\n name: node.name,\n level: level,\n path: node.path\n };\n };\n\n /**\n * Searches the tree for nodes matching the search text using fuzzy search\n * @param searchText - The text to search for\n * @returns Array of matching paths\n */\n searchTree(searchText: string | null): string[][] {\n // 1. fast exit if no data\n if (!this.dataSource?.data) return [];\n\n // 2. Normalize search text once (optimization)\n const term = (searchText || '').toLowerCase();\n const results: string[][] = [];\n\n // 3. Define recursive visitor\n const traverse = (nodes: TreeNode[]) => {\n for (const node of nodes) {\n // Safety check\n if (!node) continue;\n\n const path = node.path;\n const nodeName = path?.at(-1)?.toLowerCase() || '';\n\n // Check match\n const isMatch = fuzzySearch(term, nodeName);\n\n if (path && isMatch) {\n results.push(path);\n }\n\n // Recurse if children exist\n if (Array.isArray(node.children) && node.children.length > 0) {\n traverse(node.children);\n }\n }\n };\n\n // 4. Start traversal\n traverse(this.dataSource.data as TreeNode[]);\n\n return results;\n }\n\n /**\n * Checks if a path is the currently selected path or a parent of it\n * @param path - The path to check\n * @returns True if the path is active or a parent of the selected path\n */\n isActivePathOrParent(path: string[]): boolean {\n if (!this.selectedTreeNode) {\n return false;\n }\n if (path.length > this.selectedTreeNode.path.length) {\n return false;\n }\n const samePath = this.selectedTreeNode.path?.every((p, i) => p === path[i]);\n if (samePath) {\n return true;\n }\n return path.every((p, i) => p === this.selectedTreeNode?.path[i]);\n }\n /**\n * Toggles the expansion state of a tree node.\n * Does not collapse siblings (like Windows Explorer / VS Code) for better context.\n */\n toggleNode(node: ObjectTreeFlatNode): void {\n if (node.expandable) {\n if (this.treeControl.isExpanded(node)) {\n this.treeControl.collapse(node);\n } else {\n this.treeControl.expand(node);\n }\n }\n }\n\n /**\n * Checks if any tree nodes are currently expanded\n */\n get noneIsExpanded(): boolean {\n return !this.treeControl.dataNodes.some(node => this.treeControl.isExpanded(node));\n }\n\n /**\n * Selects a tree node and loads its associated accounts\n * @param node - The node to select\n */\n selectNode(node: ObjectTreeFlatNode): void {\n const isSamePath = node.path.every((p, i) => p === this.selectedTreeNode?.path[i]);\n if (isSamePath) {\n this.cancel();\n return;\n }\n this.selectedTreeNode = node;\n this.loadAccountsForNode();\n }\n\n /**\n * Loads accounts for the currently selected tree node\n * Uses caching to prevent redundant API calls\n */\n private loadAccountsForNode(): void {\n const accountPath = this.selectedTreeNode?.path.join(\":\");\n if (!accountPath) {\n return;\n }\n\n // Check cache first\n if (this.accountCache.has(accountPath)) {\n this.searchAccounts = this.accountCache.get(accountPath)!;\n this.currentAccountPath = accountPath;\n this.clearError();\n return;\n }\n\n this.searchingAccounts = true;\n this.clearError();\n\n const getAccounts = this.dataInjected?.getSCOAAccount;\n if (!getAccounts) {\n this.searchAccounts = [];\n this.searchingAccounts = false;\n this.setError('Account loader not configured.');\n return;\n }\n\n getAccounts(accountPath).pipe(\n takeUntil(this.destroy$),\n tap(res => {\n this.searchAccounts = res.accounts;\n this.currentAccountPath = accountPath;\n // Cache the result\n this.accountCache.set(accountPath, res.accounts);\n this.clearError();\n }),\n catchError(error => {\n // Handle error gracefully\n this.searchAccounts = [];\n this.currentAccountPath = undefined;\n this.setError('Failed to load accounts. Please try again or select a different category.');\n return of({ accounts: [] });\n }),\n finalize(() => {\n this.searchingAccounts = false;\n })\n ).subscribe();\n }\n\n /**\n * Sets an error message to display to the user\n * @param message - The error message to display\n */\n private setError(message: string): void {\n this.errorMessage = message;\n this.hasError = true;\n }\n\n /**\n * Clears the current error state\n */\n private clearError(): void {\n this.errorMessage = null;\n this.hasError = false;\n }\n\n /**\n * Retries loading accounts for the current node\n */\n retryLoadAccounts(): void {\n if (this.selectedTreeNode) {\n // Clear cache for this path to force reload\n const accountPath = this.selectedTreeNode.path.join(\":\");\n this.accountCache.delete(accountPath);\n this.loadAccountsForNode();\n }\n }\n /**\n * Cancels the current selection and resets the component state\n */\n cancel(): void {\n this.selectedTreeNode = undefined;\n this.searchAccounts = [];\n this.selectedAccount = null;\n this.currentAccountPath = undefined;\n }\n\n /**\n * Saves the selected account and closes the dialog\n */\n saveAccount(): void {\n if (this.selectedAccount) {\n this.closeAndPassData(this.selectedAccount);\n } else {\n this.closeAndPassData(undefined);\n }\n }\n\n /**\n * Closes the dialog and passes the selected account back\n * @param account - The account to return, or undefined if cancelled\n */\n closeAndPassData(account: IScoaAccount | undefined): void {\n this.dialogRef.close(account);\n }\n\n /**\n * Selects an account from the account table\n * @param account - The account to select, or null to deselect\n */\n selectAccount(account: IScoaAccount | null): void {\n this.selectedAccount = account;\n }\n /**\n * Finds a tree node by its path (from tree data)\n * @param targetPath - The path to search for\n * @returns The found node or null if not found\n */\n getNodeByPath(targetPath: string[]): TreeNode | null {\n if (!targetPath?.length || !this.dataSource?.data) {\n return null;\n }\n\n const recursiveLookUp = (nodes: TreeNode[]): TreeNode | null => {\n for (const node of nodes) {\n if (!node) {\n continue;\n }\n\n // Check for exact match\n const isSameLength = node.path?.length === targetPath.length;\n const isMatch = isSameLength && node.path && targetPath.every((p, i) => p === node.path![i]);\n\n if (isMatch) {\n return node;\n }\n\n // Check children if this node is a potential parent\n const isPotentialParent = node.path &&\n node.path.length < targetPath.length &&\n node.path.every((p, i) => p === targetPath[i]);\n\n if (isPotentialParent && node.children?.length) {\n const foundInChildren = recursiveLookUp(node.children);\n if (foundInChildren) {\n return foundInChildren;\n }\n }\n }\n\n return null;\n };\n\n return recursiveLookUp(this.dataSource.data as TreeNode[]);\n }\n\n /**\n * Finds the flat node (from treeControl.dataNodes) by path.\n * Required for expand/select operations since Material tree uses flat nodes.\n */\n getFlatNodeByPath(targetPath: string[]): ObjectTreeFlatNode | null {\n if (!targetPath?.length || !this.treeControl.dataNodes?.length) {\n return null;\n }\n return this.treeControl.dataNodes.find(\n n => n.path && n.path.length === targetPath.length && n.path.every((p, i) => p === targetPath[i])\n ) ?? null;\n }\n\n /**\n * Expands all ancestor nodes so the target node is visible in the tree.\n * Does not collapse siblings (user keeps context of other branches).\n */\n expandPathToNode(flatNode: ObjectTreeFlatNode): void {\n const targetLevel = flatNode.level;\n for (const node of this.treeControl.dataNodes) {\n if (node.level < targetLevel && flatNode.path && node.path &&\n node.path.every((p, i) => p === flatNode.path![i])) {\n this.treeControl.expand(node);\n }\n }\n }\n\n /**\n * Selects a path from search results: expands path, selects node, loads accounts,\n * scrolls selection into view, then clears search.\n * Follows UX best practice: expand to path → select → scroll into view.\n */\n selectPath(path: string[]): void {\n const flatNode = this.getFlatNodeByPath(path);\n if (!flatNode) {\n return;\n }\n\n // 1. Expand path so target is visible (don't collapse siblings - keep context)\n this.expandPathToNode(flatNode);\n\n // 2. Select node and load accounts\n this.selectNode(flatNode);\n\n // 3. Clear search to show tree with selection in context\n this.clearSearch();\n\n // 4. Scroll selected node into view after DOM updates\n setTimeout(() => {\n const el = document.querySelector(`[data-tree-path=\"${path.join(':')}\"]`);\n el?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n });\n }\n\n /**\n * Clears the search input\n */\n clearSearch(): void {\n this.accountSearchTextControl.reset();\n }\n\n /**\n * Clears the selected account\n */\n clearSelectedAccount(): void {\n this.selectedAccount = null;\n }\n /**\n * Determines if the save button should be enabled\n * Checks if the account has changed and all required inputs are valid\n */\n get saveSelection(): boolean {\n const allInputsAreValid = this.accountInputs.every(input =>\n input.required || input.validators.includes(\"\") \n ? this.selectedAccount?.[input.formControlName as keyof IScoaAccount] \n : true\n );\n\n const isDifferent = !_.isEqual(this.selectedAccount, this.value);\n return isDifferent && allInputsAreValid;\n }\n\n /**\n * Updates the selected account with new values\n * @param account - The updated account\n */\n updateAccount(account: IScoaAccount): void {\n this.selectedAccount = account;\n }\n\n /**\n * Determines if the user can clear the selected account\n */\n get userCanClearAccount(): boolean {\n if (this.readonly) {\n return false;\n }\n return !this.segmentConfig?.readOnly;\n }\n\n /**\n * Handles keyboard navigation for the dialog\n * @param event - The keyboard event\n */\n @HostListener('keydown', ['$event'])\n handleKeyboardNavigation(event: KeyboardEvent): void {\n // Close dialog on Escape\n if (event.key === 'Escape' && !this.selectedAccount) {\n this.closeAndPassData(undefined);\n event.preventDefault();\n return;\n }\n\n // Don't interfere with input fields\n const target = event.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\n return;\n }\n\n // Handle Enter key for search results\n if (event.key === 'Enter' && this.accountSearchTextControl.value) {\n const searchResults = this.searchedPaths$ ? \n (this.searchedPaths$ as any).value || [] : [];\n if (searchResults.length > 0) {\n this.selectPath(searchResults[0]);\n event.preventDefault();\n }\n }\n }\n\n /**\n * Highlights search text in a given string\n * @param text - The text to highlight\n * @param searchTerm - The search term to highlight\n * @returns Safe HTML string with highlighted text\n */\n highlightSearchText(text: string, searchTerm: string): SafeHtml {\n if (!searchTerm || !text) {\n return this.sanitizer.bypassSecurityTrustHtml(text);\n }\n\n const regex = new RegExp(`(${this.escapeRegex(searchTerm)})`, 'gi');\n const highlighted = text.replace(regex, '<mark>$1</mark>');\n return this.sanitizer.bypassSecurityTrustHtml(highlighted);\n }\n\n /**\n * Escapes special regex characters in a string\n * @param str - The string to escape\n * @returns Escaped string\n */\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\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 \r\n mat-flat-button \r\n (click)=\"clearSelectedAccount(); cancel()\"\r\n [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 \r\n matInput \r\n [formControl]=\"accountSearchTextControl\"\r\n [placeholder]=\"('Search ' + segment + ' : ' + activeColumn + ' Account').toUpperCase()\"\r\n [attr.aria-label]=\"'Search for account'\"\r\n autocomplete=\"off\">\r\n <button \r\n mat-icon-button \r\n matSuffix \r\n (click)=\"clearSearch()\"\r\n [attr.aria-label]=\"'Clear search'\"\r\n 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) {\r\n <div class=\"account-details-container\" role=\"region\" [attr.aria-label]=\"'Account details'\">\r\n <app-account-value \r\n [accountInputs]=\"accountInputs\" \r\n [userCanClearAccount]=\"userCanClearAccount\"\r\n [mscoaAccount]=\"selectedAccount\" \r\n (updateAccount)=\"updateAccount($event)\"\r\n (clearSelectedAccount)=\"clearSelectedAccount()\">\r\n </app-account-value>\r\n </div>\r\n} @else {\r\n <!-- Main Content Area with Drawer -->\r\n <mat-drawer-container \r\n class=\"drawer-container\"\r\n [attr.aria-label]=\"'Account selection interface'\">\r\n <!-- Account Table Drawer -->\r\n <mat-drawer \r\n #drawer \r\n class=\"account-drawer\"\r\n mode=\"side\" \r\n 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 \r\n mat-flat-button \r\n color=\"primary\"\r\n (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 <app-scoa-account-table \r\n [selectedAccount]=\"selectedAccount\" \r\n [segment]=\"segment\"\r\n (accountSelected)=\"selectAccount($event)\" \r\n [data]=\"{\r\n accounts: searchAccounts,\r\n account: currentAccountPath || ''\r\n }\">\r\n </app-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 \r\n mat-flat-button \r\n (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 <div \r\n class=\"path-result-item\"\r\n role=\"listitem\"\r\n (click)=\"selectPath(searchedItem)\" \r\n [attr.aria-label]=\"'Load accounts for: ' + searchedItem.join(' > ') + '. Click to select.'\"\r\n tabindex=\"0\"\r\n (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 \r\n 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 }\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\" [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 \r\n [expanded]=\"false\"\r\n 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 \r\n \r\n [dataSource]=\"dataSource\" \r\n [treeControl]=\"treeControl\"\r\n 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 \r\n class=\"toggle-button\" \r\n mat-icon-button \r\n disabled\r\n aria-hidden=\"true\">\r\n </button>\r\n <mat-checkbox \r\n (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 \r\n color=\"primary\" \r\n 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 \r\n class=\"label\" \r\n [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 \r\n *matTreeNodeDef=\"let node; when: hasChild\" \r\n matTreeNodePadding \r\n role=\"treeitem\"\r\n [attr.data-tree-path]=\"node.path?.join(':')\"\r\n [attr.aria-expanded]=\"treeControl.isExpanded(node)\">\r\n <button \r\n class=\"toggle-button\" \r\n mat-icon-button \r\n [attr.aria-label]=\"(treeControl.isExpanded(node) ? 'Collapse' : 'Expand') + ' ' + node.name\"\r\n (click)=\"toggleNode(node)\"\r\n 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 \r\n (change)=\"selectNode(node)\" \r\n [disabled]=\"true\" \r\n [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 \r\n (change)=\"selectNode(node)\"\r\n [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\r\nstyle=\" background: var(--mscoa-surface-container) !important;\"\r\nalign=\"end\">\r\n<button \r\nclass=\"action-button close-button\"\r\nmat-button \r\n(click)=\"closeAndPassData(undefined)\"\r\n[attr.aria-label]=\"'Close dialog without saving'\"\r\ntype=\"button\">\r\n\r\nClose\r\n</button>\r\n @if (userCanClearAccount ) {\r\n <button \r\n class=\"action-button save-button\"\r\n mat-flat-button \r\n [disabled]=\"!saveSelection\" \r\n (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 singleSelect?: any; // Using 'any' based on !! usage in template\r\n segment?: string;\r\n inheritValueFromAccrual?: boolean;\r\n vatSelectonActive?: boolean;\r\n [key: string]: any; // Allow indexing for row[col]\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 { ACCOUNTING_BASIS, COLUMNS, SEGMENT_TYPES } from './mscoa-chart.constants';\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?: {\r\n vatApplicableTo?: string;\r\n [key: string]: any; // Allow dynamic properties in segmentValue\r\n } | any; // Allow IScoaAccount or other types\r\n innerInput?: any;\r\n [key: string]: any;\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 | any): boolean {\r\n return !!(row?.['innerInput'] && Object.keys(row['innerInput']).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 { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../../../../../shared/modules/mat-modules.module';\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: 'app-mscoa-chart-input-menu',\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule],\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 @Input() innerInput!: FormColumnInputs;\r\n @Input() countdownSeconds: number | null = null;\r\n @Input() hoveredId: string | null = null;\r\n @Output() edit = new EventEmitter<FormColumnInputs>();\r\n @Output() delete = new EventEmitter<FormColumnInputs>();\r\n @Output() cancelDelete = new EventEmitter<string>();\r\n @Output() hoverStart = new EventEmitter<string>();\r\n @Output() hoverEnd = new EventEmitter<void>();\r\n\r\n readonly DELETION_COUNTDOWN_SECONDS = DELETION_COUNTDOWN_SECONDS;\r\n\r\n get isDeleting(): boolean {\r\n return this.countdownSeconds !== null && this.countdownSeconds > 0;\r\n }\r\n\r\n get progressValue(): number {\r\n if (!this.countdownSeconds) return 0;\r\n return ((DELETION_COUNTDOWN_SECONDS - this.countdownSeconds) / DELETION_COUNTDOWN_SECONDS) * 100;\r\n }\r\n\r\n get isHovered(): boolean {\r\n return this.hoveredId === this.innerInput.id;\r\n }\r\n\r\n onEdit(): void {\r\n this.edit.emit(this.innerInput);\r\n }\r\n\r\n 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 onMouseEnter(): void {\r\n this.hoverStart.emit(this.innerInput.id);\r\n }\r\n\r\n 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]: any;\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]: any;\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 { combineLatest, distinctUntilChanged, filter, map } from \"rxjs\";\r\nimport { MscoaComponentStore } from \"./mscoa-component-store.service\";\r\nimport { IAccountSegmentTreeKeys, ScoaAccountTree, ScoaInnerInput, ScoaInterface, ScoaSegmentValue } from \"ngx-t-forms-types\";\r\nexport const noneVatableStatus = [\"Exempt\", \"N/A\", \"n/A\", \"N/a\", \"exempt\",]\r\nexport function mscoaStoreSelectors(store: MscoaComponentStore) {\r\n\r\n const state$ = store.select(state => state)\r\n const initiated$ = store.select((state) => state.initiated)\r\n\r\n const loadingTree$ = store.select((state) => state.loadingTree)\r\n const accountValueLabel$ = store.select((state) => state.accountValueLabel)\r\n const segmentValues$ = store.select(state => state.segmentValues).pipe(\r\n filter((segmentValues): segmentValues is ScoaSegmentValue => segmentValues !== undefined),\r\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr))\r\n )\r\n const accountTreeKeys$ = store.select((state) => extractTreeFromState(state))\r\n const cashAccountTreeKeys$ = store.select((state) => extractTreeFromState({\r\n ...state,\r\n segments: state.cashSegments,\r\n }, true))\r\n const table$ = combineLatest(\r\n [accountTreeKeys$, accountValueLabel$]\r\n ).pipe(map(([keys, accountValueLabel]) => keys.map(segment => transformSegment(segment, accountValueLabel))))\r\n const cashTable$ = combineLatest([cashAccountTreeKeys$, accountValueLabel$]).pipe(map(([keys, accountValueLabel]) => keys.map(segment => transformSegment(segment, accountValueLabel))))\r\n\r\n\r\n\r\n\r\n const hasVATApplicableAccount$ = table$.pipe(\r\n map(checkhasVat)\r\n )\r\n const cashHasVATApplicableAccount$ = cashTable$.pipe(\r\n map(checkhasVat)\r\n )\r\n const inputs$ = store.select(state => state.inputs)\r\n const validationErrors$ = store.select(state => state.validationErrors)\r\n const validatingValue$ = store.select(state => state.validatingValue)\r\n return {\r\n initiated$,\r\n loadingTree$,\r\n segmentValues$,\r\n accountTreeKeys$,\r\n\r\n table$,\r\n hasVATApplicableAccount$,\r\n inputs$,\r\n state$,\r\n validationErrors$,\r\n validatingValue$,\r\n cashAccountTreeKeys$,\r\n cashTable$,\r\n cashHasVATApplicableAccount$,\r\n\r\n }\r\n}\r\n\r\n\r\n\r\nconst extractTreeFromState = (state: ScoaInterface, isCash: boolean = false) => {\r\n\r\n const { segments, inputs } = state;\r\n\r\n const inputSegments: IAccountSegmentTreeKeys[] = [...inputs].filter(i => !i.linkedSegmentId).map(input => ({\r\n segment: input.formControlName,\r\n innerInput: {\r\n ...input,\r\n id: `${state.inputId}.${input.id}`,\r\n originalId: input.id\r\n },\r\n additionalAccounts: [],\r\n readOnly: input.readonly ?? false,\r\n label: input.label,\r\n formInput: true,\r\n singleSelect: true,\r\n id: input.id,\r\n segmentTree: {} as ScoaAccountTree,\r\n inputs: [] as ScoaInnerInput[],\r\n segmentValue: (state.segmentValues?.[isCash ? 'cash' : 'accrual']?.[input.formControlName] || {}) as Record<string, any>,\r\n segmentExtension: false,\r\n customSegment: undefined\r\n }))\r\n\r\n\r\n\r\n\r\n const standardSegments: IAccountSegmentTreeKeys[] = [...(segments || [])].map(segment => {\r\n const segmentName = segment.segmentExtension ? segment.customSegment : segment.segment\r\n const segmentValue = state.segmentValues?.[isCash ? 'cash' : 'accrual']?.[segmentName || '']\r\n return ({\r\n ...segment,\r\n segment: segmentName || '',\r\n singleSelect: Boolean(segment?.singleSelect),\r\n segmentTree: state.accountTree[segment.segment || ''] || {},\r\n inputs: state.inputs || [],\r\n segmentValue: segmentValue || {},\r\n innerInput: {} as ScoaInnerInput,\r\n formInput: false\r\n })\r\n })\r\n\r\n return [...standardSegments, ...inputSegments]\r\n}\r\n\r\nconst transformSegment = (segment: IAccountSegmentTreeKeys, accountValueLabel: string) => ({\r\n ...segment,\r\n ...getSegmentCounterAccountValues(segment, accountValueLabel),\r\n accountInputs: segment.inputs.filter(input => (input as any)?.['segment'] === segment.segment),\r\n input: segment.inputs.find(input => input.formControlName?.toLocaleUpperCase() === segment.segment),\r\n vat: (segment.segmentValue as any)?.vat?.[accountValueLabel || 'SCOAAccount'],\r\n debit: (segment.segmentValue as any)?.debit?.[accountValueLabel || 'SCOAAccount'] || (segment.segmentValue as any)?.debit,\r\n credit: ((segment.segmentValue as any)?.credit?.[accountValueLabel || 'SCOAAccount'] || (segment.segmentValue as any)?.credit),\r\n})\r\n\r\nfunction getSegmentCounterAccountValues(segment: IAccountSegmentTreeKeys, accountValueLabel: string) {\r\n return (segment.additionalAccounts || []).reduce((acc, account) => {\r\n const newEntry = {\r\n [`${account}Credit`]: (segment.segmentValue as any)?.[`${account}Credit`]?.[accountValueLabel || 'SCOAAccount'],\r\n [`${account}Debit`]: (segment.segmentValue as any)?.[`${account}Debit`]?.[accountValueLabel || 'SCOAAccount']\r\n }\r\n return {\r\n ...acc,\r\n ...newEntry\r\n }\r\n }, {} as Record<string, any>)\r\n\r\n}\r\nconst checkhasVat = (rows: {\r\n accountInputs: ScoaInnerInput[];\r\n input: ScoaInnerInput | undefined;\r\n vat: any;\r\n debit: any;\r\n credit: any;\r\n segment: string;\r\n innerInput: ScoaInnerInput;\r\n label: string;\r\n formInput: boolean;\r\n segmentTree: ScoaAccountTree;\r\n inputs: ScoaInnerInput[];\r\n segmentValue: Record<string, any>;\r\n customSegment?: string | undefined;\r\n readOnly: boolean;\r\n singleSelect: boolean;\r\n inheritValueFromAccrual?: boolean;\r\n vatSelectonActive?: boolean;\r\n additionalAccounts: string[];\r\n segmentExtension: boolean;\r\n id: string;\r\n}[]) => {\r\n // VAT selection is limited to the item segment \r\n // 1) look up the item segment\r\n\r\n const itemSegmentValue = rows.find(row => row.segment.toLocaleLowerCase() === 'ITEM'.toLocaleLowerCase())\r\n const vatSelectonActive = itemSegmentValue?.vatSelectonActive === true\r\n if (!vatSelectonActive) {\r\n return false\r\n }\r\n // 2) Check vat status on both the credit and the debit || credit\r\n const vatCredit = !!itemSegmentValue?.segmentValue?.['credit'] && !noneVatableStatus.includes(itemSegmentValue?.segmentValue?.['credit']?.['VATStatus'])\r\n const vatDebit = !!itemSegmentValue?.segmentValue?.['debit'] && !noneVatableStatus.includes(itemSegmentValue?.segmentValue?.['debit']?.['VATStatus'])\r\n\r\n // 3) Return a record of each\r\n return Boolean(vatCredit || vatDebit)\r\n\r\n}","\nimport { AccountingBasis, IScoaAccount, IScoaInputConfig, MscoaValuetValidationErrors, ScoaSegmentValue } from \"ngx-t-forms-types\";\nimport { initialMscoaState, MscoaComponentStore } from \"./mscoa-component-store.service\";\nimport { noneVatableStatus } from \"./mscoa-selectors\";\n\n\nexport function mscoaStoreActions(store: MscoaComponentStore) {\n\n return {\n resetStore: store.updater((state) => {\n return initialMscoaState;\n }),\n\n setConfig: store.updater((state, config: IScoaInputConfig | undefined | null) => ({ ...state, ...(config || {}) })),\n setInitiated: store.updater((state) => ({ ...state, initiated: true })),\n setSegmentValues: store.updater((state, segmentValues: {\n [AccountingBasis.Accrual]?: ScoaSegmentValue;\n [AccountingBasis.Cash]?: ScoaSegmentValue;\n } | undefined) => {\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 = isFlatStructure ? segmentValues : segmentValues.accrual;\n const rawCash = 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: any) => {\n if (!source || !accountTreeKeys) return {};\n\n return accountTreeKeys.reduce((acc, key) => {\n // Matches 'costing' -> 'COSTING' from your log\n const upperKey = key.toUpperCase();\n acc[key] = source[upperKey] ?? source[key];\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 newState = {\n ...state,\n segmentValues: {\n ...state.segmentValues,\n accrual: accrualValue,\n cash: cashValue,\n },\n };\n return newState;\n }),\n setValidatingValue:store.updater((state,validatingValue:boolean)=>({\n ...state,\n validatingValue\n })),\n validationErrors: store.updater(\n (state,validationErrors:MscoaValuetValidationErrors)=>({\n ...state,\n validationErrors\n \n })\n ),\n setLoadingTree: store.updater((state, loading: boolean) => ({ ...state, loadingTree: loading })),\n setActiveSegment: store.updater((state, activeSegment: string | null) => ({ ...state, activeSegment })),\n setSegmentAccount: store.updater((state, { segment, account, accountType, isCash }: {\n segment: string;\n account: IScoaAccount | undefined;\n accountType: string;\n isCash: boolean\n }) => {\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 auditStateValues: store.updater((state) => {\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 itemSegment = state.segments?.find(s => s?.segment?.toLowerCase() === 'item')\n const hasAccrualVat = itemSegment?.vatSelectonActive === true ? Object.values(accrual).some((val: any) => val?.vatApplicableTo !== undefined) : false;\n const cashItemSegment = cashSegmentConfigs.find(s => s?.segment?.toLowerCase() === 'item')\n const hasCashVat = cashItemSegment?.vatSelectonActive? Object.values(cash).some((val: any) => val?.vatApplicableTo !== undefined) : false\n\n // 3. Helper: VAT Calculation Logic\n const calculateVat = (key: string, data: any, isGlobalVatActive: boolean) => {\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((acc: any, seg: any) => {\n if (seg.inheritValueFromAccrual) {\n // Store true for the segment name (normalized to upper case to match store keys)\n acc[(seg.customSegment || seg.segment).toUpperCase()] = true;\n }\n return acc;\n }, {});\n\n\n // 5. Process Accrual First (Source of Truth)\n const newAccrual = Object.entries(accrual).reduce((acc: any, [key, data]: [string, any]) => {\n acc[key] = {\n ...data,\n vat: calculateVat(key, data, hasAccrualVat)\n };\n return acc;\n }, {});\n \n // 6. Process Cash (With Inheritance)\n const newCash = Object.entries(cash).reduce((acc: any, [key, data]: [string, any]) => {\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 = data;\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 newState = {\n ...state,\n segmentValues: {\n ...state.segmentValues,\n accrual: newAccrual,\n cash: newCash\n }\n };\n \n return newState\n })\n\n\n }\n}\nfunction checkVatApplicableTo(segmentValue: {\n debit: IScoaAccount | undefined,\n credit: IScoaAccount | undefined,\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}\n\n","\r\nimport { catchError, debounceTime, EMPTY, filter, map, Observable, of, switchMap, tap ,distinctUntilChanged} from \"rxjs\";\r\nimport { IGetTreeResponse, ScoaSegmentValue } from \"ngx-t-forms-types\";\r\nimport { MscoaComponentStore } from \"./mscoa-component-store.service\";\r\nimport { FormBuilderFunctions } from \"ngx-t-forms-types\";\r\n\r\nexport function mscoaStoreEffects(store: MscoaComponentStore) {\r\n\r\n // Each new call of getMovie(id) pushed that id into movieId$ stream.\r\n\r\n const initLoadMscoa$ = store.effect((trigger$: Observable<FormBuilderFunctions | undefined>) =>\r\n trigger$.pipe(\r\n switchMap((functions) => store.selectors.initiated$.pipe(\r\n filter(initiated => !initiated),\r\n switchMap(() => {\r\n store.actions.setLoadingTree(true);\r\n return ((functions?.getLatestAccountTree() ?? of({\r\n message: '',\r\n accountTree: {},\r\n accountTreeKeys: []\r\n })) as Observable<IGetTreeResponse>).pipe(\r\n map(mscoa => {\r\n if (!mscoa) {\r\n throw new Error('Invalid MSCOA data received');\r\n }\r\n return mscoa;\r\n }),\r\n tap(mscoa => {\r\n store.patchState({\r\n ...mscoa\r\n });\r\n store.actions.setInitiated();\r\n store.actions.setLoadingTree(false);\r\n }),\r\n catchError((error) => {\r\n store.actions.setLoadingTree(false);\r\n return EMPTY;\r\n })\r\n );\r\n })\r\n ))\r\n )\r\n );\r\n\r\n const initSetSegmentValues$ = store.effect((\r\n segmentValues$: Observable<ScoaSegmentValue>\r\n ) => {\r\n return segmentValues$.pipe(\r\n tap((segmentValues) => {\r\n store.actions.setSegmentValues(segmentValues)\r\n\r\n })\r\n )\r\n }\r\n\r\n )\r\n /** Runs audit whenever segmentValues change (e.g. @Input, setSegmentAccount, load). */\r\n const auditOnSegmentValuesChange$ = store.effect((trigger$) =>\r\n store.selectors.segmentValues$.pipe(\r\n distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),\r\n // 1. Debounce to prevent over-triggering\r\n debounceTime(300),\r\n \r\n // 2. Use switchMap to handle the validation flow\r\n switchMap((values) => {\r\n // Return an array of actions to keep the flow declarative\r\n // We start by dispatching the \"loading\" and \"audit\" start actions\r\n store.actions.auditStateValues();\r\n store.actions.setValidatingValue(true);\r\n \r\n const validateMscoaSelection = store.NGX_T_FORMS_CONFIG_TOKEN.formBuilder.validateMscoaSelection;\r\n \r\n return validateMscoaSelection(values).pipe(\r\n // 3. Map the result to the success action\r\n map((validationErrors) => {\r\n store.actions.setValidatingValue(false);\r\n return store.actions.validationErrors(validationErrors);\r\n }),\r\n // 4. Handle errors gracefully within the inner observable\r\n catchError(() => {\r\n store.actions.setValidatingValue(false);\r\n return EMPTY;\r\n })\r\n );\r\n })\r\n )\r\n );\r\n\r\n return {\r\n initLoadMscoa$,\r\n initSetSegmentValues$,\r\n auditOnSegmentValuesChange$\r\n }\r\n}","import { inject, Injectable } from '@angular/core';\r\nimport { ComponentStore } from '@ngrx/component-store';\r\n\r\n\r\n\r\nimport { ScoaInterface } from \"ngx-t-forms-types\";\r\n\r\nimport { mscoaStoreSelectors } from './mscoa-selectors';\r\nimport { mscoaStoreActions } from './mscoa-actions';\r\nimport { mscoaStoreEffects } from './mscoa-effects';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../injection-tokens';\r\n\r\n\r\n\r\nexport const initialMscoaState: ScoaInterface = {\r\n accountTreeKeys: [],\r\n inputs: [],\r\n initiated: false,\r\n accountTree: {},\r\n loadingTree: false,\r\n segmentValues: {},\r\n segments: [],\r\n cashSegments: [],\r\n showAllSegments: false,\r\n getTreeResponse: null,\r\n inputId: '',\r\n label: '',\r\n accountValueLabel: '',\r\n validatingValue: false,\r\n validationErrors: {}\r\n};\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MscoaComponentStore extends ComponentStore<ScoaInterface> {\r\n NGX_T_FORMS_CONFIG_TOKEN = inject(NGX_T_FORMS_CONFIG_TOKEN)\r\n //Add a resetStore method to allow resetting the store to its initial state.\r\n\r\n\r\n // Selectors\r\n readonly selectors = mscoaStoreSelectors(this)\r\n // Updaters\r\n readonly actions = mscoaStoreActions(this)\r\n // Effects\r\n readonly effects = mscoaStoreEffects(this)\r\n\r\n constructor() {\r\n super(initialMscoaState);\r\n this.effects.auditOnSegmentValuesChange$();\r\n }\r\n\r\n}\r\n","import { \n Component, \n OnInit, \n OnDestroy, \n inject, \n Input, \n EventEmitter, \n Output, \n Injector,\n ChangeDetectorRef,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { \n combineLatest, \n map, \n Observable, \n Subject, \n BehaviorSubject,\n take, \n takeUntil, \n distinctUntilChanged, \n timer, \n tap, \n withLatestFrom,\n shareReplay,\n debounceTime\n} from 'rxjs';\nimport { CommonModule } from '@angular/common';\nimport { MatDialog } from '@angular/material/dialog';\nimport { \n IAccountSegmentTreeKeys, \n IScoaAccount, \n IScoaInputConfig, \n ITowerStepColumn, \n ScoaInnerInput, \n ScoaSegmentValue \n} from \"ngx-t-forms-types\";\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\nimport { MscoaComponentStore } from '../../store/mscoa-component-store.service';\nimport { FormColumnInputs } from 'ngx-t-forms-types';\nimport { IMscoaComputationComponentData, MscoaComputationComponent } from '../mscoa-computation/mscoa-computation.component';\nimport { FormBuilderFunctions } from \"ngx-t-forms-types\";\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\nimport { FormGroup } from '@angular/forms';\nimport { ScoaInputComponent } from '../scoa-input/scoa-input.component';\nimport { ComponentPortal, PortalModule } from '@angular/cdk/portal';\nimport { ConvertCamelCasePipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\nimport { extractCols, getAccountFieldState } from './extractCols';\n\n// Import utilities\nimport { \n ACCOUNTING_BASIS, \n COLUMNS, \n DELETION_COUNTDOWN_SECONDS,\n DIALOG_CONFIG,\n DEFAULT_EXPANSION_STATE \n} from './utils/mscoa-chart.constants';\nimport { \n getToolbarColor, \n isSegmentColumn,\n getHeaderText,\n hasInnerInput,\n shouldShowAutoSelectedLabel,\n shouldShowDropdownIcon,\n getErrorColor,\n hasError,\n shouldShowVatChip,\n shouldShowTable\n} from './utils/mscoa-chart.helpers';\nimport type { DualBasisExpansionState, CountdownSeconds, ExtendedTableRow } from './utils/mscoa-chart.types';\n\n// Import child components\nimport { MscoaChartToolbarComponent } from './components/mscoa-chart-toolbar/mscoa-chart-toolbar.component';\nimport { MscoaChartInputMenuComponent } from './components/mscoa-chart-input-menu/mscoa-chart-input-menu.component';\nimport { MscoaErrorDisplayComponent } from './components/mscoa-error-display/mscoa-error-display.component';\nimport { MscoaTemporaryHintComponent } from './components/mscoa-temporary-hint/mscoa-temporary-hint.component';\n\n// Import message formatter\nimport { mscoaMessageFormatter, ValidationError, ErrorContext } from './utils/mscoa-message-formatter';\n\n/**\n * MSCOA Chart Component\n * \n * Displays account selection tables for accrual and/or cash accounting basis.\n * Supports dynamic column generation, portal-based input rendering, and complex\n * selection logic for account assignment.\n */\n@Component({\n selector: 'app-mscoa-chart',\n templateUrl: './mscoa-chart.component.html',\n styleUrls: ['./mscoa-chart.component.scss'],\n standalone: true,\n imports: [\n MatModulesModule, \n CommonModule, \n PortalModule, \n ConvertCamelCasePipe,\n MscoaChartToolbarComponent,\n MscoaChartInputMenuComponent,\n MscoaErrorDisplayComponent,\n MscoaTemporaryHintComponent\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class MscoaChartComponent implements OnInit, OnDestroy {\n // Store selectors\n private readonly selectAccountTreeKeys$ = this.store.selectors.accountTreeKeys$;\n private readonly selectCashAccountTreeKeys$ = this.store.selectors.cashAccountTreeKeys$;\n private readonly selectMscoaLoadingTree$ = this.store.selectors.loadingTree$;\n private readonly validationErrors$ = this.store.selectors.validationErrors$;\n private readonly validatingValue$ = this.store.selectors.validatingValue$;\n private readonly table$ = this.store.selectors.table$.pipe(\n distinctUntilChanged((a, b) => _isEqual(a, b))\n );\n private readonly cashTable$ = this.store.selectors.cashTable$.pipe(\n distinctUntilChanged((a, b) => _isEqual(a, b))\n );\n private readonly hasVATApplicableAccount$ = this.store.selectors.hasVATApplicableAccount$;\n private readonly cashHasVATApplicableAccount$ = this.store.selectors.cashHasVATApplicableAccount$;\n private readonly segmentValues$ = this.store.selectors.segmentValues$;\n private readonly inputs$ = this.store.selectors.inputs$;\n\n // Business rule errors - formatted with user-friendly messages\n readonly busnessRuleErrors$ = this.validationErrors$.pipe(\n map(errors => Object.entries(errors).reduce((acc, curr) => {\n const basis = curr[0];\n const errorEntries = Object.entries(curr[1]);\n const formattedErrors = errorEntries.map(([key, err]) => {\n const context: ErrorContext = {\n accountingBasis: basis,\n segment: key\n };\n return mscoaMessageFormatter.formatError(err as ValidationError, context);\n });\n acc[basis] = formattedErrors;\n return acc;\n }, {} as Record<string, string[]>))\n );\n\n // Component state\n private readonly destroy$ = new Subject<void>();\n\n // Success state tracking - per accounting basis\n private readonly successMessageSubject$ = new BehaviorSubject<Record<string, string | null>>({\n [ACCOUNTING_BASIS.ACCRUAL]: null,\n [ACCOUNTING_BASIS.CASH]: null\n });\n readonly successMessage$ = this.successMessageSubject$.pipe(\n distinctUntilChanged(),\n takeUntil(this.destroy$)\n );\n\n // Real-time validation with debouncing\n readonly validationState$ = combineLatest([\n this.validationErrors$.pipe(debounceTime(300)),\n this.validatingValue$\n ]).pipe(\n map(([errors, isValidating]) => ({\n hasErrors: Object.keys(errors).length > 0,\n isValidating,\n errorCount: Object.values(errors).reduce((sum: number, basisErrors: any) => \n sum + Object.keys(basisErrors || {}).length, 0)\n })),\n shareReplay(1)\n );\n\n // Computed observables\n readonly hasMultiSelect$ = this.table$.pipe(\n map(table => table.some(row => (row as any).singleSelect === false)),\n shareReplay(1)\n );\n\n readonly cashHasMultiSelect$ = this.cashTable$.pipe(\n map(table => table.some(row => (row as any).singleSelect === false)),\n shareReplay(1)\n );\n\n readonly cols$ = combineLatest([\n this.hasMultiSelect$,\n this.hasVATApplicableAccount$\n ]).pipe(\n map(([hasMultiSelect, hasVATApplicableAccount]) => \n extractCols(hasMultiSelect, hasVATApplicableAccount, this.config?.extensionAccountsForSegments || [])\n ),\n shareReplay(1)\n );\n\n readonly cashCol$ = combineLatest([\n this.cashHasMultiSelect$,\n this.cashHasVATApplicableAccount$\n ]).pipe(\n map(([hasMultiSelect, hasVATApplicableAccount]) => \n extractCols(hasMultiSelect, hasVATApplicableAccount, this.config?.extensionAccountsForSegments || [])\n ),\n shareReplay(1)\n );\n\n // View data observable\n readonly viewData$ = combineLatest([\n this.selectMscoaLoadingTree$,\n this.selectAccountTreeKeys$,\n this.table$,\n this.cols$,\n this.hasMultiSelect$,\n this.selectCashAccountTreeKeys$,\n this.cashTable$,\n this.cashCol$,\n this.cashHasMultiSelect$,\n this.busnessRuleErrors$,\n this.validationErrors$,\n this.validatingValue$\n ]).pipe(\n map(([\n loading,\n accountTreeKeys,\n tableData,\n cols,\n hasMultiSelect,\n cashAccountTreeKeys,\n cashTableData,\n cashCols,\n cashHasMultiSelect,\n busnessRuleErrors,\n validationErrors,\n validatingValue\n ]) => ({\n loading,\n accountTreeKeys,\n tableData: tableData || [],\n cols,\n hasMultiSelect,\n cashAccountTreeKeys,\n cashTableData,\n cashCols,\n cashHasMultiSelect,\n busnessRuleErrors,\n validationErrors: validationErrors || {},\n validatingValue\n })),\n shareReplay(1)\n );\n\n // Component state\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly dialog = inject(MatDialog);\n private _formBuilderFunctions: FormBuilderFunctions | undefined = undefined;\n private _config: IScoaInputConfig | undefined | null = undefined;\n private previousInputsHash: string = '';\n\n // Portal management\n inputPortals: { [key: string]: ComponentPortal<any> } = {};\n\n // Selection state\n editSelection: ExtendedTableRow | undefined = undefined;\n activeColumn: string | undefined;\n isCashSelection: boolean | undefined = undefined;\n \n // Temporary hints state\n temporaryHintMessage: string | null = null;\n temporaryHintType: 'info' | 'guidance' = 'info';\n\n // Validation success indicator - shown on cells with value when validation completes, then fades out\n showValidationSuccessIndicators = false;\n private prevValidating = false;\n\n // Dual basis expansion state\n dualBasisExpansion: DualBasisExpansionState = {\n [ACCOUNTING_BASIS.CASH]: DEFAULT_EXPANSION_STATE[ACCOUNTING_BASIS.CASH],\n [ACCOUNTING_BASIS.ACCRUAL]: DEFAULT_EXPANSION_STATE[ACCOUNTING_BASIS.ACCRUAL]\n };\n\n // Input deletion countdown\n countdownSeconds: CountdownSeconds = {};\n hoveredInputId: string | null = null;\n\n // Constants\n readonly COLUMNS = COLUMNS;\n readonly ACCOUNTING_BASIS = ACCOUNTING_BASIS;\n readonly DELETION_COUNTDOWN_SECONDS = DELETION_COUNTDOWN_SECONDS;\n\n // Helper functions (exposed for template)\n readonly getToolbarColor = getToolbarColor;\n readonly isSegmentColumn = isSegmentColumn;\n readonly getHeaderText = getHeaderText;\n readonly hasInnerInput = hasInnerInput;\n readonly shouldShowAutoSelectedLabel = shouldShowAutoSelectedLabel;\n readonly shouldShowDropdownIcon = shouldShowDropdownIcon;\n readonly getErrorColor = getErrorColor;\n readonly hasError = hasError;\n readonly shouldShowVatChip = shouldShowVatChip;\n readonly shouldShowTable = shouldShowTable;\n\n /**\n * Gets the success message for a specific accounting basis\n */\n getSuccessMessage(messages: Record<string, string | null> | null, basis: string): string | null {\n if (!messages) return null;\n return messages[basis] || null;\n }\n\n constructor(\n private readonly store: MscoaComponentStore, \n private readonly injector: Injector\n ) {}\n\n // Inputs\n @Input() inputConfig!: ITowerStepColumn;\n @Input() editorMode: boolean = false;\n @Input() readonly = false;\n @Input() touched = false;\n @Input() formGroup: FormGroup | undefined | null;\n\n @Input() \n set formBuilderFunctions(func: FormBuilderFunctions | undefined) {\n if (this._formBuilderFunctions !== undefined) return;\n this._formBuilderFunctions = func;\n this.loadMscoa(func);\n }\n \n get formBuilderFunctions() {\n return this._formBuilderFunctions;\n }\n\n @Input() \n set segmentValues(segmentValues: {\n accrual?: ScoaSegmentValue | undefined;\n cash?: ScoaSegmentValue;\n } | null) {\n this.store.actions.setSegmentValues(segmentValues || undefined);\n }\n\n @Input() \n set config(config: IScoaInputConfig | undefined | null) {\n if (!config) return;\n if (_isEqual(this._config, config)) return;\n this._config = config;\n this.store.actions.setConfig(({ ...config } as any));\n }\n \n get config() {\n return this._config;\n }\n\n // Outputs\n @Output() onContainerClick = new EventEmitter<MouseEvent>();\n @Output() segmentValuesChanged = new EventEmitter<ScoaSegmentValue>();\n @Output() interaction = new EventEmitter<string>();\n\n ngOnInit(): void {\n this.segmentValues$\n .pipe(takeUntil(this.destroy$))\n .subscribe(segmentValues => {\n this.segmentValuesChanged.emit(segmentValues);\n });\n\n // Optimized portal setup - only recreate when inputs actually change\n this.inputs$\n .pipe(\n takeUntil(this.destroy$),\n distinctUntilChanged((prev, curr) => {\n const prevHash = this.getInputsHash(prev);\n const currHash = this.getInputsHash(curr);\n return prevHash === currHash;\n })\n )\n .subscribe(inputs => {\n this.setupPortals(inputs);\n this.cdr.markForCheck();\n });\n\n // Show shield icon on validated cells when validation completes (true -> false)\n this.validatingValue$\n .pipe(takeUntil(this.destroy$))\n .subscribe(curr => {\n if (this.prevValidating && !curr) {\n this.showValidationSuccessIndicators = true;\n this.cdr.markForCheck();\n timer(2500).pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.showValidationSuccessIndicators = false;\n this.cdr.markForCheck();\n });\n }\n this.prevValidating = curr;\n });\n }\n\n ngOnDestroy(): void {\n this.successMessageSubject$.complete();\n this.destroy$.next();\n this.destroy$.complete();\n // Clean up portals\n this.inputPortals = {};\n }\n\n /**\n * Sets the component as touched and emits the event\n */\n setAsTouched(ev: MouseEvent | Event): void {\n // Convert Event to MouseEvent if needed for compatibility\n if (ev instanceof MouseEvent) {\n this.onContainerClick.emit(ev);\n } else {\n // For keyboard events, create a synthetic mouse event\n const syntheticEvent = new MouseEvent('click', {\n bubbles: ev.bubbles,\n cancelable: ev.cancelable,\n view: (ev as any).view || window,\n detail: 0\n });\n this.onContainerClick.emit(syntheticEvent);\n }\n }\n\n /**\n * Optimized portal setup - only recreates portals when inputs actually change\n */\n private setupPortals(inputs: ScoaInnerInput[]): void {\n const currentHash = this.getInputsHash(inputs);\n if (currentHash === this.previousInputsHash) {\n return; // No change, skip portal recreation\n }\n this.previousInputsHash = currentHash;\n\n // Clear existing portals\n this.inputPortals = {};\n\n if (!inputs || inputs.length === 0) {\n return;\n }\n\n const sectionId = this.inputConfig?.sectionId;\n if (!sectionId) {\n return;\n }\n\n try {\n // Dynamically import the component\n import('../../../../t-form-input.component').then(module => {\n // Filter and create portals for each input\n const validInputs = inputs.filter(input => {\n // Skip inputs linked to segments if needed\n if (input.linkedSegmentId) return false;\n\n // Make sure the form control exists\n const controlKey = `${this.inputConfig?.id}.${input.id}`;\n if (!this.formGroup?.controls[controlKey]) {\n return false;\n }\n\n return true;\n });\n\n // Create a portal for each valid input\n validInputs.forEach(inp => {\n const portalKey = this.getPortalKey(inp.id);\n this.inputPortals[portalKey] = new ComponentPortal(\n module.TFormInputComponent,\n null,\n this.createInjectorWithProps({\n inputConfig: {\n ...inp,\n sectionId,\n id: portalKey,\n label: '',\n appearance: 'fill',\n originalId: inp.id,\n },\n formGroup: this.formGroup,\n formBuilderFunctions: this.formBuilderFunctions,\n editorMode: this.editorMode\n })\n );\n });\n\n this.cdr.markForCheck();\n }).catch(error => {\n // Error handling - could emit to error service in production\n if (error) {\n // Silent fail for now, but could log to error service\n }\n });\n } catch (error) {\n // Error handling\n if (error) {\n // Silent fail for now\n }\n }\n }\n\n /**\n * Creates a hash of inputs array for comparison\n */\n private getInputsHash(inputs: ScoaInnerInput[]): string {\n if (!inputs || inputs.length === 0) return '';\n return inputs.map(i => i.id).sort().join(',');\n }\n\n /**\n * Generates a consistent portal key for an input\n */\n getPortalKey(inputId: string): string {\n return `${this.inputConfig?.id}.${inputId}`;\n }\n\n /**\n * Helper to create an injector with properties to pass to the component\n */\n private createInjectorWithProps(props: any): Injector {\n return Injector.create({\n providers: [\n { provide: 'COMPONENT_PROPS', useValue: props }\n ],\n parent: this.injector\n });\n }\n\n /**\n * Loads MSCOA data\n */\n loadMscoa(functions: FormBuilderFunctions | undefined): void {\n this.store.effects.initLoadMscoa$(functions);\n }\n\n /**\n * Handles segment change\n */\n segmentChange(activeSegment: string): void {\n this.store.actions.setActiveSegment(activeSegment);\n }\n\n /**\n * Handles account number selection\n */\n accountNumberSelected(\n account: IScoaAccount | undefined, \n segment: string, \n accountType: string = COLUMNS.DEBIT, \n isCash: boolean = false\n ): void {\n this.store.actions.setSegmentAccount({ segment, account, accountType, isCash });\n }\n\n /**\n * Handles account selection\n */\n selectAccount(row: ExtendedTableRow | undefined, col: string | undefined, cash: boolean = false): void {\n if (!row || !col) return;\n\n // Clear any existing success message for the current basis when opening a new selection\n const currentBasis = cash ? ACCOUNTING_BASIS.CASH : ACCOUNTING_BASIS.ACCRUAL;\n const currentMessages = this.successMessageSubject$.value;\n this.successMessageSubject$.next({\n ...currentMessages,\n [currentBasis]: null\n });\n\n this.editSelection = row;\n this.activeColumn = col;\n this.isCashSelection = cash;\n this.interaction.emit();\n\n // Show contextual hint when opening selection\n const guidance = this.getContextualGuidance(row, col, false);\n if (guidance) {\n this.showTemporaryHint(guidance, 'guidance');\n }\n\n const isInput = hasInnerInput(row);\n if (isInput && row.innerInput) {\n this.openInput(row.innerInput as FormColumnInputs);\n } else {\n this.openScoaSelection();\n }\n }\n\n /**\n * Opens SCOA selection dialog\n */\n private openScoaSelection(): void {\n if (!this.editSelection) return;\n\n const data: IMscoaComputationComponentData = {\n segment: this.editSelection.segment as string,\n segmentConfig: this.config?.segments?.find(segment => segment.id === this.editSelection?.id),\n value: (this.editSelection.segmentValue as any)?.[this.activeColumn as \"debit\" | \"credit\"],\n data: this.editSelection.segmentTree,\n accountInputs: this.editSelection.accountInputs || [],\n activeColumn: this.activeColumn,\n readonly: this.readonly,\n isCashSelection: Boolean(this.isCashSelection),\n getSCOAAccount: this.formBuilderFunctions?.getSCOAAccount ?? \n (() => new Observable(subscriber => subscriber.next({ accounts: [] }))) as any\n };\n\n const dialogRef = this.dialog.open(MscoaComputationComponent, {\n data,\n ...DIALOG_CONFIG.COMPUTATION\n });\n\n dialogRef.afterClosed().pipe(\n take(1),\n withLatestFrom(this.isCashSelection ? this.cashHasVATApplicableAccount$ : this.hasVATApplicableAccount$)\n ).subscribe(([result, hasVat]) => {\n this.handleDialogResult(result, hasVat);\n });\n }\n\n /**\n * Handles dialog result and updates columns accordingly\n */\n private handleDialogResult(result: any, hasVat: boolean): void {\n const { activeColumn, editSelection, isCashSelection } = this;\n if (!result || !activeColumn || !editSelection) return;\n\n const segment = editSelection.customSegment || editSelection.segment;\n if (!segment) return;\n \n const isSingleSelect = editSelection.singleSelect === true;\n\n // Determine which columns need updating\n const targetColumns = this.resolveTargetColumns(activeColumn, isSingleSelect, hasVat);\n\n // Execute updates\n targetColumns.forEach(col => {\n this.accountNumberSelected(result, segment, col, isCashSelection);\n });\n if (targetColumns.size > 0) {\n // Track successful selection for success message\n const basis = isCashSelection ? ACCOUNTING_BASIS.CASH : ACCOUNTING_BASIS.ACCRUAL;\n const successMessage = `Account combination successfully created for ${segment} segment (${activeColumn} column, ${basis} basis).`;\n \n // Emit success message with debounce for the specific basis\n timer(500).pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n const currentMessages = this.successMessageSubject$.value;\n this.successMessageSubject$.next({\n ...currentMessages,\n [basis]: successMessage\n });\n // Auto-clear after 6 seconds\n timer(6000).pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n const updatedMessages = this.successMessageSubject$.value;\n this.successMessageSubject$.next({\n ...updatedMessages,\n [basis]: null\n });\n });\n });\n\n // Clear any temporary hints when selection is made\n this.clearTemporaryHint();\n }\n\n this.resetSelectionState();\n }\n\n /**\n * Resolves which columns should be updated based on selection type\n */\n private resolveTargetColumns(activeColumn: string, isSingleSelect: boolean, hasVat: boolean): Set<string> {\n const targets = new Set<string>();\n\n // Rule 1: Multi-select always just updates the active column\n if (!isSingleSelect) {\n targets.add(activeColumn);\n return targets;\n }\n\n // Rule 2: Single Select Logic\n switch (activeColumn) {\n case COLUMNS.DEBIT:\n targets.add(COLUMNS.DEBIT);\n targets.add(COLUMNS.CREDIT);\n break;\n\n case COLUMNS.VAT:\n targets.add(COLUMNS.VAT);\n break;\n\n default:\n // Check for Extension Logic (e.g., bankChargesDebit)\n const extension = this.getExtensionPair(activeColumn);\n if (extension) {\n targets.add(activeColumn);\n targets.add(extension);\n }\n break;\n }\n\n // Rule 3: VAT Side Effect (Independent Rule)\n if (hasVat && activeColumn !== COLUMNS.VAT) {\n targets.add(COLUMNS.VAT);\n }\n\n return targets;\n }\n\n /**\n * Gets extension pair for a column (e.g., bankChargesDebit -> bankChargesCredit)\n */\n private getExtensionPair(activeColumn: string): string | null {\n const split = activeColumn.split(/(?=[A-Z])/);\n const suffix = split.at(-1)?.toLowerCase();\n const baseKey = split[0];\n\n const isDebitExtension = suffix === COLUMNS.DEBIT;\n const isValidConfig = baseKey && this.config?.extensionAccountsForSegments?.includes(baseKey);\n\n if (isDebitExtension && isValidConfig) {\n return `${baseKey}Credit`;\n }\n\n return null;\n }\n\n /**\n * Resets selection state\n */\n private resetSelectionState(): void {\n this.editSelection = undefined;\n this.activeColumn = undefined;\n this.isCashSelection = undefined;\n }\n\n /**\n * Opens input dialog\n */\n private openInput(input: FormColumnInputs): void {\n if (!this.editSelection || !this.activeColumn) return;\n\n const segment = this.editSelection.segment;\n if (!segment) return;\n\n const dialogRef = this.dialog.open(ScoaInputComponent, {\n data: {\n input,\n formGroup: this.formGroup,\n heading: `${this.activeColumn} ${segment?.toLowerCase() || 'Incomplete configuration'}`,\n value: (this.editSelection.segmentValue as any)?.[this.activeColumn],\n subHeading: `Enter ${this.activeColumn} ${segment?.toLowerCase() || '***'} and save`\n },\n ...DIALOG_CONFIG.INPUT\n });\n\n dialogRef.afterClosed().pipe(take(1)).subscribe(result => {\n if (result && segment) {\n this.accountNumberSelected(\n result[segment],\n segment,\n this.activeColumn as \"debit\" | \"credit\",\n this.isCashSelection\n );\n }\n this.resetSelectionState();\n });\n }\n\n /**\n * Checks if selection should be disabled\n */\n selectionDisabled(row: IAccountSegmentTreeKeys, col: any): boolean {\n if (this.inputConfig?.readonly || row['readOnly'] || row['inheritValueFromAccrual']) {\n return true;\n }\n\n const isVatCol = col === COLUMNS.VAT;\n\n // Case 1: Credit column with singleSelect enabled\n if (row['singleSelect'] && col === COLUMNS.CREDIT && !isVatCol) {\n return true;\n }\n\n // Case 2: VAT columns with special conditions\n if (isVatCol === true) {\n return row.segment.toLowerCase() !== 'item';\n }\n\n // Case 3: Extension columns\n const split = (col || '').split(/(?=[A-Z])/);\n const isExtensionDebit = split?.at(-1)?.toLowerCase() === COLUMNS.DEBIT;\n const isExtensionCredit = split?.at(-1)?.toLowerCase() === COLUMNS.CREDIT;\n const isInConfig = this.config?.extensionAccountsForSegments?.includes(split[0] as string);\n const isSetupForRow = Boolean(row?.additionalAccounts?.includes(split[0] as string));\n\n if ((isExtensionDebit && isInConfig && !isSetupForRow) || \n (isExtensionCredit && isInConfig && !isSetupForRow)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Gets account field state\n */\n getFields(row: any, col: string) {\n return getAccountFieldState(row, col, this.touched, this.inputConfig);\n }\n\n /**\n * Checks if dual account basis is enabled\n */\n get isDualAccountBasis(): boolean {\n return (this.config?.accountingBasis as any) === ACCOUNTING_BASIS.DUAL;\n }\n\n /**\n * Toggles dual basis expansion\n */\n toggleDualBasisExpansion(basis: string): void {\n this.dualBasisExpansion[basis] = !this.dualBasisExpansion[basis];\n this.cdr.markForCheck();\n }\n\n /**\n * Gets expansion state for a basis\n */\n getExpansionState(basis: string): boolean {\n return this.dualBasisExpansion[basis] ?? true;\n }\n\n /**\n * Input deletion methods\n */\n inputWillBeRemovedIn(id: string): number | null {\n return this.countdownSeconds[id]?.count ?? null;\n }\n\n removeInput(item: FormColumnInputs): void {\n if (this.countdownSeconds[item.id]) {\n this.stopDeletion(item.id);\n return;\n }\n\n this.countdownSeconds[item.id] = {\n count: DELETION_COUNTDOWN_SECONDS,\n stop$: new Subject<void>()\n };\n\n const countdown$ = timer(0, 1000).pipe(\n tap((secondsElapsed) => {\n const data = this.countdownSeconds[item.id];\n if (!data) return;\n\n const remainingTime = DELETION_COUNTDOWN_SECONDS - secondsElapsed;\n if (remainingTime <= 0) {\n this.formDeleteInput(item);\n this.stopDeletion(item.id);\n } else {\n data.count = remainingTime;\n this.cdr.markForCheck();\n }\n }),\n takeUntil(this.countdownSeconds[item.id]!.stop$)\n );\n\n countdown$.subscribe({\n complete: () => {\n // Countdown completed or stopped\n }\n });\n }\n\n stopDeletion(id: string): void {\n if (this.countdownSeconds[id]) {\n this.countdownSeconds[id]?.stop$.next();\n delete this.countdownSeconds[id];\n this.cdr.markForCheck();\n }\n }\n\n formDeleteInput(item: FormColumnInputs): void {\n this.formBuilderFunctions?.deleteInput(item);\n }\n\n editInput(input: FormColumnInputs): void {\n this.formBuilderFunctions?.editInput(input);\n }\n\n /**\n * TrackBy functions for performance\n */\n trackByColumn(index: number, col: string): string {\n return col;\n }\n\n trackByRow(index: number, row: ExtendedTableRow): string {\n return row.segment || `row-${index}`;\n }\n\n trackByError(index: number, error: string): string {\n return error;\n }\n\n /**\n * Handles input menu events\n */\n onInputMenuEdit(input: FormColumnInputs): void {\n this.editInput(input);\n }\n\n onInputMenuDelete(input: FormColumnInputs): void {\n this.removeInput(input);\n }\n\n onInputMenuCancelDelete(id: string): void {\n this.stopDeletion(id);\n }\n\n onInputMenuHoverStart(id: string): void {\n this.hoveredInputId = id;\n this.cdr.markForCheck();\n }\n\n onInputMenuHoverEnd(): void {\n this.hoveredInputId = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Returns the business validation error for a cell. validationErrors is keyed by basis then by segment;\n * each error has accountDimension (the column, e.g. \"debit\"). So we match row segment and col to that.\n */\n getCellBusinessError(\n validationErrors: Record<string, Record<string, { canOveride?: boolean; accountDimension?: string; message?: string }>> | undefined | null,\n basis: string,\n col: string,\n segment: string | undefined\n ): { canOveride: boolean; accountDimension: string; message: string } | null {\n if (!validationErrors || !basis || !col || segment == null || segment === '') return null;\n const basisErrors = validationErrors[basis];\n if (!basisErrors) return null;\n const segmentKey = Object.keys(basisErrors).find(k => k.toLowerCase() === String(segment).toLowerCase());\n if (!segmentKey) return null;\n const err = basisErrors[segmentKey];\n if (!err) return null;\n const dim = (err.accountDimension ?? '').toLowerCase();\n const colLower = col.toLowerCase();\n if (dim && dim !== colLower) return null;\n return { canOveride: !!err.canOveride, accountDimension: err.accountDimension ?? col, message: err.message ?? '' };\n }\n\n /**\n * True when this table (basis) has at least one business rule error. When true, only cells with an error should be clickable.\n */\n tableHasBusinessErrors(\n validationErrors: Record<string, Record<string, unknown>> | undefined | null,\n basis: string\n ): boolean {\n if (!validationErrors || !basis) return false;\n const basisErrors = validationErrors[basis];\n return !!basisErrors && Object.keys(basisErrors).length > 0;\n }\n\n /**\n * True when the cell should be disabled because the table has business errors and this cell is not one of them.\n */\n isCellDisabledByBusinessErrors(\n validationErrors: Record<string, Record<string, { canOveride?: boolean; accountDimension?: string; message?: string }>> | undefined | null,\n basis: string,\n col: string,\n segment: string | undefined\n ): boolean {\n return this.tableHasBusinessErrors(validationErrors, basis) && !this.getCellBusinessError(validationErrors, basis, col, segment);\n }\n\n /**\n * Gets validation hint for a row/column combination\n * Only shows hints when the selection value is entirely empty\n */\n getValidationHint(row: ExtendedTableRow, col: string, basis: string): string | null {\n // Only show hints if the selection value is entirely empty\n if (row[col]) {\n return null;\n }\n\n // Show hints for empty required fields\n if (this.touched && this.inputConfig?.required) {\n return `Please select an account for ${row.segment || 'this segment'} in ${col} column.`;\n }\n\n // Show hints for single select fields (only when empty)\n if (row.singleSelect && col === COLUMNS.CREDIT) {\n return `The credit account will be automatically selected based on your debit selection.`;\n }\n\n // Show hints for VAT fields (only when empty)\n if (col === COLUMNS.VAT && row.segment?.toLowerCase() !== 'item') {\n return `VAT selection is only available for the Item segment.`;\n }\n\n return null;\n }\n\n /**\n * Gets context-aware guidance hint based on current state\n */\n getContextualGuidance(row: ExtendedTableRow, col: string, hasErrors: boolean): string | null {\n // If there are errors, don't show guidance\n if (hasErrors) {\n return null;\n }\n\n // Context-specific guidance based on segment and column\n const segment = row.segment?.toLowerCase() || '';\n \n // Item segment specific guidance\n if (segment === 'item' && col === COLUMNS.DEBIT) {\n return `For Item segments, select accounts that align with your transaction type (Assets, Payables, or Retentions).`;\n }\n\n // Project segment specific guidance\n if (segment === 'project' && col === COLUMNS.DEBIT) {\n return `Capital projects typically use specific account codes. Ensure your selection matches the project type.`;\n }\n\n // Regional segment specific guidance\n if (segment === 'regional' && col === COLUMNS.DEBIT && !row[col]) {\n return `Select the appropriate regional account code that matches your organization's regional structure.`;\n }\n\n // General guidance for first-time selection\n if (!row[col] && col === COLUMNS.DEBIT) {\n return `Choose an account that matches your transaction's reporting category. The system will validate compatibility automatically.`;\n }\n\n return null;\n }\n\n /**\n * Shows a temporary hint message\n */\n showTemporaryHint(message: string, type: 'info' | 'guidance' = 'info'): void {\n this.temporaryHintMessage = message;\n this.temporaryHintType = type;\n this.cdr.markForCheck();\n\n // Auto-clear after 6 seconds\n timer(6000).pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.temporaryHintMessage = null;\n this.cdr.markForCheck();\n });\n }\n\n /**\n * Clears temporary hint\n */\n clearTemporaryHint(): void {\n this.temporaryHintMessage = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Checks if text is likely truncated (heuristic based on length)\n */\n isTextTruncated(text: string | null | undefined): boolean {\n if (!text) return false;\n // Consider text truncated if it's longer than ~30 characters\n // This is a heuristic - actual truncation depends on available space\n return text.length > 30;\n }\n\n /**\n * Calculates column width percentage for proper space distribution\n */\n getColumnWidthPercent(isSegment: boolean, totalColumns: number): number | null {\n if (isSegment) {\n return 15; // Segment column gets 20%\n }\n // Remaining 80% is distributed equally among account columns\n const accountColumns = totalColumns - 1; // Exclude segment column\n if (accountColumns > 0) {\n return 80 / accountColumns;\n }\n return null;\n }\n\n /**\n * Gets formatted error context for a specific row/column\n */\n getErrorContext(row: ExtendedTableRow, col: string, basis: string): ErrorContext {\n return {\n segment: row.segment,\n column: col,\n accountingBasis: basis,\n accountNumber: row[col]?.AccountNumberShortened || row[col]?.SCOAAccount\n };\n }\n\n /**\n * Checks if there are errors for a specific row\n */\n hasRowErrors(row: ExtendedTableRow, basis: string): boolean {\n // This would need access to validation errors per row\n // For now, return false - can be enhanced with row-specific error tracking\n return false;\n }\n\n /**\n * Handles keyboard navigation in table cells\n */\n handleCellKeyDown(event: KeyboardEvent, row: ExtendedTableRow, col: string, isCash: boolean): void {\n const key = event.key;\n const target = event.target as HTMLElement;\n const cell = target.closest('td[mat-cell]') as HTMLElement;\n \n if (!cell) return;\n\n switch (key) {\n case 'ArrowRight':\n event.preventDefault();\n this.focusNextCell(cell, 'right');\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.focusNextCell(cell, 'left');\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.focusNextCell(cell, 'down');\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.focusNextCell(cell, 'up');\n break;\n case 'Enter':\n case ' ':\n // Type assertion for selectionDisabled - ExtendedTableRow extends IAccountSegmentTreeKeys\n if (!this.selectionDisabled(row as any, col)) {\n event.preventDefault();\n this.selectAccount(row, col, isCash);\n this.setAsTouched(event);\n }\n break;\n case 'Escape':\n event.preventDefault();\n this.resetSelectionState();\n cell.blur();\n break;\n case 'Tab':\n // Allow default tab behavior\n break;\n default:\n // Allow other keys to propagate\n break;\n }\n }\n\n /**\n * Focuses the next cell in the specified direction\n */\n private focusNextCell(currentCell: HTMLElement, direction: 'up' | 'down' | 'left' | 'right'): void {\n const table = currentCell.closest('table');\n if (!table) return;\n\n const cells = Array.from(table.querySelectorAll<HTMLElement>('td[mat-cell]'));\n const currentIndex = cells.indexOf(currentCell);\n \n if (currentIndex === -1) return;\n\n // Get column count from table headers\n const headers = Array.from(table.querySelectorAll<HTMLElement>('th[mat-header-cell]'));\n const colCount = headers.length || 4; // Default to 4 if can't determine\n\n let nextIndex = currentIndex;\n\n switch (direction) {\n case 'right':\n nextIndex = currentIndex + 1;\n break;\n case 'left':\n nextIndex = currentIndex - 1;\n break;\n case 'down':\n nextIndex = currentIndex + colCount;\n break;\n case 'up':\n nextIndex = currentIndex - colCount;\n break;\n }\n\n if (nextIndex >= 0 && nextIndex < cells.length) {\n const nextCell = cells[nextIndex];\n if (nextCell) {\n const button = nextCell.querySelector<HTMLButtonElement>('button.cell-button');\n if (button && button.disabled === false) {\n button.focus();\n } else if (nextCell) {\n // Try to focus the cell itself if no button or button is disabled\n nextCell.focus();\n }\n }\n }\n }\n}\n","<section \n (click)=\"setAsTouched($event)\" \n class=\"mscoa-chart__container\"\n [class.mscoa-chart__container--touched]=\"touched\"\n *ngIf=\"(viewData$ | async) as viewData\"\n role=\"region\"\n [attr.aria-label]=\"'MSCOA Account Chart'\"\n [attr.aria-busy]=\"viewData.loading || viewData.validatingValue\">\n\n @if (viewData.loading) {\n <div class=\"mscoa-chart__loading-container\" role=\"status\" aria-live=\"polite\">\n <mat-spinner [diameter]=\"40\"></mat-spinner>\n <span class=\"sr-only\">Loading account chart data...</span>\n </div>\n } @else {\n @defer (on viewport) {\n <ng-container *ngIf=\"viewData.accountTreeKeys || viewData.cashAccountTreeKeys\">\n <div class=\"mscoa-chart__table-container\">\n @if (isDualAccountBasis) {\n <div class=\"dual-basis-container\" role=\"group\" aria-label=\"Dual accounting basis tables\">\n <div class=\"dual-basis-container__item\">\n <ng-container \n *ngTemplateOutlet=\"selectionTable; \n context: {\n accountingBasis: ACCOUNTING_BASIS.ACCRUAL,\n canCollapse: true,\n viewData: viewData\n }\">\n </ng-container>\n </div>\n \n <div class=\"dual-basis-container__item\">\n <ng-container \n *ngTemplateOutlet=\"selectionTable; \n context: {\n accountingBasis: ACCOUNTING_BASIS.CASH,\n canCollapse: true,\n viewData: viewData\n }\">\n </ng-container>\n </div>\n </div>\n } @else {\n <ng-container \n *ngTemplateOutlet=\"selectionTable; \n context: {\n accountingBasis: config?.accountingBasis,\n canCollapse: false,\n viewData: viewData\n }\">\n </ng-container>\n }\n </div>\n </ng-container>\n\n <ng-template \n #selectionTable \n let-accountingBasis=\"accountingBasis\" \n let-canCollapse=\"canCollapse\"\n let-viewData=\"viewData\">\n \n <div class=\"mscoa-chart-table\" role=\"group\" [attr.aria-label]=\"'Accounting basis: ' + (accountingBasis || 'Accrual')\">\n <!-- Toolbar -->\n <app-mscoa-chart-toolbar\n [accountingBasis]=\"accountingBasis\"\n [canCollapse]=\"canCollapse\"\n [isExpanded]=\"getExpansionState(accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\"\n (toggleExpansion)=\"toggleDualBasisExpansion(accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\">\n </app-mscoa-chart-toolbar>\n\n @if (shouldShowTable(isDualAccountBasis, getExpansionState(accountingBasis || ACCOUNTING_BASIS.ACCRUAL), accountingBasis)) {\n <div class=\"account-selection-table-wrapper\">\n <div\n class=\"account-selection-table-container\"\n [class.account-selection-table-container--accrual]=\"!accountingBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL\"\n [class.account-selection-table-container--cash]=\"accountingBasis === ACCOUNTING_BASIS.CASH\"\n role=\"table\"\n [attr.aria-label]=\"'Account selection table for ' + (accountingBasis || 'Accrual') + ' basis'\">\n\n <table \n mat-table \n [dataSource]=\"accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashTableData : viewData.tableData\" \n [trackBy]=\"trackByRow\"\n class=\"table\"\n [attr.aria-label]=\"'Account selection table for ' + (accountingBasis || 'Accrual') + ' basis'\"\n [attr.aria-describedby]=\"'table-description-' + (accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\"\n role=\"table\">\n <span [id]=\"'table-description-' + (accountingBasis || ACCOUNTING_BASIS.ACCRUAL)\" class=\"sr-only\">\n Use arrow keys to navigate between cells. Press Enter or Space to select an account.\n </span>\n \n @for (\n col of (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols); \n track trackByColumn($index, col); \n let i = $index\n ) {\n <ng-container [matColumnDef]=\"col\" [sticky]=\"i === 0\">\n <!-- Header Cell -->\n <th \n mat-header-cell \n *matHeaderCellDef\n [class.table__header-cell--segment]=\"isSegmentColumn(i)\"\n [class.table__header-cell--regular]=\"!isSegmentColumn(i)\"\n [style.width.%]=\"getColumnWidthPercent(isSegmentColumn(i), (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols).length)\"\n [style.min-width.px]=\"isSegmentColumn(i) ? 150 : 200\"\n [attr.aria-sort]=\"i === 0 ? 'none' : null\"\n [attr.scope]=\"'col'\"\n [attr.aria-label]=\"getHeaderText(col, i, accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashHasMultiSelect : viewData.hasMultiSelect) + ' column'\">\n {{ getHeaderText(col, i, accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashHasMultiSelect : viewData.hasMultiSelect) | titlecase | unCamelCase }}\n </th>\n\n <!-- Data Cell -->\n <td \n mat-cell\n *matCellDef=\"let row\"\n [class.table__cell--segment]=\"isSegmentColumn(i)\"\n [class.table__cell--regular]=\"!isSegmentColumn(i)\"\n [class.table__cell--active]=\"editSelection?.segment === row['segment'] && activeColumn === col\"\n [class.table__cell--business-error]=\"!isSegmentColumn(i) && getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-label]=\"'Cell for ' + row['segment'] + ' segment, ' + col + ' column'\"\n [attr.aria-selected]=\"!!row[col]\"\n [attr.aria-invalid]=\"!isSegmentColumn(i) && !!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.role]=\"'gridcell'\"\n [attr.tabindex]=\"isSegmentColumn(i) ? -1 : (row[col] ? 0 : -1)\">\n \n @if (isSegmentColumn(i)) {\n <!-- Segment Column -->\n <div class=\"segment-cell-content\">\n @if (editorMode && row.innerInput?.id) {\n <button \n mat-icon-button \n [matMenuTriggerData]=\"{innerInput: row.innerInput}\"\n [matMenuTriggerFor]=\"inputMenu\" \n [matTooltip]=\"'Options for: ' + row.innerInput.label\"\n [attr.aria-label]=\"'Options menu for ' + row.innerInput.label\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon>more_vert</mat-icon>\n </button>\n }\n <span class=\"segment-cell-content__label\">{{ row['label'] }}</span>\n </div>\n } @else {\n <!-- Regular Column -->\n @if (row.innerInput?.id && formGroup && inputPortals[getPortalKey(row.innerInput.id)]) {\n <div class=\"portal-container\">\n <ng-template [cdkPortalOutlet]=\"inputPortals[getPortalKey(row.innerInput.id)]\"></ng-template>\n </div>\n } @else {\n @if (row[col]) {\n <!-- Account Selected -->\n @if (getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment']); as cellError) {\n <div class=\"account-cell-wrapper\" \n [class.account-cell-wrapper--expandable]=\"isTextTruncated(row[col] | unCamelCase)\">\n <button \n [disabled]=\"row['singleSelect'] === true && col === COLUMNS.CREDIT\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation(); selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); setAsTouched($event)\"\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\n color=\"primary\" \n mat-button \n class=\"cell-button cell-button--selected cell-button--business-error\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase) + ' for ' + row['segment'] + ' segment, ' + col + ' column. Business error: ' + cellError.message\"\n [attr.aria-invalid]=\"true\"\n [attr.aria-pressed]=\"true\"\n [matTooltip]=\"cellError.message\">\n <div class=\"content\">\n <span \n class=\"selected-acount-label selected-acount-label--tag selected-acount-label--business-error\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase)\">\n {{ row[col] | unCamelCase }}\n @if (shouldShowVatChip(row, col)) {\n <span \n class=\"vat-badge\"\n [attr.aria-label]=\"'VAT applicable to ' + col + ' column'\"\n [matTooltip]=\"'VAT is applicable to this ' + col + ' account selection'\">\n VAT\n </span>\n }\n </span>\n <mat-icon class=\"business-error-indicator\" aria-hidden=\"true\">error</mat-icon>\n </div>\n </button>\n </div>\n } @else {\n <div class=\"account-cell-wrapper\" \n [class.account-cell-wrapper--expandable]=\"isTextTruncated(row[col] | unCamelCase)\">\n <button \n [disabled]=\"(row['singleSelect'] === true && col === COLUMNS.CREDIT) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n (mousedown)=\"$event.preventDefault(); $event.stopPropagation(); selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); setAsTouched($event)\"\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\n color=\"primary\" \n mat-button \n class=\"cell-button cell-button--selected\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase) + ' for ' + row['segment'] + ' segment, ' + col + ' column. Press Enter or Space to change'\"\n [attr.aria-invalid]=\"false\"\n [attr.aria-disabled]=\"(row['singleSelect'] === true && col === COLUMNS.CREDIT) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-pressed]=\"true\">\n <div class=\"content\">\n <span \n class=\"selected-acount-label selected-acount-label--tag\"\n [attr.aria-label]=\"'Selected account: ' + (row[col] | unCamelCase)\">\n {{ row[col] | unCamelCase }}\n @if (shouldShowVatChip(row, col)) {\n <span \n class=\"vat-badge\"\n [attr.aria-label]=\"'VAT applicable to ' + col + ' column'\"\n [matTooltip]=\"'VAT is applicable to this ' + col + ' account selection'\">\n VAT\n </span>\n }\n </span>\n @if (showValidationSuccessIndicators) {\n <mat-icon class=\"validated-indicator\" aria-hidden=\"true\" [matTooltip]=\"'Validated'\">shield</mat-icon>\n } @else {\n <mat-icon class=\"success-indicator\" aria-hidden=\"true\">check_circle</mat-icon>\n }\n </div>\n </button>\n </div>\n }\n } @else {\n <!-- No Account Selected -->\n <div class=\"cell-button-wrapper\">\n <button \n [disabled]=\"selectionDisabled(row, col) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [color]=\"\"\n (click)=\"selectAccount(row, col, accountingBasis === ACCOUNTING_BASIS.CASH); $event.stopPropagation(); setAsTouched($event)\"\n (keydown)=\"handleCellKeyDown($event, row, col, accountingBasis === ACCOUNTING_BASIS.CASH)\"\n mat-button\n class=\"cell-button\"\n [class.cell-button--business-error]=\"!!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-label]=\"shouldShowAutoSelectedLabel(row, col) ? 'Auto selected for ' + row['segment'] + ' segment, ' + col + ' column' : 'Select account for ' + row['segment'] + ' segment, ' + col + ' column'\"\n [attr.aria-disabled]=\"selectionDisabled(row, col) || isCellDisabledByBusinessErrors(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-describedby]=\"getValidationHint(row, col, accountingBasis || ACCOUNTING_BASIS.ACCRUAL) ? 'hint-' + row['segment'] + '-' + col : null\"\n [attr.aria-invalid]=\"hasError(touched, inputConfig?.required || false, !!row[col]) || !!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\"\n [attr.aria-required]=\"inputConfig?.required && !row[col]\"\n [matTooltip]=\"getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])?.message\">\n <div class=\"content\">\n <span \n class=\"selected-acount-label\"\n [class.selected-acount-label--error]=\"hasError(touched, inputConfig?.required || false, !!row[col])\"\n [class.selected-acount-label--business-error]=\"!!getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])\">\n {{ (shouldShowAutoSelectedLabel(row, col) ? 'auto selected' : 'Select account') | unCamelCase }}\n @if (inputConfig?.required && !row[col]) {\n <span class=\"required-indicator\" aria-label=\"Required field\">*</span>\n }\n </span>\n @if (getCellBusinessError(viewData.validationErrors, accountingBasis || ACCOUNTING_BASIS.ACCRUAL, col, row['segment'])) {\n <mat-icon class=\"business-error-indicator\" aria-hidden=\"true\">error</mat-icon>\n } @else if (shouldShowDropdownIcon(row, col)) {\n <mat-icon aria-hidden=\"true\">arrow_drop_down</mat-icon>\n }\n </div>\n </button>\n @if (getValidationHint(row, col, accountingBasis || ACCOUNTING_BASIS.ACCRUAL); as hint) {\n <span \n class=\"inline-hint\"\n [id]=\"'hint-' + row['segment'] + '-' + col\"\n role=\"tooltip\"\n aria-live=\"polite\">\n {{ hint }}\n </span>\n }\n </div>\n }\n }\n }\n </td>\n </ng-container>\n }\n\n <tr mat-header-row *matHeaderRowDef=\"accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: (accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashCols : viewData.cols)\"></tr>\n </table>\n </div>\n </div>\n\n <!-- Empty State -->\n <ng-container *ngIf=\"(accountingBasis === ACCOUNTING_BASIS.CASH ? viewData.cashAccountTreeKeys : viewData.accountTreeKeys).length === 0\">\n <section class=\"empty-state\" role=\"status\" aria-live=\"polite\">\n <mat-icon aria-hidden=\"true\">info</mat-icon>\n <span>\n No account segments are currently configured.\n Please configure account segments to proceed.\n </span>\n </section>\n </ng-container>\n\n <!-- Success Messages (Temporary) -->\n @if ((successMessage$ | async); as successMessages) {\n @if (getSuccessMessage(successMessages, accountingBasis || ACCOUNTING_BASIS.ACCRUAL); as msg) {\n <app-mscoa-temporary-hint\n [message]=\"getSuccessMessage(successMessages, accountingBasis || ACCOUNTING_BASIS.ACCRUAL) ?? ''\"\n [type]=\"'info'\"\n [duration]=\"6000\"\n [showDismiss]=\"true\">\n </app-mscoa-temporary-hint>\n }\n }\n\n <!-- Business Rule Errors (Temporary display, keeps error styling) -->\n @if ((viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL] || []).length > 0) {\n <app-mscoa-error-display\n [errors]=\"viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL] || []\"\n type=\"error\"\n [context]=\"{ accountingBasis: accountingBasis || ACCOUNTING_BASIS.ACCRUAL }\"\n [duration]=\"6000\"\n [showDismiss]=\"true\">\n </app-mscoa-error-display>\n }\n\n <!-- Temporary Contextual Hints -->\n @if (temporaryHintMessage) {\n <app-mscoa-temporary-hint\n [message]=\"temporaryHintMessage\"\n [type]=\"temporaryHintType\"\n [duration]=\"6000\"\n [showDismiss]=\"true\">\n </app-mscoa-temporary-hint>\n }\n\n <!-- Validation Hints (Context-Aware) -->\n @if (!touched && inputConfig?.required && !viewData.busnessRuleErrors[accountingBasis || ACCOUNTING_BASIS.ACCRUAL]?.length && (!isDualAccountBasis || accountingBasis === ACCOUNTING_BASIS.ACCRUAL || !accountingBasis)) {\n <div class=\"validation-hints\" role=\"region\" aria-label=\"Validation guidance\">\n <p class=\"validation-hints__title\">Guidance:</p>\n <ul class=\"validation-hints__list\">\n <li>Account combinations are validated automatically. Select accounts that belong to compatible reporting categories.</li>\n <li>Required fields are marked with an asterisk (*). Complete all required selections to proceed.</li>\n <li>Some fields may be automatically populated based on your selections to ensure consistency.</li>\n </ul>\n </div>\n }\n }\n </div>\n </ng-template>\n } @placeholder {\n <div class=\"loading-placeholder\" role=\"status\" aria-live=\"polite\">\n <p>Loading data...</p>\n </div>\n } @loading (minimum 100ms) {\n <div class=\"loading-spinner-container\" role=\"status\" aria-live=\"polite\">\n <mat-progress-spinner mode=\"indeterminate\" [diameter]=\"40\"></mat-progress-spinner>\n <span class=\"sr-only\">Loading account chart...</span>\n </div>\n } @error {\n <div class=\"error-state\" role=\"alert\" aria-live=\"assertive\">\n <p>Error loading data. Please try again.</p>\n </div>\n }\n }\n</section>\n\n<!-- Input Menu -->\n<mat-menu #inputMenu=\"matMenu\">\n <ng-template matMenuContent let-innerInput=\"innerInput\">\n <app-mscoa-chart-input-menu\n [innerInput]=\"innerInput\"\n [countdownSeconds]=\"inputWillBeRemovedIn(innerInput.id)\"\n [hoveredId]=\"hoveredInputId\"\n (edit)=\"onInputMenuEdit($event)\"\n (delete)=\"onInputMenuDelete($event)\"\n (cancelDelete)=\"onInputMenuCancelDelete($event)\"\n (hoverStart)=\"onInputMenuHoverStart($event)\"\n (hoverEnd)=\"onInputMenuHoverEnd()\">\n </app-mscoa-chart-input-menu>\n </ng-template>\n</mat-menu>\n","import { Directive, ElementRef, Input, Optional, Self, OnDestroy, DoCheck, Output, EventEmitter } 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 @Output() blur = new EventEmitter<any>();\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: any;\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 { Component, ElementRef, inject, Input, Optional, Self } from '@angular/core';\nimport { AbstractControl, FormGroup, NgControl, ValidationErrors } from '@angular/forms';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport { BehaviorSubject } from 'rxjs';\nimport { AccountingBasis, FormBuilderFunctions, IIncludedSegmentConfig, ITowerStepColumn } from \"ngx-t-forms-types\";\n\nimport { MscoaChartComponent } from '../mscoa-chart/mscoa-chart.component';\nimport { IScoaInputConfig, ScoaSegmentValue } from \"ngx-t-forms-types\";\nimport _ from 'lodash';\nimport { CommonModule } from '@angular/common';\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput'; import { MscoaComponentStore } from '../../store/mscoa-component-store.service';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\nconst customInputConfig: BaseCustomInputConfig = {\n controlType: 'lib-mscoa-reactive-form-field',\n nextId: 0\n}\n\n@Component({\n selector: 'lib-mscoa-reactive-form-field',\n standalone: true,\n imports: [MscoaChartComponent, CommonModule],\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 host: {\n '[class.floating]': 'shouldLabelFloat',\n '[id]': 'id',\n },\n})\nexport class MscoaReactiveFormFieldComponent extends BaseCustomInput<ScoaSegmentValue> {\n store = inject(MscoaComponentStore)\n\n businessRuleValidationErrors$ = this.store.selectors.validationErrors$;\n businessRuleValidationErrors = toSignal(this.businessRuleValidationErrors$)\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 constructor(\n @Optional() @Self() ngControl: NgControl,\n elementRef: ElementRef<HTMLElement>\n ) {\n super(ngControl, elementRef, customInputConfig);\n\n }\n\n\n\n @Input() formBuilderFunctions: FormBuilderFunctions | undefined\n @Input() editorMode: boolean = false;\n\n _inputConfig!: ITowerStepColumn;\n\n mscoaInputConfig$ = new BehaviorSubject<IScoaInputConfig | undefined>(undefined)\n @Input() set inputConfig(inputConfig: ITowerStepColumn) {\n this._inputConfig = inputConfig\n this.mscoaInputConfig$.next({ ...inputConfig.mscoaConfig, inputId: inputConfig.id } as any)\n\n }\n\n get shouldLabelFloat(): boolean {\n return this.focused || !this.empty;\n }\n\n\n\n\n segmentValuesChanged(event: ScoaSegmentValue): void {\n this.value = event\n this.onChange(event);\n this.stateChanges.next();\n\n }\n\n get readonly(): boolean {\n return !!this._inputConfig.readonly\n }\n get parentFormGroup(): FormGroup | null {\n return this.ngControl?.control?.parent as FormGroup;\n }\n\noverride checkValidationsAnErrors() {\n const { control } = this.ngControl || {};\n if (!control) return;\n\n const errors: ValidationErrors = { ...(control.errors || {}) };\n const mscoa = this._inputConfig?.mscoaConfig as any;\n const rawValue = this.value || {};\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 || '').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) as any[]) {\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 ?? '').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: rawValue['accrual'] as unknown as ScoaSegmentValue,\n cash: rawValue['cash'] as unknown as ScoaSegmentValue\n };\n let 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/** Determines if the current value satisfies the specific Accounting Basis.\n * For dual basis, BOTH accrual and cash must be valid.\n */\nprivate checkBasisValidity(basis: AccountingBasis | undefined, accrualValid: boolean, cashValid: boolean): boolean {\n const b = (basis ?? '').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. */\nprivate updateControlErrors(\n control: AbstractControl,\n currentErrors: ValidationErrors,\n segmentValid: boolean,\n hasNonOverridableBusinessError: boolean,\n businessRuleMessages: string[],\n segmentErrorMessage?: string\n) {\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 control.setErrors(hasErrors ? newErrors : null);\n}\n\n}\n","\r\n<div (click)=\"onContainerClick($event)\">\r\n <app-mscoa-chart \r\n (onContainerClick)=\"onContainerClick($event)\"\r\n (segmentValuesChanged)=\"segmentValuesChanged($event)\" \r\n [config]=\"mscoaInputConfig$|async\"\r\n [inputConfig]=\"_inputConfig \"\r\n [readonly]=\"readonly\"\r\n \r\n [touched]=\"touched\"\r\n [editorMode]=\"editorMode\"\r\n [formGroup]=\"parentFormGroup\"\r\n [formBuilderFunctions]=\"formBuilderFunctions\"\r\n [segmentValues]=\"value\">\r\n </app-mscoa-chart>\r\n</div>\r\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 { Component, EventEmitter, Input, Output, } from '@angular/core';\r\nimport {ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormBuilderFunctions } from \"ngx-t-forms-types\";\r\n\r\n\r\nimport _ from 'lodash';\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@Component({\r\n selector: 'lib-mscoa-form-input',\r\n standalone: true,\r\n imports: [\r\n MatModulesModule,\r\n CommonModule, \r\n ReactiveFormsModule,\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})\r\nexport class MscoaFormInputComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() editorMode: boolean = false; \r\n @Input() formGroup!: FormGroup;\r\n \r\n @Input() formBuilderFunctions: FormBuilderFunctions |undefined\r\n\r\n\r\n @Output() reload = new EventEmitter<void>();\r\n\r\n \r\n get errorMessage(){\r\n return getInputErrorMessage(this.inputConfig, this.formGroup, true)\r\n }\r\n \r\n \r\n}\r\n","<form [formGroup]=\"formGroup\">\r\n <mat-form-field \r\n\r\n [appearance]=\"this.inputConfig.appearance ||'fill' \"\r\n [floatLabel]=\"'always'\"\r\n subscriptSizing=\"dynamic\" *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }} \r\n <lib-t-form-input-status \r\n [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n\r\n \r\n <lib-mscoa-reactive-form-field \r\n [inputConfig]=\"this.inputConfig\"\r\n [formControlName]=\"this.inputConfig.id\"\r\n [required]=\"this.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 <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n \r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\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 </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n \r\n </mat-form-field>\r\n\r\n\r\n \r\n \r\n \r\n","\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';\r\nimport { HmacSHA256, enc } from 'crypto-js';\r\n\r\n\r\n const APP_SECRET = `c011//e91d5664a8df0b///f6240a06445**b9YWnn7db012ec5a4f62b12e0555_24bfec2`; // Move to environment config in production\r\nexport const generateSecretKey = async (input:FormColumnInputs): Promise<string> => {\r\n try {\r\n if(!input){\r\n throw new Error(\"Input is required to generate secret key\");\r\n }\r\n const {id,element,formControlName,sectionId} = input;\r\n // Add salt and pepper to the mix\r\n const pepper = \"NGX_T_FORMS_V1\";\r\n const timestamp = new Date().getTimezoneOffset();\r\n \r\n // Create a more complex seed with multiple layers\r\n const primarySeed = `${id}:${formControlName}:${element}:${sectionId}`;\r\n const enrichedSeed = `${pepper}:${primarySeed}:${timestamp}`;\r\n \r\n // Double hashing for increased security\r\n const firstHash = HmacSHA256(enrichedSeed, APP_SECRET);\r\n const secondHash = HmacSHA256(firstHash.toString(), APP_SECRET + pepper);\r\n \r\n // Take first 32 characters of final hash\r\n return secondHash.toString(enc.Hex).substring(0, 32);\r\n } catch (error) {\r\n throw error\r\n }\r\n \r\n\r\n}\r\n","import CryptoJS from 'crypto-js';\r\ninterface EncryptedData {\r\n ciphertext: string;\r\n salt: string;\r\n iv: string;\r\n hmac: string;\r\n}\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, EncryptedData };","import { 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 { FormColumnInputs } from \"ngx-t-forms-types\";\r\nimport { generateSecretKey } from '../../../../../../../services/core/t-input-controller/functions/generateInputSecret';\r\nimport SignaturePad, { PointGroup } from \"signature_pad\";\r\nimport { decrypt, EncryptedData } from \"../../../../../../../shared/functions/enryption\";\r\nimport { SignatureConfigOptions } from \"../../../config/signature\";\r\nexport const getSignatureImage = async (inputConfig: FormColumnInputs, value: EncryptedData | undefined): Promise<string | undefined> => {\r\n if (typeof value !== 'object' && value !== null || value === null) return\r\n\r\n const secret = await generateSecretKey(inputConfig);\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 const signaturePad = new SignaturePad(canvas, SignatureConfigOptions);\r\n if (!secret) {\r\n return\r\n }\r\n if (!value || !value.salt || !secret || typeof value.iv !== 'string' || typeof value.salt !== 'string') {\r\n return\r\n }\r\n\r\n const decrypted = await decrypt(value as unknown as EncryptedData, secret) as unknown as PointGroup[];\r\n let parsed = JSON.parse(decrypted as unknown as string || '[]');\r\n try {\r\n parsed = JSON.parse(decrypted as unknown as string || '[]');\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","import { CommonModule } from '@angular/common';\r\nimport { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, inject, Input, NgZone, Optional, Self, ViewChild, ViewEncapsulation } from '@angular/core';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';;\r\nimport { NgControl } from '@angular/forms';\r\n\r\nimport SignaturePad, { PointGroup } from 'signature_pad';\r\nimport { FormColumnInputs } from 'ngx-t-forms-types';;\r\n\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { debounceTime, finalize, firstValueFrom, Subject, Subscription, take } from 'rxjs';\r\nimport { SignatureConfigOptions } from '../../config/signature';\r\nimport { IUserSignature } from \"ngx-t-forms-types\";\r\nimport { decrypt, encrypt, EncryptedData } from '../../../../../../shared/functions/enryption';\r\nimport { generateSecretKey } from '../../../../../../services/core/t-input-controller/functions/generateInputSecret';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\n\r\n\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'lib-signature-pad-input',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'lib-signature-pad-input',\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule],\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.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SignaturePadInputComponent extends BaseCustomInput<PointGroup[] | undefined> implements AfterViewInit {\r\n readonly NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN)\r\n @ViewChild('signature', { static: false }) signatureElement!: ElementRef\r\n signaturePad: SignaturePad | undefined;\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 n === null || n === undefined || (n as any) === '' || n.length === 0;\r\n }\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n private signatureSubject = new Subject<void>();\r\n private subscription: Subscription = new Subscription();\r\n\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>,\r\n private cdr: ChangeDetectorRef,\r\n private ngZone: NgZone\r\n ) {\r\n super(ngControl, elementRef, customInputConfig);\r\n this.subscription = this.signatureSubject\r\n .pipe(debounceTime(500))\r\n .subscribe(async () => {\r\n await this.saveSignature();\r\n });\r\n }\r\n _inputConfig!: FormColumnInputs;\r\n @Input() set inputConfig(inputConfig: FormColumnInputs) {\r\n\r\n this._inputConfig = inputConfig;\r\n }\r\n\r\n get inputConfig() {\r\n return this._inputConfig;\r\n }\r\n\r\n\r\n\r\n ngAfterViewInit() {\r\n this.loading = 'Initializing signature pad ...';\r\n\r\n this.initSignature()\r\n\r\n }\r\n\r\n initSignature() {\r\n this.ngZone.runOutsideAngular(async () => {\r\n try {\r\n {\r\n\r\n const canvas = document.createElement('canvas');\r\n // Set canvas dimensions\r\n canvas.width = this.signatureElement.nativeElement.offsetWidth;\r\n canvas.height = 200; // You can adjust this value\r\n\r\n // Append canvas to the div\r\n this.signatureElement.nativeElement.appendChild(canvas);\r\n // Initialize SignaturePad\r\n this.signaturePad = new SignaturePad(canvas, SignatureConfigOptions);\r\n // Load initial value if exists\r\n\r\n if (this.value !== undefined && this.value !== null && (this.value as any) !== '') {\r\n\r\n await this.initLoadValue()\r\n\r\n\r\n } else {\r\n await this.loadUserDigitalSignatureFromAPI()\r\n }\r\n\r\n\r\n // Add event listeners for changes\r\n this.signaturePad.addEventListener('afterUpdateStroke', () => {\r\n\r\n this.signatureSubject.next();\r\n this.canSaveSignature = true;\r\n\r\n\r\n }, { once: false });\r\n if (!!this.inputConfig.readonly) {\r\n this.signaturePad.off()\r\n }\r\n this.loading = undefined;\r\n }\r\n } catch (error) {\r\n\r\n }\r\n })\r\n }\r\n\r\n\r\n async initLoadValue() {\r\n try {\r\n this.loading = 'Loading signature ...';\r\n\r\n //Load user signature \r\n const secret = await generateSecretKey(this.inputConfig);\r\n if (!secret) {\r\n this.loading = undefined;\r\n return\r\n }\r\n\r\n\r\n const decrypted = await decrypt(this.value as unknown as EncryptedData, secret) as unknown as PointGroup[];\r\n\r\n let parsed = JSON.parse(decrypted as unknown as string || '[]');\r\n try {\r\n parsed = JSON.parse(decrypted as unknown as string || '[]');\r\n } catch {\r\n this.loading = undefined;\r\n return\r\n }\r\n this.NGX_T_FORMS_CONFIG.formBuilder.toastSuccess('Signature loaded successfully')\r\n this.signaturePad?.fromData(parsed);\r\n\r\n } catch {\r\n } finally {\r\n this.loading = undefined;\r\n }\r\n\r\n\r\n }\r\n\r\n private _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 private 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 = [];\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\r\n saveSignature = async (): Promise<PointGroup[] | null> => {\r\n\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\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\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);\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 this.value = await encrypt(processedData, secrete) as unknown as PointGroup[];\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 clearSignature() {\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 override ngOnDestroy() {\r\n this.signaturePad?.off(); // Remove event listeners\r\n this.stateChanges.complete();\r\n this.subscription?.unsubscribe();\r\n }\r\n\r\n canSaveSignature: boolean = false;\r\n canApplySignature: boolean = false;\r\n userStoredSignature: IUserSignature | undefined;\r\n getUserUrl() {\r\n const userPicture = this.userStoredSignature?.pictureUrl || `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 async loadUserDigitalSignatureFromAPI(): Promise<void> {\r\n if (!this.NGX_T_FORMS_CONFIG.formBuilder.getUserSignature) {\r\n return;\r\n }\r\n if (this._inputConfig.disabled || !!this._inputConfig.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\r\n } catch {\r\n } finally {\r\n this.loading = undefined;\r\n }\r\n }\r\n saveUserSignature() {\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.saveUserSignature(data).pipe(\r\n take(1),\r\n finalize(() => {\r\n this.loading = undefined;\r\n this.canSaveSignature = false;\r\n })\r\n ).subscribe(() => {\r\n\r\n });\r\n return null;\r\n }\r\n\r\n}\r\n","<div [style.opacity]=\"canApplySignature?'0.1':'1'\" #signature class=\"signature-container\">\r\n \r\n \r\n</div>\r\n@if (canSaveSignature) {\r\n\r\n<mat-toolbar>\r\n\r\n <button style=\" width: 100%;\" \r\n matTooltip=\"You can save this signature for quick use in future documents\" \r\n mat-flat-button\r\n color=\"accent\"\r\n (click)=\"saveUserSignature()\">\r\n <mat-icon>save</mat-icon>\r\n Save for future use\r\n </button>\r\n</mat-toolbar>\r\n}\r\n@if (canApplySignature && !inputConfig.disabled && !inputConfig.readonly ) {\r\n\r\n <mat-card appearance=\"outlined\" class=\"signature-card\">\r\n <mat-card-header>\r\n <img \r\n class=\"userAvatar\"\r\n mat-card-avatar \r\n [src]=\"getUserUrl()\" \r\n [attr.aria-label]=\"'Profile picture of ' + userStoredSignature?.userName\"\r\n >\r\n \r\n \r\n <mat-card-title class=\"existingTitle\">Found an existing signature</mat-card-title>\r\n \r\n <mat-card-subtitle class=\"signature-metadata\">\r\n <span class=\"metadata-item\">\r\n <mat-icon aria-hidden=\"true\">person</mat-icon>\r\n <span class=\"metadata-text\">{{userStoredSignature?.userName}}</span>\r\n </span>\r\n \r\n <span class=\"metadata-item\">\r\n <mat-icon aria-hidden=\"true\">calendar_month</mat-icon>\r\n <span class=\"metadata-text\">{{userStoredSignature?.signatureDate | date: 'mediumDate'}}</span>\r\n </span>\r\n </mat-card-subtitle>\r\n </mat-card-header>\r\n \r\n <mat-card-content>\r\n <p class=\"signature-description\">\r\n You can apply your saved signature or clear to draw a new one\r\n </p>\r\n </mat-card-content>\r\n \r\n \r\n <mat-card-actions align=\"end\">\r\n <button \r\n mat-flat-button\r\n color=\"primary\" \r\n class=\"apply-signature-btn\"\r\n (click)=\"saveSignature()\"\r\n [matTooltip]=\"'Apply your saved signature from ' + (userStoredSignature?.signatureDate | date: 'mediumDate')\">\r\n <mat-icon>done</mat-icon>\r\n <span>Apply Existing Signature</span>\r\n </button>\r\n </mat-card-actions>\r\n </mat-card>\r\n }\r\n<mat-toolbar style=\"max-width: 100%; overflow:auto\">\r\n <span>\r\n <div style=\"font-size:14px;line-height:normal;font-weight:500\">\r\n Signature:\r\n </div>\r\n <div style=\"font-size:12px;font-weight:400;line-height:1.5\">\r\n Secured and Encrypted.\r\n </div>\r\n\r\n </span>\r\n <span class=\"spacer\"></span>\r\n\r\n@if(!inputConfig.readonly){\r\n <button mat-stroked-button color=\"warn\" (click)=\"clearSignature()\">\r\n Clear\r\n\r\n</button>\r\n}\r\n\r\n</mat-toolbar>\r\n@if(loading){\r\n<div class=\"signature-pad-container\">\r\n <mat-spinner diameter=\"50\">\r\n </mat-spinner>\r\n <span>\r\n {{loading}}\r\n </span>\r\n\r\n</div>\r\n}","import { Component,EventEmitter,Input, Output } from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { ITowerStepColumn } from \"ngx-t-forms-types\";\nimport { CommonModule } from '@angular/common';\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\n\nimport { SignaturePadInputComponent } from './core/signature-pad-input/signature-pad-input.component';\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\n\n\n@Component({\n selector: 'lib-signature-input-element',\n standalone: true,\n imports: [ MatModulesModule, \n TFormInputStatusComponent,\n CommonModule,\n ReactiveFormsModule, SignaturePadInputComponent],\n templateUrl: './signature-input-element.component.html',\n styleUrl: './signature-input-element.component.css'\n})\nexport class SignatureInputElementComponent {\n @Input() inputConfig!: ITowerStepColumn;\n @Input() formGroup!: FormGroup;\n \n @Output() reload = new EventEmitter<void>();\n\n\n get errorMessage(){\n return getInputErrorMessage(this.inputConfig, this.formGroup);\n }\n}\n","<form [formGroup]=\"formGroup\">\n <mat-form-field \n [appearance]=\"this.inputConfig.appearance ||'fill' \"\n [floatLabel]=\"'always'\"\n subscriptSizing=\"dynamic\" *ngIf=\"this.inputConfig as inputConfig\">\n <mat-label>\n {{this.inputConfig.label }} \n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\n </mat-label>\n <lib-signature-pad-input [inputConfig]=\"this.inputConfig\"\n [required]=\"this.inputConfig.required\"\n [formControlName]=\"inputConfig.id\"></lib-signature-pad-input>\n <!-- <app-signature-input [inputConfig]=\"this.inputConfig\"\n [formControlName]=\"inputConfig.id\"></app-signature-input>\n -->\n\n @if(inputConfig.hintLabel || inputConfig.temporaryHint ){\n <mat-hint class=\"inputHint\">\n {{ inputConfig.temporaryHint || inputConfig.hintLabel}}\n </mat-hint>\n } \n\n @if (!!errorMessage) {\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</mat-error>\n }\n @if(inputConfig.canReload?.canReload){\n <button mat-icon-button\n style=\"margin-right: 4px;\"\n matTooltip=\"Click to refresh this field.\"\n class=\"input-sync-button\"\n (click)=\"inputConfig.canReload.emit()\" matSuffix>\n <mat-icon style=\"color:var(--mat-sys-primary)\">sync</mat-icon>\n </button>\n }\n <!-- Prefix Icon -->\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\n\n <!-- Suffix Icon or Password Visibility Toggle -->\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\n }}</mat-icon>\n <!-- <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"inputConfig.togglePasswordVisibility()\"\n mat-icon-button matSuffix>\n <mat-icon>{{ inputConfig.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\n </button> -->\n </ng-container>\n\n <!-- Prefix & Suffix Text -->\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\n }}</span>\n\n <!-- Character Count Hint -->\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\n }}\n </mat-hint>\n\n \n\n </mat-form-field>\n</form>\n","import { Component, Input } from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\n\r\n\r\n@Component({\r\n selector: 'lib-section-title',\r\n standalone: true,\r\n imports: [CommonModule,MatModulesModule],\r\n templateUrl: './section-title.component.html',\r\n styleUrl: './section-title.component.css'\r\n})\r\nexport class SectionTitleComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n \r\n}\r\n","<br>\r\n<h3>\r\n {{inputConfig.label}}\r\n</h3>\r\n<div [innerHTML]=\"inputConfig.hintLabel\">\r\n</div>\r\n<br>\r\n","import { Component, ElementRef, Input, OnInit, Optional, Self } from '@angular/core';\r\nimport { NgControl, ReactiveFormsModule} from '@angular/forms';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { MatAutocomplete } from '@angular/material/autocomplete';\r\nimport { debounceTime, Subject, takeUntil } from 'rxjs';\r\nconst customInputConfig:BaseCustomInputConfig = {\r\n controlType: 'lib-auto-complet-reactive-input',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'lib-auto-complet-reactive-input',\r\n imports: [\r\n MatModulesModule,\r\n ReactiveFormsModule,\r\n ],\r\n host: {\r\n '[class.floating]': 'shouldLabelFloat',\r\n '[id]': 'id',\r\n\r\n },\r\n providers: [{ provide: MatFormFieldControl, useExisting: AutoCompletReactiveInputComponent }],\r\n templateUrl: './auto-complet-reactive-input.component.html',\r\n styleUrl: './auto-complet-reactive-input.component.css'\r\n})\r\nexport class AutoCompletReactiveInputComponent extends BaseCustomInput<string|number|Date> implements OnInit {\r\n override get empty(): boolean {\r\n return !this.value;\r\n }\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n @Input() auto!: MatAutocomplete\r\n @Input() inputConfig!: ITowerStepColumn;\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>\r\n ) {\r\n super(ngControl, elementRef,customInputConfig);\r\n }\r\n private readonly debounceTime = 300;\r\n private valueSubject = new Subject<any>();\r\n \r\n ngOnInit(): void {\r\n this.valueSubject.pipe(\r\n debounceTime(this.debounceTime),\r\n takeUntil(this.destroy$)\r\n ).subscribe(event => {\r\n this.value = event.target.value;\r\n this.stateChanges.next();\r\n this.onChange(this.value);\r\n });\r\n }\r\n\r\n onInputChange($event: any) {\r\n this.valueSubject.next($event);\r\n }\r\n \r\n}\r\n","<input [readonly]=\"this.inputConfig?.readonly\" [pattern]=\"this.inputConfig?.pattern || ''\"\r\n [required]=\"!!this.inputConfig?.required\" [attr.maxlength]=\"this.inputConfig?.maxLength\"\r\n [attr.minlength]=\"this.inputConfig?.minLength\"\r\n [type]=\"this.inputConfig?.type||'text'\" \r\n (input)=\"onInputChange($event)\"\r\n [value]=\"value\"\r\n\r\n [min]=\"this.inputConfig?.min\" [max]=\"this.inputConfig?.max\" autocomplete=\"on\"\r\n [matAutocomplete]=\"auto\"\r\n matInput />","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\nimport { ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { AutoCompletReactiveInputComponent } from './core/auto-complet-reactive-input/auto-complet-reactive-input.component';\r\n\r\n@Component({\r\n selector: 'lib-auto-complete-input-element',\r\n standalone: true,\r\n imports: [MatModulesModule,ReactiveFormsModule,CommonModule, \r\n AutoCompletReactiveInputComponent,\r\n TFormInputStatusComponent],\r\n templateUrl: './auto-complete-input-element.component.html',\r\n styleUrl: './auto-complete-input-element.component.css'\r\n})\r\nexport class AutoCompleteInputElementComponent {\r\n @Input() inputConfig!: ITowerStepColumn; \r\n @Input() formGroup!: FormGroup;\r\n\r\n\r\n \r\n @Output() reload = new EventEmitter<void>();\r\n \r\n get errorMessage(){\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n\r\n get options(): any[] {\r\n return this.inputConfig.matOptions?.options || [];\r\n }\r\n}\r\n","\r\n<form [formGroup]=\"formGroup\">\r\n\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\" *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }} \r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n <lib-auto-complet-reactive-input\r\n [inputConfig]=\"this.inputConfig\"\r\n [required]=\"this.inputConfig.required\"\r\n [formControlName]=\"this.inputConfig.id\"\r\n [auto]=\"auto\"\r\n ></lib-auto-complet-reactive-input>\r\n \r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\r\n @for (option of options ; track option.id) {\r\n <mat-option [value]=\"option.value\">{{option.label}}</mat-option>\r\n }\r\n \r\n </mat-autocomplete>\r\n\r\n\r\n @if(inputConfig.hintLabel || inputConfig.temporaryHint ){\r\n <mat-hint [matTooltip]=\"inputConfig.hintLabel ||''\" class=\"inputHint\">\r\n {{ inputConfig.temporaryHint || inputConfig.hintLabel}}\r\n </mat-hint>\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\r\n style=\"color:var(--mat-sys-primary)\"\r\n >sync</mat-icon>\r\n </button>\r\n }\r\n \r\n @if (!!errorMessage) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</mat-error>\r\n }\r\n <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n \r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n \r\n </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n \r\n \r\n \r\n </mat-form-field>\r\n</form>\r\n\r\n","import { Component, ElementRef, forwardRef, Input, Optional, Self } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport _ from 'lodash';\r\n\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';;\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatSlideToggleChange } from '@angular/material/slide-toggle';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { OverlayModule } from '@angular/cdk/overlay';\r\n;\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'lib-geo-location-form-input',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'lib-toggle',\r\n standalone: true,\r\n imports: [MatModulesModule,CommonModule,OverlayModule],\r\n\r\n templateUrl: './toggle.component.html',\r\n providers: [ {\r\n provide: MatFormFieldControl,\r\n useExisting: forwardRef(() => ToggleComponent)\r\n }],\r\n styleUrl: './toggle.component.css'\r\n})\r\nexport class ToggleComponent extends BaseCustomInput<boolean> {\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 }\r\n\r\n\r\n \r\n \r\n @Input() inputConfig!: ITowerStepColumn;\r\n\r\n\r\n\r\n\r\n\r\n \r\n\r\n get empty() {\r\n return !this.value\r\n }\r\n\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n @Input()\r\n\r\n \r\n\r\n changed(event:MatSlideToggleChange){\r\n this.value = event.checked\r\n this.onChange(event.checked)\r\n this.stateChanges.next();\r\n }\r\n get isChecked(){\r\n return Boolean(this.value)\r\n }\r\n\r\n}","<ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayOpen]=\"!!(this.inputConfig.disabled || this.inputConfig.readonly)\"\r\n>\r\n<div style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.1);\">\r\n\r\n\r\n</div>\r\n</ng-template>\r\n\r\n<mat-slide-toggle \r\n\r\nstyle=\"display: block\" \r\n\r\n [disabledInteractive]=\"this.inputConfig.disabled || this.inputConfig.readonly\"\r\n[required]=\"this.inputConfig.required\" \r\n[labelPosition]=\"this.inputConfig.labelPosition || 'after'\"\r\n(change)=\"this.changed($event)\"\r\n[checked]=\"isChecked\"\r\n[ariaReadOnly]=\"this.inputConfig.disabled\"\r\n[disabled]=\"this.inputConfig.disabled\"\r\n>\r\n@if (inputConfig.falseLabel || inputConfig.trueLabel) {\r\n\r\n\r\n @if (this.inputConfig.labelPosition !== 'after') {\r\n {{ this.inputConfig.label | titlecase }}\r\n <span class=\"spacer\"></span>\r\n @if (isChecked) {\r\n <span class=\"true-label\" >{{ inputConfig.trueLabel|| 'Yes' }}</span>\r\n } @else {\r\n <span class=\"false-label\" >{{ inputConfig.falseLabel || 'No' }}</span>\r\n }\r\n } \r\n @else {\r\n @if (isChecked) {\r\n <span class=\"true-label\" >{{ inputConfig.trueLabel || 'Yes' }}</span>\r\n } @else {\r\n <span class=\"false-label\">{{ inputConfig.falseLabel || 'No' }}</span>\r\n }\r\n <span class=\"spacer\"></span>\r\n {{ this.inputConfig.label | titlecase }}\r\n }\r\n\r\n}\r\n</mat-slide-toggle>","import { Component,EventEmitter,Input, Output} from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { ToggleComponent } from './core/toggle/toggle.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n\r\n@Component({\r\n selector: 'lib-toggle-input-element',\r\n standalone: true,\r\n imports: [MatModulesModule,ReactiveFormsModule,TFormInputStatusComponent,\r\n CommonModule,\r\n ToggleComponent\r\n ],\r\n templateUrl: './toggle-input-element.component.html',\r\n styleUrl: './toggle-input-element.component.css'\r\n})\r\nexport class ToggleInputElementComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n \r\n @Output() reload = new EventEmitter<void>();\r\n\r\n\r\n get errorMessage(){\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n } \r\n}\r\n","<form [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" floatLabel=\"always\" subscriptSizing=\"dynamic\"\r\n *ngIf=\"this.inputConfig as inputConfig\">\r\n @if(!(inputConfig.disabled ||errorMessage)){\r\n <mat-label>\r\n toggle to select\r\n\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n }\r\n\r\n <lib-toggle [inputConfig]=\"this.inputConfig\" [required]=\"this.inputConfig.required\"\r\n [formControlName]=\"inputConfig.id\"></lib-toggle>\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) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</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 <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n\r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\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 </ng-container>\r\n\r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n\r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n\r\n </mat-form-field>\r\n</form>","import { Component, ElementRef, Input, OnInit, Optional, Self } from '@angular/core';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\n\r\nimport { NgControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { MatSelectChange } from '@angular/material/select';\r\nimport { ITowerStepColumn, OptionSelectTypes } from 'ngx-t-forms-types';\r\nimport { MatChipListboxChange } from '@angular/material/chips';\r\nimport { MatRadioChange } from '@angular/material/radio';\r\nimport { MatCheckboxChange } from '@angular/material/checkbox';\r\nconst customInputConfig:BaseCustomInputConfig = {\r\n controlType: 'lib-select-input',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'lib-select-input',\r\n imports: [CommonModule,MatModulesModule,ReactiveFormsModule],\r\n templateUrl: './select-input.component.html',\r\n styleUrl: './select-input.component.css',\r\n host: {\r\n '[class.floating]': 'shouldLabelFloat',\r\n '[id]': 'id',\r\n },\r\n providers: [{ provide: MatFormFieldControl, useExisting: SelectInputComponent }],\r\n\r\n})\r\nexport class SelectInputComponent extends BaseCustomInput<string|number|Date|string[]> implements OnInit {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n constructor(\r\n \r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>\r\n ) {\r\n super(ngControl, elementRef,customInputConfig);\r\n \r\n }\r\n\r\noptionSelectTypes = OptionSelectTypes\r\n override get empty(): boolean {\r\n \r\n return !this.value;\r\n }\r\n\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n \r\n private valueSubject = new Subject<any>();\r\n\r\n ngOnInit() {\r\n \r\n }\r\n\r\n onInputChange($event: any) {\r\n this.valueSubject.next($event);\r\n }\r\n onSelectionChange(event:MatSelectChange| MatChipListboxChange | MatRadioChange){\r\n this.value = event.value\r\n this.stateChanges.next();\r\n this.onChange(this.value);\r\n }\r\n checkBoxChanged(event: MatCheckboxChange,value:string) {\r\n if (event.checked) {\r\n this.value = [...(this.value || []) as any, value];\r\n } else {\r\n this.value = ((this.value || []) as any).filter((v: string) => v !== value);\r\n }\r\n this.stateChanges.next();\r\n this.onChange(this.value);\r\n }\r\n isSelected(value: string): boolean {\r\n if (!this.value || !Array.isArray(this.value)) return false;\r\n return this.value.includes(value);\r\n }\r\n getSelectOptions(): any {\r\n if(!this.inputConfig?.matOptions) return []\r\n if(Array.isArray(this.inputConfig.matOptions?.options)){\r\n return this.inputConfig.matOptions?.options || []\r\n }\r\n return []\r\n \r\n }\r\n getAvatar(userName: any) {\r\n return `https://ui-avatars.com/api/?color=EADDFF&font-size=0.36&bold=true&background=random&name=${userName}`\r\n }\r\n get inputControl(){\r\n return this.ngControl?.control as any \r\n\r\n }}\r\n","@switch ( inputConfig.optionSelectType) {\r\n@case (optionSelectTypes.ChipSelect) {\r\n<mat-chip-listbox [multiple]=\"!!inputConfig.allowMultipleSelection\" [value]=\"value\" [disabled]=\"disabled\"\r\n (change)=\"onSelectionChange($event)\" aria-l abel=\"Chip select options\">\r\n @for (option of getSelectOptions(); track option.value) {\r\n <mat-chip-option [value]=\"option.value\">{{option.label}}</mat-chip-option>\r\n }\r\n</mat-chip-listbox>\r\n}\r\n@case (optionSelectTypes.RadioButton) {\r\n@if(!!inputConfig.allowMultipleSelection){\r\n@for (option of getSelectOptions(); track option.value) {\r\n<mat-checkbox\r\n[value]=\"option.value\"\r\n[checked]=\"isSelected(option.value)\"\r\n(change)=\"checkBoxChanged($event,option.value)\" class=\"example-margin\">\r\n {{option.label }}\r\n</mat-checkbox>\r\n}\r\n}@else {\r\n<mat-radio-group aria-labelledby=\"example-radio-group-label\" class=\"example-radio-group\"\r\n (change)=\"onSelectionChange($event)\" [value]=\"value\">\r\n @for (option of getSelectOptions(); track option.value) {\r\n <mat-radio-button class=\"example-radio-button\" [value]=\"option.value\">{{option.label}}</mat-radio-button>\r\n }\r\n</mat-radio-group>\r\n}\r\n\r\n}\r\n@default {\r\n\r\n<mat-select [multiple]=\"!!inputConfig.allowMultipleSelection\" #sele (selectionChange)=\"onSelectionChange($event)\"\r\n [value]=\"value\">\r\n\r\n\r\n\r\n @for (option of getSelectOptions(); track option.value) {\r\n <mat-option [value]=\"option.value\" [disabled]=\"this.inputConfig?.readonly\">\r\n @switch (this.inputConfig.matOptions?.optionType) {\r\n @case ('user') {\r\n <mat-list-item style=\"padding: 0px;\">\r\n <img matListItemAvatar [src]=\"getAvatar(option.username)\" />\r\n <div matListItemTitle>{{ option.username | titlecase }}</div>\r\n <div matListItemLine> {{ option.email }}</div>\r\n </mat-list-item>\r\n\r\n }\r\n @default {\r\n {{ option.label }}\r\n }\r\n }\r\n\r\n </mat-option>\r\n }\r\n\r\n</mat-select>\r\n\r\n}\r\n}","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormControl, FormGroup, FormGroupDirective, NgForm, ReactiveFormsModule } from '@angular/forms';\r\nimport { ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\n\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { SelectInputComponent } from './elements/select-input/select-input.component';\r\n// Add this to your component\r\n\r\n@Component({\r\n selector: 'lib-select-input-element',\r\n standalone: true,\r\n imports: [CommonModule,MatModulesModule,ReactiveFormsModule,SelectInputComponent,TFormInputStatusComponent],\r\n templateUrl: './select-input-element.component.html',\r\n styleUrl: './select-input-element.component.css'\r\n})\r\nexport class SelectInputElementComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n\r\n @Output() reload = new EventEmitter<void>();\r\n getSelectOptions(): any {\r\n if(!this.inputConfig.matOptions) return []\r\n if(Array.isArray(this.inputConfig.matOptions?.options)){\r\n return this.inputConfig.matOptions?.options || []\r\n }\r\n return []\r\n \r\n \r\n }\r\n optionsSearchWordKeyWord!: string;\r\n\r\n \r\n selectInputSearchWord(event: any) {\r\n this.optionsSearchWordKeyWord = event.detail.value.toUpperCase();\r\n }\r\n get errorMessage(){\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n\r\n errorStateMatcher = new class implements ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\r\n return !!(control && control.invalid && (control.dirty || control.touched));\r\n }\r\n }\r\n}\r\n","<ng-container [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\"\r\n *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n\r\n <lib-select-input [inputConfig]=\"this.inputConfig\"\r\n\r\n [required]=\"this.inputConfig.required\"\r\n [formControlName]=\"this.inputConfig.id\" >\r\n\r\n </lib-select-input>\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\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</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 <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n\r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\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 </ng-container>\r\n\r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n\r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n\r\n\r\n\r\n </mat-form-field>\r\n</ng-container>\r\n","import { Component, ElementRef, Input, OnInit, Optional, Self } from '@angular/core';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\n\r\nimport { NgControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatAutocomplete } from '@angular/material/autocomplete';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\n\r\nconst customInputConfig:BaseCustomInputConfig = {\r\n controlType: 'lib-text-area-reactive-input',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'lib-text-area-reactive-input',\r\n imports: [CommonModule,MatModulesModule,ReactiveFormsModule],\r\n host: {\r\n '[class.floating]': 'shouldLabelFloat',\r\n '[id]': 'id',\r\n\r\n },\r\n providers: [{ provide: MatFormFieldControl, useExisting: TextAreaReactiveInputComponent }],\r\n \r\n templateUrl: './text-area-reactive-input.component.html',\r\n styleUrl: './text-area-reactive-input.component.css'\r\n})\r\nexport class TextAreaReactiveInputComponent extends BaseCustomInput<string | number | Date > implements OnInit {\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 n === null || n === undefined || n === '';\r\n}\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n @Input() auto!: MatAutocomplete\r\n @Input() inputConfig!: ITowerStepColumn;\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>\r\n ) {\r\n super(ngControl, elementRef,customInputConfig);\r\n }\r\n private readonly debounceTime = 300;\r\n private valueSubject = new Subject<any>();\r\n \r\n ngOnInit(): void {\r\n this.valueSubject.pipe(\r\n debounceTime(this.debounceTime),\r\n takeUntil(this.destroy$)\r\n ).subscribe(event => {\r\n this.value = event.target.value;\r\n this.stateChanges.next();\r\n this.onChange(this.value);\r\n });\r\n }\r\n\r\n onInputChange($event: any) {\r\n this.valueSubject.next($event);\r\n }\r\n}\r\n","\r\n<textarea \r\n [readonly]=\"this.inputConfig?.readonly\"\r\n [required]=\"inputConfig?.required\" \r\n [attr.maxlength]=\"inputConfig?.maxLength\" [attr.minlength]=\"inputConfig?.minLength\"\r\n [rows]=\"inputConfig?.rows\" [spellcheck]=\"inputConfig?.spellcheck\"\r\n [value]=\"value\"\r\n [autocapitalize]=\"inputConfig?.autocapitalize\" [autocomplete]=\"inputConfig?.autocomplete\"\r\n (input)=\"onInputChange($event)\" \r\n [placeholder]=\"inputConfig?.placeholder||''\" [wrap]=\"inputConfig?.wrap\" matInput></textarea>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\nimport { TextAreaReactiveInputComponent } from './core/text-area-reactive-input/text-area-reactive-input.component';\r\n\r\n@Component({\r\n selector: 'lib-textarea-input-element',\r\n standalone: true,\r\n imports: [ReactiveFormsModule,CommonModule,MatModulesModule,TFormInputStatusComponent,TextAreaReactiveInputComponent],\r\n templateUrl: './textarea-input-element.component.html',\r\n styleUrl: './textarea-input-element.component.css'\r\n})\r\nexport class TextareaInputElementComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n \r\n @Output() reload = new EventEmitter<void>();\r\n \r\n \r\n get errorMessage(){\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n}\r\n","<form [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\" *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }} \r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n <lib-text-area-reactive-input \r\n [inputConfig]=\"this.inputConfig\"\r\n [required]=\"this.inputConfig.required\"\r\n [formControlName]=\"this.inputConfig.id\"\r\n\r\n >\r\n\r\n </lib-text-area-reactive-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 @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 <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n \r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\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 </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n \r\n </mat-form-field>\r\n</form>\r\n","import { Component, ElementRef, Input, Optional, Self } from '@angular/core';\r\nimport { FormControl, FormGroup, NgControl } from '@angular/forms';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\n\r\n\r\nconst customInputConfig:BaseCustomInputConfig = {\r\n controlType: 'lib-date-range-picker-reactive-input',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'lib-date-range-picker-reactive-input',\r\n imports: [CommonModule,MatModulesModule],\r\n standalone: true,\r\n host: {\r\n '[class.floating]': 'shouldLabelFloat',\r\n '[id]': 'id',\r\n\r\n },\r\n providers: [{ provide: MatFormFieldControl, useExisting: DateRangePickerReactiveInputComponent }],\r\n \r\n templateUrl: './date-range-picker-reactive-input.component.html',\r\n styleUrl: './date-range-picker-reactive-input.component.css'\r\n})\r\nexport class DateRangePickerReactiveInputComponent extends BaseCustomInput<Date> {\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 n === null || n === undefined || (n as any) === '';\r\n}\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n\r\n @Input() inputConfig!: ITowerStepColumn;\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>\r\n ) {\r\n super(ngControl, elementRef, customInputConfig);\r\n }\r\n \r\n\r\n get startDateControl(): FormControl {\r\n return this.parentFormGroup?.controls[`${this.inputConfig?.id}.${this.inputConfig?.startDateControl}`] as FormControl;\r\n }\r\n get endDateControl(): FormControl {\r\n return this.parentFormGroup?.controls[`${this.inputConfig?.id}.${this.inputConfig?.endDateControl}`] as FormControl;\r\n }\r\n\r\n \r\n get parentFormGroup(): FormGroup | null {\r\n return this.ngControl?.control?.parent as FormGroup;\r\n }\r\n override checkValidationsAnErrors(): void {\r\n \r\n const control = this.ngControl?.control;\r\n if (!control || !this.touched) return;\r\n \r\n const errors = { ...control.errors };\r\n \r\n \r\n this.errors = errors;\r\n const validStartDate = this.startDateControl?.valid;\r\n const validEndDate = this.endDateControl?.valid;\r\n if (validStartDate && validEndDate && 'required' in errors) {\r\n const hasOtherErrors = Object.keys(errors).length > 1;\r\n if (!hasOtherErrors) {\r\n control.setErrors(null);\r\n } else {\r\n delete errors['required'];\r\n control.setErrors(errors);\r\n }\r\n } else if (!('required' in errors) && this.required && !validStartDate || !('required' in errors) && this.required && !validEndDate) {\r\n control.setErrors({ required: true, ...errors });\r\n }\r\n }\r\n\r\n}\r\n","","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { provideNativeDateAdapter } from '@angular/material/core';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\nimport { DateRange, MatDatepickerInputEvent } from '@angular/material/datepicker';\r\nimport { DateRangePickerReactiveInputComponent } from './core/date-range-picker-reactive-input/date-range-picker-reactive-input.component';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\n\r\n@Component({\r\n selector: 'lib-date-range-picker-input-element',\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule, ReactiveFormsModule, TFormInputStatusComponent,DateRangePickerReactiveInputComponent],\r\n templateUrl: './date-range-picker-input-element.component.html',\r\n styleUrl: './date-range-picker-input-element.component.css',\r\n providers: [provideNativeDateAdapter()],\r\n})\r\nexport class DateRangePickerInputElementComponent {\r\n \r\n\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n \r\n @Output() reload = new EventEmitter<void>();\r\n /**\r\n * Get the appropriate error message for this input\r\n */\r\n get errorMessage() {\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n\r\n /**\r\n * Get the start date control name\r\n */\r\n get startControlName(): string {\r\n return this.inputConfig.startDateControl \r\n ? `${this.inputConfig.id}.${this.inputConfig.startDateControl}`\r\n : `${this.inputConfig.id}.startDate`;\r\n }\r\n\r\n /**\r\n * Get the end date control name\r\n */\r\n get endControlName(): string {\r\n return this.inputConfig.endDateControl \r\n ? `${this.inputConfig.id}.${this.inputConfig.endDateControl}`\r\n : `${this.inputConfig.id}.endDate`;\r\n }\r\n\r\n /**\r\n * Check if the start date control has a specific error\r\n */\r\n hasStartDateError(errorName: string): boolean {\r\n const control = this.formGroup.get(this.startControlName);\r\n return control ? control.hasError(errorName) : false;\r\n }\r\n\r\n /**\r\n * Check if the end date control has a specific error\r\n */\r\n hasEndDateError(errorName: string): boolean {\r\n const control = this.formGroup.get(this.endControlName);\r\n return control ? control.hasError(errorName) : false;\r\n }\r\n dateChanged(event: MatDatepickerInputEvent<any, DateRange<any>>,formControlName: string | undefined) {\r\n // set touched and dirty on the form group\r\n const control = this.formGroup.controls[`${this.inputConfig.id}.${formControlName}`];\r\n if (control) {\r\n control.setValue(event.value);\r\n control.updateValueAndValidity();\r\n control.markAsTouched();\r\n control.markAsDirty();\r\n }\r\n\r\n\r\n }\r\n}","<!-- <mat-form-field [appearance]=\"this.inputConfig.appearance || 'fill'\" floatLabel=\"auto\">\r\n <mat-label></mat-label>\r\n @if(inputConfig.startDateControl && inputConfig.endDateControl) {\r\n <ng-container>\r\n <mat-date-range-input [formGroup]=\"formGroup\" [rangePicker]=\"picker\">\r\n <input matStartDate [formControlName]=\"inputConfig.startDateControl\" placeholder=\"Start date\">\r\n <input matEndDate [formControlName]=\"inputConfig.endDateControl\" placeholder=\"End date\">\r\n </mat-date-range-input>\r\n <mat-hint>{{inputConfig.hintLabel}}</mat-hint>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker></mat-date-range-picker>\r\n\r\n @if (formGroup.controls[inputConfig.startDateControl]?.hasError('matStartDateInvalid')) {\r\n <mat-error>Invalid start date</mat-error>\r\n }\r\n @if (formGroup.controls[inputConfig.endDateControl]?.hasError('matEndDateInvalid')) {\r\n <mat-error>Invalid end date</mat-error>\r\n }\r\n \r\n @if(!!errorMessage) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</mat-error>\r\n }\r\n </ng-container>\r\n }\r\n</mat-form-field> -->\r\n<form [formGroup]=\"formGroup\">\r\n\r\n\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance || 'fill'\" subscriptSizing=\"dynamic\">\r\n <mat-label>{{inputConfig.label}} <lib-t-form-input-status\r\n [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status></mat-label>\r\n <lib-date-range-picker-reactive-input [inputConfig]=\"this.inputConfig\" [required]=\"this.inputConfig.required\"\r\n [formControlName]=\"inputConfig.id+'.'+inputConfig.endDateControl\"></lib-date-range-picker-reactive-input>\r\n\r\n <mat-date-range-input [required]=\"inputConfig.required\" [formGroup]=\"formGroup\" [rangePicker]=\"picker\">\r\n @if (inputConfig.startDateControl) {\r\n <input matStartDate [disabled]=\"!!(this.inputConfig.disabled ?? this.inputConfig.readonly)\"\r\n [formControlName]=\"inputConfig.id+'.'+inputConfig.startDateControl\" [min]=\"inputConfig.startMinDate\"\r\n [max]=\"inputConfig.startMaxDate\"\r\n [value]=\"formGroup.controls[inputConfig.id+'.'+inputConfig.startDateControl]?.value\"\r\n (dateChange)=\"dateChanged($event, inputConfig.startDateControl)\" placeholder=\"Start date\">\r\n }\r\n @if (inputConfig.endDateControl) {\r\n <input matEndDate [disabled]=\"!!(this.inputConfig.disabled ?? this.inputConfig.readonly)\"\r\n [formControlName]=\"inputConfig.id+'.'+inputConfig.endDateControl\"\r\n [value]=\"formGroup.controls[inputConfig.id+'.'+inputConfig.endDateControl]?.value\" placeholder=\"End date\"\r\n [min]=\"inputConfig.endMinDate\" [max]=\"inputConfig.endMaxDate\"\r\n (dateChange)=\"dateChanged($event, inputConfig.endDateControl)\">\r\n }\r\n </mat-date-range-input>\r\n\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-date-range-picker #picker>\r\n <mat-datepicker-actions>\r\n <button mat-button matDatepickerCancel>Cancel</button>\r\n <button mat-raised-button color=\"primary\" matDatepickerApply>Apply</button>\r\n </mat-datepicker-actions>\r\n </mat-date-range-picker>\r\n\r\n\r\n\r\n @if(inputConfig.hintLabel || inputConfig.temporaryHint ){\r\n <mat-hint [matTooltip]=\"inputConfig.hintLabel ||''\" 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 @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\r\n style=\"color:var(--mat-sys-primary)\"\r\n >sync</mat-icon>\r\n </button>\r\n }\r\n <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n\r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n\r\n </ng-container>\r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\">\r\n {{ (formGroup.controls[inputConfig.id]?.value.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n\r\n </mat-form-field>\r\n\r\n</form>","import { Component, ElementRef, Input, Optional, Self } from '@angular/core';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { NgControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatDatepicker, MatDatepickerInputEvent } from '@angular/material/datepicker';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nconst customInputConfig:BaseCustomInputConfig = {\r\n controlType: 'lib-auto-complet-reactive-input',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'lib-date-picker-reactive-input',\r\n imports: [\r\n MatModulesModule,\r\n ReactiveFormsModule\r\n ],\r\n host: {\r\n '[class.floating]': 'shouldLabelFloat',\r\n '[id]': 'id',\r\n\r\n },\r\n providers: [{ provide: MatFormFieldControl, useExisting: DatePickerReactiveInputComponent }],\r\n templateUrl: './date-picker-reactive-input.component.html',\r\n styleUrl: './date-picker-reactive-input.component.css'\r\n})\r\nexport class DatePickerReactiveInputComponent extends BaseCustomInput<Date> {\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 n === null || n === undefined || (n as any) === '';\r\n}\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n@Input()picker!: MatDatepicker<any>\r\n @Input() inputConfig!: ITowerStepColumn;\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>\r\n ) {\r\n super(ngControl, elementRef,customInputConfig);\r\n }\r\n \r\n \r\n\r\n changed(event: MatDatepickerInputEvent<any, any>){\r\n \r\n this.value = event.value;\r\n this.stateChanges.next();\r\n this.onChange(this.value);\r\n \r\n }\r\n\r\n \r\n}\r\n","<input \r\n[required]=\"inputConfig?.required\" \r\n[disabled]=\"this.inputConfig.disabled || this.inputConfig.readonly\"\r\n[min]=\"inputConfig?.min\" \r\n(dateChange)=\"changed($event)\"\r\n[value]=\"value\"\r\n[max]=\"inputConfig?.max\" matInput \r\n[matDatepicker]=\"picker\" />","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { provideNativeDateAdapter } from '@angular/material/core';\r\nimport { DatePickerReactiveInputComponent } from './core/date-picker-reactive-input/date-picker-reactive-input.component';\r\n\r\n\r\n@Component({\r\n selector: 'lib-date-picker-input-element',\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule, ReactiveFormsModule, TFormInputStatusComponent,DatePickerReactiveInputComponent],\r\n templateUrl: './date-picker-input-element.component.html',\r\n styleUrl: './date-picker-input-element.component.css',\r\n providers: [provideNativeDateAdapter()],\r\n})\r\nexport class DatePickerInputElementComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n \r\n @Output() reload = new EventEmitter<void>();\r\n get errorMessage(){\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n}\r\n","\r\n\r\n<form [formGroup]=\"formGroup\">\r\n\r\n <mat-form-field \r\n [appearance]=\"this.inputConfig.appearance ||'fill' \" \r\n subscriptSizing=\"dynamic\">\r\n <mat-label>\r\n {{this.inputConfig.label }} \r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n <lib-date-picker-reactive-input\r\n [inputConfig]=\"this.inputConfig\"\r\n [required]=\"this.inputConfig.required\"\r\n [formControlName]=\"this.inputConfig.id\"\r\n [picker]=\"picker\"\r\n \r\n ></lib-date-picker-reactive-input>\r\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker>\r\n <button mat-button matDatepickerCancel>Cancel</button>\r\n <button mat-raised-button color=\"primary\" matDatepickerApply>Apply</button>\r\n </mat-datepicker>\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\r\n style=\"color:var(--mat-sys-primary)\"\r\n >sync</mat-icon>\r\n </button>\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\r\n @if (!!errorMessage) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</mat-error>\r\n }\r\n <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n \r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon \r\n matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n \r\n \r\n </ng-container>\r\n \r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n </mat-form-field>\r\n</form>","\r\nimport { Component, ElementRef, Input, Optional, Self, ViewChild } from '@angular/core';\r\nimport { NgControl, } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\n\r\nimport _ from 'lodash';\r\nimport { IFileUploadInput, ITowerStepColumn } from \"ngx-t-forms-types\";\r\n\r\nimport { FileUploadInputValueInterface, AllDocumentFileExtensions, AllImageFileExtensions, InputFileType, UploadTypes } from \"ngx-t-forms-types\";\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { CommonModule } from '@angular/common';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';;\r\nconst customInputConfig:BaseCustomInputConfig = {\r\n controlType: 'app-file-uploader',\r\n nextId: 0\r\n}\r\n\r\n@Component({\r\n selector: 'app-file-uploader',\r\n templateUrl: './file-uploader.component.html',\r\n styleUrls: ['./file-uploader.component.css'],\r\n standalone: true,\r\n imports: [\r\n MatModulesModule,\r\n CommonModule\r\n ],\r\n host: {\r\n '[class.floating]': 'shouldLabelFloat',\r\n '[id]': 'id',\r\n },\r\n providers: [{ provide: MatFormFieldControl, useExisting: FileUploaderComponent }]\r\n\r\n})\r\nexport class FileUploaderComponent extends BaseCustomInput< FileUploadInputValueInterface | object | null > {\r\n\r\n //Emit on the stateChanges stream when something happens in the form field control that may require the form field to run change detection.\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>\r\n ) {\r\n super(ngControl, elementRef,customInputConfig);\r\n }\r\n\r\n\r\n @ViewChild('uploader') uploader!: ElementRef<HTMLInputElement>;\r\n\r\n\r\n\r\n\r\n\r\n\r\n @Input() inputConfig!: ITowerStepColumn;\r\n\r\n\r\n\r\n\r\n override get value(): FileUploadInputValueInterface | object | null {\r\n return this._value;\r\n }\r\n override set value(file: FileUploadInputValueInterface | object | null) {\r\n const fileType = this.inputConfig?.fileType;\r\n if (!file || typeof file !== 'object') {\r\n this._value = file;\r\n this.stateChanges.next();\r\n return;\r\n }\r\n\r\n const { base64, fileExtension } = file as FileUploadInputValueInterface;\r\n\r\n if (!base64) {\r\n this._value = file;\r\n this.stateChanges.next();\r\n return;\r\n }\r\n\r\n const allDocExtensions = Object.values(AllDocumentFileExtensions);\r\n const allImageExtensions = Object.values(AllImageFileExtensions);\r\n const isFile = allDocExtensions.includes(fileExtension as any);\r\n const isImage = allImageExtensions.includes(fileExtension as any);\r\n if ((fileType === InputFileType.file && !isFile) ||\r\n ((fileType === InputFileType.Image || fileType === InputFileType.CaptureImage) && !isImage)) {\r\n this._value = null;\r\n\r\n this.temporaryError(`Invalid file type. Expected ${fileType} file`);\r\n this.stateChanges.next();\r\n return\r\n } else {\r\n this._value = file;\r\n this.stateChanges.next();\r\n return;\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 get empty() {\r\n return !this.value\r\n }\r\n\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n\r\n \r\n \r\n\r\n\r\n\r\n \r\n override onContainerClick(event: MouseEvent) {\r\n this.uploader.nativeElement.click();\r\n if (event.target !== this._elementRef.nativeElement) {\r\n this.markAsTouched();\r\n this.stateChanges.next();\r\n }\r\n }\r\n ///End of Implementation of MatFormFieldControl\r\n\r\n triggerUploader() {\r\n this.uploader.nativeElement.click();\r\n }\r\n\r\n fileName!: string;\r\n loading!: Number;\r\n onFileSelected(event: Event): void {\r\n const files = (event.target as HTMLInputElement).files;\r\n if (files && files.length > 0) {\r\n const file = files[0];\r\n if(!file) return;\r\n this.assignFile(file);\r\n }\r\n }\r\n\r\n assignFile(file: File) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n this.fileName = file.name;\r\n const nameSplit = file.name.split('.')\r\n const fileExtension = nameSplit[nameSplit.length - 1];\r\n this.value = {\r\n fileName: file.name,\r\n base64: reader.result as string,\r\n type:this.inputConfig?.fileType,\r\n blob: file,\r\n fileExtension\r\n };\r\n this.onChange(this.value)\r\n\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n\r\n\r\n returnPreview() {\r\n const inp: any = this.inputConfig;\r\n const fileType = (inp as IFileUploadInput)?.fileType;\r\n switch (fileType) {\r\n case InputFileType.file:\r\n return 'https://res.cloudinary.com/afrob/image/upload/v1676973154/Flows/Icons/iPhone_14_-_1_tx1scw.png';\r\n\r\n default:\r\n return (this.value as FileUploadInputValueInterface)?.base64;\r\n break;\r\n }\r\n }\r\n uploadType() {\r\n const inp: any = this.inputConfig;\r\n const fileType = (inp as IFileUploadInput)?.fileType;\r\n if (!fileType) {\r\n return InputFileType.file;\r\n }\r\n return (UploadTypes as any)[fileType as any];\r\n }\r\n\r\n dragOver = false;\r\n\r\n onDragOver(event: DragEvent) {\r\n this.dragOver = true;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n // Add logic to highlight the drop zone\r\n }\r\n\r\n onDrop(event: DragEvent) {\r\n this.dragOver = false;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n const file = files[0];\r\n // Handle the file(s) here\r\n if(!file) return;\r\n this.assignFile(file);\r\n }\r\n // Remove highlight from the drop zone\r\n }\r\n\r\n onDragLeave(event: DragEvent) {\r\n this.dragOver = false;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n // Remove highlight from the drop zone\r\n }\r\n clearFile(event: MouseEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.value = null;\r\n this.stateChanges.next();\r\n }\r\n\r\n\r\n}\r\n","\r\n <mat-progress-bar *ngIf=\"loading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n\r\n\r\n\r\n<section *ngIf=\"!shouldLabelFloat\">\r\n <br>\r\n <div \r\n [style.border-color]=\"dragOver ? ' var(--mat-stepper-header-selected-state-icon-background-color)' : '#ccc;'\"\r\n(dragover)=\"onDragOver($event)\" \r\n(drop)=\"onDrop($event)\" \r\n(dragleave)=\"onDragLeave($event)\"\r\n class=\"drop-zone\" >\r\n <div>\r\n <mat-icon>\r\n cloud_upload\r\n </mat-icon>\r\n </div>\r\n <div>\r\n @if (!!errorMessage\r\n\r\n ) {\r\n <span class=\"mat-mdc-form-field-error\" >\r\n {{errorMessage}}\r\n </span>\r\n }@else {\r\n Drag and drop files or click to upload\r\n }\r\n \r\n \r\n \r\n </div>\r\n \r\n </div>\r\n</section>\r\n\r\n<input\r\nstyle=\"display: none\"\r\nhidden\r\n[readonly]=\"!!this.inputConfig?.readonly\"\r\n[type]=\"this.inputConfig?.type|| 'file'\"\r\n[accept]=\"uploadType()\"\r\n(change)=\"onFileSelected($event)\"\r\n#uploader\r\n/>\r\n<div \r\n[style.border-color]=\"dragOver ? 'var(--mat-stepper-header-selected-state-icon-background-color)' : '#ccc;'\"\r\n*ngIf=\"!!shouldLabelFloat\" \r\nclass=\"drop-zone\"\r\n\r\n(dragover)=\"onDragOver($event)\" \r\n(drop)=\"onDrop($event)\" \r\n(dragleave)=\"onDragLeave($event)\">\r\n<img style=\"width: 100%;\" [src]=\"returnPreview()\" alt=\"\">\r\n<mat-toolbar style=\" height: min-content !important;\">\r\n <mat-icon\r\n [style.color]=\"dragOver ? 'var(--mat-stepper-header-selected-state-icon-background-color)' : ''\"\r\n >\r\n cloud_upload\r\n </mat-icon>\r\n <span class=\"spacer\"></span>\r\n <div style=\"padding: 8px;\" >\r\n <div style=\"\r\n line-height: normal;width: 100%;\r\n white-space:normal;overflow: hidden;text-overflow: ellipsis;\r\n font-size: 0.75em;color:var(--mat-stepper-header-selected-state-icon-background-color);\"\r\n *ngIf=\"!!this.fileName\">\r\n {{ this.fileName}}\r\n </div>\r\n <div style=\"font-size: 0.875em;\">\r\n \r\n Drag and drop files or click to upload\r\n \r\n </div>\r\n </div>\r\n \r\n \r\n <span class=\"spacer\"></span>\r\n <button (click)=\"clearFile($event)\" mat-icon-button>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n</mat-toolbar>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule, ValidationErrors } from '@angular/forms';\r\nimport { ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { FileUploaderComponent } from './core/file-uploader/file-uploader.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n@Component({\r\n selector: 'lib-file-upload-input-element',\r\n standalone: true,\r\n imports: [FileUploaderComponent, CommonModule, ReactiveFormsModule, TFormInputStatusComponent, MatModulesModule],\r\n templateUrl: './file-upload-input-element.component.html',\r\n styleUrl: './file-upload-input-element.component.css'\r\n})\r\nexport class FileUploadInputElementComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n @Output() reload = new EventEmitter<void>();\r\n getErrors(): ValidationErrors | null | undefined {\r\n return this.formGroup.controls[this.inputConfig.id]?.errors\r\n }\r\n get errorMessage() {\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n}\r\n","<form [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\" *ngIf=\"this.inputConfig as classInput\">\r\n <mat-label>\r\n {{this.inputConfig.label }} \r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n <app-file-uploader\r\n [inputConfig]=\"inputConfig\"\r\n [formControlName]=\"inputConfig.id\"\r\n [required]=\"this.inputConfig.required\"\r\n ></app-file-uploader>\r\n\r\n\r\n @if(inputConfig.hintLabel || classInput.temporaryHint ){\r\n <mat-hint class=\"inputHint\">\r\n {{ classInput.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 <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\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\r\n style=\"color:var(--mat-sys-primary)\"\r\n >sync</mat-icon>\r\n </button>\r\n }\r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n <!-- <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"classInput.togglePasswordVisibility()\"\r\n mat-icon-button matSuffix>\r\n <mat-icon>{{ classInput.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\r\n </button> -->\r\n </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n \r\n \r\n </mat-form-field>\r\n</form>\r\n\r\n","\r\n/// <reference path=\"../../../../../../../types/editorjs.d.ts\" />\r\nimport { EditorConfig, OutputData} from \"@editorjs/editorjs\";\r\nimport Header from '@editorjs/header';\r\nimport List from '@editorjs/list';\r\nimport Paragraph from '@editorjs/paragraph';\r\nimport Quote from '@editorjs/quote';\r\nimport Table from '@editorjs/table';\r\nimport ImageTool from '@editorjs/image';\r\nimport Delimiter from '@editorjs/delimiter';\r\nimport CodeTool from '@editorjs/code';\r\n\r\nimport Embed from '@editorjs/embed';\r\n\r\nexport interface EditorJsPayload {\r\n holderId: string,\r\n imageFetchEndpoint:string,\r\n imageUploadEndpoint: string,\r\n readOnly:boolean,\r\n onChangeFn: () => void,\r\n data:OutputData|undefined\r\n}\r\nexport const editorConfig = (\r\n payload: EditorJsPayload \r\n): EditorConfig => {\r\n return ({\r\n holder: payload.holderId,\r\n autofocus: true,\r\n placeholder: 'Let\\'s write something amazing...',\r\n inlineToolbar: true,\r\n tools: {\r\n header: {\r\n class: Header as any,\r\n config: {\r\n levels: [1, 2, 3, 4, 5, 6],\r\n defaultLevel: 1,\r\n placeholder: 'Type your heading here...'\r\n },\r\n inlineToolbar: ['link', 'bold', 'italic', 'marker']\r\n },\r\n list: {\r\n class: List as any,\r\n inlineToolbar: true,\r\n config: {\r\n defaultStyle: 'unordered',\r\n placeholder: 'Enter a list item here...'\r\n }\r\n },\r\n paragraph: {\r\n class: Paragraph as any,\r\n inlineToolbar: true,\r\n config: {\r\n preserveBlank: true,\r\n placeholder: 'Type your paragraph here...'\r\n }\r\n },\r\n quote: {\r\n class: Quote,\r\n inlineToolbar: true,\r\n shortcut: 'CMD+SHIFT+Q',\r\n config: {\r\n quotePlaceholder: 'Enter a quote',\r\n captionPlaceholder: 'Quote\\'s author',\r\n alignmentEnabled: true\r\n }\r\n },\r\n delimiter: {\r\n class: Delimiter\r\n },\r\n image: {\r\n class: ImageTool,\r\n config: {\r\n endpoints: {\r\n byFile: payload.imageUploadEndpoint,\r\n byUrl: payload.imageFetchEndpoint\r\n },\r\n uploader: {\r\n uploadByFile(file: File) {\r\n // Custom upload logic\r\n }\r\n }\r\n }\r\n },\r\n table: {\r\n class: Table as any,\r\n inlineToolbar: true,\r\n config: {\r\n rows: 2,\r\n cols: 3\r\n }\r\n },\r\n code: {\r\n class: CodeTool,\r\n config: {\r\n placeholder: 'Enter code here...'\r\n }\r\n },\r\n \r\n embed: {\r\n class: Embed as any,\r\n config: {\r\n services: {\r\n youtube: true,\r\n codesandbox: true,\r\n codepen: true\r\n }\r\n }\r\n },\r\n \r\n },\r\n defaultBlock: 'paragraph',\r\n hideToolbar: false,\r\n data: payload.data,\r\n readOnly:payload.readOnly,\r\n logLevel: 'ERROR' as any,\r\n minHeight: 300,\r\n onChange: (api, event) => {\r\n payload.onChangeFn()\r\n },\r\n onReady: () => {},\r\n sanitizer: {\r\n p: true,\r\n b: true,\r\n a: {\r\n href: true,\r\n target: '_blank',\r\n rel: 'nofollow'\r\n }\r\n },\r\n i18n: {\r\n messages: {\r\n ui: {\r\n blockTunes: {\r\n toggler: {\r\n 'Click to tune': 'Click to tune',\r\n 'or drag to move': 'or drag to move'\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n}\r\n \r\n \r\n","import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnDestroy, Optional, Output, Self } from '@angular/core';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';;\r\nimport { NgControl } from '@angular/forms';\r\n\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';;\r\nimport EditorJS, { OutputData } from '@editorjs/editorjs'\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { editorConfig, EditorJsPayload } from '../form-input-rich-text-editor/config';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { CommonModule } from '@angular/common';\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'lib-editor-js-input',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'lib-editor-js-input',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './editor-js-input.component.html',\r\n providers: [{ provide: MatFormFieldControl, useExisting: EditorJsInputComponent }],\r\n styleUrl: './editor-js-input.component.css'\r\n})\r\nexport class EditorJsInputComponent extends BaseCustomInput<OutputData | undefined> implements AfterViewInit, OnDestroy {\r\n editor: EditorJS | undefined\r\n @Input() inputConfig!: ITowerStepColumn;\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 n === null || n === undefined || (n as any) === '';\r\n}\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n override _value:OutputData | undefined = undefined;\r\n @Input() override set value(value: OutputData | undefined) {\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\noverride get value():OutputData | undefined { return this._value; }\r\n @Output() valueChanged = new EventEmitter<OutputData | undefined>();\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>\r\n ) {\r\n super(ngControl, elementRef, customInputConfig);\r\n }\r\n ngAfterViewInit(): void {\r\n if (!!this.editor) {\r\n this.editor?.destroy()\r\n }\r\n const config: EditorJsPayload = {\r\n holderId: this.inputConfig.id,\r\n imageFetchEndpoint: '',\r\n imageUploadEndpoint: '',\r\n readOnly: this.inputConfig.readonly || false,\r\n data: this.value || undefined,\r\n onChangeFn: this.contentChangedSaveValue.bind(this)\r\n }\r\n this.editor = new EditorJS(editorConfig(config))\r\n\r\n }\r\n\r\n\r\n async contentChangedSaveValue() {\r\n const value: OutputData | undefined = await this.editor?.save()\r\n this.value = value\r\n\r\n\r\n this.onChange(value)\r\n this.valueChanged.emit(value)\r\n\r\n }\r\n override ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n this.editor?.destroy()\r\n }\r\n}\r\n","\r\n<div class=\" editor-container\" style=\"padding: 16px;\">\r\n <div #editorJs [id]=\"inputConfig.id\"></div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component,EventEmitter,Input, Output } from '@angular/core';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\n\r\nimport { EditorJsInputComponent } from './core/editor-js-input/editor-js-input.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\n\r\n@Component({\r\n selector: 'lib-editor-input-element',\r\n standalone: true,\r\n imports: [\r\n MatModulesModule,\r\n TFormInputStatusComponent,\r\n CommonModule,\r\n ReactiveFormsModule,\r\n EditorJsInputComponent\r\n ],\r\n templateUrl: './editor-input-element.component.html',\r\n styleUrl: './editor-input-element.component.css'\r\n})\r\nexport class EditorInputElementComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n \r\n @Output() reload = new EventEmitter<void>();\r\n \r\n \r\n constructor() {\r\n\r\n }\r\n get errorMessage() {\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n\r\n}\r\n","\r\n@if (inputConfig.richTextEditorLibrary === 'EditorJS') {\r\n <form [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\" *ngIf=\"this.inputConfig as classInput\">\r\n <mat-label>\r\n {{this.inputConfig.label }} \r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n <lib-editor-js-input \r\n [inputConfig]=\"inputConfig\"\r\n [formControlName]=\"inputConfig.id\"\r\n [required]=\"this.inputConfig.required\"\r\n ></lib-editor-js-input>\r\n <!-- <app-form-input-rich-text-editor\r\n [inputConfig]=\"inputConfig\"\r\n [formControlName]=\"inputConfig.id\"\r\n (change)=\"changed($event)\"\r\n >\r\n </app-form-input-rich-text-editor> -->\r\n\r\n\r\n @if(inputConfig.hintLabel || classInput.temporaryHint ){\r\n <mat-hint class=\"inputHint\">\r\n {{ classInput.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 <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\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\r\n style=\"color:var(--mat-sys-primary)\"\r\n >sync</mat-icon>\r\n </button>\r\n }\r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n <!-- <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"classInput.togglePasswordVisibility()\"\r\n mat-icon-button matSuffix>\r\n <mat-icon>{{ classInput.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\r\n </button> -->\r\n </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n\r\n \r\n </mat-form-field>\r\n \r\n</form>\r\n\r\n}\r\n\r\n\r\n\r\n\r\n","import { Component, ElementRef, forwardRef, Input, OnInit, Optional, Self } from '@angular/core';\r\nimport { NgControl } from '@angular/forms';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { debounceTime, Subject, takeUntil } from 'rxjs';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\n\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'lib-input-custom',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'lib-input-custom',\r\n imports: [CommonModule, MatModulesModule],\r\n templateUrl: './input-custom.component.html',\r\n standalone: true,\r\n host: {\r\n '[class.floating]': 'shouldLabelFloat',\r\n '[id]': 'id',\r\n },\r\n providers: [\r\n {\r\n provide: MatFormFieldControl,\r\n //:Note\r\n useExisting: forwardRef(() => InputCustomComponent) \r\n }\r\n ],\r\n styleUrl: './input-custom.component.css'\r\n})\r\nexport class InputCustomComponent extends BaseCustomInput<string | number | Date> implements OnInit {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>\r\n ) {\r\n super(ngControl, elementRef, customInputConfig);\r\n }\r\n\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 n === null || n === undefined || n === '';\r\n}\r\n\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n private readonly debounceTimeMs = 300;\r\n private valueSubject = new Subject<any>();\r\n\r\nngOnInit() {\r\n this.valueSubject.pipe(\r\n debounceTime(this.debounceTimeMs),\r\n takeUntil(this.destroy$)\r\n ).subscribe(event => {\r\n // Ensure we don't trigger unnecessary writes\r\n if (_isEqual(this.value, event.target.value) === false) {\r\n this.value = event.target.value;\r\n this.stateChanges.next();\r\n this.onChange(this.value);\r\n }\r\n });}\r\n\r\n onInputChange($event: any) {\r\n this.valueSubject.next($event);\r\n }\r\n onInputBlur($event: any) {\r\n this.touched = true; // Mark as touched on blur\r\n this.onTouched();\r\n this.blur.emit($event);\r\n }\r\n}\r\n","@if(inputConfig){\r\n<input matInput [readonly]=\"this.inputConfig.readonly || this.inputConfig.disabled\"\r\n (blur)=\"onInputBlur($event)\"\r\n [pattern]=\"this.inputConfig.pattern || ''\" [required]=\"this.inputConfig.required\"\r\n [attr.maxlength]=\"this.inputConfig.maxLength\" [type]=\"this.inputConfig.type||'text'\" [value]=\"value\"\r\n (input)=\"onInputChange($event)\" [attr.minlength]=\"this.inputConfig.minLength\"\r\n [autocomplete]=\"this.inputConfig.autocomplete\" [min]=\"this.inputConfig.min\" [max]=\"this.inputConfig.max\" />\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { ReactiveFormsModule, FormGroup, FormsModule, FormControl } from '@angular/forms';\r\n\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\nimport { InputPipeTypes, ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { InputCustomComponent } from './core/input-custom/input-custom.component';\r\n\r\n@Component({\r\n selector: 'lib-basic-input-input-element',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n MatModulesModule,\r\n TFormInputStatusComponent,\r\n CommonModule,\r\n ReactiveFormsModule,\r\n InputCustomComponent\r\n\r\n\r\n ],\r\n templateUrl: './basic-input-input-element.component.html',\r\n styleUrl: './basic-input-input-element.component.css',\r\n\r\n})\r\nexport class BasicInputInputElementComponent {\r\n\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n\r\n\r\n @Output() reload = new EventEmitter<void>();\r\n get formControl(): FormControl<any> {\r\n return this.formGroup.controls[this.inputConfig.id] as FormControl<any>\r\n }\r\n\r\n passwordStrengthColor(formControlName: string) {\r\n const form = this.formGroup\r\n const value: string = form?.value[formControlName];\r\n let strongPassword = new RegExp(\r\n '(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9])(?=.{8,})'\r\n );\r\n let mediumPassword = new RegExp(\r\n '((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9])(?=.{6,}))|((?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z0-9])(?=.{8,}))'\r\n );\r\n if (strongPassword.test(value)) {\r\n return 'var(--ion-color-success)';\r\n } else if (mediumPassword.test(value)) {\r\n return 'var(--ion-color-warning)';\r\n } else {\r\n return 'var(--ion-color-danger)';\r\n }\r\n }\r\n checkPasswordStrength(formControlName: string) {\r\n const form = this.formGroup\r\n\r\n const value: string = form?.value[formControlName];\r\n let strongPassword = new RegExp(\r\n '(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9])(?=.{8,})'\r\n );\r\n let mediumPassword = new RegExp(\r\n '((?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9])(?=.{6,}))|((?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z0-9])(?=.{8,}))'\r\n );\r\n if (strongPassword.test(value)) {\r\n return 'strong';\r\n } else if (mediumPassword.test(value)) {\r\n return 'medium';\r\n } else {\r\n return 'weak';\r\n }\r\n\r\n }\r\n\r\n get errorMessage() {\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n\r\n get hasError() {\r\n // Correctly access the control within the form group\r\n const control = this.formGroup.get(this.inputConfig.id);\r\n return control?.invalid && (control?.touched || control?.dirty);\r\n }\r\n get currencyPrefix(){\r\n const hasPipe = this.inputConfig.pipe?.pipeType === InputPipeTypes.Currency\r\n if(!hasPipe) return undefined;\r\n return this.inputConfig.pipe?.param\r\n }\r\n}\r\n","<ng-container [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill'\" subscriptSizing=\"dynamic\"\r\n *ngIf=\"this.inputConfig as classInput\">\r\n <mat-label>\r\n {{inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n @if(currencyPrefix){\r\n <span style=\"color: var(--mat-sys-primary);padding-right: 4px;\" matTextPrefix>{{currencyPrefix}} </span>\r\n }\r\n\r\n <lib-input-custom [inputConfig]=\"this.inputConfig\" [required]=\"this.inputConfig.required\"\r\n [formControlName]=\"this.inputConfig.id\"></lib-input-custom>\r\n\r\n @if(errorMessage) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</mat-error>\r\n }\r\n <!-- [type]=\"this.inputConfig.showPassword ? 'text' : this.inputConfig.type||'text'\"-->\r\n <!-- @if(classInput.canRefresh){\r\n <button\r\n (click)=\"classInput.refresh()\"\r\n style=\" min-width: 1%;\"\r\n [matTooltip]=\"'Click to refresh this field. This will update any calculated values, fetch latest data from services, or reload available options'\"\r\n color=\"primary\" matSuffix mat-icon-button>\r\n <mat-icon>\r\n sync\r\n </mat-icon>\r\n </button>\r\n } -->\r\n\r\n\r\n @if(inputConfig.hintLabel || classInput.temporaryHint ){\r\n <mat-hint class=\"inputHint\">\r\n {{ classInput.temporaryHint || inputConfig.hintLabel}}\r\n </mat-hint>\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\r\n style=\"color:var(--mat-sys-primary)\"\r\n >sync</mat-icon>\r\n </button>\r\n }\r\n\r\n\r\n <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n\r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <!-- <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"classInput.togglePasswordVisibility()\"\r\n mat-icon-button matSuffix>\r\n <mat-icon>{{ classInput.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\r\n </button>\r\n </ng-container> -->\r\n\r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n\r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n\r\n <!-- Password Strength Hint -->\r\n <mat-hint *ngIf=\"inputConfig.type === 'password'\" [style.color]=\"passwordStrengthColor(inputConfig.id)\"\r\n matTooltip=\"The password should be at least 8 characters long. Have at least one uppercase letter, one lowercase, one digit, one special character.\"\r\n align=\"end\">\r\n {{ checkPasswordStrength(inputConfig.id) }} password\r\n </mat-hint>\r\n <!-- @if(inputConfig?.canReload){\r\n <mat-hint align=\"end\">\r\n \r\n <button click=\" canReload.emit()\" style=\" height: 28px;\r\n width: 28px;\r\n padding: 0px;\r\n font-size: 1em;\" [matTooltip]=\"'Reload ' + inputConfig.label +' resources'\" mat-icon-button>\r\n <mat-icon>\r\n sync\r\n </mat-icon>\r\n\r\n </button>\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</ng-container>","export class ColorScale {\r\n private min: number;\r\n private max: number;\r\n private alpha: number;\r\n private colorStops: Color[];\r\n\r\n constructor(\r\n min: number,\r\n max: number,\r\n colorStops: string[],\r\n alpha: number = 1\r\n ) {\r\n validateMinMaxValues(min, max);\r\n validateColorStops(colorStops);\r\n validateAlphaValue(alpha);\r\n\r\n this.min = min;\r\n this.max = max;\r\n this.alpha = alpha;\r\n this.colorStops = colorStops.map((colorStop) =>\r\n hexToColor(colorStop, alpha)\r\n );\r\n }\r\n\r\n getColor(value: number) {\r\n const numOfColorStops = this.colorStops.length;\r\n if (value < this.min) return this.colorStops[0];\r\n if (value > this.max) return this.colorStops[numOfColorStops - 1];\r\n\r\n const range = this.max - this.min;\r\n\r\n let weight = (value - this.min) / range;\r\n const colorStopIndex = Math.max(\r\n Math.ceil(weight * (numOfColorStops - 1)),\r\n 1\r\n );\r\n\r\n const minColor = this.colorStops[colorStopIndex - 1];\r\n const maxColor = this.colorStops[colorStopIndex];\r\n if(maxColor === undefined) return minColor;\r\n if(minColor === undefined) return maxColor;\r\n\r\n weight = weight * (numOfColorStops - 1) - (colorStopIndex - 1);\r\n\r\n const r = Math.floor(weight * maxColor.r + (1 - weight) * minColor.r);\r\n const g = Math.floor(weight * maxColor.g + (1 - weight) * minColor.g);\r\n const b = Math.floor(weight * maxColor.b + (1 - weight) * minColor.b);\r\n\r\n return new Color(r, g, b, this.alpha);\r\n }\r\n}\r\n\r\nexport function validateMinMaxValues(min: number, max: number) {\r\n if (min > max) {\r\n throw new Error('The minimum value must be less than the maximum value.');\r\n }\r\n}\r\n\r\nexport function validateColorStops(colorStops: string[]) {\r\n if (colorStops.length < 2) {\r\n throw new Error('At least two colors must be provided.');\r\n }\r\n\r\n colorStops.forEach((str) => {\r\n if (!isValidHexColor(str)) {\r\n throw new Error(`${str} is not a valid hex color.`);\r\n }\r\n });\r\n}\r\n\r\nexport function validateAlphaValue(alpha: number) {\r\n if (alpha < 0 || alpha > 1) {\r\n throw new Error('The alpha value must be between 0 and 1.');\r\n }\r\n}\r\n\r\nexport function hexToColor(hex: string, alpha: number) {\r\n if (isValid3DigitHexColor(hex)) {\r\n hex = convertTo6DigitHexColor(hex);\r\n }\r\n\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n if (!!result?.[1] && !!result?.[2] && !!result?.[3]) {\r\n return new Color(\r\n parseInt(result[1], 16),\r\n parseInt(result[2], 16),\r\n parseInt(result[3], 16),\r\n alpha\r\n );\r\n } else {\r\n throw new Error(`${hex} is not a valid hex color.`);\r\n }\r\n}\r\n\r\nexport function isValidHexColor(colorString: string) {\r\n return (\r\n isValid3DigitHexColor(colorString) || isValid6DigitHexColor(colorString)\r\n );\r\n}\r\n\r\nfunction isValid3DigitHexColor(colorString: string) {\r\n const hexColorRegex = /^#(?:[0-9a-fA-F]{3})$/;\r\n return colorString.match(hexColorRegex);\r\n}\r\n\r\nfunction isValid6DigitHexColor(colorString: string) {\r\n const hexColorRegex = /^#(?:[0-9a-fA-F]{6})$/;\r\n return colorString.match(hexColorRegex);\r\n}\r\n\r\nfunction convertTo6DigitHexColor(threeDigitHex: string) {\r\n return threeDigitHex\r\n .substring(1)\r\n .split('')\r\n .map((char) => {\r\n return char + char;\r\n })\r\n .join('');\r\n}\r\n\r\nfunction componentToHex(c: number) {\r\n const hex = c.toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n}\r\n\r\nexport function rgbaToHex(color: Color) {\r\n const r = Math.floor(color.r * color.a);\r\n const g = Math.floor(color.g * color.a);\r\n const b = Math.floor(color.b * color.a);\r\n return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;\r\n}\r\n\r\nexport class Color {\r\n public r: number;\r\n public g: number;\r\n public b: number;\r\n public a: number;\r\n\r\n constructor(r: number, g: number, b: number, a: number = 1) {\r\n validateAlphaValue(a);\r\n\r\n this.r = r;\r\n this.g = g;\r\n this.b = b;\r\n this.a = a;\r\n }\r\n\r\n toRGBString() {\r\n return `rgb(${Math.floor(this.r * this.a)},${Math.floor(\r\n this.g * this.a\r\n )},${Math.floor(this.b * this.a)})`;\r\n }\r\n\r\n toRGBAString() {\r\n return `rgba(${this.r},${this.g},${this.b},${this.a})`;\r\n }\r\n\r\n toHexString() {\r\n return rgbaToHex(this);\r\n }\r\n}\r\n","\r\n\r\n\r\nimport { DocumentLitsLabelConfigInterfaceValueType, FormColumnInputs, InputDataTypes, InputPipeTypes } from \"ngx-t-forms-types\";\r\n\r\nexport function configureCols(inputConfig:FormColumnInputs,tempLabels:string[]):{displayedColumnsInOrder:string[],columnsConfig:any} \r\n{\r\n try {\r\n \r\n const labelInputs = ((inputConfig?.formInputs || []) as FormColumnInputs[]).filter(input=>input.showAsLabel || tempLabels.includes(input.formControlName) )\r\n const cols = [];\r\n let colConfigs: any = {};\r\n for (\r\n let index = 0;\r\n index < ( labelInputs).length;\r\n index++\r\n ) {\r\n const c = labelInputs [index]\r\n const col = {...c}\r\n cols.push(`${inputConfig.id}.${col.id}`);\r\n if(!col.id){\r\n continue\r\n }\r\n colConfigs[`${inputConfig.id}.${col.id}`]={\r\n 'property' :`${inputConfig.id}.${col.id}`,\r\n 'formControlName': col.formControlName,\r\n 'label': col.label,\r\n dataType: getDataType(col as any)\r\n }\r\n \r\n }\r\n \r\n //add remove section config\r\n cols.push('itemRemovalButton');\r\n colConfigs['itemRemovalButton'] = {\r\n property: 'itemRemovalButton',\r\n label: '',\r\n type: 'removal',\r\n };\r\n // end\r\n return {\r\n displayedColumnsInOrder : cols.filter((c) => !!c ) as string[],\r\n columnsConfig : colConfigs}\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\nfunction getDataType(input:FormColumnInputs):DocumentLitsLabelConfigInterfaceValueType|InputPipeTypes | InputDataTypes{\r\n try {\r\n if(input.pipe?.pipeType){\r\n return input.pipe.pipeType\r\n }\r\n const inputDataType = input.dataType;\r\n switch (inputDataType) {\r\n\r\n\r\n case InputDataTypes.Number:\r\n\r\n return DocumentLitsLabelConfigInterfaceValueType.number\r\n\r\n case InputDataTypes.Date:\r\n \r\n return DocumentLitsLabelConfigInterfaceValueType.date\r\n case InputDataTypes.Array:\r\n return InputDataTypes.Array\r\n case InputDataTypes.Boolean:\r\n return InputDataTypes.Boolean\r\n case InputDataTypes.Object:\r\n return InputDataTypes.Object\r\n\r\n\r\n \r\n \r\n\r\n default:\r\n return DocumentLitsLabelConfigInterfaceValueType.string\r\n \r\n }\r\n \r\n } catch (error) {\r\n const msg = error instanceof Error ? error.message : 'Failed to get data type'\r\n throw new Error(msg)\r\n }\r\n}","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { MatTableDataSource, MatTableModule } from '@angular/material/table';\r\nimport { IMultiple } from \"ngx-t-forms-types\";\r\nimport { ColorScale } from '../../../../../../services/core/t-input-controller/functions/colorCoding';\r\nimport { CalculationFunctions } from \"ngx-t-forms-types\";\r\nimport { FormGroup } from '@angular/forms';\r\nimport { configureCols } from '../../../../../../services/core/t-input-controller/functions/configureCols';\r\nimport { FormatDataPipe } from '../../../../../../../lib/shared/pipes/format-Data.pipe';\r\n\r\n@Component({\r\n selector: 'lib-multiple-input-table-view',\r\n standalone: true,\r\n imports: [MatModulesModule, CommonModule,MatTableModule,FormatDataPipe],\r\n templateUrl: './multiple-input-table-view.component.html',\r\n styleUrl: './multiple-input-table-view.component.css'\r\n})\r\nexport class MultipleInputTableViewComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() dataSource: MatTableDataSource<any> = new MatTableDataSource<any>();\r\n @Input() applyOptionsTo:any\r\n @Input() formGroup:FormGroup | null = null\r\n @Output() onEditItem = new EventEmitter<string>();\r\n @Output() onDeleteItem = new EventEmitter<any>();\r\n @Output() onCopy = new EventEmitter<string>();\r\n @Output() onApplyOptionsTo = new EventEmitter<any>();\r\n applyOptionsToFn(item:any){\r\n this.onApplyOptionsTo.emit(item)\r\n }\r\n editItem(row:any) {\r\n const rowId = row[`${this.inputConfig?.id}.id`]\r\n \r\n this.onEditItem.emit(rowId);\r\n }\r\n \r\n copy(row:any) {\r\n const rowId = row[`${this.inputConfig?.id}.id`]\r\n this.onCopy.emit(rowId);\r\n }\r\n areYouSureYouWantToDeleteRow :Record<string,boolean> = {\r\n\r\n }\r\n isAboutToDeleteRow(row: any) {\r\n return this.areYouSureYouWantToDeleteRow[row[`${this.inputConfig?.id}.id`]]\r\n }\r\n \r\n countDownDate: Date = new Date();\r\n deletionTimers: { [key: string]: any } = {}; // Store timeout IDs by row ID\r\n \r\n getCountdownSeconds(): number {\r\n const now = new Date();\r\n const timeElapsed = (now.getTime() - this.countDownDate.getTime()) / 1000;\r\n // Convert elapsed time to percentage (0-100)\r\n // 0 seconds = 0%, 3 seconds = 100%\r\n const percentage = Math.min(Math.round((timeElapsed / 3) * 100), 100);\r\n return percentage;\r\n }\r\n secondsCountDown() {\r\n return (3 - (this.getCountdownSeconds() / 100 * 3)).toFixed(1)\r\n }\r\n multipleInputRemoveItem(event: Event, row: any) {\r\n const rowId = row[`${this.inputConfig?.id}.id`];\r\n \r\n if (this.areYouSureYouWantToDeleteRow[rowId]) {\r\n // Second click - cancel the scheduled deletion\r\n if (this.deletionTimers[rowId]) {\r\n clearTimeout(this.deletionTimers[rowId]);\r\n delete this.deletionTimers[rowId];\r\n }\r\n delete this.areYouSureYouWantToDeleteRow[rowId];\r\n } else {\r\n // First click - schedule auto-deletion after 3 seconds\r\n this.areYouSureYouWantToDeleteRow[rowId] = true;\r\n \r\n // Start countdown\r\n this.countDownDate = new Date();\r\n \r\n // Schedule auto-deletion after 3 seconds\r\n this.deletionTimers[rowId] = setTimeout(() => {\r\n if (this.areYouSureYouWantToDeleteRow[rowId]) {\r\n this.onDeleteItem.emit(row);\r\n delete this.areYouSureYouWantToDeleteRow[rowId];\r\n delete this.deletionTimers[rowId];\r\n }\r\n }, 3000);\r\n }\r\n \r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n returnBackground(row: any, columnsConfig?: any):string|undefined {\r\n var background: any = '';\r\n if (\r\n this.dataSource\r\n ? this.dataSource.data.length > 1\r\n ? columnsConfig['colorScale']\r\n : false\r\n : false\r\n ) {\r\n const input = this.inputConfig as IMultiple;\r\n const point = row[columnsConfig['key']];\r\n const inputIsGrouped = input.groupBy;\r\n const dataSet = inputIsGrouped\r\n ? this.dataSource!.data.filter(\r\n (s) => s[input.groupBy?.[0] || ''] === row[input.groupBy?.[0] || '']\r\n )\r\n : new Array(this.dataSource!.data);\r\n let arrayValues: Array<number> = dataSet.map((vr) =>\r\n Number(vr[columnsConfig['key']])\r\n );\r\n const max = Math.max(...arrayValues);\r\n const min = Math.min(...arrayValues);\r\n const hasNun = isNaN(max) || isNaN(min);\r\n if (!hasNun && Number(max) !== Number(min)) {\r\n let colorScale = new ColorScale(\r\n min,\r\n max,\r\n ['#2fdf75', '#FFA500', '#ff4961'],\r\n 0.8\r\n );\r\n\r\n let color:string|undefined= colorScale.getColor(point)?.toRGBAString();\r\n background = color;\r\n }\r\n }\r\n return background;\r\n }\r\n\r\n hasTopBorder(row: any) {\r\n const input = this.inputConfig as IMultiple\r\n const inputIsGrouped = input.groupBy;\r\n if (inputIsGrouped) {\r\n const indexOfRow = this.dataSource!.data.indexOf(row);\r\n const rowIsFirstInTable = indexOfRow === 0;\r\n\r\n if (!input.groupBy) {\r\n return false;\r\n }\r\n const isFirstInGroup = rowIsFirstInTable\r\n ? true\r\n : this.dataSource!.data[indexOfRow - 1][input.groupBy?.[0] ?? ''] !==\r\n row[input.groupBy?.[0] ?? ''];\r\n\r\n return isFirstInGroup;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n\r\n\r\n\r\n getCalculationFunction(row: any) {\r\n const func:CalculationFunctions = row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION']\r\n \r\n switch (func) {\r\n case CalculationFunctions.Sum:\r\n \r\n return 'TOTAL';\r\n case CalculationFunctions.Avg:\r\n return 'AVERAGE';\r\n case CalculationFunctions.Max:\r\n return 'MAX';\r\n case CalculationFunctions.Min:\r\n return 'MIN';\r\n \r\n default:\r\n return func;\r\n }\r\n }\r\n tempLabels:string[] = []\r\n toggleTepLabel(event:any,label:string){\r\n if(this.tempLabels.includes(label)){\r\n this.tempLabels = this.tempLabels.filter(l=>l!==label)\r\n \r\n }else{\r\n this.tempLabels.push(label)\r\n }\r\n\r\n event.stopPropagation()\r\n event.preventDefault()\r\n }\r\n get getColConfig(){\r\n if(!this.inputConfig) return {\r\n columnsConfig: [],\r\n displayedColumnsInOrder: []\r\n }\r\n return configureCols(this.inputConfig,this.tempLabels )\r\n }\r\n get displayedColumnsInOrder():string[] {\r\n return this.getColConfig.displayedColumnsInOrder\r\n }\r\n get allPossibleLabels(){\r\n return this.inputConfig?.formInputs?.map(\r\n inp=>({\r\n label:inp.label,\r\n selected:this.displayedColumnsInOrder.includes(`${this.inputConfig?.id}.${inp.id}`),\r\n formControlName: inp.formControlName\r\n })\r\n ) ||[]\r\n }\r\n \r\n\r\n\r\n SYSTEM_KEY_IN_EDIT:string| null = null\r\n rowIsInEdit(row:any) {\r\n return !!this.inputConfig?.formIsOpen &&this.formGroup?.controls[`${this.inputConfig?.id}.id`]?.value===row[`${this.inputConfig?.id}.id`]\r\n }\r\n fullView: boolean = false;\r\n}\r\n","@defer (on viewport) {\r\n\r\n@if (getColConfig.displayedColumnsInOrder.length===0) {\r\n<div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n No columns\r\n</div>\r\n}\r\n<div class=\"table-container\">\r\n\r\n <table mat-table [dataSource]=\"(dataSource || [])\" class=\"example-table\" matSort matSortActive=\"created\"\r\n matSortDisableClear matSortDirection=\"desc\">\r\n @for (col of (displayedColumnsInOrder||[]); track col) {\r\n <ng-container [matColumnDef]=\"col\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <span style=\"text-align: start; line-height: normal; font-size: 0.8125em\">\r\n {{ getColConfig.columnsConfig?.[col]?.[\"label\"] }}\r\n </span>\r\n @if($last){\r\n <button matTooltip=\"Show other values\" [matMenuTriggerFor]=\"colOptions\" \r\n [matMenuTriggerData]=\"{}\" mat-icon-button>\r\n <mat-icon>\r\n label\r\n </mat-icon>\r\n </button>\r\n \r\n }\r\n </th>\r\n <td [class.functionClass]=\"row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION']\"\r\n \r\n [style.background]=\"\r\n returnBackground(row, getColConfig.columnsConfig?.[col])\r\n \" mat-cell *matCellDef=\"let row\">\r\n <div *ngIf=\" getColConfig.columnsConfig?.[col]?.['type'] === 'removal'\" class=\"cellClass\">\r\n \r\n <div style=\"width: 100%; text-align: right;\" *ngIf=\"!!row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] &&!row['id'] && !inputConfig?.multipleInputInEditId || \r\n !!row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] && inputConfig?.multipleInputInEditId &&\r\n inputConfig?.multipleInputInEditId !== row['id']\">\r\n <strong>\r\n\r\n {{getCalculationFunction(row)}}\r\n </strong>\r\n\r\n </div>\r\n <button mat-icon-button\r\n [color]=\"t.menuOpen ? 'primary' : 'basic'\"\r\n *ngIf=\"\r\n !row['SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION'] &&\r\n row['' ] !== 'true' && !inputConfig?.readonly \r\n \r\n \" \r\n [matMenuTriggerFor]=\"rowOptions\" \r\n [matMenuTriggerData]=\"{row:row}\" \r\n #t=\"matMenuTrigger\" (click)=\"applyOptionsToFn(row)\"\r\n expand=\"block\" fill=\"clear\" style=\"margin-left: auto;margin-right:0px;display:block\">\r\n @if (rowIsInEdit(row)) {\r\n <mat-icon color=\"primary\">\r\n edit\r\n </mat-icon> \r\n\r\n }@else {\r\n <mat-icon >\r\n {{\r\n t.menuOpen ? 'close' : 'more_horiz'\r\n }}\r\n \r\n </mat-icon>\r\n }\r\n \r\n\r\n </button>\r\n\r\n\r\n <mat-chip *ngIf=\"\r\n row['SYSTEM_KEY_IN_EDIT']\r\n \r\n \">\r\n In {{ inputConfig?.readonly ? 'View' : 'Edit' }}\r\n\r\n </mat-chip>\r\n\r\n </div>\r\n <div *ngIf=\"getColConfig.columnsConfig && getColConfig.columnsConfig?.[col]?.type !== 'removal'\"\r\n class=\"cellClass\">\r\n <span >\r\n {{ row[col] |formatData: getColConfig.columnsConfig?.[col].dataType }}\r\n\r\n </span>\r\n </div>\r\n </td>\r\n </ng-container>\r\n }\r\n\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"getColConfig.displayedColumnsInOrder \"></tr>\r\n <tr [style.border-top]=\"hasTopBorder(row) ? 'solid 2px' : ''\" mat-row\r\n \r\n *matRowDef=\"let row; columns: getColConfig.displayedColumnsInOrder\"></tr>\r\n </table>\r\n \r\n <div *ngIf=\"!(dataSource?.data)||(dataSource?.data)?.length === 0\">\r\n <div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n <div style=\"\r\n padding-left: 16px;\r\n padding-right: 16px;\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n\r\n display: flex;\r\n justify-content: center;\r\n opacity: 0.6;\r\n font-size: 0.8125em;\r\n \">\r\n \r\n <div style=\"margin-top: 8px; text-align: center;\">\r\n <mat-icon style=\"font-size: 1.25em; vertical-align: middle; margin-right: 8px;\">list</mat-icon>\r\n <div style=\"margin-top: 8px;\">\r\n <strong>No items yet</strong>\r\n <p style=\"margin-top: 4px; font-size: 0.8125em;\">\r\n <strong>Click the add button</strong> to create a new row. You'll be able to fill in details using a form.\r\n Each saved entry will appear as a row in this table.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\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=\"50\" />\r\n</div>\r\n}\r\n<mat-menu #colOptions=\"matMenu\">\r\n <ng-template matMenuContent >\r\n @for (label of allPossibleLabels; track label.label) {\r\n <button mat-menu-item (click)=\"toggleTepLabel($event,label.formControlName);\">\r\n <mat-icon>\r\n {{ label.selected?'check_circle':'radio_button_unchecked'}}\r\n </mat-icon>\r\n {{label.label}}\r\n \r\n </button>\r\n \r\n }\r\n\r\n </ng-template>\r\n</mat-menu>\r\n<mat-menu #rowOptions=\"matMenu\">\r\n <ng-template matMenuContent let-row=\"row\">\r\n @if(!inputConfig?.readonly){\r\n <button mat-menu-item (click)=\"editItem(row)\">\r\n <mat-icon>\r\n {{'edit'}}\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n {{ 'Edit'}}\r\n </div>\r\n <div class=\"option-sub-text\">\r\n {{inputConfig?.readonly ? 'View item properties' : 'Modify item properties'}}\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button mat-menu-item (click)=\"copy(row)\">\r\n <mat-icon>\r\n content_copy\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n Duplicate\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Create a copy with same values\r\n </div>\r\n </div>\r\n </button>\r\n @if(isAboutToDeleteRow(row)){\r\n <button mat-menu-item (click)=\"multipleInputRemoveItem($event,row)\">\r\n <mat-icon color=\"accent\">\r\n cancel\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\" style=\"color: #2196F3;\">\r\n Cancel Deletion\r\n </div>\r\n <div class=\"option-sub-text\">\r\n Auto-deleting in {{ secondsCountDown()}} seconds...\r\n </div>\r\n </div>\r\n </button>\r\n <div class=\"deletion-progress-container\">\r\n <mat-progress-bar color=\"warn\" mode=\"determinate\" [value]=\"getCountdownSeconds()\"></mat-progress-bar>\r\n <div class=\"deletion-message\" *ngIf=\"getCountdownSeconds() > 75\">\r\n Deleting soon...\r\n </div>\r\n </div>\r\n }@else {\r\n <button mat-menu-item (click)=\"multipleInputRemoveItem($event,row)\">\r\n <mat-icon color=\"warn\">\r\n delete_outline\r\n </mat-icon>\r\n <div class=\"option-text\">\r\n <div class=\"option-main-text\">\r\n Delete \r\n </div>\r\n <div class=\"option-sub-text\">\r\n Will delete after 3 seconds (click to cancel)\r\n </div>\r\n </div>\r\n </button>\r\n }\r\n }\r\n </ng-template>\r\n</mat-menu>\r\n","import { Component, EventEmitter, Input, OnDestroy, Output } from '@angular/core';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { TFormInputComponent } from '../../../../t-form-input.component';\r\nimport { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\nimport { Subject, takeUntil, tap, timer } from 'rxjs';\r\nimport { CalculationFunctions, ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { IMultipleInputCal } from 'ngx-t-forms-types';\r\nimport { FormBuilderFunctions } from 'ngx-t-forms-types';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\n\r\n@Component({\r\n selector: 'lib-multiple-input-table-edit',\r\n standalone: true,\r\n imports: [MatModulesModule, CommonModule, DragDropModule,],\r\n templateUrl: './multiple-input-table-edit.component.html',\r\n styleUrl: './multiple-input-table-edit.component.css'\r\n})\r\nexport class MultipleInputTableEditComponent implements OnDestroy {\r\n InputComponent = TFormInputComponent;\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() editorMode: boolean = false;\r\n @Input() formGroup:FormGroup | null = null\r\n\r\n @Output() onSaveMultipleInputForm = new EventEmitter<any>();\r\n @Output() editMultipleInput = new EventEmitter<ITowerStepColumn>();\r\n @Output() deleteInput = new EventEmitter<ITowerStepColumn>();\r\n @Output() showItemAsLabel = new EventEmitter<ITowerStepColumn>();\r\n @Output() addFunction = new EventEmitter<IMultipleInputCal>();\r\n @Input() formBuilderFunctions: FormBuilderFunctions |undefined\r\n @Output() reorderItems = new EventEmitter< CdkDragDrop<ITowerStepColumn[] , any, any>>();\r\n calculationFunctions \r\n constructor() {\r\n this.calculationFunctions = Object.values(CalculationFunctions)\r\n }\r\n\r\n ngOnDestroy(): void {\r\n Object.values(this.countdownSeconds).forEach(({ stop$ }) => stop$.complete());\r\n }\r\nactiveInput:string = ''\r\n // getMultipleInputForm(): FormGroup | any {\r\n // const form: FormGroup | undefined =\r\n // this.inputConfig?.multipleInputController?.sections[\r\n // this.inputConfig.input.id\r\n // ]?.sectionForm\r\n \r\n // return form;\r\n // }\r\n saveMultipleInputForm() {\r\n this.onSaveMultipleInputForm.emit();\r\n }\r\n dragging:boolean = false\r\n inputWillBeRemovedIn(id: string) {\r\n return this.countdownSeconds[id]?.count\r\n }\r\n countdownSeconds: {\r\n [key: string]:\r\n {\r\n count: number | null,\r\n stop$: Subject<void>\r\n }\r\n } = {}\r\n removeInput(item: ITowerStepColumn) {\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: 5,\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) {\r\n return;\r\n }\r\n \r\n const remainingTime = 5 - secondsElapsed;\r\n if (remainingTime <= 0) {\r\n this.formDeleteInput(item)\r\n this.stopDeletion(item.id);\r\n // Stop and remove timer\r\n // Actual deletion logic here, e.g., remove the element by id\r\n // document.getElementById(id)?.remove();\r\n } else {\r\n data.count = remainingTime;\r\n }\r\n }),\r\n takeUntil(this.countdownSeconds[item.id]!.stop$)\r\n );\r\n \r\n countdown$?.subscribe({\r\n complete: () => {}\r\n });\r\n }\r\n stopDeletion(id: string) {\r\n if (this.countdownSeconds[id]) {\r\n this.countdownSeconds[id]?.stop$.next();\r\n delete this.countdownSeconds[id];\r\n }\r\n }\r\n\r\n formDeleteInput(item: ITowerStepColumn){\r\n this.deleteInput.emit(item)\r\n }\r\n dropItems(event: CdkDragDrop<ITowerStepColumn[], any, any>) {\r\n this.reorderItems.emit(event);\r\n\r\n }\r\n overId:string | null = null\r\n editInput(input: ITowerStepColumn) {\r\n \r\n this.editMultipleInput.emit(input);\r\n\r\n }\r\n toggleLabel(item: ITowerStepColumn) {\r\n this.showItemAsLabel.emit(item);\r\n }\r\n toggleFunction(func:CalculationFunctions,inputId:string) {\r\n \r\n let addFunction:IMultipleInputCal = {\r\n id: uuidv4(),\r\n inputId: this.activeInput,\r\n func\r\n } as any\r\n this.addFunction.emit(addFunction);\r\n \r\n \r\n }\r\n selectedFunction(func:CalculationFunctions) {\r\n return this.inputConfig?.calculateListFunctions.find(f=>f.inputId === this.activeInput && f.func === func)\r\n }\r\n areYouSure:boolean = false\r\n get formInvalid(){\r\n const allControls: AbstractControl<any, any>[] = []\r\n this.inputConfig?.formInputs?.forEach(input=>{\r\n const control = this.formGroup?.controls[`${ this.inputConfig?.id}.${input.id}`];\r\n if (control) {\r\n allControls.push(control);\r\n }else{\r\n \r\n }\r\n })\r\n \r\n return allControls.some((control:any)=>control?.invalid || !control)\r\n }\r\n closeMultipleInput(){\r\n if(this.areYouSure){\r\n this.formBuilderFunctions?.multipleInputToggleForm(this.inputConfig?.id!,false)\r\n this.areYouSure = false \r\n return \r\n }\r\n this.areYouSure = true\r\n\r\n }\r\n get innerInputs():ITowerStepColumn[]{\r\n return this. inputConfig?.formInputs?.map(input=>({\r\n ...input,\r\n originalId: input.id,\r\n id: `${this.inputConfig?.id}.${input.id}`\r\n } as ITowerStepColumn)) ||[]\r\n }\r\n get rowInUpdate(){\r\n return !!this.inputConfig?.formIsOpen &&!!this.formGroup?.controls[`${this.inputConfig?.id}.id`]?.value\r\n }\r\n}\r\n","\r\n<mat-card appearance=\"outlined\" style=\" margin-top: 8px;background:var(--mat-sys-surface-container)\" class=\" mat-elevation-z4\">\r\n <mat-card-content>\r\n <div class=\"list\" (cdkDropListDropped)=\"dropItems($event)\"\r\n \r\n [cdkDropListData]=\"innerInputs\" cdkDropList\r\n \r\n #InputList=\"cdkDropList\" class=\"row\">\r\n @for( innerInput of innerInputs|| [];track innerInput.id\r\n ){\r\n <ng-container>\r\n @if(editorMode){\r\n <mat-card (mouseover)=\"activeInput = innerInput.id\" *ngIf=\"!!formGroup\" cdkDrag\r\n (cdkDragStarted)=\"dragging =true\" (cdkDragReleased)=\"dragging =false\"\r\n [class.inputCardElevated]=\"activeInput ===innerInput.id\"\r\n [class.inputCard]=\"activeInput !==innerInput.id\"\r\n [class]=\"'col-md-'+(dragging?'12':innerInput.colSize)\" class=\"box\">\r\n <div class=\"custom-placeholder\" *cdkDragPlaceholder></div>\r\n <ng-container *ngComponentOutlet=\"InputComponent; \r\n inputs: {\r\n inputConfig: innerInput,\r\n formGroup: formGroup,\r\n formBuilderFunctions: formBuilderFunctions,\r\n }\">\r\n </ng-container>\r\n <mat-card-actions *ngIf=\"activeInput === innerInput.id\">\r\n <span class=\"spacer\"></span>\r\n <button [matTooltip]=\"'Edit Input: ' + innerInput.label \"\r\n (click)=\"editInput(innerInput)\" mat-icon-button>\r\n <mat-icon>\r\n edit\r\n </mat-icon>\r\n\r\n </button>\r\n @if(!!inputWillBeRemovedIn(innerInput.id) ){\r\n <button (mouseover)=\"overId = innerInput.id\" (mouseout)=\"overId = null\"\r\n (click)=\"removeInput(innerInput)\" color=\"warn\" mat-stroked-button>\r\n <div style=\"display: flex; align-items: center;\">\r\n <mat-progress-spinner style=\"margin-right: 5px;\" color=\"primary\" class=\"cancelProgress\"\r\n [value]=\"((inputWillBeRemovedIn(innerInput.id)||0)/5)*100\">\r\n </mat-progress-spinner>\r\n\r\n {{overId === innerInput.id ? 'Click to cancel':'Deleting in'}}\r\n {{inputWillBeRemovedIn(innerInput.id)}}\r\n </div>\r\n\r\n </button>\r\n\r\n }@else if(inputConfig?.systemDefault !== true && innerInput.systemDefault !== true) {\r\n <button [matTooltip]=\"'Delete input ' + innerInput.label \"\r\n (click)=\"removeInput(innerInput)\" mat-icon-button>\r\n\r\n <mat-icon>\r\n delete\r\n </mat-icon>\r\n </button>\r\n }\r\n |\r\n <button *ngIf=\"!!innerInput.showAsLabel && innerInput.dataType=== 'number' ||!!innerInput.showAsLabel && innerInput.type === 'number'\"\r\n [matMenuTriggerFor]=\"calculationMenu\" \r\n [matMenuTriggerData]=\"{inputId:innerInput.originalId || innerInput.id}\"\r\n [matTooltip]=\"'calculate sum,avg,min,max'\"\r\n mat-icon-button>\r\n\r\n <mat-icon>\r\n calculate\r\n </mat-icon>\r\n </button>\r\n <button [color]=\"innerInput.showAsLabel? 'primary' : ''\"\r\n (click)=\"toggleLabel(innerInput)\"\r\n [matTooltip]=\"innerInput.showAsLabel? 'Hide as label' : 'Show as label'\"\r\n mat-icon-button>\r\n\r\n <mat-icon>\r\n label\r\n </mat-icon>\r\n </button>\r\n <span class=\"spacer\"></span>\r\n </mat-card-actions>\r\n </mat-card>\r\n }@else {\r\n \r\n <div [class]=\"'col-md-'+(dragging?'12':innerInput.colSize)\" class=\"box\">\r\n <ng-container *ngComponentOutlet=\"InputComponent; \r\n inputs: {\r\n inputConfig: innerInput,\r\n formGroup: formGroup,\r\n formBuilderFunctions: formBuilderFunctions,\r\n }\">\r\n </ng-container>\r\n </div>\r\n \r\n }\r\n\r\n </ng-container>\r\n }\r\n @if (!!editorMode && ( innerInputs|| []).length === 0) {\r\n\r\n <div class=\"tree-instructions\">\r\n <mat-icon style=\"margin-top: 4px;margin-bottom:auto\" class=\"info-icon\" color=\"primary\">info</mat-icon>\r\n <span>\r\n <strong>Add Form Input</strong>\r\n <br>\r\n Manage your list by adding, editing, or removing items. Each item is customizable through a form.\r\n </span>\r\n </div>\r\n\r\n }\r\n\r\n </div>\r\n </mat-card-content>\r\n @if ( ( innerInputs|| []).length !== 0) {\r\n <br>\r\n <mat-divider></mat-divider>\r\n <mat-card-actions align=\"end\" class=\"ion-margin-top\">\r\n <button [color]=\"areYouSure ? 'warn' : ''\" class=\"ion-margin-end\"\r\n [style.text-decoration]=\"areYouSure ? 'underline' : ''\" mat-flat-button\r\n (click)=\"closeMultipleInput()\">\r\n {{ areYouSure ? \"leave without saving\" : \"cancel\" }}\r\n </button>\r\n @if(!inputConfig?.readonly){\r\n <button [disabled]=\"!!formInvalid\" style=\"min-width: 10em\" color=\"primary\" (click)=\"saveMultipleInputForm()\" class=\"ion-padding-horizontal\"\r\n mat-raised-button>\r\n {{\r\n rowInUpdate\r\n ? \"Update\"\r\n : \"save\"\r\n }}\r\n </button>\r\n }\r\n\r\n </mat-card-actions>\r\n }\r\n\r\n</mat-card>\r\n\r\n\r\n<mat-menu #calculationMenu=\"matMenu\">\r\n <ng-template matMenuContent let-inputId=\"sectionId\">\r\n <button (click)=\"toggleFunction(func,inputId)\" mat-menu-item *ngFor=\"let func of calculationFunctions\">\r\n {{ func }}\r\n <mat-icon color=\"primary\" *ngIf=\"selectedFunction(func)\">check_circle</mat-icon>\r\n </button>\r\n </ng-template>\r\n</mat-menu> ","\r\nimport { calculateListOveralFunctions } from \"../../../../../services/core/t-form-controller/function/calculateInputValue\";\r\nimport { CalculationFunctions, FormColumnInputs } from \"ngx-t-forms-types\";\r\n\r\nexport function getCaluculatedTableData(inputConfig: FormColumnInputs | undefined,data:any[]) {\r\n try {\r\n if(!Array.isArray(data) || !inputConfig) return data ;\r\n const input:FormColumnInputs = inputConfig;\r\n // const funcs = (input?.calculateListFunctions || []).map(f=> {\r\n // // const {formControlName}= input.formInputs?.find(i=>i.id === f.id) ||{}\r\n // // return {\r\n // // ...f,\r\n // // formControlName\r\n // // }\r\n // return \r\n // })\r\n const funcs = (input?.calculateListFunctions || [])\r\n const allUniqueFunctionNames = [...new Set(funcs.map((f: {\r\n \r\n inputId: string;\r\n func: CalculationFunctions;\r\n })=>f.func))]\r\n const calculatedData = allUniqueFunctionNames.map(func=>{\r\n let newCalculatedData:any = {\r\n //itemRemovalButton\r\n SYSTEM_KEY_PROPERTY_FOR_MULTIPLE_INPUTS_CALCULATION_FUNCTION: func\r\n \r\n }\r\n funcs.filter(f=>f.func === func).forEach(f=>{\r\n const arrayValues = data.map(d=>Number(d[f.inputId as any]))\r\n newCalculatedData[f.inputId as any] = calculateListOveralFunctions(func,arrayValues)\r\n })\r\n return newCalculatedData\r\n })\r\nreturn [...data,...calculatedData]\r\n \r\n } catch (error) {\r\n return data;\r\n }\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, ElementRef, Input, Optional, Self } from '@angular/core';\r\nimport { FormGroup, NgControl, } from '@angular/forms';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\n\r\nimport { IMultiple, IMultipleInputCal, ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\n\r\nimport _, { } from 'lodash';\r\n\r\n\r\nimport { MultipleInputTableViewComponent } from '../multiple-input-table-view/multiple-input-table-view.component';\r\nimport { MultipleInputTableEditComponent } from '../multiple-input-table-edit/multiple-input-table-edit.component';\r\n\r\nimport { FormBuilderFunctions } from 'ngx-t-forms-types';\r\nimport { getCaluculatedTableData } from '../../functions/getListCalculated';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { CdkDragDrop } from '@angular/cdk/drag-drop';\r\n\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { takeUntil } from 'rxjs';\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'app-multiple-input-table',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'app-multiple-input-table',\r\n templateUrl: './multiple-input-table.component.html',\r\n styleUrls: ['./multiple-input-table.component.css'],\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatModulesModule,\r\n MultipleInputTableEditComponent,\r\n MultipleInputTableViewComponent,\r\n ],\r\n providers: [{ provide: MatFormFieldControl, useExisting: MultipleInputTableComponent }],\r\n\r\n})\r\nexport class MultipleInputTableComponent extends BaseCustomInput<any[] | null> {\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.listenToValueChanges();\r\n\r\n }\r\n @Input() editorMode: boolean = false;\r\n @Input() formGroup!: FormGroup;\r\n\r\n _inputConfig!: ITowerStepColumn;\r\n @Input() set inputConfig(config: ITowerStepColumn) {\r\n if (_isEqual(this._inputConfig, config)) return\r\n\r\n this._inputConfig = config;\r\n\r\n\r\n }\r\n get inputConfig() {\r\n return this._inputConfig;\r\n }\r\n @Input() formBuilderFunctions: FormBuilderFunctions | undefined\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * Manages custom validation errors on the form control.\r\n * Intended to be called from the ngDoCheck lifecycle hook.\r\n * This function handles both the 'required' error and the new\r\n * 'multipleInputListMissingSomeFields' custom error.\r\n */\r\n override checkValidationsAnErrors() {\r\n const control = this.ngControl?.control;\r\n\r\n // 1. Early exit if there's no form control to work with.\r\n if (!control) {\r\n return;\r\n }\r\n\r\n // --- DEFINE THE DESIRED ERROR STATE ---\r\n\r\n // 2. Determine if the custom \"multiple fields\" error should exist.\r\n let shouldHaveCustomError = false;\r\n const formInputs = (this.inputConfig as IMultiple)?.formInputs;\r\n\r\n if (Array.isArray(formInputs) && Array.isArray(this.value)) {\r\n const requiredFieldIds = formInputs\r\n .filter(i => i.required)\r\n .map(i => i.id);\r\n\r\n if (requiredFieldIds.length > 0) {\r\n shouldHaveCustomError = this.value.some(item =>\r\n requiredFieldIds.some(id => this._isNilOrEmpty(item?.[`${this.inputConfig.id}.${id}`]))\r\n );\r\n }\r\n }\r\n\r\n // 3. Determine if the standard 'required' error should exist.\r\n const shouldHaveRequiredError = this.required && this._isNilOrEmpty(this.value);\r\n\r\n\r\n // --- APPLY THE ERROR STATE TO THE CONTROL ---\r\n\r\n // 4. Preserve other errors that might be on the control (e.g., minlength, pattern).\r\n const newErrors = { ...control.errors };\r\n delete newErrors['required'];\r\n delete newErrors['multipleInputListMissingSomeFields'];\r\n\r\n\r\n // 5. Add our managed errors back if their conditions are met.\r\n if (shouldHaveRequiredError) {\r\n newErrors['required'] = true;\r\n }\r\n if (shouldHaveCustomError) {\r\n newErrors['multipleInputListMissingSomeFields'] = { value: true }; // Or simply 'true'\r\n }\r\n\r\n // 6. Finalize the error object. If no errors, it must be null.\r\n const finalErrors = Object.keys(newErrors).length > 0 ? newErrors : null;\r\n\r\n // 7. IMPORTANT: Only update the control if the errors have actually changed.\r\n // This prevents infinite loops within ngDoCheck. A simple stringify is a\r\n // dependency-free way to compare the error objects.\r\n if (JSON.stringify(control.errors) !== JSON.stringify(finalErrors)) {\r\n control.setErrors(finalErrors);\r\n }\r\n}\r\n\r\n\r\n\r\n get empty() {\r\n return !this.value\r\n }\r\n\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n override get errorState(): boolean {\r\n // 1. Check for standard validation errors from Angular's Forms API.\r\n const hasStandardError = !!this.ngControl?.errors;\r\n\r\n // 2. Check for custom validation errors specific to 'IMultiple' type.\r\n let hasCustomError = false;\r\n const formInputs = (this.inputConfig as IMultiple)?.formInputs;\r\n\r\n // This custom logic only runs if the config and value are the expected array types.\r\n if (Array.isArray(formInputs) && Array.isArray(this.value)) {\r\n const requiredFieldIds = formInputs\r\n .filter(input => input.required)\r\n .map(input => input.id);\r\n\r\n // The custom error is true if any item in our value array is missing\r\n // a value for any of its required sub-fields.\r\n if (requiredFieldIds.length > 0) {\r\n hasCustomError = this.value.some(item =>\r\n requiredFieldIds.some(id => this._isNilOrEmpty(item?.[`${this.inputConfig.id}.${id}`]))\r\n );\r\n }\r\n }\r\n\r\n // 3. The final error state is true if *any* validation fails,\r\n // AND the control has been \"touched\" by the user.\r\n return (hasStandardError || hasCustomError) && this.touched;\r\n }\r\n private _isNilOrEmpty(value: any): boolean {\r\n return value === null || value === undefined || value === '';\r\n }\r\n\r\n\r\n\r\n\r\n /// En of implementations of MatFormFieldControl\r\n applyOptionsTo: any;\r\n dataSource!: MatTableDataSource<any>\r\n listenToValueChanges() {\r\n this.stateChanges.pipe(\r\n takeUntil(this.destroy$)\r\n ).subscribe(() => {\r\n \r\n this.checkItemList()\r\n\r\n })\r\n }\r\n checkItemList() {\r\n try {\r\n\r\n if (this.value) {\r\n const TableData: any = !!(this.inputConfig as IMultiple)\r\n .groupBy && (this.inputConfig as IMultiple).groupBy!.length > 0\r\n ? addGroups(\r\n this.value,\r\n (this.inputConfig as IMultiple).groupBy\r\n )\r\n : this.value;\r\n const data = getCaluculatedTableData(this.inputConfig, TableData)\r\n\r\n if (!this.dataSource) {\r\n\r\n this.dataSource = new MatTableDataSource(data);\r\n\r\n this.dataSource\r\n } else {\r\n this.dataSource.data = data;\r\n }\r\n\r\n }\r\n return true\r\n } catch {\r\n return false\r\n\r\n }\r\n }\r\n\r\n multipleInputRemoveItem(item: any) {\r\n\r\n if (!this.value) return;\r\n this.value = this.value.filter((i) => !_isEqual(i, item));\r\n\r\n\r\n this.applyOptionsTo = undefined;\r\n this.onChange(this.value);\r\n this.stateChanges.next();\r\n }\r\n\r\n\r\n generateMultipleInputForm() {\r\n const id = this.inputConfig?.id;\r\n if (!id) return;\r\n this.formBuilderFunctions?.multipleInputToggleForm(id, true)\r\n\r\n }\r\n rowInViewOnly: string | undefined = undefined;\r\n\r\n editRow(rowId: string) {\r\n if (!rowId) {\r\n throw new Error('Row id not provided')\r\n\r\n }\r\n\r\n if (!this.formBuilderFunctions || !this.inputConfig) return\r\n\r\n this.formBuilderFunctions?.multipleInputEditRow(this.inputConfig?.id, rowId)\r\n\r\n\r\n // if( !this.inputConfig?.multipleInputController){\r\n // return\r\n // }\r\n // this.inputConfig.multipleInputInEditId = this.applyOptionsTo.id;\r\n // this.inputConfig.applyMultipleInputValuesToForm(\r\n // this.applyOptionsTo\r\n // );\r\n }\r\n\r\n copy(rowId: string) {\r\n if (!this.formBuilderFunctions || !this.inputConfig) return\r\n this.formBuilderFunctions?.multipleInputDuplicateRow(this.inputConfig?.id, rowId)\r\n // this.generateMultipleInputForm();\r\n // this.inputConfig?.applyMultipleInputValuesToForm(\r\n // this.applyOptionsTo\r\n // );\r\n // this.applyOptionsTo = undefined;\r\n }\r\n get handleLabel() {\r\n return (this.inputConfig as any)?.handleLabel\r\n }\r\n handleIcon() {\r\n return (this.inputConfig as any)?.handleIcon || 'add'\r\n }\r\n saveMultipleInputForm() {\r\n\r\n this.formBuilderFunctions?.multipleInputSaveForm(this.inputConfig?.id!)\r\n\r\n // const value: any = this.inputConfig?.multipleInputFormValue();\r\n\r\n // value['id'] = uuidv4();\r\n\r\n // if (!this.inputConfig) {\r\n // return\r\n // }\r\n\r\n // const previousValue = this.value\r\n // if (!previousValue) {\r\n // this.value = [value];\r\n // this.inputConfig.multipleInputController = undefined;\r\n\r\n // } else {\r\n // if (this.inputConfig?.multipleInputInEditId) {\r\n // let inEdit = previousValue.find(\r\n // (i: { id: any }) =>\r\n // i.id === this.inputConfig?.multipleInputInEditId\r\n // );\r\n // Object.keys(inEdit).every((s) => {\r\n // s;\r\n // inEdit[s] = value[s];\r\n // return !!inEdit[s];\r\n // });\r\n\r\n // this.value = [...previousValue],\r\n // this.inputConfig.multipleInputController = undefined;\r\n\r\n // } else {\r\n\r\n\r\n // this.value = [...previousValue, value];\r\n // this.inputConfig.multipleInputController = undefined;\r\n\r\n // }\r\n // }\r\n // this.onChange(this.value);\r\n // this.stateChanges.next();\r\n // this.checkItemList(this.value || []);\r\n // return\r\n\r\n\r\n }\r\n\r\n editInput(input: ITowerStepColumn) {\r\n if (typeof this.formBuilderFunctions?.editInput !== 'function') {\r\n throw new Error('editInput function not defined in formBuilderFunctions')\r\n }\r\n this.formBuilderFunctions?.editInput(input)\r\n }\r\n deleteItemInput(input: ITowerStepColumn) {\r\n this.formBuilderFunctions?.deleteInput(input)\r\n }\r\n showItemAsLabel(input: ITowerStepColumn) {\r\n this.formBuilderFunctions?.multipleInputToggleLabel(input)\r\n }\r\n addFunction(func: IMultipleInputCal) {\r\n this.formBuilderFunctions?.addFunction(func, this.inputConfig?.id)\r\n\r\n }\r\n reorderItems(event: CdkDragDrop<ITowerStepColumn[], any, any>) {\r\n if (!this.formBuilderFunctions || !this.inputConfig) return\r\n this.formBuilderFunctions?.reorderItems(event as any, this.inputConfig.id)\r\n }\r\n get parentFormGroup(): FormGroup | null {\r\n return this.ngControl?.control?.parent as FormGroup;\r\n }\r\n\r\n}\r\n\r\n\r\n\r\nfunction addGroups(tableValue: any[], groupBy: string[] | undefined): any {\r\n throw new Error('Function not implemented.');\r\n}\r\n\r\n","\r\n<lib-multiple-input-table-view\r\n\r\n[inputConfig]=\"inputConfig\"\r\n[dataSource]=\"dataSource\"\r\n[applyOptionsTo]=\"applyOptionsTo\"\r\n[formGroup]=\"parentFormGroup\"\r\n(onEditItem)=\"editRow($event)\"\r\n\r\n(onDeleteItem)=\"multipleInputRemoveItem(applyOptionsTo)\"\r\n(onCopy)=\"copy($event)\"\r\n(onApplyOptionsTo)=\"applyOptionsTo = $event\"\r\n></lib-multiple-input-table-view>\r\n@if(!!inputConfig.formIsOpen || !!rowInViewOnly){\r\n<lib-multiple-input-table-edit \r\n[editorMode]=\"editorMode\"\r\n(editMultipleInput)=\"editInput($event)\"\r\n(deleteInput)=\" deleteItemInput($event)\"\r\n(addFunction)=\"addFunction($event)\"\r\n(showItemAsLabel)=\"showItemAsLabel($event)\"\r\n(onSaveMultipleInputForm)=\"saveMultipleInputForm()\"\r\n(reorderItems)=\"reorderItems($event)\"\r\n[formBuilderFunctions]=\"formBuilderFunctions\"\r\n[formGroup]=\"parentFormGroup\"\r\n[inputConfig]=\"inputConfig\"\r\n></lib-multiple-input-table-edit>\r\n\r\n}\r\n\r\n@if (\r\n !inputConfig.readonly &&\r\n !inputConfig.formIsOpen\r\n) {\r\n <section >\r\n <button \r\n color=\"primary\" \r\n style=\" display: block;\r\n margin-top: 8px;\r\n width: 100%;\" (click)=\"generateMultipleInputForm()\" mat-flat-button>\r\n \r\n {{handleLabel}}\r\n <mat-icon matPrefix>{{\r\n handleIcon()\r\n }}</mat-icon>\r\n \r\n \r\n </button>\r\n </section>\r\n \r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { ITowerStepColumn } from \"ngx-t-forms-types\";\r\n\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\n\r\nimport { MultipleInputTableComponent } from './core/multiple-input-table/multiple-input-table.component';\r\n\r\nimport { FormBuilderFunctions } from \"ngx-t-forms-types\";\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n@Component({\r\n selector: 'lib-multiple-input-input-element',\r\n standalone: true,\r\n imports: [MatModulesModule,\r\n TFormInputStatusComponent,\r\n CommonModule,\r\n ReactiveFormsModule, MultipleInputTableComponent],\r\n templateUrl: './multiple-input-input-element.component.html',\r\n styleUrl: './multiple-input-input-element.component.css'\r\n})\r\nexport class MultipleInputInputElementComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n @Input() editorMode: boolean = false;\r\n @Input() formBuilderFunctions: FormBuilderFunctions | undefined\r\n @Output() reload = new EventEmitter<void>();\r\n get errorMessage() {\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n\r\n}\r\n","<form [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\" floatLabel=\"always\"\r\n *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n\r\n <app-multiple-input-table [editorMode]=\"editorMode\" [required]=\"this.inputConfig.required\" [formGroup]=\"formGroup\"\r\n [formBuilderFunctions]=\"formBuilderFunctions\" *ngIf=\"inputConfig.id\" [formControlName]=\"inputConfig.id\"\r\n [inputConfig]=\"inputConfig\">\r\n </app-multiple-input-table>\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) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</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 <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n\r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\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 </ng-container>\r\n\r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n\r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n </mat-form-field>\r\n</form>","\r\n\r\nconst DEFAULT_OPTIONS: PositionOptions = {\r\n enableHighAccuracy: true,\r\n timeout: 5000,\r\n maximumAge: 0\r\n};\r\n\r\nconst getGeoLocation = (options: PositionOptions = DEFAULT_OPTIONS): Promise<GeolocationPosition> => {\r\n return new Promise((resolve, reject) => {\r\n if (!navigator.geolocation) {\r\n const error= {\r\n code: 0,\r\n message: 'Geolocation is not supported by this browser',\r\n PERMISSION_DENIED: 1,\r\n POSITION_UNAVAILABLE: 2,\r\n TIMEOUT: 3\r\n };\r\n reject(error);\r\n return;\r\n }\r\n\r\n navigator.geolocation.getCurrentPosition(\r\n (position: GeolocationPosition) => resolve(position),\r\n (error: GeolocationPositionError) => reject(error),\r\n options\r\n );\r\n });\r\n};\r\n\r\nexport default getGeoLocation;","import { Component, ElementRef, Input, Optional, Self } from '@angular/core';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { NgControl, } from '@angular/forms';\r\nimport _ from 'lodash';\r\nimport getGeoLocation from '../../functions/getGeoLocation';\r\nimport { FormBuilderFunctions, ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\n\r\n\r\n\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'lib-geo-location-form-input',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'lib-geo-location-form-input',\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule],\r\n templateUrl: './geo-location-form-input.component.html',\r\n styleUrl: './geo-location-form-input.component.css',\r\n providers: [\r\n {\r\n provide: MatFormFieldControl,\r\n useExisting: GeoLocationFormInputComponent\r\n }\r\n ]\r\n})\r\nexport class GeoLocationFormInputComponent extends BaseCustomInput<GeolocationPosition | null> {\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>\r\n ) {\r\n super(ngControl, elementRef, customInputConfig);\r\n }\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 n === null || n === undefined || (n as any) === '';\r\n}\r\n override get shouldLabelFloat(): boolean {\r\n return true;\r\n }\r\n\r\n\r\n @Input() formBuilderFunctions: FormBuilderFunctions | undefined\r\n\r\n\r\n @Input() inputConfig!: ITowerStepColumn;\r\n\r\n\r\n\r\n\r\n isLoading = false;\r\n error = false;\r\n async getLocation() {\r\n try {\r\n this.error = false;\r\n this.isLoading = true;\r\n const currentLocation = await getGeoLocation()\r\n this.isLoading = false;\r\n this.value = currentLocation\r\n this.onChange(this.value);\r\n this.stateChanges.next()\r\n } catch {\r\n this.isLoading = false;\r\n this.error = true;\r\n this.errors = { externalError: true }\r\n\r\n }\r\n\r\n }\r\n}\r\n","@if(!!empty){\r\n\r\n<p class=\"empty-state\">\r\n Click icon to get your location\r\n\r\n</p>\r\n\r\n\r\n}\r\n<div class=\"coordinates-section\">\r\n @if(!empty){\r\n <div class=\"coordinate-item\">\r\n <mat-icon color=\"primary\">map</mat-icon>\r\n <span class=\"value\">\r\n <div class=\"inner-value\">\r\n {{value?.coords?.latitude || 'N/A'}} <span class=\"unit\">°N</span>\r\n </div>\r\n <div class=\"inner-value label\">\r\n latitude\r\n </div>\r\n </span>\r\n\r\n\r\n </div>\r\n <div class=\"coordinate-item\">\r\n <mat-icon color=\"primary\">map</mat-icon>\r\n\r\n <span class=\"value\">\r\n <div class=\"inner-value\">\r\n {{value?.coords?.longitude || 'N/A'}}\r\n <span class=\"unit\">°E</span>\r\n </div>\r\n <div class=\"inner-value label\">\r\n longitude\r\n </div>\r\n </span>\r\n\r\n </div>\r\n\r\n\r\n <div class=\"coordinate-item\">\r\n <mat-icon color=\"primary\">zoom_in_map</mat-icon>\r\n <span class=\"value\">\r\n <div class=\"inner-value\">\r\n {{value?.coords?.accuracy | number:'1.0-0'}}\r\n <span class=\"unit\">m</span>\r\n </div>\r\n <div class=\"inner-value label\">\r\n accuracy\r\n </div>\r\n </span>\r\n\r\n\r\n </div>\r\n }\r\n <button mat-flat-button (click)=\"getLocation()\">\r\n {{empty ? 'Get Location' : 'Update Location'}}\r\n <mat-icon>my_location</mat-icon>\r\n </button>\r\n</div>","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { FormBuilderFunctions, ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { GeoLocationFormInputComponent } from './elements/geo-location-form-input/geo-location-form-input.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n\r\n\r\n@Component({\r\n selector: 'lib-geo-location',\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule, ReactiveFormsModule, TFormInputStatusComponent, GeoLocationFormInputComponent],\r\n templateUrl: './geo-location.component.html',\r\n styleUrl: './geo-location.component.css'\r\n})\r\nexport class GeoLocationComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n @Input() editorMode: boolean = false;\r\n @Input() formBuilderFunctions: FormBuilderFunctions | undefined\r\n\r\n \r\n @Output() reload = new EventEmitter<void>();\r\n get errorMessage() {\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n}\r\n","\r\n\r\n<form [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\" *ngIf=\"this.inputConfig as classInput\">\r\n <mat-label>\r\n {{this.inputConfig.label }} \r\n <lib-t-form-input-status \r\n [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n <lib-geo-location-form-input\r\n [inputConfig]=\"this.inputConfig\"\r\n [formControlName]=\"this.inputConfig.id\"\r\n [required]=\"this.inputConfig.required\"\r\n ></lib-geo-location-form-input>\r\n \r\n @if(inputConfig.hintLabel || classInput.temporaryHint ){\r\n <mat-hint class=\"inputHint\">\r\n {{ classInput.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 @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 <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n \r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n <!-- <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"classInput.togglePasswordVisibility()\"\r\n mat-icon-button matSuffix>\r\n <mat-icon>{{ classInput.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\r\n </button> -->\r\n </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n\r\n </mat-form-field>\r\n</form>","// Image capture\r\n\r\nimport { AbstractControl, ValidationErrors } from \"@angular/forms\";\r\nimport { FileUploadInputValueInterface } from \"ngx-t-forms-types\";\r\n\r\n\r\nexport async function setupDevices(\r\n cameraCallback: (stream: MediaStream) => any\r\n): Promise<any> {\r\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n video: true,\r\n });\r\n if (stream) {\r\n cameraCallback(stream);\r\n return stream;\r\n } else {\r\n return 'You have no output video device';\r\n }\r\n } catch (e) {\r\n return e;\r\n }\r\n }\r\n}\r\n\r\n\r\nexport function fileUploaderValidator(control: AbstractControl): ValidationErrors | null {\r\n // Implement your validation logic here\r\n const file: FileUploadInputValueInterface= control.value;\r\n\r\n // Example validation: Check if file is provided\r\n if (!file || !file.base64) {\r\n return { requiredFile: 'You must upload a file.' };\r\n }\r\n\r\n // Add more validation logic as needed\r\n // ...\r\n\r\n return null; // Return null if no validation errors\r\n}","import { Component, ElementRef, Input, Optional, Self, ViewChild } from '@angular/core';\r\nimport {\r\n NgControl,\r\n} from '@angular/forms';\r\nimport { setupDevices } from '../../../file-upload-input-element/core/file-uploader/camera-functions';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\n\r\nimport _ from 'lodash';\r\nimport { FileUploadInputValueInterface, ITowerStepColumn } from \"ngx-t-forms-types\";\r\n\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';;\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'app-camera-capture',\r\n nextId: 0\r\n}\r\n@Component({\r\n selector: 'app-camera-capture',\r\n templateUrl: './camera-capture.component.html',\r\n styleUrls: ['./camera-capture.component.scss'],\r\n standalone: true,\r\n imports: [CommonModule, MatModulesModule],\r\n\r\n providers: [{\r\n provide: MatFormFieldControl,\r\n useExisting: CameraCaptureComponent\r\n }]\r\n\r\n})\r\nexport class CameraCaptureComponent extends BaseCustomInput<FileUploadInputValueInterface | object | null> {\r\n constructor(\r\n @Optional() @Self() ngControl: NgControl,\r\n elementRef: ElementRef<HTMLElement>\r\n ) {\r\n super(ngControl, elementRef, customInputConfig);\r\n }\r\n //Emit on the stateChanges stream when something happens in the form field control that may require the form field to run change detection.\r\n\r\n @ViewChild('video')\r\n public video!: ElementRef;\r\n\r\n @ViewChild('canvas')\r\n public canvas!: ElementRef;\r\n\r\n @Input() inputConfig!: ITowerStepColumn;\r\n\r\n get empty() {\r\n return !this.value\r\n }\r\n\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n WIDTH = 640;\r\n HEIGHT = 480;\r\n captures: string[] = [];\r\n isCaptured!: boolean;\r\n\r\n ngOnInit() {\r\n }\r\n recapture() {\r\n this.video.nativeElement.srcObject = undefined;\r\n this.isCaptured = false;\r\n setupDevices(this.setup);\r\n this.value = null;\r\n this.stateChanges.next();\r\n }\r\n setup = (stream: MediaStream): any => {\r\n try {\r\n this.video.nativeElement.srcObject = stream;\r\n this.video.nativeElement.play()\r\n\r\n } catch {\r\n }\r\n };\r\n touch(event: any) {\r\n this.markAsTouched();\r\n }\r\n videoMode: boolean = false;\r\n capture() {\r\n this.touch('df');\r\n this.drawImageToCanvas(this.video.nativeElement);\r\n const inp: any = this.inputConfig\r\n const fileType = (inp).fileType;\r\n this.value = {\r\n fileName: new Date(),\r\n type: fileType,\r\n base64: this.canvas.nativeElement.toDataURL('image/png'),\r\n };\r\n\r\n this.captures.push(this.canvas.nativeElement.toDataURL('image/png'));\r\n this.isCaptured = true;\r\n this.stopVideo();\r\n this.onChange(this.value);\r\n this.stateChanges.next();\r\n }\r\n\r\n stopVideo() {\r\n if (this.video.nativeElement.srcObject) {\r\n const tracks = this.video.nativeElement.srcObject.getTracks();\r\n tracks.forEach((track: { stop: () => any }) => track.stop());\r\n }\r\n\r\n }\r\n drawImageToCanvas(image: any) {\r\n this.canvas.nativeElement\r\n .getContext('2d')\r\n .drawImage(image, 0, 0, this.WIDTH, this.HEIGHT);\r\n }\r\n}\r\n\r\n","<br>\r\n<div class=\"video-container\">\r\n <video\r\n style=\"margin: auto;\"\r\n [style.display]=\"!isCaptured ? 'block' : 'none'\"\r\n #video\r\n id=\"video\"\r\n [width]=\"WIDTH\"\r\n [height]=\"HEIGHT\"\r\n autoplay\r\n ></video>\r\n <canvas\r\n [style.display]=\"isCaptured ? 'block' : 'none'\"\r\n #canvas\r\n id=\"canvas\"\r\n [width]=\"WIDTH\"\r\n [height]=\"HEIGHT\"\r\n ></canvas>\r\n</div>\r\n<mat-toolbar style=\"background: none;\">\r\n <span class=\"spacer\"></span>\r\n <button (click)=\"isCaptured ? recapture() : capture()\" [color]=\"isCaptured?'primary':'warn'\" mat-icon-button>\r\n <mat-icon>\r\n photo_camera\r\n </mat-icon>\r\n\r\n </button>\r\n <button (click)=\"stopVideo()\" *ngIf=\"!isCaptured\" mat-icon-button>\r\n <mat-icon>\r\n stop\r\n </mat-icon>\r\n\r\n </button>\r\n <span class=\"spacer\"></span>\r\n</mat-toolbar>\r\n\r\n\r\n\r\n\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, } from '@angular/core';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { CameraCaptureComponent } from './core/camera-capture/camera-capture.component';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\n\r\n@Component({\r\n selector: 'lib-image-capture-input-element',\r\n standalone: true,\r\n imports: [CommonModule,MatModulesModule,\r\n TFormInputStatusComponent,CameraCaptureComponent,ReactiveFormsModule],\r\n templateUrl: './image-capture-input-element.component.html',\r\n styleUrl: './image-capture-input-element.component.css'\r\n})\r\nexport class ImageCaptureInputElementComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n \r\n \r\n @Output() reload = new EventEmitter<void>();\r\n\r\n get errorMessage(){\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n}\r\n","\r\n\r\n<ng-container [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\" *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{inputConfig.label }} \r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n \r\n <app-camera-capture\r\n [required]=\"this.inputConfig.required\"\r\n [inputConfig]=\"inputConfig\"\r\n [formControlName]=\"inputConfig.id\"\r\n \r\n ></app-camera-capture> \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) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</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 <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n\r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\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 </ng-container>\r\n\r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n\r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n\r\n\r\n </mat-form-field>\r\n</ng-container>\r\n","import { inject, Injectable } from '@angular/core';\nimport { Observable, of, throwError } from 'rxjs';\nimport { catchError, map, take } from 'rxjs/operators';\nimport {\n APIDataFetchingConfigurationInterface,\n DataSources,\n IStoreFunctions,\n MongoDbPipeLineConfigInterface\n} from 'ngx-t-forms-types';\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../injection-tokens';\n\n/** Sort map: key -> 1 (asc) | -1 (desc) */\nexport type DocumentSortMap = Record<string, 1 | -1>;\n\n/** Default sort when none provided: updatedAt descending. */\nexport const DEFAULT_SORT: DocumentSortMap = { updatedAt: -1 };\n\nexport interface DocumentLoaderParams {\n sourceType: DataSources | 'default';\n documentsSource: APIDataFetchingConfigurationInterface | MongoDbPipeLineConfigInterface | undefined;\n workflowId: string;\n parentFormValue: Record<string, any>;\n formBuilder: IStoreFunctions;\n /** Pagination params for all sources. Required for server-side pagination. */\n page?: number;\n itemsPerPage?: number;\n sort?: DocumentSortMap;\n searchKey?: string;\n /** Filter object: key is dot-joined path (from primaryIdentifierKey) or '_id'; value is the filter value. */\n filter?: Record<string, unknown>;\n}\n\nexport interface DocumentFooterConfig {\n totalPages: number;\n totalItems: number;\n itemsPerPage: number;\n currentPage?: number;\n /** When present and non-empty, server maintains sort; otherwise use local sort. */\n sortBy?: DocumentSortMap;\n}\n\nexport interface LoadDocumentsResult {\n documents: Record<string, any>[];\n footerConfig?: DocumentFooterConfig;\n error?: string;\n}\n\n/**\n * Abstracts document fetching from different data sources (API, MongoDB, default).\n * For default source with getWorkflowDocuments, supports server-side pagination, sort, and search\n * (aligned with getTransactionsWithSchema / getWorkflowDocuments).\n */\n@Injectable({ providedIn: 'root' })\nexport class DocumentLoaderService {\n private readonly formsConfig = inject(NGX_T_FORMS_CONFIG_TOKEN, { optional: true });\n\n loadDocuments(params: DocumentLoaderParams): Observable<LoadDocumentsResult> {\n const { sourceType, documentsSource, workflowId } = params;\n\n if (sourceType === DataSources.Api && documentsSource) {\n return this.loadFromApi(params);\n }\n if (sourceType === DataSources.MongoDb && documentsSource) {\n return this.loadFromMongoDb(params);\n }\n if (sourceType === 'default') {\n return this.loadFromDefault(workflowId, params);\n }\n\n return of({ documents: [] });\n }\n\n /**\n * Normalizes API/MongoDB/default responses to LoadDocumentsResult.\n * Extracts documents from formValues, documents, results, or raw array.\n * Validates footerConfig. Returns empty documents + error on malformed response.\n */\n private normalizeToLoadDocumentsResult(response: unknown): LoadDocumentsResult {\n if (response == null) {\n return { documents: [] };\n }\n const res = response as Record<string, unknown>;\n const rawDocs: unknown = res['formValues'] ?? res['documents'] ?? res['results'] ?? (Array.isArray(response) ? response : undefined);\n if (!Array.isArray(rawDocs)) {\n return {\n documents: [],\n error: 'Invalid response format: expected formValues, documents, or results array',\n };\n }\n const documents = this.flattenListDocuments(rawDocs as Record<string, any>[]);\n const footerConfig = this.validateFooterConfig(res['footerConfig']);\n return { documents, footerConfig };\n }\n\n private validateFooterConfig(fc: unknown): DocumentFooterConfig | undefined {\n if (!fc || typeof fc !== 'object') return undefined;\n const o = fc as Record<string, unknown>;\n const totalPages = o['totalPages'] as number;\n const totalItems = o['totalItems'] as number;\n const itemsPerPage = o['itemsPerPage'] as number;\n if (typeof totalPages !== 'number' || typeof totalItems !== 'number' || typeof itemsPerPage !== 'number') {\n return undefined;\n }\n return {\n totalPages,\n totalItems,\n itemsPerPage,\n currentPage: typeof o['currentPage'] === 'number' ? (o['currentPage'] as number) : undefined,\n sortBy: (o['sortBy'] && typeof o['sortBy'] === 'object')\n ? (o['sortBy'] as DocumentSortMap)\n : undefined,\n };\n }\n\n private loadFromApi(params: DocumentLoaderParams): Observable<LoadDocumentsResult> {\n const { documentsSource, workflowId, parentFormValue, formBuilder } = params;\n const config = documentsSource as APIDataFetchingConfigurationInterface;\n const missingInputs: string[] = [];\n const postData = (config.backEndConfig?.minimumInputRequired ?? []).reduce((acc, curr) => {\n if (curr.type === 'default') {\n acc[curr.name] = curr.defaultValue;\n return acc;\n }\n if (curr.type === 'mapto' && parentFormValue[curr.name] !== undefined) {\n acc[curr.name] = parentFormValue[curr.name];\n return acc;\n }\n missingInputs.push(curr.name);\n return acc;\n }, {} as Record<string, any>);\n postData['workflowId'] = workflowId;\n postData['page'] = params.page ?? 1;\n postData['itemsPerPage'] = params.itemsPerPage ?? 10;\n postData['sort'] = (params.sort && Object.keys(params.sort).length > 0) ? params.sort : DEFAULT_SORT;\n postData['searchKey'] = params.searchKey;\n if (params.filter && Object.keys(params.filter).length > 0) {\n postData['filter'] = params.filter;\n }\n\n if (missingInputs.length > 0) {\n return throwError(() => new Error(`Missing inputs: ${missingInputs.join(', ')}`));\n }\n\n return formBuilder.httpPostDataFunction(config.httpEndPoint, postData).pipe(\n take(1),\n map((response) => this.normalizeToLoadDocumentsResult(response)),\n catchError((err) => {\n const msg = err?.error?.message ?? (err instanceof Error ? err.message : 'Unknown error');\n return of({ documents: [], error: msg });\n })\n );\n }\n\n private loadFromMongoDb(params: DocumentLoaderParams): Observable<LoadDocumentsResult> {\n const { documentsSource, formBuilder } = params;\n const config = documentsSource as MongoDbPipeLineConfigInterface;\n if (!config.pipeline || config.pipeline.length === 0) {\n return throwError(() => new Error('No pipeline found'));\n }\n if (!config.workflowId) {\n return throwError(() => new Error('No workflow id found'));\n }\n\n const paginationParams = {\n page: params.page ?? 1,\n itemsPerPage: params.itemsPerPage ?? 10,\n sort: (params.sort && Object.keys(params.sort).length > 0) ? params.sort : DEFAULT_SORT,\n searchKey: params.searchKey,\n ...(params.filter && Object.keys(params.filter).length > 0 ? { filter: params.filter } : {}),\n };\n const runPipeline = formBuilder.runMongoDbPipeLine as (p: unknown[], w: string, opts?: unknown) => Observable<unknown>;\n return runPipeline(config.pipeline, config.workflowId, paginationParams).pipe(\n take(1),\n map((data) => this.normalizeToLoadDocumentsResult(data)),\n catchError((err) => {\n const msg = err?.error?.message ?? (err instanceof Error ? err.message : 'Unknown error');\n return of({ documents: [], error: msg });\n })\n );\n }\n\n private loadFromDefault(\n workflowId: string,\n params: DocumentLoaderParams\n ): Observable<LoadDocumentsResult> {\n // Prefer formBuilder from params; fallback to injected config when params.formBuilder\n // lacks getWorkflowDocuments (e.g. form builder preview, test-app, or partial config)\n const getWorkflowDocuments =\n this.formsConfig?.formBuilder?.getWorkflowDocuments;\n\n \n if (typeof getWorkflowDocuments !== 'function') {\n\n return of({ documents: [] });\n }\n const page = params.page ?? 1;\n const itemsPerPage = params.itemsPerPage ?? 10;\n const sort = (params.sort && Object.keys(params.sort).length > 0) ? params.sort : DEFAULT_SORT;\n const searchKey = params.searchKey;\n const filter = params.filter;\n return getWorkflowDocuments(workflowId, page, itemsPerPage, sort, searchKey, filter).pipe(\n take(1),\n map((res) => this.normalizeToLoadDocumentsResult(res))\n );\n }\n\n /**\n * Flatten WorkFlowDocumentInterface list rows so form fields are at top level.\n * Matches getSelectedDocument structure so row[col.formControlName] works for all columns.\n * Attaches _originalDoc so primaryIdentifierKey can resolve against the original nested structure\n * (e.g. { _id, reference, form: { customId } }) when the flattened row has form keys at top level.\n */\n private flattenListDocuments(docs: Record<string, any>[]): Record<string, any>[] {\n return docs.map((doc) => {\n const form = doc['form'];\n if (!form || typeof form !== 'object') return { ...doc, _originalDoc: doc };\n const { form: _f, ...rest } = doc;\n return { ...rest, ...form, _originalDoc: doc };\n });\n }\n}\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 transform(\r\n value: any,\r\n dataType: DocumentLitsLabelConfigInterfaceValueType | InputDataTypes | undefined |InputPipeTypes ,\r\n pipeConfig?: FormColumnInputs['pipe'] | undefined\r\n ): any {\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, '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(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(value);\r\n return currencyPipeForNumberType.transform(numberValueForNumber, currencyCode);\r\n } else {\r\n return value;\r\n }\r\n case InputDataTypes.Array:\r\n return value.length + ' 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)) / 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: any = {\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]);\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 default:\r\n return value;\r\n }\r\n } catch {\r\n return value; // Return original value in case of an error\r\n }\r\n }\r\n}","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n Input,\n Optional,\n Self,\n ViewChild,\n} from '@angular/core';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\nimport { DataSources, FormBuilderFunctions, FormColumnInputs } from 'ngx-t-forms-types';\nimport {\n DEFAULT_SORT,\n DocumentFooterConfig,\n DocumentLoaderParams,\n DocumentLoaderService,\n DocumentSortMap,\n} from '../../document-loader.service';\nimport { FormControl, FormGroup, NgControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\nimport { DocumentLitsLabelConfigInterfaceValueType, IWorkflowDocumentPickerConfig, IWorkflowDocListCols, TreeNode } from 'ngx-t-forms-types';\nimport { catchError, debounceTime, distinctUntilChanged, finalize, map, of, take, takeUntil, tap } from 'rxjs';\nimport { FormatDataPipe } from '../../../../../../shared/pipes/format-Data.pipe';\nimport { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSort, MatSortModule } from '@angular/material/sort';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatDividerModule } from '@angular/material/divider';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { returnMappedPathValue } from '../../../../../../services/core/t-form-section-controller/Functions/getValueFromPathMap';\n\nconst customInputConfig: BaseCustomInputConfig = {\n controlType: 'lib-document-picker-reactive-input',\n nextId: 0,\n};\n\n/**\n * Document Picker: Link workflow transactions via search, sort, and selection.\n *\n * User Story: As a Process Coordinator, I want to search, sort, and select specific workflow\n * transactions from a paginated list, so that I can accurately link related records.\n *\n * AC1 Dynamic loading: Reloads when workflowId/inputConfig changes.\n * AC2 Search: Refreshes list and resets to page 1 on keyword change; restores full list when cleared.\n * AC3 Sort/Pagination: Sort resets to page 1; pagination fetches subset while preserving search/sort.\n * AC4 Selection: Selected transaction shown clearly; deselect restores paginated view.\n * AC5 Empty/Error: \"No transactions found\" when empty; error state with retry option.\n */\n@Component({\n selector: 'lib-document-picker-reactive-input',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatCardModule,\n MatIconModule,\n MatProgressSpinnerModule,\n MatFormFieldModule,\n MatInputModule,\n MatButtonModule,\n MatTooltipModule,\n MatTableModule,\n MatSortModule,\n MatPaginatorModule,\n MatDividerModule,\n MatCheckboxModule,\n MatRadioModule,\n FormatDataPipe,\n ],\n templateUrl: './document-picker-reactive-input.component.html',\n styleUrl: './document-picker-reactive-input.component.css',\n host: {\n '[class.floating]': 'shouldLabelFloat',\n '[id]': 'id',\n },\n providers: [{ provide: MatFormFieldControl, useExisting: DocumentPickerReactiveInputComponent }],\n})\nexport class DocumentPickerReactiveInputComponent extends BaseCustomInput<unknown | unknown[]> implements AfterViewInit {\n private readonly formsConfig = inject(NGX_T_FORMS_CONFIG_TOKEN);\n private readonly documentLoader = inject(DocumentLoaderService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n readonly searchFormControl = new FormControl('');\n readonly dataSource = new MatTableDataSource<Record<string, any>>([]);\n\n @ViewChild(MatSort) sort!: MatSort;\n @ViewChild(MatPaginator) paginator!: MatPaginator;\n\n @Input() formBuilderFunctions: FormBuilderFunctions | undefined;\n @Input() searchPlaceholder = 'Search transactions…';\n @Input() emptyMessage = 'No transactions found';\n\n private _inputConfig: FormColumnInputs | undefined;\n @Input() set inputConfig(value: FormColumnInputs | undefined) {\n if (_isEqual(this._inputConfig, value)) return;\n this._inputConfig = value;\n this.loadCols();\n }\n get inputConfig(): FormColumnInputs | undefined {\n return this._inputConfig;\n }\n\n get isMultiSelect(): boolean {\n return this.inputConfig?.allowMultipleSelection === true;\n }\n\n get primaryIdentifierKey(): TreeNode[] | string | undefined {\n return this.inputConfig?.workflowPickerConfig?.primaryIdentifierKey;\n }\n\n /**\n * Returns the row identifier. Uses returnMappedPathValue when primaryIdentifierKey is set,\n * resolving against the original document (row._originalDoc) for nested paths like form.customId,\n * since the table row is flattened. Fallback: _id or id.\n */\n getRowId(row: Record<string, any>): unknown {\n const pk = this.primaryIdentifierKey;\n if (pk != null && pk !== '') {\n const doc = row['_originalDoc'] ?? row;\n return returnMappedPathValue(pk as TreeNode[], doc);\n }\n return row['_id'] ?? row['id'];\n }\n\n /**\n * Builds a filter object for the selected value.\n * Key: dot-joined path from primaryIdentifierKey (e.g. form.customId) or '_id' when not set.\n * Value: the current value.\n */\n private buildFilterForValue(): Record<string, unknown> | undefined {\n const val = this.value;\n if (val == null || val === '') return undefined;\n const pk = this.primaryIdentifierKey;\n let filterKey = '_id';\n if (pk != null && pk !== '') {\n if (typeof pk === 'string') {\n filterKey = pk;\n } else if (Array.isArray(pk) && pk.length > 0) {\n filterKey = pk\n .map((n) => (typeof n === 'object' && n != null && (n).key != null ? String((n).key) : String(n)))\n .join('.');\n }\n }\n return { [filterKey]: val };\n }\n\n /** Builds a minimal row from an id for fallback when the row is not in documentOptions/dataSource. */\n private buildFallbackRowFromId(id: unknown): Record<string, any> {\n const pk = this.primaryIdentifierKey;\n if (!pk || !Array.isArray(pk) || pk.length === 0) {\n return { _id: id, id };\n }\n let obj: Record<string, any> = {};\n let current: Record<string, any> = obj;\n for (let i = 0; i < pk.length; i++) {\n const node = pk[i];\n const key = typeof node === 'object' && node != null && node.key != null ? String(node.key) : String(node);\n const isLast = i === pk.length - 1;\n if (isLast) {\n current[key] = id;\n } else {\n current[key] = {};\n current = current[key];\n }\n }\n return obj;\n }\n\n /** Returns selected id(s) as strings. Handles value from form/API (string, number, ObjectId, etc.). */\n getSelectedIds(): string[] {\n const v = this.value;\n if (v == null || v === '') return [];\n if (Array.isArray(v)) return v.map((x) => (x != null ? String(x) : '')).filter(Boolean);\n return [String(v)];\n }\n\n isRowSelected(row: Record<string, any>): boolean {\n const id = this.getRowId(row);\n return this.getSelectedIds().some((sid) => sid == id || String(id) === sid);\n }\n\n override get empty(): boolean {\n const n = this.value;\n if (n === null || n === undefined) return true;\n if (this.isMultiSelect) {\n return Array.isArray(n) && n.length === 0;\n }\n return n === '';\n }\n override get shouldLabelFloat(): boolean {\n return true;\n }\n\n constructor(\n @Optional() @Self() ngControl: NgControl,\n elementRef: ElementRef<HTMLElement>\n ) {\n super(ngControl, elementRef, customInputConfig);\n this.listenToStateChanges()\n this.setupFilterPredicate()\n this.setupSearchSubscription()\n }\n\n ngAfterViewInit(): void {\n this.dataSource.sort = this.sort;\n this.attachPaginatorIfNeeded();\n this.sort?.sortChange.pipe(takeUntil(this.destroy$)).subscribe((s) => {\n if (this.footerConfig && s.active && s.direction) {\n this.onSortChange(s.active, s.direction as 'asc' | 'desc');\n }\n });\n }\n\n /** Attach paginator when client-side (not server-side). Server-side uses length from footerConfig. */\n private attachPaginatorIfNeeded(): void {\n if (this.footerConfig) return; // Server-side: paginator length handled by template\n if (this.paginator && this.dataSource.paginator !== this.paginator) {\n this.dataSource.paginator = this.paginator;\n this.cdr.markForCheck();\n }\n }\n\n private setupFilterPredicate(): void {\n this.dataSource.filterPredicate = (doc: Record<string, any>, filter: string): boolean => {\n const term = filter?.trim()\n if (!term) return true\n if (typeof doc !== 'object' || doc === null) return false\n const regex = new RegExp(term.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'i')\n return Object.values(doc).some(value =>\n typeof value === 'string' && regex.test(value)\n )\n }\n }\n\n private setupSearchSubscription(): void {\n this.searchFormControl.valueChanges.pipe(\n debounceTime(400),\n map((term) => term?.trim() ?? ''),\n distinctUntilChanged((a, b) => a === b),\n takeUntil(this.destroy$)\n ).subscribe((filter) => {\n if (this.footerConfig) {\n this.serverPage = 1;\n this.loadDocumentOptions(true);\n } else {\n this.dataSource.filter = filter;\n this.dataSource.paginator?.firstPage();\n }\n });\n }\n\n get parentFormGroup(): FormGroup | null {\n return this.ngControl?.control?.parent as FormGroup;\n }\n private _pickerConfig: IWorkflowDocumentPickerConfig | undefined;\n _cols: IWorkflowDocListCols[] = [];\n _loadingCols = false;\n\n /** Documents loaded in memory. For client-side: full list; for server-side: current page only. */\n private documentOptions: Record<string, any>[] = [];\n\n /** Last loaded workflowId/sourceType - only reload when these change. */\n private lastLoadedWorkflowId: string | undefined;\n private lastLoadedSourceType: DataSources | 'default' | undefined;\n\n /** Server-side pagination (getWorkflowDocuments). When true, page/sort/search trigger API calls. */\n footerConfig: DocumentFooterConfig | undefined;\n serverPage = 1;\n serverPageSize = 5;\n serverSort: DocumentSortMap = { ...DEFAULT_SORT };\n\n loadingData = false;\n dataLoadingError: string | undefined;\n\n get displayedColumns(): string[] {\n return this._cols.map((col) => col.formControlName);\n }\n\n /** Page index for paginator: server-side uses serverPage; client-side uses paginator's current page. */\n get pageIndexForDisplay(): number {\n return this.footerConfig ? this.serverPage - 1 : (this.paginator?.pageIndex ?? 0);\n }\n\n /** Page size for paginator: server-side uses serverPageSize; client-side uses paginator's current size. */\n get pageSizeForDisplay(): number {\n return this.footerConfig ? this.serverPageSize : (this.paginator?.pageSize ?? 5);\n }\n\n /** True when server echoes sort in footerConfig; false when sortBy is empty → use local sort. */\n get serverMaintainsSort(): boolean {\n const sb = this.footerConfig?.sortBy;\n return !!(sb && typeof sb === 'object' && Object.keys(sb).length > 0);\n }\n\n /**\n * Documents load only when workflowId or documentSourceType changes.\n * Search, pagination, sorting operate client-side on already-loaded data.\n */\n private shouldLoadDocuments(forceRefresh: boolean): boolean {\n if (forceRefresh) return true;\n const pickerConfig = this.inputConfig?.workflowPickerConfig;\n \n const workflowId = pickerConfig?.workflowId ?? '';\n const sourceType = (pickerConfig?.documentSourceType as DataSources | 'default') ?? 'default';\n if (!workflowId || !sourceType) return false;\n return (\n this.lastLoadedWorkflowId !== workflowId || this.lastLoadedSourceType !== sourceType\n );\n }\n\n private listenToStateChanges(): void {\n this.stateChanges.pipe(\n takeUntil(this.destroy$),\n tap(() => {\n if (this.isMultiSelect) {\n this.dataSource.data = [...this.documentOptions];\n this.cdr.markForCheck();\n return;\n }\n const hasValue = !!this.value;\n const docIdMatches =\n this.selectedDocument != null && this.getRowId(this.selectedDocument) == this.value;\n\n if (!docIdMatches && hasValue) {\n // Use filter so the selected document appears on the first page\n this.serverPage = 1;\n this.loadDocumentOptions(true);\n } else if (!docIdMatches && !hasValue) {\n this.restoreDocumentList();\n }\n })\n ).subscribe();\n }\n\n /** Restore list view from memory (no API call). Use when value is cleared or user deselects. */\n restoreDocumentList(): void {\n this.selectedDocument = undefined;\n this.dataSource.data = [...this.documentOptions];\n this.loadingData = false;\n this.dataLoadingError = undefined;\n setTimeout(() => this.attachPaginatorIfNeeded(), 0);\n this.cdr.markForCheck();\n }\n\n private loadCols(): void {\n const newConfig = this._inputConfig?.workflowPickerConfig;\n\n if (_isEqual(this._pickerConfig, newConfig)) return;\n\n if (!newConfig?.workflowId) {\n this._pickerConfig = newConfig;\n this._cols = [];\n this.documentOptions = [];\n this.dataSource.data = [];\n this.lastLoadedWorkflowId = undefined;\n this.lastLoadedSourceType = undefined;\n this.footerConfig = undefined;\n this.serverPage = 1;\n this.serverPageSize = 10;\n this.serverSort = { ...DEFAULT_SORT };\n this.selectedDocument = undefined;\n this.dataLoadingError = undefined;\n this.cdr.markForCheck();\n return;\n }\n\n this._pickerConfig = newConfig;\n this.lastLoadedWorkflowId = undefined;\n this.lastLoadedSourceType = undefined;\n this.footerConfig = undefined;\n this.serverPage = 1;\n this._loadingCols = true;\n this.cdr.markForCheck();\n\n this.formsConfig.formBuilder.getWorkflowCols(newConfig.workflowId).pipe(\n take(1),\n tap((cols) => {\n this._cols = [\n { label: '', formControlName: 'icons' },\n { label: 'reference', formControlName: 'reference' },\n { label: 'Updated', formControlName: 'updatedAt', type: DocumentLitsLabelConfigInterfaceValueType.date },\n ...cols,\n { label: '', formControlName: 'actions' },\n ];\n this.loadDocumentOptions();\n }),\n catchError(() => {\n this._cols = [];\n return of([]);\n }),\n finalize(() => {\n this._loadingCols = false;\n this.cdr.markForCheck();\n })\n ).subscribe();\n }\n\n /**\n * Load documents only when workflowId or documentSourceType changes.\n * Called from: loadCols (config change), refreshDocuments (user refresh).\n */\n private loadDocumentOptions(forceRefresh = false): void {\n const pickerConfig = this.inputConfig?.workflowPickerConfig;\n const workflowId = pickerConfig?.workflowId ?? '';\n const sourceType = (pickerConfig?.documentSourceType as DataSources | 'default') ?? 'default';\n const newSource = pickerConfig?.documentsSource;\n if (!sourceType) return;\n if (!forceRefresh && !this.shouldLoadDocuments(false)) return;\n\n this.lastLoadedWorkflowId = workflowId;\n this.lastLoadedSourceType = sourceType;\n this.loadingData = true;\n this.dataLoadingError = undefined;\n this.cdr.markForCheck();\n\n const effectiveSort = (this.serverSort && Object.keys(this.serverSort).length > 0) ? this.serverSort : DEFAULT_SORT;\n const filter = !this.isMultiSelect && this.value ? this.buildFilterForValue() : undefined;\n const parentFormValue = {\n ...(this.parentFormGroup?.value ?? {}),\n page: this.serverPage,\n itemsPerPage: this.serverPageSize,\n sort: effectiveSort,\n searchKey: this.searchFormControl.value?.trim() || undefined,\n ...(filter ? { filter } : {}),\n };\n const params: DocumentLoaderParams = {\n sourceType,\n documentsSource: newSource,\n workflowId,\n parentFormValue,\n formBuilder: this.formsConfig.formBuilder,\n page: this.serverPage,\n itemsPerPage: this.serverPageSize,\n sort: effectiveSort,\n searchKey: this.searchFormControl.value?.trim() || undefined,\n filter,\n };\n\n this.documentLoader.loadDocuments(params).pipe(\n take(1),\n tap((result) => {\n const documents = result.documents;\n this.documentOptions = documents;\n this.footerConfig = result.footerConfig;\n this.dataLoadingError = result.error;\n if (this.isMultiSelect) {\n this.dataSource.data = [...this.documentOptions];\n setTimeout(() => this.attachPaginatorIfNeeded(), 0);\n } else if (this.value) {\n const matchingDoc = documents.find((d) => this.getRowId(d) == this.value);\n const rowFromCurrent = !matchingDoc && this.dataSource.data?.length\n ? this.dataSource.data.find((d) => this.getRowId(d) == this.value)\n : null;\n const displayDoc = matchingDoc ?? rowFromCurrent ?? this.buildFallbackRowFromId(this.value);\n this.selectedDocument = matchingDoc ?? rowFromCurrent ?? undefined;\n this.dataSource.data = [displayDoc];\n setTimeout(() => this.attachPaginatorIfNeeded(), 0);\n } else {\n this.selectedDocument = undefined;\n this.dataSource.data = [...this.documentOptions];\n setTimeout(() => this.attachPaginatorIfNeeded(), 0);\n }\n }),\n catchError((error) => {\n this.dataLoadingError =\n error?.error?.message ?? (error instanceof Error ? error.message : 'Unknown error');\n this.documentOptions = [];\n this.footerConfig = undefined;\n this.dataSource.data = [];\n return of({ documents: [] });\n }),\n finalize(() => {\n this.loadingData = false;\n this.cdr.markForCheck();\n })\n ).subscribe();\n }\n\n refreshDocuments(): void {\n this.lastLoadedWorkflowId = undefined;\n this.lastLoadedSourceType = undefined;\n this.loadDocumentOptions(true);\n }\n\n /** Server-side: handle paginator page/pageSize change. */\n onPageChange(event: { pageIndex: number; pageSize: number }): void {\n if (!this.footerConfig) return;\n this.serverPage = event.pageIndex + 1;\n this.serverPageSize = event.pageSize;\n this.loadDocumentOptions(true);\n }\n\n /** Server-side: handle sort change. */\n onSortChange(active: string, direction: 'asc' | 'desc'): void {\n if (!this.footerConfig || !active) return;\n this.serverSort = { [active]: direction === 'asc' ? 1 : -1 };\n this.serverPage = 1;\n this.loadDocumentOptions(true);\n }\n\n clearSearch() {\n this.searchFormControl.setValue('')\n }\n\n onRadioChange(event: { value: string }): void {\n const id = event?.value;\n if (id == null) return;\n const row =\n this.documentOptions.find((r) => this.getRowId(r) == id) ??\n this.dataSource.data.find((r) => this.getRowId(r) == id);\n this.selectRow(row ?? this.buildFallbackRowFromId(id));\n }\n\n /** Handle click on radio: if already selected, deselect (radios don't fire change when re-clicked). */\n onRadioClick(row: Record<string, any>, event: MouseEvent): void {\n if (this.isRowSelected(row)) {\n event.preventDefault();\n event.stopPropagation();\n this.selectRow(row);\n }\n }\n\n /** Handle click on row: toggle selection (select or deselect). Ignores clicks on buttons/controls. */\n onRowClick(row: Record<string, any>, event: MouseEvent): void {\n if (!!this.inputConfig?.disabled || !!this.inputConfig?.readonly) return;\n const target = event.target as HTMLElement;\n if (target.closest('button, [mat-icon-button], .mat-mdc-radio-button')) return;\n this.selectRow(row);\n }\n\n selectRow(row: any) {\n const id = this.getRowId(row);\n const idStr = id != null ? String(id) : undefined;\n\n if (this.isMultiSelect) {\n const ids = [...this.getSelectedIds()];\n const idx = ids.indexOf(idStr ?? '');\n if (idx >= 0) {\n ids.splice(idx, 1);\n } else if (idStr != null) {\n ids.push(idStr);\n }\n this.value = ids.length ? ids : null;\n this.onChange(this.value);\n this.onTouched();\n this.cdr.markForCheck();\n return;\n }\n\n const isDeselecting = this.isRowSelected(row);\n this.selectedDocument = undefined;\n this.value = isDeselecting ? null : (idStr ?? null);\n this.onChange(this.value);\n this.onTouched();\n\n if (isDeselecting) {\n this.serverPage = 1;\n this.loadDocumentOptions(true);\n }\n }\n selectedDocument: Record<string, any> | undefined = undefined;\n}\n","<mat-card class=\"doc-picker-card\">\n <header class=\"doc-picker-header\">\n @if (!inputConfig?.disabled && !inputConfig?.readonly && !selectedDocument && !dataLoadingError) {\n <div class=\"doc-picker-toolbar\">\n <mat-form-field subscriptSizing=\"dynamic\" class=\"doc-picker-search\">\n <input matInput [placeholder]=\"searchPlaceholder\" [formControl]=\"searchFormControl\"\n [attr.aria-label]=\"searchPlaceholder\">\n @if (searchFormControl.value) {\n <button mat-icon-button matSuffix (click)=\"clearSearch()\" type=\"button\"\n aria-label=\"Clear search\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon matSuffix>search</mat-icon>\n }\n </mat-form-field>\n @if (isMultiSelect && getSelectedIds().length > 0) {\n <span class=\"doc-picker-selection-badge\" role=\"status\" aria-live=\"polite\">\n {{ getSelectedIds().length }} selected\n </span>\n }\n </div>\n }\n </header>\n\n @if (dataLoadingError) {\n <div class=\"doc-picker-error\">\n <mat-icon color=\"warn\">error</mat-icon>\n <span class=\"doc-picker-error-text\">{{ dataLoadingError }}</span>\n @if (!inputConfig?.disabled && !inputConfig?.readonly) {\n <button mat-stroked-button color=\"warn\" (click)=\"refreshDocuments()\" class=\"doc-picker-retry\"\n aria-label=\"Retry loading documents\">\n <mat-icon>refresh</mat-icon>\n Retry\n </button>\n }\n </div>\n } @else {\n <div class=\"doc-picker-body\">\n @if (!inputConfig?.disabled && !inputConfig?.readonly && !selectedDocument) {\n <div class=\"doc-picker-helper\">\n <mat-icon class=\"doc-picker-helper-icon\" color=\"primary\">info</mat-icon>\n <span><strong>{{ isMultiSelect ? 'Link transactions' : 'Link a transaction' }}</strong> — Search or sort to find {{ isMultiSelect ? 'them' : 'one' }}, then {{ isMultiSelect ? 'check the box' : 'select the radio' }} to select {{ isMultiSelect ? 'them' : 'it' }}.</span>\n </div>\n }\n <div class=\"doc-picker-content-area\">\n @if (_loadingCols || loadingData) {\n <div class=\"doc-picker-loading doc-picker-loading-overlay\">\n <mat-spinner [diameter]=\"40\" aria-label=\"Loading documents\"></mat-spinner>\n </div>\n }\n @if (dataSource.filteredData.length === 0 && !loadingData && !_loadingCols) {\n <div class=\"doc-picker-empty\">\n <mat-icon>folder_open</mat-icon>\n <span>{{ emptyMessage }}</span>\n <button mat-stroked-button color=\"warn\" (click)=\"refreshDocuments()\" class=\"doc-picker-retry\"\n aria-label=\"Retry loading documents\">\n <mat-icon>refresh</mat-icon>\n Retry\n </button>\n </div>\n }\n @if (dataSource.filteredData.length > 0 && _cols.length > 0) {\n @if (isMultiSelect) {\n <div class=\"doc-picker-table-wrapper\">\n <table mat-table [dataSource]=\"dataSource\" class=\"doc-picker-table\" matSort matSortActive=\"updatedAt\"\n matSortDisableClear matSortDirection=\"desc\" role=\"grid\" aria-label=\"Transaction list\">\n @for (col of _cols; track col.formControlName) {\n <ng-container [matColumnDef]=\"col.formControlName\" [stickyEnd]=\"$last\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header\n [disabled]=\"col.formControlName === 'icons' || col.formControlName === 'actions'\"\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\n [class.doc-picker-col-icons]=\"col.formControlName === 'icons'\"\n [class.doc-picker-col-actions]=\"col.formControlName === 'actions'\"\n [class.doc-picker-col-text]=\"col.formControlName !== 'icons' && col.formControlName !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\n @if (col.formControlName === 'actions') {\n <button mat-icon-button (click)=\"refreshDocuments()\" class=\"doc-picker-refresh\"\n matTooltip=\"Refresh list\" matTooltipPosition=\"below\" aria-label=\"Refresh document list\">\n <mat-icon>sync</mat-icon>\n </button>\n }@else {\n {{ col.label }}\n }\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\n [class.doc-picker-col-icons]=\"col.formControlName === 'icons'\"\n [class.doc-picker-col-actions]=\"col.formControlName === 'actions'\"\n [class.doc-picker-col-text]=\"col.formControlName !== 'icons' && col.formControlName !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\n @if (col.formControlName === 'icons') {\n <mat-icon class=\"doc-picker-row-icon\">description</mat-icon>\n } @else if (col.formControlName === 'actions') {\n <mat-checkbox\n [checked]=\"isRowSelected(row)\"\n [disabled]=\"!!inputConfig?.disabled || !!inputConfig?.readonly\"\n (change)=\"selectRow(row)\"\n [matTooltip]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? 'document')\"\n matTooltipPosition=\"below\"\n [attr.aria-label]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? 'document')\">\n </mat-checkbox>\n } @else {\n <span class=\"doc-picker-cell-value doc-picker-cell-text\"\n [class.doc-picker-cell-selected]=\"isRowSelected(row)\"\n [matTooltip]=\"row[col.formControlName] | formatData:col.type\"\n matTooltipPosition=\"above\">\n {{ row[col.formControlName] | formatData:col.type }}\n </span>\n }\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row class=\"doc-picker-row\" *matRowDef=\"let row; columns: displayedColumns;\"\n [class.doc-picker-row-selected]=\"isRowSelected(row)\"\n [attr.aria-label]=\"'Row: ' + (row['reference'] ?? 'document')\"\n [attr.aria-selected]=\"isRowSelected(row)\"></tr>\n </table>\n </div>\n } @else {\n <mat-radio-group [value]=\"value\" (change)=\"onRadioChange($event)\" class=\"doc-picker-radio-group\">\n <div class=\"doc-picker-table-wrapper\">\n <table mat-table [dataSource]=\"dataSource\" class=\"doc-picker-table\" matSort matSortActive=\"updatedAt\"\n matSortDisableClear matSortDirection=\"desc\" role=\"grid\" aria-label=\"Transaction list\">\n @for (col of _cols; track col.formControlName) {\n <ng-container [matColumnDef]=\"col.formControlName\" [stickyEnd]=\"$last\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header\n [disabled]=\"col.formControlName === 'icons' || col.formControlName === 'actions'\"\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\n [class.doc-picker-col-icons]=\"col.formControlName === 'icons'\"\n [class.doc-picker-col-actions]=\"col.formControlName === 'actions'\"\n [class.doc-picker-col-text]=\"col.formControlName !== 'icons' && col.formControlName !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\n \n\n @if (col.formControlName === 'actions') {\n <button mat-icon-button (click)=\"refreshDocuments()\" class=\"doc-picker-refresh\"\n matTooltip=\"Refresh list\" matTooltipPosition=\"below\" aria-label=\"Refresh document list\">\n <mat-icon>sync</mat-icon>\n </button>\n }@else {\n {{ col.label }}\n }\n \n </th>\n <td mat-cell *matCellDef=\"let row\"\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\n [class.doc-picker-col-icons]=\"col.formControlName === 'icons'\"\n [class.doc-picker-col-actions]=\"col.formControlName === 'actions'\"\n [class.doc-picker-col-text]=\"col.formControlName !== 'icons' && col.formControlName !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\n @if (col.formControlName === 'icons') {\n <mat-icon class=\"doc-picker-row-icon\">description</mat-icon>\n } @else if (col.formControlName === 'actions') {\n <mat-radio-button\n [value]=\"getRowId(row)\"\n [disabled]=\"!!inputConfig?.disabled || !!inputConfig?.readonly\"\n (click)=\"onRadioClick(row, $event)\"\n [matTooltip]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? 'document')\"\n matTooltipPosition=\"below\"\n [attr.aria-label]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? 'document')\">\n </mat-radio-button>\n } @else {\n <span class=\"doc-picker-cell-value doc-picker-cell-text\"\n [class.doc-picker-cell-selected]=\"isRowSelected(row)\"\n [matTooltip]=\"row[col.formControlName] | formatData:col.type\"\n matTooltipPosition=\"above\">\n {{ row[col.formControlName] | formatData:col.type }}\n </span>\n }\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row class=\"doc-picker-row\" *matRowDef=\"let row; columns: displayedColumns;\"\n [class.doc-picker-row-selected]=\"isRowSelected(row)\"\n [attr.aria-label]=\"'Row: ' + (row['reference'] ?? 'document')\"\n [attr.aria-selected]=\"isRowSelected(row)\"\n (click)=\"onRowClick(row, $event)\"></tr>\n </table>\n </div>\n </mat-radio-group>\n }\n }\n </div>\n </div>\n @if (!inputConfig?.disabled && !inputConfig?.readonly && !selectedDocument) {\n <mat-paginator [pageSizeOptions]=\"[5, 10, 25, 50]\"\n [pageSize]=\"pageSizeForDisplay\"\n [length]=\"footerConfig ? footerConfig.totalItems : dataSource.filteredData.length\"\n [pageIndex]=\"pageIndexForDisplay\"\n (page)=\"onPageChange($event)\"\n showFirstLastButtons\n aria-label=\"Transaction list pagination\" class=\"doc-picker-paginator\"></mat-paginator>\n }\n }\n</mat-card>\n\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\nimport { FormBuilderFunctions, ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { DocumentPickerReactiveInputComponent } from './core/document-picker-reactive-input/document-picker-reactive-input.component';\r\n\r\n@Component({\r\n selector: 'lib-document-picker',\r\n imports: [CommonModule, ReactiveFormsModule, DocumentPickerReactiveInputComponent, TFormInputStatusComponent,\r\n MatModulesModule],\r\n templateUrl: './document-picker.component.html',\r\n styleUrl: './document-picker.component.css'\r\n})\r\nexport class DocumentPickerComponent {\r\n @Input() inputConfig!: ITowerStepColumn;\r\n @Input() formGroup!: FormGroup;\r\n @Input() editorMode: boolean = false;\r\n @Input() formBuilderFunctions: FormBuilderFunctions | undefined\r\n\r\n @Output() reload = new EventEmitter<void>();\r\n\r\n\r\n get errorMessage() {\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n\r\n}\r\n","<form [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\"\r\n *ngIf=\"this.inputConfig as classInput\">\r\n <mat-label>\r\n {{this.inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n\r\n\r\n <lib-document-picker-reactive-input [disabled]=\"!!this.inputConfig.disabled\" [inputConfig]=\"inputConfig\"\r\n [formBuilderFunctions]=\"formBuilderFunctions\" [required]=\"this.inputConfig.required\"\r\n [formControlName]=\"this.inputConfig.id\">\r\n\r\n </lib-document-picker-reactive-input>\r\n\r\n @if(inputConfig.hintLabel || classInput.temporaryHint ){\r\n <mat-hint class=\"inputHint\">\r\n {{ classInput.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 <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n @if(inputConfig?.canReload?.canReload){\r\n <button mat-icon-button style=\"margin-right: 4px;\" matTooltip=\"Click to refresh this field.\"\r\n class=\"input-sync-button\" (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 <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\r\n <!-- <button *ngIf=\"inputConfig.id === 'password'\" (click)=\"classInput.togglePasswordVisibility()\"\r\n mat-icon-button matSuffix>\r\n <mat-icon>{{ classInput.showPassword ? 'remove_red_eye' : 'eye_off' }}</mat-icon>\r\n </button> -->\r\n </ng-container>\r\n\r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n\r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n\r\n\r\n\r\n </mat-form-field>\r\n</form>","import { DefaultInputConfig } from \"ngx-t-forms-types\"\r\nimport { ElementTypes } from \"ngx-t-forms-types\"\r\n\r\nexport function getInputIllustration(element:ElementTypes): string {\r\n const dc= DefaultInputConfig\r\n return dc[element]?.illustration\r\n }","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, inject, Input, Output } from '@angular/core';\r\nimport { ReactiveFormsModule, FormsModule, } from '@angular/forms';\r\n\r\nimport { take, tap } from 'rxjs';\r\nimport { FormColumnInputs, ITowerStepColumn, WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\nimport { getInputIllustration } from '../../../../../../shared/functions/getInputIllustration';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { MatSelectChange } from '@angular/material/select';\r\n\r\n\r\n@Component({\r\n selector: 'app-points-creation',\r\n templateUrl: './points-creation.component.html',\r\n styleUrls: ['./points-creation.component.scss'],\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatModulesModule,\r\n ReactiveFormsModule,\r\n FormsModule\r\n ]\r\n})\r\nexport class PointsCreationComponent {\r\n\r\n NGX_T_FORMS_CONFIG = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n _inputConfig: ITowerStepColumn | undefined = undefined;\r\n pointRow: WorkflowAdjudicationScoreSheetValue = this.createDefaultPointRow();\r\n \r\n cols: string[] = [];\r\n selectAllWorkflowInputs: FormColumnInputs[] = [];\r\n _points: WorkflowAdjudicationScoreSheetValue[] = [];\r\n @Output() pointsChange = new EventEmitter<WorkflowAdjudicationScoreSheetValue[]>();\r\n @Input() set value(value: any) {\r\n this._points = (value || []) as WorkflowAdjudicationScoreSheetValue[];\r\n // Reset the point row to default when the value is set\r\n }\r\n @Input() set inputConfig(value: ITowerStepColumn | undefined) {\r\n this._inputConfig = value;\r\n let cols \r\n if ((this.inputConfig?.adjudicationPointTypes?.length || 0) > 0) {\r\n cols = ['description', 'totalPoints', 'pointType', 'actions'];\r\n } else {\r\n cols = ['description', 'totalPoints', 'actions'];\r\n }\r\n if(this.inputConfig?.disabled || !!this.inputConfig?.readonly) {\r\n cols = cols.filter(col => col !== 'actions'); // Remove pointType if disabled or readonly\r\n }\r\n this.cols = cols;\r\n\r\n }\r\n get inputConfig(): ITowerStepColumn | undefined {\r\n return this._inputConfig;\r\n }\r\n\r\n constructor() {\r\n this.NGX_T_FORMS_CONFIG.formBuilder.getCurrentFormAvailableInputOptions().pipe(\r\n take(1),\r\n tap((inputs: FormColumnInputs[]) => {\r\n this.selectAllWorkflowInputs = inputs;\r\n })\r\n ).subscribe();\r\n }\r\n\r\n get points(): WorkflowAdjudicationScoreSheetValue[] {\r\n // The data source for the table is always the saved points plus the current edit/add row\r\n if(this._inputConfig?.disabled || !!this._inputConfig?.readonly) {\r\n return this._points;\r\n }\r\n return [...this._points, this.pointRow];\r\n }\r\n\r\n set points(value: WorkflowAdjudicationScoreSheetValue[]) {\r\n // Used to set the points from an external source\r\n this._points = value;\r\n }\r\n \r\n get filteredInputs(): FormColumnInputs[] {\r\n const description = this.pointRow.description?.toLowerCase() || '';\r\n if (!description) {\r\n return this.selectAllWorkflowInputs;\r\n }\r\n \r\n // Using a regex for robust matching\r\n const regex = new RegExp(description.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), 'i');\r\n return this.selectAllWorkflowInputs.filter((input: FormColumnInputs) => \r\n (typeof input.label === 'string' && regex.test(input.label)) || \r\n (typeof input.hintLabel === 'string' && regex.test(input.hintLabel))\r\n );\r\n }\r\n\r\n get pointInEditIsValid(): boolean {\r\n const typeRequired = (this.inputConfig?.adjudicationPointTypes?.length || 0) > 0;\r\n return !!this.pointRow.description && this.pointRow.totalPoints > 0 && (!typeRequired || !!this.pointRow.pointType);\r\n }\r\n\r\n private createDefaultPointRow(): WorkflowAdjudicationScoreSheetValue {\r\n return {\r\n id: '',\r\n formControlName: '',\r\n totalPoints: 0,\r\n description: '',\r\n pointType: '',\r\n inputId: undefined,\r\n isEditRow: true\r\n };\r\n }\r\n\r\n private resetPointRow(): void {\r\n this.pointRow = this.createDefaultPointRow();\r\n }\r\n\r\n selectActiveInput(input: FormColumnInputs): void {\r\n this.pointRow = {\r\n ...this.pointRow,\r\n totalPoints: 0,\r\n description: input.label || '',\r\n id: input.id,\r\n formControlName: input.formControlName,\r\n pointType: this.pointRow.pointType || this.inputConfig?.adjudicationPointTypes[0] || '',\r\n inputId: input.id\r\n };\r\n }\r\n\r\n selectPointType(pointType: MatSelectChange): void {\r\n this.pointRow = {\r\n ...this.pointRow,\r\n pointType: pointType.value\r\n };\r\n }\r\n\r\n savePoints(): void {\r\n const pointToSave: WorkflowAdjudicationScoreSheetValue = {\r\n ...this.pointRow,\r\n id: this.pointRow.id || uuidv4(),\r\n formControlName: this.pointRow.formControlName || this.pointRow.description,\r\n isEditRow: undefined // Mark as a saved row\r\n };\r\n\r\n // Add the new or updated point to our source array\r\n this._points = [...this._points, pointToSave];\r\n\r\n // Reset the input row for the next entry\r\n this.pointsChange.emit(this._points);\r\n this.resetPointRow();\r\n\r\n }\r\n\r\n edit(element: WorkflowAdjudicationScoreSheetValue): void {\r\n // Set the selected element as the current editable row\r\n this.pointRow = {\r\n ...element,\r\n isEditRow: true,\r\n };\r\n // Remove the element from the main list so there are no duplicates while editing\r\n this._points = this._points.filter(p => p.id !== element.id);\r\n // Emit the updated points list\r\n this.pointsChange.emit(this._points);\r\n }\r\n\r\n remove(element: WorkflowAdjudicationScoreSheetValue): void {\r\n // Directly filter the source array to remove the specified element\r\n this._points = this._points.filter(p => p.id !== element.id);\r\n // Emit the updated points list\r\n this.pointsChange.emit(this._points);\r\n }\r\n\r\n getInputIllustration(input: FormColumnInputs): string {\r\n return getInputIllustration(input.element);\r\n }\r\n}","<div style=\"resize: both; overflow: auto;\">\r\n @if(!points || points.length === 1) {\r\n <h5 style=\"margin-bottom: 5px; margin-top: 0px;\">\r\n ℹ️ To add a scoring item:\r\n </h5>\r\n <ol>\r\n <li>\r\n <strong>Enter Description:</strong>\r\n <ul style=\"margin-top: 5px; margin-bottom: 5px; padding-left: 20px; list-style-type: disc;\">\r\n <li>\r\n To <strong>link</strong> a field: You <strong>must select it</strong> from the list first (you can\r\n edit it after).\r\n </li>\r\n <li>\r\n For a <strong>custom</strong> point: <strong>Ignore the list</strong> and just type your own\r\n description.\r\n </li>\r\n </ul>\r\n </li>\r\n <li>\r\n <strong>Set Details:</strong>\r\n Assign the <strong>Points</strong> and select the <strong>Point Type</strong>.\r\n </li>\r\n <li>\r\n <strong>Save:</strong>\r\n Click the <strong>\"Save\"</strong> button to add the item.\r\n </li>\r\n </ol>\r\n }\r\n <table mat-table [dataSource]=\"points\" matSort>\r\n <ng-container matColumnDef=\"description\">\r\n <th mat-header-cell *matHeaderCellDef>Description</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n @if (element.isEditRow ) {\r\n \r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"input-add\" appearance=\"outline\">\r\n <textarea [matAutocomplete]=\"auto\" [(ngModel)]=\"pointRow.description\" matInput cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"1\" placeholder=\"Enter point description\"></textarea>\r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\r\n @for (input of filteredInputs; track input.id) {\r\n <mat-option [value]=\"input.label\" (click)=\"selectActiveInput(input)\">\r\n <div style=\"display: flex;align-items: center;gap:8px\">\r\n <img height=\"24px\" width=\"24px\" [src]=\" getInputIllustration(input) \"\r\n [alt]=\"input.label\">\r\n <span>\r\n <div style=\"font-size: 0.75em;\">\r\n <strong>\r\n {{input.label}}\r\n </strong>\r\n\r\n </div>\r\n <div\r\n style=\"font-size: 0.75em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\">\r\n {{input.hintLabel || input.formControlName}}\r\n </div>\r\n </span>\r\n\r\n </div>\r\n </mat-option>\r\n }\r\n\r\n </mat-autocomplete>\r\n\r\n </mat-form-field>\r\n\r\n\r\n }@else {\r\n\r\n {{ element.description }}}\r\n\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"totalPoints\">\r\n <th mat-header-cell *matHeaderCellDef>Points</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n @if (element.isEditRow) {\r\n \r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"input-add\" appearance=\"outline\">\r\n <input matInput \r\n [(ngModel)]=\"pointRow.totalPoints\"\r\n placeholder=\"Enter points , eg 50\" type=\"number\">\r\n\r\n </mat-form-field>\r\n\r\n \r\n }@else {\r\n\r\n {{ element.totalPoints }}\r\n }\r\n\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"pointType\">\r\n <th mat-header-cell *matHeaderCellDef>Point Type</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n @if (element.isEditRow) {\r\n \r\n <mat-form-field subscriptSizing=\"dynamic\" class=\"input-add\" appearance=\"outline\">\r\n <mat-select (selectionChange)=\"selectPointType($event)\" ngDefaultControl \r\n \r\n [value]=\"pointRow.pointType\"\r\n \r\n placeholder=\"Select\">\r\n @for (type of inputConfig?.adjudicationPointTypes || []; track $index) {\r\n <mat-option [value]=\"type\">{{type}}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n \r\n }@else {\r\n\r\n {{ element.pointType }}\r\n }\r\n\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"actions\" [stickyEnd]=\"true\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span style=\"display: flex; justify-content: center;\">\r\n @if (element.isEditRow) {\r\n <button [disabled]=\"this.inputConfig?.disabled || this.inputConfig?.readonly\" matTooltip=\"Save Point in Edit\" color=\"primary\" style=\"white-space: nowrap;\r\n height: 26px;\r\n margin-bottom: 0px;\" mat-flat-button (click)=\"savePoints()\" [disabled]=\"!pointInEditIsValid\">\r\n\r\n <span style=\"font-size: 0.875em;\">\r\n save\r\n </span>\r\n\r\n\r\n </button>\r\n\r\n }@else {\r\n <button mat-icon-button (click)=\"edit(element)\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n <button mat-icon-button (click)=\"remove(element)\">\r\n <mat-icon>delete_forever</mat-icon>\r\n\r\n </button>\r\n }\r\n\r\n </span>\r\n\r\n\r\n\r\n </td>\r\n </ng-container>\r\n <tr mat-header-row *matHeaderRowDef=\"cols\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: cols\"></tr>\r\n </table>\r\n</div>","export function getColorForNumber(targetNumber: number, numbers: number[], asc = true): string {\r\n if (numbers.length === 0) {\r\n throw new Error(\"The numbers array must not be empty.\");\r\n }\r\n\r\n // Avoid sorting the original array\r\n const sortedNumbers = [...numbers].sort((a, b) => asc ? a - b : b - a);\r\n const min = sortedNumbers[0];\r\n const max = sortedNumbers[sortedNumbers.length - 1];\r\n if (!min || !max) {\r\n return \"rgb(173, 173, 173)\";\r\n }\r\n if (min === max) {\r\n return \"rgb(173, 173, 173)\"; // Return gray if there is no range\r\n }\r\n\r\n const interpolateColor = (value: number): string => {\r\n const fraction = (value - min) / (max - min);\r\n const colors = [\r\n { color: [247, 0, 0], pos: 0.0 }, // Red\r\n { color: [247, 187, 0], pos: 0.25 }, // Orange\r\n { color: [247, 247, 0], pos: 0.5 }, // Yellow\r\n { color: [207, 247, 0], pos: 0.75 }, // Light green\r\n { color: [96, 247, 0], pos: 1.0 } // Green\r\n ];\r\n\r\n for (let i = 0; i < colors.length - 1; i++) {\r\n const nextColor = colors[i + 1]\r\n const currentColor = colors[i]\r\n if (currentColor && nextColor && fraction <= nextColor.pos) {\r\n\r\n const range = nextColor.pos - currentColor.pos;\r\n const localFraction = (fraction - currentColor.pos) / range;\r\n const r = Math.round(currentColor.color[0]! + localFraction * (nextColor.color[0]! - currentColor.color[0]!));\r\n const g = Math.round(currentColor.color[1]! + localFraction * (nextColor.color[1]! - currentColor.color[1]!));\r\n const b = Math.round(currentColor.color[2]! + localFraction * (nextColor.color[2]! - currentColor.color[2]!));\r\n return `rgb(${r}, ${g}, ${b})`;\r\n }\r\n }\r\n\r\n return `rgb(${colors[colors.length - 1]?.color[0]}, ${colors[colors.length - 1]?.color[1]}, ${colors[colors.length - 1]?.color[2]},0.6)`;\r\n };\r\n\r\n return interpolateColor(targetNumber);\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Inject } from '@angular/core';\r\nimport { MatModulesModule } from '../../../../../../../../shared/modules/mat-modules.module';\r\nimport { EditorJsInputComponent } from '../../../../../editor-input-element/core/editor-js-input/editor-js-input.component';\r\nimport { ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { OutputData } from '@editorjs/editorjs';\r\n export interface SubmissionReviewDialogData {\r\n readonly: boolean; // Indicates if the dialog is read-only\r\n respondentNameKey: string; // Key for the respondent's name\r\n respondentCodeKey: string; // Key for the respondent's code\r\n activeRowNotes:OutputData | undefined\r\n row: { nameOfBidder: string, \r\n [key: string]: any, // Allows for additional properties\r\n adj_microFlow_review_notes: OutputData | undefined,\r\n adj_microFlow_assignedScore: Record<string, number> };\r\n\r\n \r\n }\r\n@Component({\r\n selector: 'lib-submission-review-dialog',\r\n imports: [CommonModule,MatModulesModule,EditorJsInputComponent],\r\n templateUrl: './submission-review-dialog.component.html',\r\n styleUrl: './submission-review-dialog.component.css'\r\n})\r\nexport class SubmissionReviewDialogComponent {\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<SubmissionReviewDialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data:SubmissionReviewDialogData){}\r\n get notesInputConfig(): ITowerStepColumn {\r\n return {\r\n id: 'adj_microFlow_review_notes',\r\n label: 'Notes',\r\n readonly: this.data.readonly,\r\n required: false,\r\n formControlName: 'adj_microFlow_review_notes',\r\n } as ITowerStepColumn\r\n }\r\n get respondentName(){\r\n return this.data.row[this.data.respondentNameKey]\r\n }\r\n changedNotes: OutputData | undefined;\r\n notesChanged(notes: OutputData | undefined): void {\r\n this.changedNotes = notes;\r\n }\r\n\r\n}\r\n","<span mat-dialog-title>\r\n Review Feedback For <span class=\"bidder-name\">{{ respondentName }}</span>\r\n</span>\r\n\r\n<div class=\"dialog-instructions\">\r\n <p>\r\n Your notes will be visible to the respondent. Provide <strong>clear, constructive feedback</strong> to\r\n guide their future submissions.\r\n </p>\r\n</div>\r\n<mat-dialog-content style=\"padding-bottom: 8px;padding-bottom: 8px\">\r\n <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%;\r\n display: absolute;\r\n left: 0;\r\n margin-bottom: 8px;\r\n margin-top: 8px;\r\n border-radius:16px;\" appearance=\"outline\">\r\n <lib-editor-js-input [value]=\"data.row['adj_microFlow_review_notes'] || data.activeRowNotes\"\r\n (valueChanged)=\"notesChanged($event)\" ngDefaultControl [inputConfig]=\"notesInputConfig\"\r\n [required]=\"this.notesInputConfig.required\">\r\n </lib-editor-js-input>\r\n <mat-hint>\r\n <strong>Tip:</strong> Use bold, lists, and tables to structure your feedback.\r\n </mat-hint>\r\n </mat-form-field>\r\n</mat-dialog-content>\r\n\r\n\r\n<mat-dialog-actions align=\"end\">\r\n <button mat-dialog-close mat-button >\r\n Cancel\r\n </button>\r\n @if( !data.readonly){\r\n <button mat-flat-button\r\n [mat-dialog-close]=\"changedNotes\"\r\n >\r\n Save Feedback\r\n </button>}\r\n</mat-dialog-actions>","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output } from '@angular/core';\r\n\r\n\r\n\r\nimport { FormsModule } from '@angular/forms';\r\nimport { RouterModule } from '@angular/router';\r\nimport { BehaviorSubject, catchError, combineLatest, map, Observable, of, shareReplay, startWith, switchMap, take, tap } from 'rxjs';\r\n\r\n\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { DaysAgoPipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens/index';\r\nimport { ITowerStepColumn, IWorkflowDocListCols, AdjResponseReviewColumnMapping, WorkflowAdjudicationMicroFlowReviewValue } from 'ngx-t-forms-types';\r\nimport { getColorForNumber } from '../../../../../../shared/functions/mapColors';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { MatSelectChange } from '@angular/material/select';\r\n\r\nimport { OutputData } from '@editorjs/editorjs';\r\nimport { SubmissionReviewDialogComponent } from './elements/submission-review-dialog/submission-review-dialog.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\n// --- TYPE DEFINITIONS FOR ROBUSTNESS ---\r\n\r\nexport interface ISubmission extends Record<string, any> {\r\n id: string;\r\n adjudicationPricePreferenceCalculationColor?: string;\r\n backgroundShades?: Record<string, string>;\r\n}\r\nexport interface tableCols extends IWorkflowDocListCols {\r\n showColor?: boolean;\r\n maxWidth?: string;\r\n}\r\ninterface IViewModel {\r\n submissions: ISubmission[];\r\n columnMapping: AdjResponseReviewColumnMapping;\r\n displayColumns?: tableCols[];\r\n displayCols: string[];\r\n loading: boolean;\r\n error?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-submission-review',\r\n templateUrl: './submission-review.component.html',\r\n styleUrls: ['./submission-review.component.scss'],\r\n standalone: true\r\n ,\r\n imports: [\r\n CommonModule,\r\n MatModulesModule,\r\n FormsModule,\r\n RouterModule,\r\n DaysAgoPipe,\r\n \r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SubmissionReviewComponent {\r\n\r\n @Input() inputConfig: ITowerStepColumn | undefined\r\n private _value: WorkflowAdjudicationMicroFlowReviewValue[] | null = [];\r\n\r\n // A stream to push updates of the review values (`this.value`)\r\n private valueChanges$ = new BehaviorSubject<WorkflowAdjudicationMicroFlowReviewValue[] | null>([]);\r\n\r\n @Input() set value(value: any) {\r\n if (_isEqual(value, this._value)) return;\r\n this._value = value as WorkflowAdjudicationMicroFlowReviewValue[] || [];\r\n // FIX: Instead of triggering a full refresh, push the new value to its own stream.\r\n this.valueChanges$.next(this._value);\r\n }\r\n get value(): WorkflowAdjudicationMicroFlowReviewValue[] | null {\r\n return this._value;\r\n }\r\n @Output() reviewChange = new EventEmitter<WorkflowAdjudicationMicroFlowReviewValue[]>();\r\n\r\n private config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n private refreshTrigger = new BehaviorSubject<void>(undefined);\r\n selected: string = '';\r\n columnMapping: AdjResponseReviewColumnMapping | undefined = undefined;\r\n submissions: ISubmission[] = [];\r\n\r\n private readonly initialState: IViewModel = {\r\n loading: true,\r\n submissions: [],\r\n columnMapping: {} as any,\r\n displayCols: [],\r\n displayColumns: [],\r\n error: undefined,\r\n };\r\n\r\n // Stream for the initial data fetch. Only re-runs when `refreshTrigger` is fired.\r\n private readonly fetchedData$ = this.refreshTrigger.pipe(\r\n switchMap(() => this.config.formBuilder.getCurrentStepMicroflowSubmissions().pipe(take(1))),\r\n shareReplay(1)\r\n );\r\n\r\n /**\r\n * REFACTORED: The new vm$ combines the one-time fetched data with the ongoing stream\r\n * of local review changes (`valueChanges$`). This prevents re-fetching from the server\r\n * every time a status or note is changed.\r\n */\r\n readonly vm$: Observable<IViewModel> = combineLatest([\r\n this.fetchedData$,\r\n this.valueChanges$\r\n ]).pipe(\r\n map(([res, reviewValues]) => {\r\n const { submissions, columnMapping } = res;\r\n\r\n this.columnMapping = columnMapping;\r\n this.submissions = submissions;\r\n // FIX: Pass reviewValues as an argument to make the function pure.\r\n\r\n const enrichedSubmissions = this.enrichSubmissionsData(submissions, columnMapping, reviewValues) || this._value || [];\r\n const calcKey = columnMapping.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation';\r\n const sortedSubmissions = [...enrichedSubmissions].sort((a, b) => Number(b[calcKey]) - Number(a[calcKey]));\r\n const newVm: IViewModel = {\r\n loading: false, \r\n submissions: sortedSubmissions || this._value,\r\n columnMapping: columnMapping,\r\n displayCols: [columnMapping.respondentNameKey, 'adjudicationPricePreferenceCalculation', 'status', 'actions'],\r\n displayColumns: [\r\n { label: 'name', formControlName: columnMapping.respondentNameKey, type: 'string' as any },\r\n { label: 'Preference', formControlName: 'adjudicationPricePreferenceCalculation', type: 'number' as any, showColor: true },\r\n { label: 'Actions', formControlName: 'actions', type: 'string' },\r\n { label: 'status and Notes', formControlName: 'status', type: 'actions' },\r\n ],\r\n error: undefined,\r\n };\r\n \r\n return newVm;\r\n }),\r\n startWith(this.initialState),\r\n catchError(() => {\r\n return of({ ...this.initialState, loading: false, error: 'Failed to load submissions.' });\r\n }),\r\n shareReplay(1)\r\n );\r\n\r\n loadMicroSubmissions(): void {\r\n this.refreshTrigger.next();\r\n }\r\n\r\n /**\r\n * REFACTORED: Now accepts `reviewValues` as a parameter instead of relying on `this.value`.\r\n */\r\n private enrichSubmissionsData(\r\n submissions: ISubmission[],\r\n cols: AdjResponseReviewColumnMapping,\r\n reviewValues: WorkflowAdjudicationMicroFlowReviewValue[] | null\r\n ): ISubmission[] {\r\n const numberSets = new Map<string, number[]>();\r\n numberSets.set(\r\n cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation',\r\n submissions.map((s) => Number(s[cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'] || 0))\r\n );\r\n const list:any = submissions.length > 0 ? submissions : this._value || [];\r\n return list.map((submission:any) => {\r\n const priceCalcKey = cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation';\r\n const numbers = numberSets.get(priceCalcKey) || [];\r\n const color = numbers.length === 0 ? submission.adjudicationPricePreferenceCalculationColor: this.getColorString(submission[priceCalcKey], numbers);\r\n const backgroundShades =numbers.length === 0? submission['backgroundShades'] : { [priceCalcKey]:this.getScoreShade(color) }\r\n // Use the passed `reviewValues` argument\r\n const submissionReview = reviewValues?.find((v) => v.id === submission.id) || {} as any;\r\n \r\n return {\r\n ...submission,\r\n submissionIsReviewed: !!submissionReview,\r\n adj_microFlow_review_notes: submissionReview?.adj_microFlow_review_notes || '',\r\n submissionHasReviewNotes: !!submissionReview?.adj_microFlow_review_notes,\r\n adj_microFlow_review: submissionReview?.['adj_microFlow_review'],\r\n adjudicationPricePreferenceCalculationColor: color,\r\n adjudicationPricePreferenceCalculation: submission[cols.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'],\r\n backgroundShades\r\n };\r\n });\r\n }\r\n\r\n private getColorString(target: number, numbers: number[]): string {\r\n return getColorForNumber(target, numbers, true);\r\n }\r\n\r\n private getScoreShade(rgbColor: string): string {\r\n if (!rgbColor) return '';\r\n return rgbColor.replace('rgb', 'rgba').replace(')', `, 0.1)`);\r\n }\r\n\r\n viewMicroSubmission(res: any) {\r\n const alreadyInValue = this.value?.find((v) => v.id === res.id);\r\n if (!alreadyInValue) {\r\n const newReview: WorkflowAdjudicationMicroFlowReviewValue = {\r\n id: res.id,\r\n adj_microFlow_review: undefined as any,\r\n nameOfBidder: res[this.columnMapping?.respondentNameKey || ''] || '',\r\n supplierNumber: res[this.columnMapping?.respondentCodeKey || ''] || '',\r\n createdAt: res[this.columnMapping?.responseDateKey || 'createdAt'] || undefined,\r\n updatedAt: res[this.columnMapping?.responseDateKey || 'updatedAt'] || undefined,\r\n adjudicationPricePreferenceCalculation: res[this.columnMapping?.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'] || 0,\r\n reference: res.reference || '',\r\n }\r\n const newValue = [...(this.value || []), newReview];\r\n this.reviewChange.emit(newValue);\r\n }\r\n this.config.formBuilder['previewWorkflowDocument'](res.id);\r\n }\r\n\r\n reviewStatuses = [\r\n {\r\n label: '✅ Compliant',\r\n value: \"compliant\",\r\n color: 'var(--mat-sys-primary)',\r\n },\r\n {\r\n label: '❌ Non-compliant',\r\n value: \"non-compliant\",\r\n color: 'var(--mat-sys-error)',\r\n },\r\n\r\n\r\n ];\r\n\r\n setResponseStatus(res: any, status: MatSelectChange) {\r\n const alreadyInValue = this.value?.find((v) => v.id === res.id);\r\n\r\n if (!alreadyInValue) {\r\n const newReview: WorkflowAdjudicationMicroFlowReviewValue = {\r\n id: res.id,\r\n adj_microFlow_review: status.value as any,\r\n nameOfBidder: res[this.columnMapping?.respondentNameKey || ''] || '',\r\n supplierNumber: res[this.columnMapping?.respondentCodeKey || ''] || '',\r\n createdAt: res[this.columnMapping?.responseDateKey || 'createdAt'] || undefined,\r\n updatedAt: res[this.columnMapping?.responseDateKey || 'updatedAt'] || undefined,\r\n adjudicationPricePreferenceCalculation: res[this.columnMapping?.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'] || 0,\r\n reference: res.reference || '',\r\n }\r\n \r\n this.reviewChange.emit([...(this.value || []), newReview]);\r\n this.reachedMax([...(this.value || []), newReview])\r\n return\r\n }\r\n const newValue= (this.value||[]).map((v) => {\r\n if (v.id === res.id) {\r\n return { ...v, adj_microFlow_review: status.value as any };\r\n }\r\n return v;\r\n });\r\n \r\n\r\n this.reviewChange.emit(newValue);\r\n this.reachedMax(newValue)\r\n\r\n }\r\n get maxLimit(): number | undefined {\r\n const hasMax = this.inputConfig?.maxLength;\r\n if (!hasMax || isNaN(Number(hasMax))) {\r\n return; // No limit set, do nothing\r\n }\r\n return Number(hasMax);\r\n }\r\n reachedMax(newValue: WorkflowAdjudicationMicroFlowReviewValue[] | null): void {\r\n const hasMax = this.inputConfig?.maxLength;\r\n if (!hasMax || isNaN(Number(hasMax))) {\r\n return; // No limit set, do nothin\r\n }\r\n const allCompetentSubmissions = newValue?.filter((v) => (v.adj_microFlow_review as any) === 'compliant').length || 0;\r\n if (!(allCompetentSubmissions >= (Number(hasMax) || 1))) {\r\n return \r\n }\r\n const missingSubmission = this.submissions.filter((s) => !newValue?.find((v) => v.id === s.id))\r\n .map((s) => ({\r\n id: s.id,\r\n adj_microFlow_review: 'non-compliant' as any, // Default to non-compliant\r\n nameOfBidder: s[this.columnMapping?.respondentNameKey || ''] || '',\r\n supplierNumber: s[this.columnMapping?.respondentCodeKey || ''] || '',\r\n createdAt: s[this.columnMapping?.responseDateKey || 'createdAt'] || undefined,\r\n updatedAt: s[this.columnMapping?.responseDateKey || 'updatedAt'] || undefined,\r\n adjudicationPricePreferenceCalculation: s[this.columnMapping?.responsePreferenceCalculationKey || 'adjudicationPricePreferenceCalculation'] || 0,\r\n reference: s['reference'] || '',\r\n }));\r\n const unique = new Set([...newValue || [], ...missingSubmission])\r\n this.reviewChange.emit(Array.from(unique) as WorkflowAdjudicationMicroFlowReviewValue[]);\r\n \r\n\r\n }\r\n\r\n notesOpenForRowId: string | null = null;\r\n // FIX: A Map to hold notes being edited, keyed by row ID. This prevents shared state.\r\n\r\n\r\n\r\n\r\n /**\r\n * REFACTORED: Saves the notes from the `notesBeingEdited` map.\r\n */\r\n notesBlur(notesToSave: OutputData | undefined): void {\r\n if (!this.notesOpenForRowId || !notesToSave) {\r\n this.notesOpenForRowId = null;\r\n return\r\n }\r\n\r\n const alreadyInValue = this.value?.find((v) => v.id === this.notesOpenForRowId);\r\n\r\n if (!alreadyInValue) {\r\n const newReview: WorkflowAdjudicationMicroFlowReviewValue = {\r\n id: this.notesOpenForRowId,\r\n adj_microFlow_review_notes: notesToSave,\r\n adj_microFlow_review: undefined as any,\r\n nameOfBidder: '',\r\n supplierNumber: '',\r\n createdAt: undefined as any,\r\n updatedAt: undefined as any,\r\n adjudicationPricePreferenceCalculation: 0,\r\n reference: '',\r\n } as any;\r\n this.reviewChange.emit([...(this.value || []), newReview]);\r\n } else {\r\n const newValue = this.value?.map((v) => {\r\n if (v.id === this.notesOpenForRowId) {\r\n return { ...v, adj_microFlow_review_notes: notesToSave };\r\n }\r\n return v;\r\n });\r\n this.reviewChange.emit(newValue);\r\n }\r\n\r\n // Clean up and close the overlay\r\n \r\n\r\n }\r\n\r\n\r\n bulkOperations = [\r\n {\r\n label: '✅ Set all to Compliant',\r\n value: 'compliant',\r\n color: 'var(--mat-sys-primary)',\r\n },\r\n {\r\n label: '❌ Set all to Non-compliant',\r\n value: 'non-compliant',\r\n color: 'var(--mat-sys-error)',\r\n },\r\n {\r\n label:\"🔄 Reset all \",\r\n value: 'reset',\r\n color: 'var(--mat-sys-secondary)',\r\n }\r\n\r\n\r\n ]\r\n get bulkStatus() {\r\n const allCompliant = this.submissions.every((s) => s['adj_microFlow_review'] === 'compliant');\r\n\r\n if (allCompliant) {\r\n return 'compliant';\r\n }\r\n\r\n const allNonCompliant = this.submissions.every((s) => s['adj_microFlow_review'] === 'non-compliant');\r\n if (allNonCompliant) {\r\n return 'non-compliant';\r\n }\r\n\r\n return 'mixed';\r\n }\r\nbulkStatusChanged(event: MatSelectChange) {\r\n const newStatus = event.value;\r\n if(newStatus === 'reset') {\r\n this.reviewChange.emit([]);\r\n return\r\n }\r\n // Create a Map of existing values for efficient O(1) lookup\r\n const existingValueMap = new Map((this.value ?? []).map(v => [v.id, v]));\r\n\r\n // Destructure column keys with fallbacks for cleaner access\r\n const {\r\n respondentNameKey = '',\r\n respondentCodeKey = '',\r\n responseDateKey = 'createdAt',\r\n responsePreferenceCalculationKey = 'adjudicationPricePreferenceCalculation',\r\n } = this.columnMapping || {};\r\n\r\n let allItems = this.submissions.map(s => {\r\n // Efficiently look up the existing value using the Map\r\n const existingValue = existingValueMap.get(s.id);\r\n \r\n // If it exists, spread its properties to preserve them and update the status\r\n if (existingValue) {\r\n return { ...existingValue, adj_microFlow_review: newStatus };\r\n }\r\n \r\n // Otherwise, create a new object from the submission data\r\n return {\r\n id: s.id,\r\n adj_microFlow_review: newStatus,\r\n nameOfBidder: s[respondentNameKey] || '',\r\n supplierNumber: s[respondentCodeKey] || '',\r\n createdAt: s[responseDateKey] || undefined,\r\n updatedAt: s[this.columnMapping?.responseDateKey || 'updatedAt'] || undefined,\r\n adjudicationPricePreferenceCalculation: s[responsePreferenceCalculationKey] || 0,\r\n reference: s['reference'] || '',\r\n };\r\n });\r\n\r\n // Apply the compliance limit if necessary\r\n const shouldApplyLimit = this.maxLimit !== undefined && newStatus === 'compliant';\r\n if (shouldApplyLimit) {\r\n // Sort by preference calculation, highest first\r\n allItems.sort((a, b) => \r\n (b.adjudicationPricePreferenceCalculation ?? 0) - (a.adjudicationPricePreferenceCalculation ?? 0)\r\n );\r\n\r\n // Mark items beyond the limit as 'non-compliant'\r\n allItems = allItems.map((item, index) => {\r\n if (index >= this.maxLimit!) {\r\n return { ...item, adj_microFlow_review: 'non-compliant' };\r\n }\r\n return item;\r\n });\r\n }\r\n\r\n this.reviewChange.emit(allItems as WorkflowAdjudicationMicroFlowReviewValue[]);\r\n}\r\n dialog = inject(MatDialog)\r\n openNotes(row: any) {\r\n\r\n this.notesOpenForRowId = row.id;\r\n \r\n const stringfiedTemplate = JSON.stringify(this.inputConfig?.adjudicationReviewFeedbackTemplate);\r\n const template = stringfiedTemplate?.replace(/\\$bidderName/g, row[this.columnMapping?.respondentNameKey || ''])\r\n ?.replace(/\\$bidderCode/g, row[this.columnMapping?.respondentCodeKey || ''])\r\n ?.replace(/\\$responseDate/g, row[this.columnMapping?.responseDateKey || ''])\r\n ?.replace(/\\$responsePreferenceCalculation/g, row[this.columnMapping?.responsePreferenceCalculationKey || ''] || '0')\r\n\r\n this.dialog.open(\r\n SubmissionReviewDialogComponent,{\r\n\r\n height: 'fit-content',\r\n data: {\r\n row,\r\n respondentNameKey: this.columnMapping?.respondentNameKey || '',\r\n respondentCodeKey: this.columnMapping?.respondentCodeKey || '',\r\n readonly: this.inputConfig?.readonly || false,\r\n activeRowNotes: JSON.parse(template || '{}') as OutputData | undefined\r\n },\r\n autoFocus: false,\r\n disableClose: true\r\n }).afterClosed().pipe(\r\n take(1),\r\n tap((result: OutputData | undefined) => {\r\n \r\n \r\n this.notesBlur( result);\r\n })\r\n ).subscribe();\r\n }\r\n canChangeStatus(row: any): boolean {\r\n if (row.adj_microFlow_review === 'compliant') return true;\r\n const maxLength = this.inputConfig?.maxLength\r\n // check if max ecists and is a number\r\n if (!maxLength || isNaN(Number(maxLength))) {\r\n return true; // No limit set, allow status change\r\n }\r\n const allCompetentSubmissions = this.value?.filter((v) => (v.adj_microFlow_review as any) === 'compliant').length || 0;\r\n return allCompetentSubmissions < (Number(maxLength) || 1)\r\n }\r\n}","@if (vm$ | async; as vm) {\r\n\r\n<ng-container *ngIf=\"vm.loading; then loading; else (vm.error ? error : dataContainer)\"></ng-container>\r\n\r\n<ng-template #loading>\r\n <div style=\"display: flex; justify-content: center; align-items: center; padding:24px;width: 100%;\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #error>\r\n <div class=\"info-card error-card\">\r\n <h5 class=\"info-title\">❌ Failed to load data</h5>\r\n <p>{{ vm.error }}</p>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\">\r\n Try Again\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #dataContainer>\r\n <ng-container\r\n *ngIf=\"!vm.displayCols.length; then noColumns; else (!vm.submissions.length ? noSubmissions : submissionsTable)\"></ng-container>\r\n</ng-template>\r\n\r\n\r\n<ng-template #noColumns>\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">⚙️ This step needs to be configured to show data.</h5>\r\n <ol>\r\n <li>\r\n <strong>Why you're seeing this:</strong>\r\n <ul>\r\n <li>This component is designed for a <strong>\"Submission Review\"</strong> workflow step.</li>\r\n <li>It's currently missing the required column setup.</li>\r\n </ul>\r\n </li>\r\n <li>\r\n <strong>What to do (for Administrators):</strong>\r\n To fix this, go to the <strong>Workflow Builder</strong> and for this specific step, <strong>map the display\r\n columns</strong> to the desired submission data (e.g., form fields or document keys).\r\n </li>\r\n </ol>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #noSubmissions>\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">ℹ️ There are no submissions to display.</h5>\r\n <ul>\r\n <li>This can happen if <strong>no one has responded</strong> yet, or if the <strong>submission closing date has\r\n passed</strong>.</li>\r\n <li>If you are expecting to see submissions, try clicking the <strong>Refresh</strong> button.</li>\r\n </ul>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\" class=\"load-button\">\r\n Refresh\r\n </button>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #submissionsTable>\r\n @if(!value || value.length === 0){\r\n\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">📝 How to Review Submissions</h5>\r\n <ol>\r\n <li>\r\n <strong>View Response:</strong> Click the <strong>Preview</strong> (<mat-icon\r\n class=\"smallIcon\">preview</mat-icon>) icon to see the full submission.\r\n </li>\r\n <li>\r\n <strong>Set Status:</strong> Use the dropdown to select <strong>Compliant</strong> or\r\n <strong>Non-compliant</strong>.\r\n </li>\r\n <li>\r\n <strong>Add Note (If Non-compliant):</strong>\r\n <ul>\r\n <li>If you select <strong>Non-compliant</strong>, you <strong>must</strong> add a note.</li>\r\n <li>Click the <strong>Add Note</strong> (<mat-icon class=\"smallIcon\">add_comment</mat-icon>) icon, write your\r\n feedback, and hit <strong>Save Feedback</strong>. Your note will be visible to the applicant.</li>\r\n </ul>\r\n </li>\r\n </ol>\r\n </div>\r\n }\r\n <table mat-table [dataSource]=\"vm.submissions\">\r\n @for (col of vm.displayColumns; track col.formControlName) {\r\n <ng-container [matColumnDef]=\"col.formControlName\">\r\n <th mat-header-cell *matHeaderCellDef style=\"padding:4px\">\r\n\r\n @if(col.formControlName === 'status' && !inputConfig?.readonly ){\r\n <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%;\r\n margin-bottom: 8px;\r\n margin-top: 8px;\r\n border-radius:16px;\" appearance=\"outline\">\r\n <mat-label>\r\n Bulk Status Selection\r\n </mat-label>\r\n <mat-select\r\n [style.color]=\"bulkStatus === 'non-compliant' ? 'var(--mat-sys-error)' : bulkStatus==='compliant'? 'var(--mat-sys-primary)' : ''\"\r\n (selectionChange)=\"bulkStatusChanged($event)\" ngDefaultControl [value]=\"bulkStatus\"\r\n placeholder=\" Select Status\">\r\n @for (type of bulkOperations || []; track type) {\r\n <mat-option [value]=\"type.value\">{{type.label}}</mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n }@else {\r\n {{ col.label }}\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" mat-ripple class=\"table-cell\" [class.selected-row]=\"selected === row.id\"\r\n (click)=\"$event.stopPropagation()\" [class.price-preference-cell]=\"true\"\r\n [style.border-bottom-color]=\"row.adjudicationPricePreferenceCalculationColor\"\r\n [style.background]=\"row.backgroundShades?.[col.formControlName]\">\r\n\r\n @if(col.formControlName === 'actions'){\r\n <span style=\"display: flex; align-items: center;\">\r\n <button matTooltipPosition=\"before\"\r\n [matTooltip]=\"`View and review **` + row[vm.columnMapping.respondentNameKey]+ `** 's' Submission`\"\r\n (click)=\"viewMicroSubmission(row)\" mat-icon-button>\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n @if( !(inputConfig?.readonly) || (inputConfig?.readonly) && !!row['submissionHasReviewNotes'] ){\r\n <button (click)=\"openNotes(row)\" cdkOverlayOrigin #trigger=\"cdkOverlayOrigin\" matTooltipPosition=\"after\"\r\n [matTooltip]=\"\r\n `Add a review note for **` + row[vm.columnMapping.respondentNameKey] + `**`\" mat-icon-button>\r\n <mat-icon [style.color]=\"\r\n notesOpenForRowId === row.id ? 'var(--mat-sys-primary)' : (row['adj_microFlow_review']==='non-compliant' && !row['adj_microFlow_review_notes']?'var(--mat-sys-error)':'')\r\n \">\r\n {{ !row['submissionHasReviewNotes']? 'add_comment' : 'comment' }}\r\n </mat-icon>\r\n </button>\r\n }\r\n\r\n </span>\r\n\r\n\r\n\r\n } @else if(col.formControlName === 'status'){\r\n <mat-form-field floatLabel=\"always\" subscriptSizing=\"dynamic\" style=\"width: 100%;\r\n margin-bottom: 8px;\r\n margin-top: 8px;\r\n border-radius:16px;\" appearance=\"outline\">\r\n <mat-select [disabled]=\"!canChangeStatus(row) || inputConfig?.readonly === true\"\r\n [style.color]=\"row['adj_microFlow_review'] === 'non-compliant' ? 'var(--mat-sys-error)' : row['adj_microFlow_review']==='compliant'? 'var(--mat-sys-primary)' : ''\"\r\n (selectionChange)=\"setResponseStatus(row,$event)\" ngDefaultControl [value]=\"row.adj_microFlow_review\"\r\n placeholder=\" Select Status\">\r\n @for (type of reviewStatuses || []; track type) {\r\n <mat-option [value]=\"type.value\">{{type.label}}</mat-option>\r\n }\r\n </mat-select>\r\n @if(row['adj_microFlow_review']==='non-compliant' && !row['adj_microFlow_review_notes']){\r\n <mat-hint style=\"color:var(--mat-sys-error)\">\r\n Rejection reason is required. Add a review note.\r\n </mat-hint>\r\n }\r\n </mat-form-field>\r\n\r\n } @else {\r\n @switch (col?.type) {\r\n @case ('daysAgo') {\r\n {{ row[col.formControlName] | daysAgo }}\r\n }\r\n @case ('number') {\r\n <div class=\"number-cell\">\r\n <span>\r\n {{ (row[col.formControlName] | number:'0.0-0' ) || 'N/A' }}\r\n </span>\r\n @if (col.showColor) {\r\n <mat-icon [style.color]=\"row.adjudicationPricePreferenceCalculationColor\">\r\n fiber_manual_record\r\n </mat-icon>\r\n }\r\n </div>\r\n }\r\n @default {\r\n @if($index === 0) {\r\n <span class=\"main-submission-text\">\r\n <mat-icon style=\"font-size: 1em;height:16px;width:16px\">domain</mat-icon>\r\n <strong>\r\n {{ row[col.formControlName] }}\r\n </strong>\r\n </span>\r\n <span class=\"secondary-text\">\r\n <mat-icon>fingerprint</mat-icon>\r\n {{row[vm.columnMapping.respondentCodeKey]}}\r\n <mat-icon>more_time</mat-icon>\r\n {{ row[vm.columnMapping.responseDateKey ||''] | daysAgo}}\r\n </span>\r\n } @else {\r\n {{ row[col.formControlName] }}\r\n }\r\n }\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"vm.displayCols\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: vm.displayCols\"></tr>\r\n </table>\r\n\r\n\r\n</ng-template>\r\n\r\n}","import { Component } from '@angular/core';\r\nimport { Inject, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, NgForm, ReactiveFormsModule, Validators, FormGroupDirective } from '@angular/forms';\r\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\r\nimport { Observable, map, startWith } from 'rxjs';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../../../../../../../../lib/shared/modules/mat-modules.module';\r\nimport { WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\n\r\n\r\n// DEFINE A CLEAR DATA STRUCTURE FOR TYPE SAFETY\r\n\r\nexport interface ScoreSheetGroup {\r\n key: string;\r\n name: string;\r\n}\r\n\r\nexport interface PointAssignmentDialogData {\r\n readonly: boolean; // Indicates if the dialog is read-only\r\n row: { nameOfBidder: string, adj_microFlow_assignedScore: Record<string, number> };\r\n scoreSheetGroups: ScoreSheetGroup[];\r\n groupedScoreSheet: Record<string, WorkflowAdjudicationScoreSheetValue[]>;\r\n existingScores: Record<string, Record<string, number | null>>; // e.g., { 'groupKey': { 'scoreId': 10 } }\r\n}\r\n// NEW: Custom ErrorStateMatcher to show errors immediately on invalid input, without waiting for the user to \"touch\" (blur) the field.\r\nexport class ShowErrorOnDirtyMatcher implements ErrorStateMatcher {\r\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\r\n // Show error if the control has been modified (is dirty) and is invalid.\r\n return !!(control && control.invalid && control.dirty);\r\n }\r\n}\r\n@Component({\r\n selector: 'lib-point-assignment-dialog',\r\n imports: [MatModulesModule, ReactiveFormsModule, CommonModule],\r\n templateUrl: './point-assignment-dialog.component.html',\r\n styleUrl: './point-assignment-dialog.component.css'\r\n})\r\nexport class PointAssignmentDialogComponent implements OnInit {\r\n pointsForm!: FormGroup;\r\n totalPoints$!: Observable<number>;\r\n maxPossiblePoints = 0;\r\n matcher = new ShowErrorOnDirtyMatcher();\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<PointAssignmentDialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: PointAssignmentDialogData,\r\n private fb: FormBuilder\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.calculateMaxPoints();\r\n this.pointsForm = this.buildForm();\r\n this.totalPoints$ = this.createTotalPointsObservable();\r\n }\r\n\r\n correctMaxValue(event: Event, groupKey: string, controlId: string, maxPoints: number): void {\r\n const inputElement = event.target as HTMLInputElement;\r\n const currentValue = parseFloat(inputElement.value);\r\n\r\n if (currentValue > maxPoints) {\r\n // THE FIX: Remove `{ emitEvent: false }` to allow the totalPoints$ observable to receive the updated value.\r\n this.pointsForm.get([groupKey, controlId])?.patchValue(maxPoints);\r\n }\r\n }\r\n\r\n\r\n // The rest of the file remains the same...\r\n private buildForm(): FormGroup {\r\n const groupOfGroups = this.data.scoreSheetGroups.reduce((acc, group) => {\r\n const scoresInGroup = this.data.groupedScoreSheet[group.key] || [];\r\n const groupControls = scoresInGroup.reduce((ctrls, score) => {\r\n const existingScore = this.data.row.adj_microFlow_assignedScore?.[score.id] ?? null;\r\n ctrls[score.id] = new FormControl(existingScore, [\r\n Validators.required,\r\n Validators.min(0),\r\n Validators.max(score.totalPoints),\r\n ]);\r\n return ctrls;\r\n }, {} as Record<string, FormControl>);\r\n acc[group.key] = this.fb.group(groupControls);\r\n return acc;\r\n }, {} as Record<string, FormGroup>);\r\n return this.fb.group(groupOfGroups);\r\n }\r\n\r\n private calculateMaxPoints(): void {\r\n this.maxPossiblePoints = Object.values(this.data.groupedScoreSheet)\r\n .flat()\r\n .reduce((acc, score) => acc + score.totalPoints, 0);\r\n }\r\n\r\n private createTotalPointsObservable(): Observable<number> {\r\n return this.pointsForm.valueChanges.pipe(\r\n startWith(this.pointsForm.value),\r\n map(formValue => {\r\n let total = 0;\r\n Object.values(formValue || {}).forEach((group: any) => {\r\n Object.values(group || {}).forEach(score => {\r\n total += Number(score) || 0;\r\n });\r\n });\r\n return total;\r\n })\r\n );\r\n }\r\n}","<span mat-dialog-title>\r\n Assign Points for <span class=\"bidder-name\">{{ data.row['nameOfBidder'] }}</span>\r\n</span>\r\n @if( !data.readonly){\r\n<div class=\"dialog-instructions\">\r\n @if(!pointsForm.dirty && !pointsForm.touched){\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">💯 How to Assign Points\r\n\r\n </h5>\r\n <ol>\r\n <li>\r\n <strong>Enter a score</strong> for each item listed below.\r\n </li>\r\n <li>\r\n <strong>Follow the rules:</strong>\r\n <ul>\r\n <li>Your score cannot be higher than the maximum points shown (e.g., / 10).</li>\r\n <li>The <strong>\"Save Points\"</strong> button at the bottom will turn blue when everything is filled\r\n out correctly.</li>\r\n </ul>\r\n </li>\r\n <li>\r\n <strong>Click the blue \"Save Points\" button</strong> to finish.\r\n </li>\r\n </ol>\r\n </div>\r\n }\r\n @else {\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">✍️ Editing Your Scores</h5>\r\n <ol>\r\n <li>\r\n <strong>You are viewing saved scores.</strong> To make a change, simply click on a score and type in a\r\n new number.\r\n </li>\r\n <li>\r\n The <strong>Total Points</strong> bar at the top will update as you make edits.\r\n </li>\r\n <li>\r\n Click <strong>\"Save Points\"</strong> to confirm your changes when you're done.\r\n </li>\r\n </ol>\r\n </div>\r\n }\r\n</div>\r\n\r\n }\r\n\r\n\r\n<mat-dialog-content style=\"padding-bottom: 8px;padding-bottom: 8px\" [formGroup]=\"pointsForm\">\r\n <div class=\"summary-bar\">\r\n <h3>Total Points: {{ totalPoints$ | async }} / {{ maxPossiblePoints }}</h3>\r\n <mat-progress-bar mode=\"determinate\"\r\n [value]=\"((totalPoints$ | async) || 0) / maxPossiblePoints * 100\"></mat-progress-bar>\r\n </div>\r\n\r\n <mat-accordion multi>\r\n @for (group of data.scoreSheetGroups; track group.key) {\r\n <mat-expansion-panel [expanded]=\"true\" [formGroupName]=\"group.key\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>{{ group.name }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\r\n @for (score of data.groupedScoreSheet[group.key] || []; track score.id) {\r\n <div class=\"score-item\">\r\n <label [for]=\"score.id\" class=\"score-description\">{{ score.description }}</label>\r\n\r\n <mat-form-field appearance=\"outline\" subscriptSizing=\"dynamic\" class=\"score-input\">\r\n <mat-label>Score</mat-label>\r\n <input [disabled]=\"data.readonly\" matInput type=\"number\" placeholder=\"0\" [id]=\"score.id\"\r\n [formControlName]=\"score.id\" [max]=\"score.totalPoints\" min=\"0\" [errorStateMatcher]=\"matcher\"\r\n (input)=\"correctMaxValue($event, group.key, score.id, score.totalPoints)\" />\r\n <span matSuffix>\r\n <span style=\"min-width: 58px; display:flex\">\r\n / {{ score.totalPoints }}\r\n </span>\r\n </span>\r\n\r\n <mat-error *ngIf=\"pointsForm.get(group.key)?.get(score.id)?.hasError('required')\">\r\n A score is required.\r\n </mat-error>\r\n <mat-error *ngIf=\"pointsForm.get(group.key)?.get(score.id)?.hasError('max')\">\r\n Score cannot exceed {{ score.totalPoints }}.\r\n </mat-error>\r\n <mat-error *ngIf=\"pointsForm.get(group.key)?.get(score.id)?.hasError('min')\">\r\n Score cannot be negative.\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n <mat-divider></mat-divider>\r\n }\r\n </mat-expansion-panel>\r\n }\r\n </mat-accordion>\r\n\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions align=\"end\">\r\n <button mat-button mat-dialog-close>Cancel</button>\r\n @if( !data.readonly){\r\n <button mat-flat-button color=\"primary\" \r\n [mat-dialog-close]=\"pointsForm.getRawValue()\"\r\n [disabled]=\"pointsForm.invalid\">\r\n Save Points\r\n </button>\r\n }\r\n\r\n</mat-dialog-actions>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, inject, Input, Output } from '@angular/core';\r\n\r\n\r\nimport { BehaviorSubject, catchError, combineLatest, map, Observable, of, shareReplay, startWith, switchMap, take, tap } from 'rxjs';\r\nimport { FormsModule, ReactiveFormsModule, } from '@angular/forms';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\n\r\nimport { AdjResponseReviewColumnMapping, ITowerStepColumn, WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\nimport { ISubmission, tableCols } from '../submission-review/submission-review.component';\r\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\r\nimport { DaysAgoPipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\r\nimport { getColorForNumber } from '../../../../../../shared/functions/mapColors';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { PointAssignmentDialogComponent } from './elements/point-assignment-dialog/point-assignment-dialog.component';\r\nexport interface IViewModel {\r\n submissions: ISubmission[];\r\n columnMapping: AdjResponseReviewColumnMapping;\r\n displayColumns?: tableCols[];\r\n displayCols: string[];\r\n loading: boolean;\r\n groupedScoreSheet?: Record<string, WorkflowAdjudicationScoreSheetValue[]>;\r\n scoreSheetGroups?: { name: string; key: string }[];\r\n error?: string;\r\n}\r\n@Component({\r\n selector: 'app-point-assignment',\r\n templateUrl: './point-assignment.component.html',\r\n styleUrls: ['./point-assignment.component.scss'],\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatModulesModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n DaysAgoPipe\r\n ]\r\n})\r\nexport class PointAssignmentComponent {\r\n\r\n private config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n private refreshTrigger = new BehaviorSubject<void>(undefined);\r\n // A stream to push updates of the review values (`this.value`)\r\n private valueChanges$ = new BehaviorSubject<any[] | null>([]);\r\n private readonly initialState: IViewModel = {\r\n loading: true,\r\n submissions: [],\r\n columnMapping: {} as any,\r\n displayCols: [],\r\n displayColumns: [],\r\n error: undefined,\r\n };\r\n private _value: any[] | null = [];\r\n\r\n @Input() inputConfig: ITowerStepColumn | undefined\r\n // Stream for the initial data fetch. Only re-runs when `refreshTrigger` is fired.\r\n\r\n @Input() set value(value: any) {\r\n if (_isEqual(value, this._value)) return;\r\n this._value = value as any[] || [];\r\n // FIX: Instead of triggering a full refresh, push the new value to its own stream.\r\n this.valueChanges$.next(this._value);\r\n }\r\n @Output() pointsChange = new EventEmitter<any[]>();\r\n get value(): any[] | null {\r\n return this._value;\r\n }\r\n private readonly fetchedData$ = this.refreshTrigger.pipe(\r\n switchMap(() => this.config.formBuilder.getCurrentStepMicroflowSubmissions().pipe(take(1))),\r\n shareReplay(1)\r\n );\r\n loadMicroSubmissions(): void {\r\n this.refreshTrigger.next();\r\n }\r\n readonly vm$: Observable<IViewModel> = combineLatest([\r\n this.fetchedData$,\r\n this.valueChanges$\r\n ]).pipe(\r\n map(([res, reviewValues]) => {\r\n const { columnMapping, submissions, scoreSheet } = res;\r\n //group scoresheet by pointType\r\n const groupedScoreSheet = (scoreSheet || []).reduce((acc, curr) => {\r\n const pointType = curr.pointType || 'default';\r\n if (!acc[pointType]) {\r\n acc[pointType] = [];\r\n }\r\n acc[pointType].push(curr);\r\n return acc;\r\n }, {} as Record<string, WorkflowAdjudicationScoreSheetValue[]>);\r\n const dataModel = {\r\n submissions: this.enrichSubmissionsData(submissions || [], reviewValues),\r\n loading: false,\r\n error: undefined,\r\n groupedScoreSheet,\r\n scoreSheetGroups: Object.keys(groupedScoreSheet).map(key => ({\r\n name: key.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/([A-Z])([A-Z][a-z])/g, '$1 $2'),\r\n key: key\r\n })),\r\n columnMapping: columnMapping,\r\n displayCols: ['nameOfBidder', 'adj_microFlow_review', 'adjudicationPricePreferenceCalculation',\r\n 'adj_microFlow_scoreSheetTotalPoints',\r\n 'actions'],\r\n displayColumns: [\r\n { label: 'name', formControlName: 'nameOfBidder', type: 'string' as any },\r\n { label: 'Pref Calc', formControlName: 'adjudicationPricePreferenceCalculation', type: 'number' as any, showColor: true },\r\n { label: 'status', formControlName: 'adj_microFlow_review', type: 'string' },\r\n { label: 'Score', formControlName: 'adj_microFlow_scoreSheetTotalPoints', type: 'number' as any, showColor: true },\r\n { label: '', formControlName: 'actions', type: 'string' },\r\n\r\n ],\r\n }\r\n\r\n return {\r\n ...dataModel\r\n }\r\n }),\r\n startWith(this.initialState),\r\n catchError(() => {\r\n return of({ ...this.initialState, loading: false, error: 'Failed to load submissions.' });\r\n }),\r\n shareReplay(1)\r\n\r\n )\r\n viewMicroSubmission(res: any) {\r\n this.config.formBuilder['previewWorkflowDocument'](res.id);\r\n }\r\n\r\n\r\n enrichSubmissionsData(submissions: ISubmission[], reviewValues: any[] | null): ISubmission[] {\r\n const numberSets = new Map<string, number[]>();\r\n numberSets.set(\r\n 'adjudicationPricePreferenceCalculation',\r\n submissions.map((s) => Number(s['adjudicationPricePreferenceCalculation'] || 0))\r\n );\r\n const list = submissions.length > 0 ? submissions : reviewValues || [];\r\n return (list).map((submission) => {\r\n const numbers = numberSets.get('adjudicationPricePreferenceCalculation') || [];\r\n const color = numbers.length === 0 ? submission['adjudicationPricePreferenceCalculationColor'] : this.getColorString(submission['adjudicationPricePreferenceCalculation'], numbers);\r\n const backgroundShades = { ['adjudicationPricePreferenceCalculation']: this.getScoreShade(color) }\r\n const value = this.value?.find((v) => v.id === submission.id);\r\n return ({\r\n ...submission,\r\n adj_microFlow_review: submission['adj_microFlow_review'] === 'compliant' ? '✅' : '❌',\r\n adjudicationPricePreferenceCalculationColor: color,\r\n backgroundShades,\r\n ...value,\r\n })\r\n })\r\n }\r\n private getScoreShade(rgbColor: string): string {\r\n if (!rgbColor) return '';\r\n return rgbColor.replace('rgb', 'rgba').replace(')', `, 0.1)`);\r\n }\r\n private getColorString(target: number, numbers: number[]): string {\r\n return getColorForNumber(target, numbers, true);\r\n }\r\n dialog = inject(MatDialog)\r\n openPointAssignmentDialog(row: any, groupedScoreSheet: Record<string, WorkflowAdjudicationScoreSheetValue[]> | undefined, scoreSheetGroups: {\r\n name: string;\r\n key: string;\r\n }[] | undefined): void {\r\n this.dialog.open(PointAssignmentDialogComponent, {\r\n\r\n height: 'fit-content',\r\n data: {\r\n row,\r\n groupedScoreSheet,\r\n scoreSheetGroups,\r\n readonly: this.inputConfig?.readonly || false,\r\n },\r\n autoFocus: false,\r\n disableClose: true\r\n }).afterClosed().pipe(\r\n take(1),\r\n switchMap((result: Record<string, Record<string, number>>) => {\r\n if (!result) return of(null);\r\n // Update the value with the new point assignments\r\n const assignment = Object.values(result).reduce((acc, curr) => {\r\n acc = {\r\n ...acc,\r\n ...curr\r\n }\r\n return acc;\r\n }, {} as Record<string, number>);\r\n row['adj_microFlow_assignedScore'] = assignment;\r\n const alreadyInValue = this.value?.find((v) => v.id === row.id);\r\n let newValue\r\n if (!alreadyInValue) {\r\n newValue = [...(this.value || []), {\r\n ...row,\r\n adj_microFlow_assignedScore: assignment,\r\n adj_microFlow_scoreSheetTotalPoints: Object.values(assignment).reduce((acc, curr) => acc + curr, 0)\r\n }];\r\n\r\n } else {\r\n newValue = this.value?.map((v) => {\r\n if (v.id === row.id) {\r\n return {\r\n ...v,\r\n adj_microFlow_scoreSheetTotalPoints: Object.values(assignment).reduce((acc, curr) => acc + curr, 0),\r\n adj_microFlow_assignedScore: assignment\r\n };\r\n }\r\n return v;\r\n }) || [];\r\n }\r\n\r\n\r\n return of(newValue);\r\n }),\r\n tap(\r\n (newValue) => {\r\n if (!newValue || this.inputConfig?.readonly) return;\r\n this.pointsChange.emit(newValue);\r\n },\r\n )\r\n )\r\n .subscribe();\r\n\r\n\r\n }\r\n\r\n}\r\n","@if (vm$ | async; as vm) {\r\n<ng-container *ngIf=\"vm.loading; then loading; else (vm.error ? error : dataContainer)\"></ng-container>\r\n\r\n<ng-template #loading>\r\n <div style=\"display: flex; justify-content: center; align-items: center; padding:24px;width: 100%;\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n</ng-template>\r\n<ng-template #error>\r\n <div class=\"info-card error-card\">\r\n <h5 class=\"info-title\">❌ Failed to load data</h5>\r\n <p>{{ vm.error }}</p>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\">\r\n Try Again\r\n </button>\r\n </div>\r\n</ng-template>\r\n<ng-template #dataContainer>\r\n\r\n @if(vm.submissions.length === 0){\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">ℹ️ There are no submissions to display.</h5>\r\n <ul>\r\n <li>This can happen if <strong>no one has responded</strong> yet, or if <strong>none of the submission were\r\n compliant </strong>.</li>\r\n <li>If you are expecting to see submissions, try clicking the <strong>Refresh</strong> button.</li>\r\n </ul>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\" class=\"load-button\">\r\n Refresh\r\n </button>\r\n </div>\r\n }@else {\r\n\r\n @if(!value || value.length === 0){\r\n\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">📝 How to Review Submissions</h5>\r\n <ol>\r\n <li>\r\n <strong>View Response:</strong> Click the <strong>Preview</strong> (<mat-icon\r\n class=\"smallIcon\">preview</mat-icon>) icon to see the full submission.\r\n </li>\r\n <li>\r\n <strong>Set Status:</strong> Use the dropdown to select <strong>Compliant</strong> or\r\n <strong>Non-compliant</strong>.\r\n </li>\r\n <li>\r\n <strong>Add Note (If Non-compliant):</strong>\r\n <ul>\r\n <li>If you select <strong>Non-compliant</strong>, you <strong>must</strong> add a note.</li>\r\n <li>Click the <strong>Add Note</strong> (<mat-icon class=\"smallIcon\">add_comment</mat-icon>) icon, write your\r\n feedback, and hit <strong>Save Feedback</strong>. Your note will be visible to the applicant.</li>\r\n </ul>\r\n </li>\r\n </ol>\r\n </div>\r\n }\r\n <table mat-table [dataSource]=\"vm.submissions\">\r\n @for (col of vm.displayColumns; track col.formControlName) {\r\n <ng-container [matColumnDef]=\"col.formControlName\">\r\n <th mat-header-cell *matHeaderCellDef style=\"padding:4px\">\r\n {{ col.label }}\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" mat-ripple class=\"table-cell\" (click)=\"$event.stopPropagation()\"\r\n [class.price-preference-cell]=\"true\"\r\n [style.border-bottom-color]=\"row.adjudicationPricePreferenceCalculationColor\"\r\n [style.background]=\"row.backgroundShades?.[col.formControlName]\">\r\n @if(col.formControlName === 'actions'){\r\n <span style=\"display: flex; align-items: center;\">\r\n <button matTooltipPosition=\"before\"\r\n [matTooltip]=\"`View and review **` + row[vm.columnMapping.respondentNameKey]+ `** 's' Submission`\"\r\n (click)=\"viewMicroSubmission(row)\" mat-icon-button>\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n </span>\r\n }@else if (col.formControlName === 'adj_microFlow_scoreSheetTotalPoints') {\r\n <button \r\n (click)=\"openPointAssignmentDialog(row,vm?.groupedScoreSheet, vm.scoreSheetGroups)\"\r\n [id]=\"row.id\" mat-stroked-button>\r\n \r\n {{ (row[col.formControlName] | number:'0.0-0' ) || 'Assign Points' }}\r\n \r\n </button>\r\n }\r\n\r\n @else {\r\n @switch (col?.type) {\r\n @case ('daysAgo') {\r\n {{ row[col.formControlName] | daysAgo }}\r\n }\r\n @case ('number') {\r\n\r\n {{ (row[col.formControlName] | number:'0.0-0' ) || 'N/A' }}\r\n\r\n }\r\n @default {\r\n @if($index === 0) {\r\n <span class=\"main-submission-text\">\r\n <mat-icon style=\"font-size: 1em;height:16px;width:16px\">domain</mat-icon>\r\n <strong>\r\n {{ row[col.formControlName] }}\r\n </strong>\r\n </span>\r\n <span class=\"secondary-text\">\r\n <mat-icon>fingerprint</mat-icon>\r\n {{row[vm.columnMapping.respondentCodeKey]}}\r\n <mat-icon>more_time</mat-icon>\r\n {{ row[vm.columnMapping.responseDateKey ||''] | daysAgo}}\r\n </span>\r\n } @else {\r\n {{ row[col.formControlName] }}\r\n }\r\n }\r\n }\r\n }\r\n\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"vm.displayCols\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: vm.displayCols\"></tr>\r\n </table>\r\n }\r\n</ng-template>\r\n}\r\n\r\n","import { Component, EventEmitter, inject, Input, Output } from '@angular/core';\r\n\r\n\r\n\r\n\r\n\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\r\nimport { ITowerStepColumn, WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\nimport { BehaviorSubject, catchError, combineLatest, map, Observable, of, shareReplay, startWith, switchMap, take, tap } from 'rxjs';\r\nimport { NGX_T_FORMS_CONFIG_TOKEN } from '../../../../../../injection-tokens';\r\nimport { IViewModel } from '../point-assignment/point-assignment.component';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { _isEqual } from '../../../../../..//shared/functions/isEqual';\r\nimport { PointAssignmentDialogComponent } from '../point-assignment/elements/point-assignment-dialog/point-assignment-dialog.component';\r\nimport { ISubmission } from '../submission-review/submission-review.component';\r\nimport { DaysAgoPipe } from '../../../../../../shared/pipes/date/days-ago.pipe';\r\nimport { getColorForNumber } from '../../../../../../shared/functions/mapColors';\r\n\r\n\r\n@Component({\r\n selector: 'app-supplier-selection',\r\n standalone: true,\r\n imports: [MatModulesModule, CommonModule, FormsModule, DaysAgoPipe],\r\n templateUrl: './supplier-selection.component.html',\r\n styleUrl: './supplier-selection.component.scss'\r\n})\r\nexport class SupplierSelectionComponent {\r\n private config = inject(NGX_T_FORMS_CONFIG_TOKEN);\r\n private refreshTrigger = new BehaviorSubject<void>(undefined);\r\n // A stream to push updates of the review values (`this.value`)\r\n private valueChanges$ = new BehaviorSubject<any[] | null>([]);\r\n private readonly initialState: IViewModel = {\r\n loading: true,\r\n submissions: [],\r\n columnMapping: {} as any,\r\n displayCols: [],\r\n displayColumns: [],\r\n error: undefined,\r\n };\r\n private _value: any[] | null = [];\r\n\r\n @Input() inputConfig: ITowerStepColumn | undefined\r\n // Stream for the initial data fetch. Only re-runs when `refreshTrigger` is fired.\r\n\r\n @Input() set value(value: any) {\r\n if (_isEqual(value, this._value)) return;\r\n this._value = value as any[] || [];\r\n // FIX: Instead of triggering a full refresh, push the new value to its own stream.\r\n this.valueChanges$.next(this._value);\r\n }\r\n @Output() supplierSelection = new EventEmitter<any[]>();\r\n get value(): any[] | null {\r\n return this._value;\r\n }\r\n private readonly fetchedData$ = this.refreshTrigger.pipe(\r\n switchMap(() => this.config.formBuilder.getCurrentStepMicroflowSubmissions().pipe(take(1))),\r\n shareReplay(1)\r\n );\r\n loadMicroSubmissions(): void {\r\n this.refreshTrigger.next();\r\n }\r\n readonly vm$: Observable<IViewModel> = combineLatest([\r\n this.fetchedData$,\r\n this.valueChanges$\r\n ]).pipe(\r\n map(([res, reviewValues]) => {\r\n const { columnMapping, submissions, scoreSheet, adjudicationPricePreferenceCalculationFormula } = res;\r\n //group scoreSheet by pointType\r\n const groupedScoreSheet = (scoreSheet || []).reduce((acc, curr) => {\r\n const pointType = curr.pointType || 'default';\r\n if (!acc[pointType]) {\r\n acc[pointType] = [];\r\n }\r\n acc[pointType].push(curr);\r\n return acc;\r\n }, {} as Record<string, WorkflowAdjudicationScoreSheetValue[]>);\r\n const totalPossibleScore = (scoreSheet || []).reduce(\r\n (acc, curr) => acc + curr.totalPoints,\r\n 0\r\n );\r\n\r\n const maxPointsAwarded: number =\r\n adjudicationPricePreferenceCalculationFormula === '80(1-((totalBidPrice-Pmin)/(Pmin)))'\r\n ? 20\r\n : adjudicationPricePreferenceCalculationFormula === '90(1-((totalBidPrice-Pmin)/(Pmin)))'\r\n ? 10\r\n : 100;\r\n const dataModel = {\r\n submissions: this.enrichSubmissionsData(submissions || [],reviewValues, totalPossibleScore, maxPointsAwarded),\r\n loading: false,\r\n error: undefined,\r\n groupedScoreSheet,\r\n\r\n scoreSheetGroups: Object.keys(groupedScoreSheet).map(key => ({\r\n name: key.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/([A-Z])([A-Z][a-z])/g, '$1 $2'),\r\n key: key\r\n })),\r\n maxPointsAwarded,\r\n totalPossibleScore,\r\n columnMapping: columnMapping,\r\n displayCols: ['nameOfBidder',\r\n 'adjudicationPricePreferenceCalculation',\r\n 'adj_microFlow_pointsAwarded',\r\n 'adj_microFlow_pricePointCalculation',\r\n \r\n 'actions',\r\n 'adj_microFlow_supplierAppointed',\r\n ],\r\n displayColumns: [\r\n { label: 'name', formControlName: 'nameOfBidder', type: 'string' as any },\r\n { label: `${100 - maxPointsAwarded}`, formControlName: 'adjudicationPricePreferenceCalculation', type: 'number' as any },\r\n { label: `${maxPointsAwarded}`, formControlName: 'adj_microFlow_pointsAwarded', type: 'number' as any },\r\n { label: 'Total', formControlName: 'adj_microFlow_pricePointCalculation', type: 'number' as any },\r\n { label: '', formControlName: 'actions', type: 'actions' as any },\r\n { label: 'Appointed', formControlName: 'adj_microFlow_supplierAppointed', type: 'boolean' as any, showColor: true },\r\n \r\n\r\n ],\r\n }\r\n return {\r\n ...dataModel\r\n }\r\n }),\r\n startWith(this.initialState),\r\n catchError(() => {\r\n return of({ ...this.initialState, loading: false, error: 'Failed to load submissions.' });\r\n }),\r\n shareReplay(1)\r\n\r\n )\r\n viewMicroSubmission(res: any) {\r\n this.config.formBuilder['previewWorkflowDocument'](res.id);\r\n }\r\n\r\n enrichSubmissionsData(submissions: ISubmission[],value:any[] | null, totalPossibleScore: number, maxPointsAwarded: number): ISubmission[] {\r\n // 1. Handle edge cases first for clarity.\r\n \r\n // 2. Improve performance by creating a lookup map to avoid O(n^2) complexity.\r\n // This is much faster than using .find() inside a loop.\r\n const valueMap = new Map(this.value?.map(v => [v.id, v]) || []);\r\n const list = submissions.length > 0 ? submissions : value || [];\r\n // 3. First pass: Enrich submissions with calculated scores.\r\n const enrichedSubmissions = list.map(submission => {\r\n const value = valueMap.get(submission.id);\r\n\r\n // Use nullish coalescing (??) for cleaner fallback logic.\r\n const totalPoints = value?.['adj_microFlow_scoreSheetTotalPoints']\r\n ?? submission?.['adj_microFlow_scoreSheetTotalPoints']\r\n ?? 0;\r\n\r\n // Simplify calculation: remove unnecessary try-catch. Division by zero in JS results\r\n // in Infinity, not an error. The check for totalPossibleScore > 0 handles this.\r\n const pointsAwarded = totalPossibleScore > 0\r\n ? (totalPoints / totalPossibleScore) * maxPointsAwarded\r\n : 0;\r\n\r\n const pricePointCalculation = (submission['adjudicationPricePreferenceCalculation'] ?? 0) + pointsAwarded;\r\n\r\n return {\r\n ...submission,\r\n ...value,\r\n adj_microFlow_pointsAwarded: pointsAwarded,\r\n adj_microFlow_pricePointCalculation: pricePointCalculation,\r\n };\r\n });\r\n\r\n // 4. Define keys to process to avoid repetition (DRY principle).\r\n const keysToColor = [\r\n 'adj_microFlow_pricePointCalculation',\r\n\r\n ];\r\n\r\n // 5. Correctly build the number sets from the *newly enriched* data.\r\n const numberSets = new Map<string, number[]>();\r\n for (const key of keysToColor) {\r\n const values = enrichedSubmissions.map(s => Number(s[key] ?? 0));\r\n numberSets.set(key, values);\r\n }\r\n\r\n // 6. Second pass: Add colors and shades based on the complete dataset.\r\n return enrichedSubmissions.map(submission => {\r\n const colColors: Record<string, string> = {};\r\n const backgroundShades: Record<string, any> = { ...submission.backgroundShades };\r\n\r\n for (const key of keysToColor) {\r\n const scoreValue = submission[key];\r\n const allScores = numberSets.get(key) || [];\r\n const color = this.getColorString(scoreValue, allScores);\r\n\r\n colColors[key] = color;\r\n backgroundShades[key] = this.getScoreShade(color);\r\n }\r\n backgroundShades['adjudicationPricePreferenceCalculation'] = undefined;\r\n\r\n return {\r\n ...submission,\r\n colColors,\r\n backgroundShades,\r\n };\r\n });\r\n }\r\n\r\n private getScoreShade(rgbColor: string): string {\r\n if (!rgbColor) return '';\r\n return rgbColor.replace('rgb', 'rgba').replace(')', `, 0.1)`);\r\n }\r\n private getColorString(target: number, numbers: number[]): string {\r\n return getColorForNumber(target, numbers, true);\r\n }\r\n dialog = inject(MatDialog)\r\n openPointAssignmentDialog(row: any, groupedScoreSheet: Record<string, WorkflowAdjudicationScoreSheetValue[]> | undefined, scoreSheetGroups: {\r\n name: string;\r\n key: string;\r\n }[] | undefined): void {\r\n this.dialog.open(PointAssignmentDialogComponent, {\r\n\r\n height: 'fit-content',\r\n data: {\r\n row,\r\n groupedScoreSheet,\r\n scoreSheetGroups\r\n },\r\n autoFocus: false,\r\n disableClose: true\r\n }).afterClosed().pipe(\r\n take(1),\r\n switchMap((result: Record<string, Record<string, number>>) => {\r\n if (!result) return of(null);\r\n // Update the value with the new point assignments\r\n const assignment = Object.values(result).reduce((acc, curr) => {\r\n acc = {\r\n ...acc,\r\n ...curr\r\n }\r\n return acc;\r\n }, {} as Record<string, number>);\r\n row['adj_microFlow_assignedScore'] = assignment;\r\n const alreadyInValue = this.value?.find((v) => v.id === row.id);\r\n let newValue\r\n if (!alreadyInValue) {\r\n newValue = [...(this.value || []), {\r\n ...row,\r\n adj_microFlow_assignedScore: assignment,\r\n adj_microFlow_scoreSheetTotalPoints: Object.values(assignment).reduce((acc, curr) => acc + curr, 0)\r\n }];\r\n\r\n } else {\r\n newValue = this.value?.map((v) => {\r\n if (v.id === row.id) {\r\n return {\r\n ...v,\r\n adj_microFlow_scoreSheetTotalPoints: Object.values(assignment).reduce((acc, curr) => acc + curr, 0),\r\n adj_microFlow_assignedScore: assignment\r\n };\r\n }\r\n return v;\r\n }) || [];\r\n }\r\n\r\n\r\n return of(newValue);\r\n }),\r\n tap(\r\n (newValue) => {\r\n if (!newValue) return;\r\n this.supplierSelection.emit(newValue);\r\n },\r\n )\r\n )\r\n .subscribe();\r\n\r\n\r\n }\r\nappointASupplier(row: any): void {\r\n if(this.inputConfig?.readonly) {\r\n return;\r\n }\r\n if (row.adj_microFlow_supplierAppointed) {\r\n row.adj_microFlow_supplierAppointed = false;\r\n } else {\r\n row.adj_microFlow_supplierAppointed = true;\r\n }\r\n const alreadyInValue = this.value?.find((v) => v.id === row.id);\r\n let newValue\r\n if (!alreadyInValue) {\r\n const otherRows = this.value?.map(\r\n v=>({\r\n ...v,\r\n adj_microFlow_supplierAppointed: false\r\n })\r\n )\r\n newValue = [...(otherRows || []), row];\r\n } else {\r\n newValue = this.value?.map((v) => {\r\n if (v.id === row.id) {\r\n return {\r\n ...v,\r\n adj_microFlow_supplierAppointed: row.adj_microFlow_supplierAppointed\r\n };\r\n }\r\n return {\r\n ...v,\r\n adj_microFlow_supplierAppointed: false\r\n }\r\n }) || [];\r\n }\r\n if (newValue) {\r\n this.supplierSelection.emit(newValue);\r\n }\r\n}\r\n}\r\n","@if (vm$ | async; as vm) {\r\n<ng-container *ngIf=\"vm.loading; then loading; else (vm.error ? error : dataContainer)\"></ng-container>\r\n\r\n<ng-template #loading>\r\n <div style=\"display: flex; justify-content: center; align-items: center; padding:24px;width: 100%;\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n</ng-template>\r\n<ng-template #error>\r\n <div class=\"info-card error-card\">\r\n <h5 class=\"info-title\">❌ Failed to load data</h5>\r\n <p>{{ vm.error }}</p>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\">\r\n Try Again\r\n </button>\r\n </div>\r\n</ng-template>\r\n<ng-template #dataContainer>\r\n\r\n @if(vm.submissions.length === 0){\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">ℹ️ There are no submissions to display.</h5>\r\n <ul>\r\n <li>This can happen if <strong>no one has responded</strong> yet, or if <strong>none of the submission were\r\n compliant </strong>.</li>\r\n <li>If you are expecting to see submissions, try clicking the <strong>Refresh</strong> button.</li>\r\n </ul>\r\n <button mat-raised-button color=\"primary\" (click)=\"loadMicroSubmissions()\" class=\"load-button\">\r\n Refresh\r\n </button>\r\n </div>\r\n }@else {\r\n\r\n @if(!value || value.length === 0){\r\n\r\n <div class=\"info-card\">\r\n <h5 class=\"info-title\">📝 How to Appoint</h5>\r\n <ol>\r\n <li>\r\n <strong>View Response:</strong> Click the <strong>Preview</strong> (<mat-icon\r\n class=\"smallIcon\">preview</mat-icon>) icon to see the full submission.\r\n </li>\r\n <li>\r\n <strong>Appoint:</strong> Click the <strong>Appoint</strong> button to appoint the supplier.\r\n </li>\r\n \r\n </ol>\r\n </div>\r\n }\r\n <table mat-table [dataSource]=\"vm.submissions\">\r\n @for (col of vm.displayColumns; track col.formControlName) {\r\n <ng-container [matColumnDef]=\"col.formControlName\">\r\n <th mat-header-cell *matHeaderCellDef style=\"padding:4px\">\r\n {{ col.label }}\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\" mat-ripple class=\"table-cell\" (click)=\"$event.stopPropagation()\"\r\n [class.price-preference-cell]=\"true\" [style.border-bottom-color]=\"row.colColors[col.formControlName]\"\r\n [style.background]=\"row.backgroundShades?.[col.formControlName]\">\r\n @if(col.formControlName === 'actions'){\r\n <span style=\"display: flex; align-items: center;\">\r\n <button matTooltipPosition=\"before\"\r\n [matTooltip]=\"`View and review **` + row[vm.columnMapping.respondentNameKey]+ `** 's' Submission`\"\r\n (click)=\"viewMicroSubmission(row)\" mat-icon-button>\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n </span>\r\n }\r\n @else if(col.formControlName === 'adj_microFlow_supplierAppointed') {\r\n @if(row[col.formControlName] === true) {\r\n <button (click)=\"appointASupplier(row)\" mat-flat-button color=\"primary\">\r\n <mat-icon>\r\n check_circle\r\n </mat-icon>\r\n Appointed\r\n </button>\r\n }@else {\r\n <button (click)=\"appointASupplier(row)\" mat-stroked-button>\r\n Appoint\r\n </button>\r\n }\r\n\r\n }\r\n @else {\r\n @switch (col?.type) {\r\n @case ('daysAgo') {\r\n {{ row[col.formControlName] | daysAgo }}\r\n }\r\n @case ('number') {\r\n\r\n {{ (row[col.formControlName] | number:'0.0-0' ) || 'N/A' }}\r\n\r\n }\r\n @default {\r\n @if($index === 0) {\r\n <span class=\"main-submission-text\">\r\n <mat-icon style=\"font-size: 1em;height:16px;width:16px\">domain</mat-icon>\r\n <strong>\r\n {{ row[col.formControlName] }}\r\n </strong>\r\n </span>\r\n <span class=\"secondary-text\">\r\n <mat-icon>fingerprint</mat-icon>\r\n {{row[vm.columnMapping.respondentCodeKey]}}\r\n <mat-icon>more_time</mat-icon>\r\n {{ row[vm.columnMapping.responseDateKey ||''] | daysAgo}}\r\n </span>\r\n } @else {\r\n {{ row[col.formControlName] }}\r\n }\r\n }\r\n }\r\n }\r\n\r\n </td>\r\n </ng-container>\r\n }\r\n <tr mat-header-row *matHeaderRowDef=\"vm.displayCols\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: vm.displayCols\"></tr>\r\n </table>\r\n }\r\n</ng-template>\r\n}","import { Component, ElementRef, Input, Optional, Self } from '@angular/core';\r\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\r\nimport { AdjudicationSteps, FormBuilderFunctions, ITowerStepColumn, WorkflowAdjudicationMicroFlowReviewValue, WorkflowAdjudicationResponseElectedSupplierSelectionValue, WorkflowAdjudicationScoreSheetValue } from 'ngx-t-forms-types';\r\nimport { NgControl } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { PointsCreationComponent } from '../points-creation/points-creation.component';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { SubmissionReviewComponent } from '../submission-review/submission-review.component';\r\nimport { PointAssignmentComponent } from '../point-assignment/point-assignment.component';\r\nimport { SupplierSelectionComponent } from '../supplier-selection/supplier-selection.component';\r\nconst customInputConfig: BaseCustomInputConfig = {\r\n controlType: 'lib-workflow-adjudication-reactive-input',\r\n nextId: 0\r\n}\r\n\r\n@Component({\r\n selector: 'lib-workflow-adjudication-reactive-input',\r\n imports: [CommonModule,PointsCreationComponent,SubmissionReviewComponent,\r\n SupplierSelectionComponent,\r\n PointAssignmentComponent],\r\n templateUrl: './workflow-adjudication-reactive-input.component.html',\r\n styleUrl: './workflow-adjudication-reactive-input.component.css',\r\n host: {\r\n '[class.floating]': 'shouldLabelFloat',\r\n '[id]': 'id',\r\n },\r\n providers: [{ provide: MatFormFieldControl, useExisting: WorkflowAdjudicationReactiveInputComponent }],\r\n})\r\nexport class WorkflowAdjudicationReactiveInputComponent extends BaseCustomInput< \r\n WorkflowAdjudicationScoreSheetValue[]|\r\n WorkflowAdjudicationMicroFlowReviewValue[]|\r\n WorkflowAdjudicationResponseElectedSupplierSelectionValue> {\r\noverride get empty(): boolean {\r\n return this.value === null || this.value === undefined || Object.keys(this.value).length === 0;\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 }\r\n\r\n adjudicationSteps = AdjudicationSteps\r\n\r\n @Input() formBuilderFunctions: FormBuilderFunctions |undefined\r\n @Input() editorMode: boolean = false;\r\n\r\n _inputConfig!: ITowerStepColumn;\r\n\r\n @Input() set inputConfig(inputConfig:ITowerStepColumn){\r\n this._inputConfig = inputConfig\r\n\r\n }\r\n get inputConfig(): ITowerStepColumn {\r\n return this._inputConfig;\r\n }\r\n\r\n get shouldLabelFloat(): boolean {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n setValue(value: WorkflowAdjudicationScoreSheetValue[] | WorkflowAdjudicationMicroFlowReviewValue[] | WorkflowAdjudicationResponseElectedSupplierSelectionValue): void {\r\n this.value = value;\r\n this.onChange(value);\r\n this.onTouched();\r\n }\r\n\r\n}\r\n","@switch (inputConfig.adjudicationStep) {\r\n@case (adjudicationSteps.ScoreCreation) {\r\n<app-points-creation [inputConfig]=\"inputConfig\" [value]=\"value\" (pointsChange)=\"setValue($event)\">\r\n</app-points-creation>\r\n}\r\n@case (adjudicationSteps.SubMissionReview) {\r\n<app-submission-review [inputConfig]=\"inputConfig\" [value]=\"value\"\r\n (reviewChange)=\"setValue($event)\"></app-submission-review>\r\n}\r\n@case (adjudicationSteps.SupplierSelection) {\r\n<app-supplier-selection [inputConfig]=\"inputConfig\" [value]=\"value\"\r\n (supplierSelection)=\"setValue($event)\"></app-supplier-selection>\r\n}\r\n@case (adjudicationSteps.PointAssignment) {\r\n<app-point-assignment [inputConfig]=\"inputConfig\" [value]=\"value\"\r\n (pointsChange)=\"setValue($event)\"></app-point-assignment>\r\n}\r\n@default {\r\n<h6>\r\n {{ inputConfig.adjudicationStep | titlecase }} is not implemented yet.\r\n</h6>\r\n}\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\r\nimport { FormBuilderFunctions, ITowerStepColumn } from 'ngx-t-forms-types';\r\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\r\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\r\nimport { WorkflowAdjudicationReactiveInputComponent } from './elements/workflow-adjudication-reactive-input/workflow-adjudication-reactive-input.component';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'lib-workflow-adjudication',\r\n imports: [MatModulesModule, ReactiveFormsModule,\r\n CommonModule,\r\n WorkflowAdjudicationReactiveInputComponent,\r\n \r\n TFormInputStatusComponent,],\r\n templateUrl: './workflow-adjudication.component.html',\r\n styleUrl: './workflow-adjudication.component.css'\r\n})\r\nexport class WorkflowAdjudicationComponent {\r\n@Input() inputConfig!: ITowerStepColumn;\r\n @Input() editorMode: boolean = false; \r\n @Input() formGroup!: FormGroup;\r\n \r\n @Input() formBuilderFunctions: FormBuilderFunctions |undefined\r\n\r\n\r\n @Output() reload = new EventEmitter<void>();\r\n\r\n \r\n get errorMessage(){\r\n return getInputErrorMessage(this.inputConfig, this.formGroup);\r\n }\r\n}\r\n","<form [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" [floatLabel]=\"'always'\" subscriptSizing=\"dynamic\"\r\n *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n \r\n <lib-workflow-adjudication-reactive-input \r\n [inputConfig]=\"this.inputConfig\" \r\n [formControlName]=\"this.inputConfig.id\"\r\n [required]=\"this.inputConfig.required\"\r\n [formGroup]=\"formGroup\" \r\n [editorMode]=\"editorMode\"\r\n [formBuilderFunctions]=\"formBuilderFunctions\">\r\n\r\n </lib-workflow-adjudication-reactive-input>\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) {\r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</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 <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n\r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\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 </ng-container>\r\n\r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n\r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n\r\n\r\n </mat-form-field>","import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, ElementRef, EventEmitter, inject, Input, OnDestroy, Optional, Output, Self, ViewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { BaseCustomInput, BaseCustomInputConfig } from '../../../../../../services/core/t-input-controller/functions/baseCustomInput';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport { FormControl, NgControl, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { MatModulesModule } from '../../../../../../shared/modules/mat-modules.module';\nimport { FormatDataPipe } from '../../../../../../shared/pipes/format-Data.pipe';\nimport { DocumentLitsLabelConfigInterfaceValueType, FormColumnInputs, FormBuilderFunctions, InputDataTypes, InputPipeTypes, TreeNode } from 'ngx-t-forms-types';\nimport { _isEqual } from '../../../../../../shared/functions/isEqual';\nimport { fuzzySearch } from '../../../../../../shared/functions/fuzzyTextSearch';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { MatSort } from '@angular/material/sort';\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs';\nimport { returnMappedPathValue } from '../../../../../../services/core/t-form-section-controller/Functions/getValueFromPathMap';\n\n/** Max rows to sample for type inference - balances accuracy vs performance */\nconst TYPE_INFER_SAMPLE_SIZE = 5;\n\ntype InferredColType = DocumentLitsLabelConfigInterfaceValueType | InputDataTypes | InputPipeTypes | undefined;\nconst customInputConfig: BaseCustomInputConfig = {\n controlType: 'lib-paginated-selection-table-reactive-input',\n nextId: 0,\n};\n@Component({\n selector: 'lib-paginated-selection-table-reactive-input',\n imports: [CommonModule, ReactiveFormsModule, MatModulesModule, FormatDataPipe],\n templateUrl: './paginated-selection-table-reactive-input.html',\n styleUrl: './paginated-selection-table-reactive-input.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.floating]': 'shouldLabelFloat',\n '[id]': 'id',\n },\n providers: [{ provide: MatFormFieldControl, useExisting: PaginatedSelectionTableReactiveInput }],\n})\nexport class PaginatedSelectionTableReactiveInput extends BaseCustomInput<unknown | unknown[]> implements AfterViewInit, OnDestroy {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly destroyRef = inject(DestroyRef);\n\n @ViewChild(MatSort) sort!: MatSort;\n @ViewChild(MatPaginator) paginator!: MatPaginator;\n\n override get empty(): boolean {\n const n = this.value;\n if (n === null || n === undefined) return true;\n if (this.isMultiSelect) {\n return Array.isArray(n) && n.length === 0;\n }\n return n === '';\n }\n get shouldLabelFloat(): boolean {\n return true;\n }\n readonly searchFormControl = new FormControl('');\n\n constructor(\n @Optional() @Self() ngControl: NgControl,\n elementRef: ElementRef<HTMLElement>\n ) {\n super(ngControl, elementRef, customInputConfig);\n this.setupFuzzyFilterPredicate();\n this.setupSearchSubscription();\n }\n readonly dataSource: MatTableDataSource<Record<string, any>> = new MatTableDataSource<Record<string, any>>([]);\n private _inputConfig: FormColumnInputs | undefined;\n /** Cached inferred column types from data - recomputed only when data changes */\n private _inferredColumnTypes: Record<string, InferredColType> = {};\n private _lastInferredDataRef: Record<string, any>[] | null = null;\n private _columnsCacheDirty = true;\n private _cachedColumns: Array<{ key: string; label: string; id?: string; type?: InferredColType }> = [];\n private _cachedDisplayedColumns: string[] = [];\n private _cachedSortActiveColumn = '';\n @Input() formBuilderFunctions: FormBuilderFunctions | undefined;\n @Input() canReload: boolean = false;\n @Input() loading: boolean = false;\n @Input() searchPlaceholder = 'Search items…';\n @Input() emptyMessage = 'No items found';\n @Input() set inputConfig(value: FormColumnInputs | undefined) {\n if (_isEqual(this._inputConfig, value)) return;\n const prevMatOptions = this._inputConfig?.matOptions?.options;\n const nextMatOptions = value?.matOptions?.options;\n const matOptionsChanged = !_isEqual(prevMatOptions, nextMatOptions);\n this._inputConfig = value;\n this._columnsCacheDirty = true;\n if (matOptionsChanged) {\n this.scheduleLoadInputData();\n }\n }\n @Output() reloadData = new EventEmitter<void>();\n get inputConfig(): FormColumnInputs | undefined {\n return this._inputConfig;\n }\n get getSelectOptions(): any {\n if (!this.inputConfig?.matOptions) return [];\n if (Array.isArray(this.inputConfig.matOptions?.options)) {\n return this.inputConfig.matOptions?.options || [];\n }\n return [];\n }\n\n private ensureColumnsCache(): void {\n if (!this._columnsCacheDirty) return;\n this._columnsCacheDirty = false;\n this._cachedColumns = this.computeColumns();\n this._cachedDisplayedColumns = this._cachedColumns.map(c => c.key);\n this._cachedSortActiveColumn = this._cachedDisplayedColumns.find(c => c !== 'icons' && c !== 'actions') ?? '';\n }\n\n private computeColumns(): Array<{ key: string; label: string; id?: string; type?: InferredColType }> {\n const configColumns = this.inputConfig?.paginationSelectionConfig?.columns;\n const options = this.getSelectOptions;\n let dataColumns: Array<{ key: string; label: string; id?: string; type?: InferredColType }>;\n if ((!configColumns || !Array.isArray(configColumns) || configColumns.length === 0) && Array.isArray(options)) {\n const allKeys = options.flatMap((option: Record<string, unknown>) => Object.keys(option));\n const uniqueKeys = [...new Set(allKeys)].filter(k => k !== 'icons' && k !== 'actions');\n dataColumns = uniqueKeys.map(key => ({\n key,\n label: key,\n id: key,\n type: this._inferredColumnTypes[key],\n }));\n } else {\n dataColumns = (configColumns || []).filter((c: { key?: string }) => c.key !== 'icons' && c.key !== 'actions').map((c: { key?: string; label?: string; id?: string; type?: InferredColType }) => ({\n key: c.key!,\n label: c.label ?? c.key ?? '',\n id: c.id ?? c.key,\n type: c.type ?? this._inferredColumnTypes[c.key!],\n }));\n }\n return [\n { key: 'icons', label: '', id: 'icons' },\n ...dataColumns,\n { key: 'actions', label: '', id: 'actions' },\n ];\n }\n\n get columns(): Array<{ key: string; label: string; id?: string; type?: InferredColType }> {\n this.ensureColumnsCache();\n return this._cachedColumns;\n }\n\n get displayedColumns(): string[] {\n this.ensureColumnsCache();\n return this._cachedDisplayedColumns;\n }\n\n /** First sortable column for initial matSort state (excludes icons/actions) */\n get sortActiveColumn(): string {\n this.ensureColumnsCache();\n return this._cachedSortActiveColumn;\n }\n private _loadScheduled = false;\n private _destroyed = false;\n private _connectTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\n /** Defer data load until after current CD cycle completes (prevents ExpressionChanged errors\n * in parent FormSectionStepper when sectionFormErrorMessage changes as form validation updates). */\n private scheduleLoadInputData(): void {\n if (this._loadScheduled) return;\n this._loadScheduled = true;\n Promise.resolve().then(() => {\n this._loadScheduled = false;\n if (!this._destroyed) this.loadInputData();\n });\n }\n\n loadInputData(): void {\n const options = this.getSelectOptions;\n if (Array.isArray(options) && options.every(option => typeof option === 'object' && option !== null)) {\n this.dataSource.data = options;\n this.inferColumnTypesFromData();\n this.attachSortAndPaginatorAfterViewReady();\n this.cdr.markForCheck();\n } else {\n this.dataSource.data = [];\n this.clearInferredCache();\n this.errorMessage = 'Invalid options format';\n this.cdr.markForCheck();\n }\n }\n\n /** Connects sort and paginator to dataSource. Deferred because table/paginator are inside @if. */\n private attachSortAndPaginatorAfterViewReady(): void {\n if (this._connectTimeoutId != null) return;\n this._connectTimeoutId = setTimeout(() => {\n this._connectTimeoutId = null;\n if (this.sort && this.dataSource.sort !== this.sort) {\n this.dataSource.sort = this.sort;\n }\n if (this.paginator && this.dataSource.paginator !== this.paginator) {\n this.dataSource.paginator = this.paginator;\n }\n // Avoid markForCheck() here - it triggers full-tree CD that re-evaluates parent's\n // sectionFormErrorMessage mid-cycle, causing ExpressionChangedAfterItHasBeenCheckedError.\n // MatTableDataSource propagates sort/paginator changes; view updates on next CD.\n }, 0);\n }\n\n /** Clear cached references to prevent memory leaks. */\n private clearInferredCache(): void {\n this._inferredColumnTypes = {};\n this._lastInferredDataRef = null;\n this._columnsCacheDirty = true;\n }\n\n /** Filter predicate using fuzzy search on all stringifiable row values. */\n private setupFuzzyFilterPredicate(): void {\n this.dataSource.filterPredicate = (row: Record<string, any>, filter: string): boolean => {\n const term = filter?.trim();\n if (!term) return true;\n if (typeof row !== 'object' || row === null) return false;\n return Object.values(row).some((value) => {\n if (value == null) return false;\n const text = typeof value === 'string' ? value : String(value);\n return fuzzySearch(term, text);\n });\n };\n }\n\n private setupSearchSubscription(): void {\n this.searchFormControl.valueChanges.pipe(\n debounceTime(300),\n map((term) => term?.trim() ?? ''),\n distinctUntilChanged((a, b) => a === b),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe((filter) => {\n this.dataSource.filter = filter;\n this.dataSource.paginator?.firstPage();\n this.cdr.markForCheck();\n });\n }\n\n clearSearch(): void {\n this.searchFormControl.setValue('');\n }\n\n /**\n * Infers column types from data source by sampling first N rows.\n * Cached per data reference to avoid recomputation on every change detection.\n */\n private inferColumnTypesFromData(): void {\n const data = this.dataSource.data;\n if (data === this._lastInferredDataRef) return;\n\n if (data.length === 0) {\n this.clearInferredCache();\n return;\n }\n this._lastInferredDataRef = data;\n\n const sampleSize = Math.min(TYPE_INFER_SAMPLE_SIZE, data.length);\n const keys = Object.keys(data[0] ?? {});\n\n for (const key of keys) {\n if (key === 'icons' || key === 'actions') continue;\n\n let inferred: InferredColType = undefined;\n for (let i = 0; i < sampleSize; i++) {\n const v = data[i]?.[key];\n if (v === null || v === undefined) continue;\n inferred = this.inferValueType(v);\n break;\n }\n this._inferredColumnTypes[key] = inferred;\n }\n this._columnsCacheDirty = true;\n }\n\n /** Lightweight single-value type inference for formatData pipe compatibility */\n private inferValueType(v: unknown): InferredColType {\n if (typeof v === 'boolean') return InputDataTypes.Boolean;\n if (Array.isArray(v)) return InputDataTypes.Array;\n if (typeof v === 'object' && v !== null) {\n return v instanceof Date ? DocumentLitsLabelConfigInterfaceValueType.date : InputDataTypes.Object;\n }\n if (typeof v === 'number' && !Number.isNaN(v)) return DocumentLitsLabelConfigInterfaceValueType.number;\n if (typeof v === 'string') {\n const trimmed = v.trim();\n if (trimmed === '') return undefined;\n const num = Number(trimmed);\n if (!Number.isNaN(num)) return DocumentLitsLabelConfigInterfaceValueType.number;\n const d = new Date(v);\n if (!Number.isNaN(d.getTime())) return DocumentLitsLabelConfigInterfaceValueType.date;\n }\n return undefined;\n }\n get isMultiSelect(): boolean {\n return this.inputConfig?.allowMultipleSelection ?? false;\n }\n get primaryIdentifierKey(): TreeNode[] | string | undefined {\n\n return this.inputConfig?.paginationSelectionConfig?.primaryIdentifierKey;\n }\n\n /** Returns the row identifier: uses returnMappedPathValue when primaryIdentifierKey is set, else fallback to _id/id. */\n getRowId(row: Record<string, any>): unknown {\n const pk = this.primaryIdentifierKey;\n if (pk != null && pk !== '') {\n return returnMappedPathValue(pk as TreeNode[], row);\n }\n return row['_id'] ?? row['id'];\n }\n\n /** Builds a minimal row object from an id for fallback when the row is not in dataSource (e.g. from radio value). */\n private buildFallbackRowFromId(id: unknown): Record<string, any> {\n const pk = this.primaryIdentifierKey;\n if (!pk || !Array.isArray(pk) || pk.length === 0) {\n return { _id: id, id };\n }\n let obj: Record<string, any> = {};\n let current: Record<string, any> = obj;\n for (let i = 0; i < pk.length; i++) {\n const node = pk[i];\n const key = typeof node === 'object' && node != null && node.key != null ? String(node.key) : String(node);\n const isLast = i === pk.length - 1;\n if (isLast) {\n current[key] = id;\n } else {\n current[key] = {};\n current = current[key];\n }\n }\n return obj;\n }\n\n getSelectedIds(): unknown[] {\n const v = this.value;\n return Array.isArray(v) ? v : (v ? [v] : []);\n }\n\n isRowSelected(row: Record<string, any>): boolean {\n const id = this.getRowId(row);\n return this.getSelectedIds().includes(id);\n }\n\n onRadioChange(event: { value: string }): void {\n const id = event?.value;\n if (id == null) return;\n const row = this.dataSource.data.find((r) => this.getRowId(r) == id);\n this.selectRow(row ?? this.buildFallbackRowFromId(id));\n }\n\n /** Handle click on radio: if already selected, deselect (radios don't fire change when re-clicked). */\n onRadioClick(row: Record<string, any>, event: MouseEvent): void {\n if (this.isRowSelected(row)) {\n event.preventDefault();\n event.stopPropagation();\n this.selectRow(row);\n }\n }\n\n\n selectRow(row: Record<string, any>): void {\n const id = this.getRowId(row);\n console.error('id', id)\n if (this.isMultiSelect) {\n const ids = [...this.getSelectedIds()];\n const idx = ids.indexOf(id);\n if (idx >= 0) {\n ids.splice(idx, 1);\n } else {\n ids.push(id);\n }\n this.value = ids.length ? ids : null;\n this.onChange(this.value);\n this.onTouched();\n this.cdr.markForCheck();\n return;\n }\n\n const isDeselecting = id === this.value;\n this.value = isDeselecting ? undefined : id;\n this.onChange(this.value);\n this.onTouched();\n this.cdr.markForCheck();\n }\n\n ngAfterViewInit(): void {\n this.attachSortAndPaginatorAfterViewReady();\n }\n\n override ngOnDestroy(): void {\n this._destroyed = true;\n this._loadScheduled = false;\n if (this._connectTimeoutId != null) {\n clearTimeout(this._connectTimeoutId);\n this._connectTimeoutId = null;\n }\n this.clearInferredCache();\n this.dataSource.data = [];\n super.ngOnDestroy();\n }\n reload(): void {\n this.reloadData.emit();\n }\n}\n","\n<mat-card class=\"doc-picker-card\">\n @if (!inputConfig?.disabled && !inputConfig?.readonly) {\n <header class=\"doc-picker-header\">\n <div class=\"doc-picker-toolbar\">\n <mat-form-field subscriptSizing=\"dynamic\" class=\"doc-picker-search\">\n <input matInput [placeholder]=\"searchPlaceholder\" [formControl]=\"searchFormControl\"\n [attr.aria-label]=\"searchPlaceholder\">\n @if (searchFormControl.value) {\n <button mat-icon-button matSuffix (click)=\"clearSearch()\" type=\"button\"\n aria-label=\"Clear search\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon matSuffix>search</mat-icon>\n }\n </mat-form-field>\n @if (isMultiSelect && getSelectedIds().length > 0) {\n <span class=\"doc-picker-selection-badge\" role=\"status\" aria-live=\"polite\">\n {{ getSelectedIds().length }} selected\n </span>\n }\n </div>\n </header>\n }\n @if (loading) {\n <div class=\"doc-picker-loading\">\n <mat-spinner [diameter]=\"40\" aria-label=\"Loading items\"></mat-spinner>\n </div>\n } @else {\n <div class=\"doc-picker-body\">\n @if (!inputConfig?.disabled && !inputConfig?.readonly && !value) {\n <div class=\"doc-picker-helper\">\n <mat-icon class=\"doc-picker-helper-icon\" color=\"primary\">info</mat-icon>\n <span><strong>{{ isMultiSelect ? 'Select items' : 'Select an item' }}</strong> — Sort or use pagination to find {{ isMultiSelect ? 'them' : 'it' }}, then {{ isMultiSelect ? 'check the box' : 'select the radio' }} to select {{ isMultiSelect ? 'them' : 'it' }}.</span>\n </div>\n }\n @if (dataSource.filteredData.length === 0) {\n <div class=\"doc-picker-empty\">\n <mat-icon>folder_open</mat-icon>\n <span>{{ emptyMessage }}</span>\n @if (canReload) {\n <button mat-stroked-button color=\"primary\" (click)=\"reload()\" class=\"doc-picker-retry\"\n aria-label=\"Retry loading items\">\n <mat-icon>refresh</mat-icon>\n Retry\n </button>\n }\n </div>\n }\n @if (dataSource.filteredData.length > 0 && columns.length > 0) {\n @if (isMultiSelect) {\n <div class=\"doc-picker-table-wrapper\">\n <table mat-table [dataSource]=\"dataSource\" class=\"doc-picker-table\"\n [matSortActive]=\"sortActiveColumn\" matSortDisableClear matSortDirection=\"asc\"\n matSort role=\"grid\" aria-label=\"Selection list\">\n @for (col of columns; track col.key) {\n <ng-container [matColumnDef]=\"col.key\" [stickyEnd]=\"$last\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header\n [disabled]=\"col.key === 'icons' || col.key === 'actions'\"\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\n [class.doc-picker-col-icons]=\"col.key === 'icons'\"\n [class.doc-picker-col-actions]=\"col.key === 'actions'\"\n [class.doc-picker-col-text]=\"col.key !== 'icons' && col.key !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\n \n @if(col.key === 'actions' && canReload){\n <button mat-icon-button\n matTooltip=\"Click to refresh this field.\"\n class=\"doc-picker-refresh doc-picker-refresh-spacing\"\n (click)=\"reload()\"\n aria-label=\"Refresh list\">\n <mat-icon class=\"doc-picker-refresh-icon\">sync</mat-icon>\n </button>\n } @else {\n {{ col.label }}\n }\n \n </th>\n <td mat-cell *matCellDef=\"let row\"\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\n [class.doc-picker-col-icons]=\"col.key === 'icons'\"\n [class.doc-picker-col-actions]=\"col.key === 'actions'\"\n [class.doc-picker-col-text]=\"col.key !== 'icons' && col.key !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\n @if (col.key === 'icons') {\n <mat-icon class=\"doc-picker-row-icon\">description</mat-icon>\n } @else if (col.key === 'actions') {\n <mat-checkbox\n [checked]=\"isRowSelected(row)\"\n [disabled]=\"!!inputConfig?.disabled || !!inputConfig?.readonly\"\n (change)=\"selectRow(row)\"\n [matTooltip]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? row['name'] ?? 'item')\"\n matTooltipPosition=\"below\"\n [attr.aria-label]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? row['name'] ?? 'item')\">\n </mat-checkbox>\n } @else {\n <span class=\"doc-picker-cell-value doc-picker-cell-text\"\n [class.doc-picker-cell-selected]=\"isRowSelected(row)\"\n [matTooltip]=\"row[col.key] | formatData:col.type\"\n matTooltipPosition=\"above\">\n {{ row[col.key] | formatData:col.type }}\n </span>\n }\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row class=\"doc-picker-row\" *matRowDef=\"let row; columns: displayedColumns;\"\n [class.doc-picker-row-selected]=\"isRowSelected(row)\"\n [attr.aria-label]=\"'Row: ' + (row['reference'] ?? row['name'] ?? 'item')\"\n [attr.aria-selected]=\"isRowSelected(row)\"></tr>\n </table>\n </div>\n } @else {\n <mat-radio-group [value]=\"value\" (change)=\"onRadioChange($event)\" class=\"doc-picker-radio-group\">\n <div class=\"doc-picker-table-wrapper\">\n <table mat-table [dataSource]=\"dataSource\" class=\"doc-picker-table\"\n [matSortActive]=\"sortActiveColumn\" matSortDisableClear matSortDirection=\"asc\"\n matSort role=\"grid\" aria-label=\"Selection list\">\n @for (col of columns; track col.key) {\n <ng-container [matColumnDef]=\"col.key\" [stickyEnd]=\"$last\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header\n [disabled]=\"col.key === 'icons' || col.key === 'actions'\"\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\n [class.doc-picker-col-icons]=\"col.key === 'icons'\"\n [class.doc-picker-col-actions]=\"col.key === 'actions'\"\n [class.doc-picker-col-text]=\"col.key !== 'icons' && col.key !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\n @if (col.key === 'actions' && canReload) {\n <button mat-icon-button\n matTooltip=\"Click to refresh this field.\"\n class=\"doc-picker-refresh doc-picker-refresh-spacing\"\n (click)=\"reload()\"\n aria-label=\"Refresh list\">\n <mat-icon class=\"doc-picker-refresh-icon\">sync</mat-icon>\n </button>\n } @else {\n {{ col.label }}\n }\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [class.text-right-align]=\"col.type === 'currency' || col.type === 'number'\"\n [class.doc-picker-col-icons]=\"col.key === 'icons'\"\n [class.doc-picker-col-actions]=\"col.key === 'actions'\"\n [class.doc-picker-col-text]=\"col.key !== 'icons' && col.key !== 'actions' && col.type !== 'currency' && col.type !== 'number'\"\n [class.doc-picker-col-numeric]=\"col.type === 'currency' || col.type === 'number'\">\n @if (col.key === 'icons') {\n <mat-icon class=\"doc-picker-row-icon\">description</mat-icon>\n } @else if (col.key === 'actions') {\n <mat-radio-button\n [value]=\"getRowId(row)\"\n [disabled]=\"!!inputConfig?.disabled || !!inputConfig?.readonly\"\n (click)=\"onRadioClick(row, $event)\"\n [matTooltip]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? row['name'] ?? 'item')\"\n matTooltipPosition=\"below\"\n [attr.aria-label]=\"isRowSelected(row) ? 'Clear selection' : 'Select ' + (row['reference'] ?? row['name'] ?? 'item')\">\n </mat-radio-button>\n } @else {\n <span class=\"doc-picker-cell-value doc-picker-cell-text\"\n [class.doc-picker-cell-selected]=\"isRowSelected(row)\"\n [matTooltip]=\"row[col.key] | formatData:col.type\"\n matTooltipPosition=\"above\">\n {{ row[col.key] | formatData:col.type }}\n </span>\n }\n </td>\n </ng-container>\n }\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row class=\"doc-picker-row\" *matRowDef=\"let row; columns: displayedColumns;\"\n [class.doc-picker-row-selected]=\"isRowSelected(row)\"\n [attr.aria-label]=\"'Row: ' + (row['reference'] ?? row['name'] ?? 'item')\"\n [attr.aria-selected]=\"isRowSelected(row)\"></tr>\n </table>\n </div>\n </mat-radio-group>\n }\n }\n </div>\n }\n @if (!inputConfig?.disabled && !inputConfig?.readonly && dataSource.filteredData.length > 0 && !loading) {\n <mat-paginator [pageSizeOptions]=\"[5, 10, 25, 50]\"\n [pageSize]=\"5\"\n [length]=\"dataSource.filteredData.length\"\n showFirstLastButtons\n aria-label=\"Selection list pagination\" class=\"doc-picker-paginator\"></mat-paginator>\n }\n</mat-card>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormControl, FormGroup, FormGroupDirective, NgForm, ReactiveFormsModule } from '@angular/forms';\nimport { MatModulesModule } from '../../../../shared/modules/mat-modules.module';\nimport { CommonModule } from '@angular/common';\nimport { ITowerStepColumn } from \"ngx-t-forms-types\";\nimport { ErrorStateMatcher } from '@angular/material/core';\nimport { getInputErrorMessage } from '../../../../services/core/t-input-controller/functions/inputErrorMessage';\nimport { TFormInputStatusComponent } from '../../../t-form-input-status/t-form-input-status.component';\nimport { PaginatedSelectionTableReactiveInput } from './elements/paginated-selection-table-reactive-input/paginated-selection-table-reactive-input';\n\n@Component({\n selector: 'lib-paginated-selection-table',\n imports: [\n CommonModule,\n MatModulesModule,\n ReactiveFormsModule,\n TFormInputStatusComponent,\n PaginatedSelectionTableReactiveInput,\n ],\n templateUrl: './paginated-selection-table.html',\n styleUrl: './paginated-selection-table.css',\n})\nexport class PaginatedSelectionTable {\n @Input() inputConfig!: ITowerStepColumn;\n @Input() formGroup!: FormGroup;\n\n @Output() reload = new EventEmitter<void>();\n\n get errorMessage() {\n return getInputErrorMessage(this.inputConfig, this.formGroup);\n }\n\n errorStateMatcher = new class implements ErrorStateMatcher {\n isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {\n return !!(control && control.invalid && (control.dirty || control.touched));\n }\n }\n}","<ng-container [formGroup]=\"formGroup\">\r\n <mat-form-field [appearance]=\"this.inputConfig.appearance ||'fill' \" subscriptSizing=\"dynamic\"\r\n *ngIf=\"this.inputConfig as inputConfig\">\r\n <mat-label>\r\n {{this.inputConfig.label }}\r\n <lib-t-form-input-status [inputConfig]=\"this.inputConfig\"></lib-t-form-input-status>\r\n </mat-label>\r\n \r\n <lib-paginated-selection-table-reactive-input [inputConfig]=\"this.inputConfig\"\r\n [disabled]=\"!!this.inputConfig.disabled\"\r\n [required]=\"this.inputConfig.required\"\r\n [canReload]=\"!!this.inputConfig.canReload.canReload || false\"\r\n (reloadData)=\"this.inputConfig.canReload.emit()\"\r\n [formControlName]=\"this.inputConfig.id\">\r\n </lib-paginated-selection-table-reactive-input>\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 \r\n <mat-error class=\"oneLineTextEllipsis\" matTooltipClass=\"errorToolTip\">{{errorMessage}}</mat-error>\r\n \r\n \r\n <!-- Prefix Icon -->\r\n <mat-icon *ngIf=\"inputConfig.prefixIcon\" matPrefix>{{ inputConfig.prefixIcon }}</mat-icon>\r\n \r\n <!-- Suffix Icon or Password Visibility Toggle -->\r\n <ng-container *ngIf=\"inputConfig.suffixIcon\">\r\n <mat-icon *ngIf=\"inputConfig.id !== 'password'\" matSuffix>{{ inputConfig.suffixIcon\r\n }}</mat-icon>\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 </ng-container>\r\n \r\n <!-- Prefix & Suffix Text -->\r\n <span *ngIf=\"inputConfig.prefixText\" matPrefix style=\"top: 0\">{{ inputConfig.prefixText }}</span>\r\n <span *ngIf=\"inputConfig.suffixText\" matSuffix style=\"padding-left: 5px\">{{ inputConfig.suffixText\r\n }}</span>\r\n \r\n <!-- Character Count Hint -->\r\n <mat-hint *ngIf=\"inputConfig.maxLength && formGroup\" align=\"end\">\r\n {{ (formGroup.controls[inputConfig.id]?.value?.length || 0) + '/' + inputConfig.maxLength\r\n }}\r\n </mat-hint>\r\n \r\n \r\n \r\n </mat-form-field>\r\n </ng-container>\r\n ","import { Component, Inject, Input, Optional } from '@angular/core';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\n\r\n\r\nimport { CommonModule } from '@angular/common';\r\n\r\n\r\nimport { MatModulesModule } from '../../shared/modules/mat-modules.module';\r\nimport { ElementTypes, ITowerStepColumn } from \"ngx-t-forms-types\";\r\nimport { SectionTitleComponent } from './elements/section-title/section-title.component';\r\nimport { AutoCompleteInputElementComponent } from './elements/auto-complete-input-element/auto-complete-input-element.component';\r\nimport { ToggleInputElementComponent } from './elements/toggle-input-element/toggle-input-element.component';\r\nimport { SelectInputElementComponent } from './elements/select-input-element/select-input-element.component';\r\nimport { TextareaInputElementComponent } from './elements/textarea-input-element/textarea-input-element.component';\r\nimport { DateRangePickerInputElementComponent } from './elements/date-range-picker-input-element/date-range-picker-input-element.component';\r\nimport { DatePickerInputElementComponent } from './elements/date-picker-input-element/date-picker-input-element.component';\r\nimport { FileUploadInputElementComponent } from './elements/file-upload-input-element/file-upload-input-element.component';\r\n//import { ImageCaptureInputElementComponent } from './elements/image-capture-input-element/image-capture-input-element.component';\r\nimport { EditorInputElementComponent } from './elements/editor-input-element/editor-input-element.component';\r\nimport { SignatureInputElementComponent } from './elements/signature-input-element/signature-input-element.component';\r\nimport { BasicInputInputElementComponent } from './elements/basic-input-input-element/basic-input-input-element.component';\r\nimport { MultipleInputInputElementComponent } from './elements/multiple-input-input-element/multiple-input-input-element.component';\r\nimport { FormBuilderFunctions } from 'ngx-t-forms-types';\r\nimport { MscoaFormInputComponent } from './elements/mscoa-form-input/mscoa-form-input.component';\r\nimport { GeoLocationComponent } from './elements/Geo-location-form-input/geo-location.component';\r\nimport { ImageCaptureInputElementComponent } from './elements/image-capture-input-element/image-capture-input-element.component';\r\n\r\n\r\nimport { DocumentPickerComponent } from './elements/document-picker/document-picker.component';\r\nimport { WorkflowAdjudicationComponent } from './elements/workflow-adjudication/workflow-adjudication.component';\r\nimport { PaginatedSelectionTable } from './elements/paginated-selection-table/paginated-selection-table';\r\n\r\n\r\n\r\n@Component({\r\n selector: 'lib-t-form-input',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MscoaFormInputComponent,\r\n MatModulesModule,\r\n SectionTitleComponent,\r\n GeoLocationComponent,\r\n AutoCompleteInputElementComponent,\r\n ToggleInputElementComponent,\r\n SelectInputElementComponent,\r\n TextareaInputElementComponent,\r\n DateRangePickerInputElementComponent,\r\n DatePickerInputElementComponent,\r\n FileUploadInputElementComponent,\r\n //REVIEW - check circular dependency error for ImageCaptureInputElementComponent\r\n // ImageCaptureInputElementComponent,\r\n EditorInputElementComponent,\r\n SignatureInputElementComponent,\r\n MultipleInputInputElementComponent,\r\n BasicInputInputElementComponent,\r\n ImageCaptureInputElementComponent,\r\n DocumentPickerComponent,\r\n WorkflowAdjudicationComponent,\r\n PaginatedSelectionTable,\r\n ],\r\n templateUrl: './t-form-input.component.html',\r\n styleUrl: './t-form-input.component.css',\r\n //TODO - check if changeDetection: ChangeDetectionStrategy.OnPush is needed\r\n // changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class TFormInputComponent {\r\n @Input() inputConfig: ITowerStepColumn | undefined\r\n @Input() formGroup!: FormGroup<{\r\n [sectionId: string]: FormGroup<{\r\n [inputId: string]: FormControl<string | null>\r\n }>\r\n }> | undefined | null\r\n @Input() editorMode: boolean = false\r\n @Input() formBuilderFunctions: FormBuilderFunctions | undefined\r\n\r\n optionsSearchWordKeyWord!: string;\r\n elementTypes = ElementTypes\r\n constructor(@Optional() @Inject('COMPONENT_PROPS') private props: any) {\r\n // Apply props from portal injection if available\r\n if (this.props) {\r\n Object.keys(this.props).forEach(key => {\r\n\r\n (this as any)[key] = this.props[key];\r\n\r\n });\r\n }\r\n }\r\n get hasFormControlInstance(): boolean {\r\n // Early return if basic requirements aren't met\r\n if (!this.formGroup || !this.inputConfig) return false;\r\n\r\n const { id } = this.inputConfig || {};\r\n const isDateRangePicker = this.inputConfig?.element === ElementTypes.DateRangePicker\r\n if (isDateRangePicker) {\r\n return !!this.formGroup.controls[`${this.inputConfig.id}.${this.inputConfig.startDateControl}`] && !!this.formGroup.controls[`${this.inputConfig.id}.${this.inputConfig.endDateControl}`]\r\n }\r\n\r\n\r\n // Handle standard form control case\r\n return !!this.formGroup.controls[id]\r\n }\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n}\r\n\r\n","@if(inputConfig ){\r\n\r\n@if(inputConfig.element === elementTypes.SectionTitle){\r\n<lib-section-title [inputConfig]=\"inputConfig\"></lib-section-title>\r\n}\r\n\r\n@if(inputConfig.element !== elementTypes.SectionTitle && !!formGroup && !!hasFormControlInstance){\r\n@switch (inputConfig.element) {\r\n@case (elementTypes.Location) {\r\n<lib-geo-location [editorMode]=\"editorMode\" [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\"\r\n [formBuilderFunctions]=\"formBuilderFunctions\">\r\n</lib-geo-location>\r\n}\r\n<!-- @case (elementTypes.QrCodeScanner) {\r\n <lib-qr-code-scanner-element \r\n [inputConfig]=\"inputConfig\" \r\n [formGroup]=\"formGroup\" \r\n \r\n (valueChange)=\"changed($event)\">\r\n </lib-qr-code-scanner-element>\r\n } -->\r\n@case (elementTypes.AutoCompleteInput) {\r\n<lib-auto-complete-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\" >\r\n</lib-auto-complete-input-element>\r\n}\r\n@case (elementTypes.Toggle) {\r\n<lib-toggle-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\">\r\n</lib-toggle-input-element>\r\n\r\n\r\n}\r\n@case (elementTypes.Select) {\r\n<lib-select-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\">\r\n</lib-select-input-element>\r\n}\r\n@case (elementTypes.Textarea) {\r\n<lib-textarea-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\">\r\n</lib-textarea-input-element>\r\n}\r\n@case (elementTypes.DateRangePicker) {\r\n<lib-date-range-picker-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\">\r\n</lib-date-range-picker-input-element>\r\n}\r\n@case (elementTypes.DatePicker){\r\n<lib-date-picker-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\">\r\n</lib-date-picker-input-element>\r\n}\r\n@case (elementTypes.FileUpload) {\r\n<lib-file-upload-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\">\r\n</lib-file-upload-input-element>\r\n\r\n}\r\n@case (elementTypes.ImageCapture) {\r\n<lib-image-capture-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\"></lib-image-capture-input-element>\r\n\r\n}\r\n@case (elementTypes.Editor) {\r\n<lib-editor-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\">\r\n</lib-editor-input-element>\r\n}\r\n@case (elementTypes.Signature) {\r\n<lib-signature-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\">\r\n</lib-signature-input-element>\r\n}\r\n\r\n@case (elementTypes.MultipleInput) {\r\n<lib-multiple-input-input-element [editorMode]=\"editorMode\" [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\"\r\n [formBuilderFunctions]=\"formBuilderFunctions\">\r\n</lib-multiple-input-input-element>\r\n\r\n\r\n}\r\n@case (elementTypes.MscoaSelection) {\r\n<lib-mscoa-form-input [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\" [editorMode]=\"editorMode\"\r\n [formBuilderFunctions]=\"formBuilderFunctions\">\r\n</lib-mscoa-form-input>\r\n\r\n}\r\n@case(elementTypes.WorkflowDocumentPicker){\r\n<lib-document-picker [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\"\r\n [formBuilderFunctions]=\"formBuilderFunctions\"></lib-document-picker>\r\n}\r\n@case(elementTypes.WorkflowAdjudication){\r\n <lib-workflow-adjudication [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\"\r\n [formBuilderFunctions]=\"formBuilderFunctions\" >\r\n\r\n </lib-workflow-adjudication>\r\n}\r\n@case(elementTypes.PaginatedSelectionTable){\r\n <lib-paginated-selection-table [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\">\r\n </lib-paginated-selection-table>\r\n}\r\n\r\n@default {\r\n\r\n<lib-basic-input-input-element [inputConfig]=\"inputConfig\" [formGroup]=\"formGroup\">\r\n</lib-basic-input-input-element>\r\n}\r\n}\r\n}\r\n}\r\n\r\n\r\n\r\n<!-- \r\n<button mat-button (click)=\"externalError()\">error</button>\r\n<button mat-button (click)=\"externalErrorClear()\"> clear error</button>-->","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","import { Component, HostListener, inject, Input, ViewChild } from '@angular/core';\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatModulesModule } from '../../shared/modules/mat-modules.module';\r\n\r\n\r\nimport { StepState } from '@angular/cdk/stepper';\r\nimport { TourMatMenu } from 'ngx-ui-tour-md-menu';\r\n\r\nimport { FormTowerControllerService } from '../../services/core/t-form-tower-controller/form-tower-controller.service';\r\nimport { catchError, take, tap } from 'rxjs';\r\nimport { MatStepper } from '@angular/material/stepper';\r\nimport { TFormInputComponent } from '../t-form-input/t-form-input.component';\r\nimport { DatabaseFormInterface, FormBuilderFunctions, FormColumnInputs } from 'ngx-t-forms-types';\r\n\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { getSubmissionStatusFn } from '../../services/core/t-form-tower-controller/functions/getSubmissionStatus';\r\nimport { _isEqual } from '../../shared/functions/isEqual';\r\nimport { TourManagerService } from '../../services/core/tour/tour-manager.service';\r\nimport { IFormTour } from '../../services/core/t-form-tower-controller/functions/selectFormSteps';\r\n\r\n\r\n\r\n\r\n@Component({\r\n selector: 'lib-user-form-stepper',\r\n imports: [\r\n CommonModule,\r\n MatModulesModule,\r\n TFormInputComponent,\r\n\r\n ReactiveFormsModule,\r\n ...TourMatMenu\r\n ],\r\n templateUrl: './user-form-stepper.component.html',\r\n standalone: true,\r\n styleUrl: './user-form-stepper.component.css',\r\n})\r\nexport class UserFormStepperComponent extends FormTowerControllerService {\r\n\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n\r\n /**\r\n * Handles the key down event and opens the application log if the key combination is pressed.\r\n * @param event The keyboard event object.\r\n */\r\n onKeyDown(event: KeyboardEvent) {\r\n if (event.ctrlKey && event.key === 'z') {\r\n // Handle the key press combination here\r\n this.revertBackHistory()\r\n }\r\n }\r\n\r\n _formId: string | undefined\r\n @Input() set formId(value: string | undefined) {\r\n if (_isEqual(this._form, value)) return\r\n this.loadForm(value)\r\n\r\n }\r\n loading = false\r\n loadForm(formId: string | undefined) {\r\n if (!formId) return\r\n this.loading = true\r\n this.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 = false;\r\n if (!form?._id) return\r\n // this.initialize(TEST_FORM.form as any);\r\n this.initialize(form?.form);\r\n },\r\n error: () => {\r\n this.loading = false;\r\n }\r\n }),\r\n catchError((error) => {\r\n this.loading = false;\r\n return error;\r\n })\r\n ).subscribe();\r\n }\r\n\r\n _initialFormValuesLocal: any\r\n @Input() set initialValues(initialFormValues: any) {\r\n if (!!initialFormValues && typeof initialFormValues === 'object' && !_isEqual(this._initialFormValuesLocal, initialFormValues)) {\r\n this._initialFormValuesLocal = initialFormValues\r\n this.initializeFormValues(initialFormValues)\r\n }\r\n }\r\n @Input() set globalSystemInputs(inputs: FormColumnInputs[]) {\r\n if (!Array.isArray(inputs)) return;\r\n this.systemInputs = inputs\r\n if (this.form) {\r\n this.initialize(this.form);\r\n }\r\n\r\n\r\n }\r\n @Input() passParamsOnSubmit: any\r\n // tourService = inject(TourManagerService)\r\n // startTour(options: IStepOption[] | undefined, event: Event | undefined) {\r\n // if (!options) return\r\n // this.tourService.startTourByOption(options)\r\n // event?.preventDefault()\r\n // event?.stopPropagation()\r\n // }\r\n get formBuilderFunctions() {\r\n return {\r\n getLatestAccountTree: () => this.NGX_T_FORMS_CONFIG.formBuilder.getScoaTree(),\r\n getSCOAAccount: (SCOAAccount: string) => this.NGX_T_FORMS_CONFIG.formBuilder.getSCOAAccount(SCOAAccount),\r\n multipleInputToggleForm: this.toggleMultipleInput.bind(this),\r\n multipleInputSaveForm: this.saveMultipleInputForm.bind(this),\r\n multipleInputEditRow: this.multipleInputEditRow.bind(this),\r\n multipleInputDuplicateRow: this.multipleInputDuplicateRow.bind(this),\r\n\r\n\r\n } as unknown as FormBuilderFunctions\r\n }\r\n\r\n\r\n @ViewChild('stepper') stepper: MatStepper | undefined;\r\n\r\n\r\n isEditable = true\r\n // showSummary = signal(false);\r\n\r\n\r\n getStepState(step: any, 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'; // Show error state for invalid touched forms\r\n if (step.sectionForm.valid) return 'done'; // Show done state for valid forms\r\n\r\n return 'number';\r\n }\r\n\r\n // getColumnClass(col: any): string {\r\n // const size = col.inputClass?.input?.colSize || 12;\r\n // return `'col-md-${size} box`;\r\n // }\r\n\r\n getPreviousStepLabel(): string | undefined {\r\n\r\n if (this.stepper === undefined) return ''\r\n const currentIndex = this.stepper?.selectedIndex;\r\n if (currentIndex > 0) {\r\n return this.selectFormSteps()?.[currentIndex - 1]?.label;\r\n }\r\n return '';\r\n }\r\n\r\n getNextStepLabel(): string | undefined {\r\n if (this.stepper === undefined) return ''\r\n const currentIndex = this.stepper?.selectedIndex;\r\n const steps = this.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: any): boolean {\r\n return step.sectionForm.valid;\r\n }\r\n\r\n get getSubmissionStatus(): string {\r\n const progress = this.formProgress() || 0;\r\n const steps = this.selectFormSteps();\r\n return getSubmissionStatusFn(this.stepper, this.mainForm, progress, steps, this.loading);\r\n }\r\n\r\n handleSubmit(): void {\r\n this.submitForm(this.passParamsOnSubmit);\r\n\r\n }\r\n\r\n\r\n\r\n tourManagerService = inject(TourManagerService)\r\n\r\n get hasTour(): boolean {\r\n return this.selectAllFormTours().length > 0;\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 // 1. Fetch the core tour steps defined for individual form fields.\r\n const tourOptions = this.selectAllFormTours();\r\n\r\n // 2. Get dynamic titles for a personalized experience.\r\n const formTitle = this.form?.formTitle || 'this Form';\r\n const firstSectionTitle = this.selectFormSteps()[0]?.label || 'First Section';\r\n\r\n // 3. Initialize the tour with a welcoming introduction.\r\n // These first steps onboard the user before diving into the specific fields.\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 || '', // Belongs to the first section contextually\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, // Tour proceeds when the user clicks the section tab/link.\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, // A small delay to allow UI to settle after section change.\r\n }\r\n ];\r\n\r\n // 4. Dynamically build the rest of the tour steps.\r\n // This loop adds the field-specific steps and the navigation steps between sections.\r\n tourOptions.forEach((option, index) => {\r\n // Add the tour step for the current form field.\r\n fullTourOptions.push(option);\r\n\r\n const nextOption = tourOptions[index + 1];\r\n\r\n // If there's no next step, we're at the end of the field list.\r\n if (!nextOption) return;\r\n\r\n // If the next field is in the same section, we don't need to add a navigation step.\r\n if (nextOption.sectionId === option.sectionId) return;\r\n\r\n // --- A section change is required ---\r\n // Find the title of the upcoming section.\r\n const nextSectionTitle = this.selectFormSteps().find(step => step.sectionId === nextOption.sectionId)?.label || 'Next Section';\r\n\r\n // Add a step to guide the user to click on the next section tab/link.\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, // This step is logically part of the *current* section.\r\n nextOnAnchorClick: true,\r\n });\r\n\r\n // Add a confirmation step after the user has navigated to the new section.\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, // This step is part of the *new* section.\r\n delayBeforeStepShow: 800,\r\n\r\n });\r\n });\r\n\r\n // 5. Add a concluding step to provide a clear end to the tour.\r\n // Note: 'form-submit-button' is a placeholder. Use the actual ID of your form's final action button.\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 || '', // Belongs to the last section\r\n });\r\n\r\n // 6. Launch the tour with the complete list of steps.\r\n this.tourManagerService.startTourByOption(fullTourOptions);\r\n }\r\nrefreshASection (sectionId: string) {\r\n this.refreshSection(sectionId).pipe(take(1)).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)=\"handleStepChange($event)\">\r\n\r\n @for (step of 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(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)=\"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();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><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]=\"mainForm?.invalid\" (click)=\"handleSubmit()\"\r\n aria-label=\"Submit form\">\r\n <span>\r\n {{ formSubmissionMessage()}}\r\n </span>\r\n @if(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}","\r\n\r\n/*\r\n * Public API Surface of ngx-t-forms\r\n */\r\n\r\n console.log = () => {};\r\n console.warn = () => {};\r\n console.info = () => {};\r\n console.debug = () => {};\r\n\r\nexport * from './lib/ngx-t-forms.service';\r\nexport * from './lib/ngx-t-forms.component';\r\n\r\nexport * from './lib/services/index'\r\nexport * from './lib/injection-tokens/index'\r\nexport * from './lib/components/index'\r\nexport * from './lib/shared/pipes'\r\nexport * from './lib/shared/index'","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["FunctionTypes","destructureObject","uuidv4","catchError","map","this","i1","i2","i3","i4","i6","i7","i5","i8","i9","i10","i11","i12","i14","ɵInternalFormsSharedModule","i15","i1.MscoaComponentStore","customInputConfig","take","i13"],"mappings":"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"}