@olaboot/esm-form-engine-lib 4.1.0

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 (628) hide show
  1. package/LICENSE.txt +401 -0
  2. package/README.md +202 -0
  3. package/dist/adapters/control-adapter.d.ts +3 -0
  4. package/dist/adapters/control-adapter.d.ts.map +1 -0
  5. package/dist/adapters/control-adapter.js +17 -0
  6. package/dist/adapters/encounter-datetime-adapter.d.ts +3 -0
  7. package/dist/adapters/encounter-datetime-adapter.d.ts.map +1 -0
  8. package/dist/adapters/encounter-datetime-adapter.js +26 -0
  9. package/dist/adapters/encounter-diagnosis-adapter.d.ts +10 -0
  10. package/dist/adapters/encounter-diagnosis-adapter.d.ts.map +1 -0
  11. package/dist/adapters/encounter-diagnosis-adapter.js +89 -0
  12. package/dist/adapters/encounter-diagnosis-adapter.test.js +217 -0
  13. package/dist/adapters/encounter-location-adapter.d.ts +3 -0
  14. package/dist/adapters/encounter-location-adapter.d.ts.map +1 -0
  15. package/dist/adapters/encounter-location-adapter.js +25 -0
  16. package/dist/adapters/encounter-provider-adapter.d.ts +3 -0
  17. package/dist/adapters/encounter-provider-adapter.d.ts.map +1 -0
  18. package/dist/adapters/encounter-provider-adapter.js +34 -0
  19. package/dist/adapters/encounter-role-adapter.d.ts +3 -0
  20. package/dist/adapters/encounter-role-adapter.d.ts.map +1 -0
  21. package/dist/adapters/encounter-role-adapter.js +40 -0
  22. package/dist/adapters/inline-date-adapter.d.ts +3 -0
  23. package/dist/adapters/inline-date-adapter.d.ts.map +1 -0
  24. package/dist/adapters/inline-date-adapter.js +56 -0
  25. package/dist/adapters/obs-adapter.d.ts +29 -0
  26. package/dist/adapters/obs-adapter.d.ts.map +1 -0
  27. package/dist/adapters/obs-adapter.js +284 -0
  28. package/dist/adapters/obs-adapter.test.js +1443 -0
  29. package/dist/adapters/obs-comment-adapter.d.ts +4 -0
  30. package/dist/adapters/obs-comment-adapter.d.ts.map +1 -0
  31. package/dist/adapters/obs-comment-adapter.js +52 -0
  32. package/dist/adapters/orders-adapter.d.ts +4 -0
  33. package/dist/adapters/orders-adapter.d.ts.map +1 -0
  34. package/dist/adapters/orders-adapter.js +64 -0
  35. package/dist/adapters/patient-identifier-adapter.d.ts +3 -0
  36. package/dist/adapters/patient-identifier-adapter.d.ts.map +1 -0
  37. package/dist/adapters/patient-identifier-adapter.js +40 -0
  38. package/dist/adapters/person-attribute-adapter.d.ts +3 -0
  39. package/dist/adapters/person-attribute-adapter.d.ts.map +1 -0
  40. package/dist/adapters/person-attribute-adapter.js +39 -0
  41. package/dist/adapters/person-attribute-adapter.test.js +146 -0
  42. package/dist/adapters/program-state-adapter.d.ts +3 -0
  43. package/dist/adapters/program-state-adapter.d.ts.map +1 -0
  44. package/dist/adapters/program-state-adapter.js +41 -0
  45. package/dist/adapters/program-state-adapter.test.js +411 -0
  46. package/dist/api/index.d.ts +27 -0
  47. package/dist/api/index.d.ts.map +1 -0
  48. package/dist/api/index.js +170 -0
  49. package/dist/components/error/error-modal.component.d.ts +7 -0
  50. package/dist/components/error/error-modal.component.d.ts.map +1 -0
  51. package/dist/components/error/error-modal.component.js +31 -0
  52. package/dist/components/error/error.scss +4 -0
  53. package/dist/components/extension/extension-parcel.component.d.ts +5 -0
  54. package/dist/components/extension/extension-parcel.component.d.ts.map +1 -0
  55. package/dist/components/extension/extension-parcel.component.js +35 -0
  56. package/dist/components/field-label/field-label.component.d.ts +12 -0
  57. package/dist/components/field-label/field-label.component.d.ts.map +1 -0
  58. package/dist/components/field-label/field-label.component.js +33 -0
  59. package/dist/components/field-label/field-label.scss +15 -0
  60. package/dist/components/group/obs-group.component.d.ts +5 -0
  61. package/dist/components/group/obs-group.component.d.ts.map +1 -0
  62. package/dist/components/group/obs-group.component.js +48 -0
  63. package/dist/components/group/obs-group.scss +16 -0
  64. package/dist/components/inputs/content-switcher/content-switcher.component.d.ts +5 -0
  65. package/dist/components/inputs/content-switcher/content-switcher.component.d.ts.map +1 -0
  66. package/dist/components/inputs/content-switcher/content-switcher.component.js +70 -0
  67. package/dist/components/inputs/content-switcher/content-switcher.scss +55 -0
  68. package/dist/components/inputs/date/date.component.d.ts +5 -0
  69. package/dist/components/inputs/date/date.component.d.ts.map +1 -0
  70. package/dist/components/inputs/date/date.component.js +125 -0
  71. package/dist/components/inputs/date/date.scss +37 -0
  72. package/dist/components/inputs/date/date.test.js +85 -0
  73. package/dist/components/inputs/file/file-thumbnail.component.d.ts +10 -0
  74. package/dist/components/inputs/file/file-thumbnail.component.d.ts.map +1 -0
  75. package/dist/components/inputs/file/file-thumbnail.component.js +51 -0
  76. package/dist/components/inputs/file/file-thumbnail.scss +42 -0
  77. package/dist/components/inputs/file/file.component.d.ts +5 -0
  78. package/dist/components/inputs/file/file.component.d.ts.map +1 -0
  79. package/dist/components/inputs/file/file.component.js +90 -0
  80. package/dist/components/inputs/file/file.scss +21 -0
  81. package/dist/components/inputs/fixed-value/fixed-value.component.d.ts +5 -0
  82. package/dist/components/inputs/fixed-value/fixed-value.component.d.ts.map +1 -0
  83. package/dist/components/inputs/fixed-value/fixed-value.component.js +14 -0
  84. package/dist/components/inputs/markdown/markdown-wrapper.component.d.ts +6 -0
  85. package/dist/components/inputs/markdown/markdown-wrapper.component.d.ts.map +1 -0
  86. package/dist/components/inputs/markdown/markdown-wrapper.component.js +20 -0
  87. package/dist/components/inputs/markdown/markdown.component.d.ts +5 -0
  88. package/dist/components/inputs/markdown/markdown.component.d.ts.map +1 -0
  89. package/dist/components/inputs/markdown/markdown.component.js +26 -0
  90. package/dist/components/inputs/multi-select/multi-select.component.d.ts +5 -0
  91. package/dist/components/inputs/multi-select/multi-select.component.d.ts.map +1 -0
  92. package/dist/components/inputs/multi-select/multi-select.component.js +134 -0
  93. package/dist/components/inputs/multi-select/multi-select.scss +25 -0
  94. package/dist/components/inputs/multi-select/multi-select.test.js +106 -0
  95. package/dist/components/inputs/number/number.component.d.ts +5 -0
  96. package/dist/components/inputs/number/number.component.d.ts.map +1 -0
  97. package/dist/components/inputs/number/number.component.js +77 -0
  98. package/dist/components/inputs/number/number.scss +15 -0
  99. package/dist/components/inputs/number/number.test.js +98 -0
  100. package/dist/components/inputs/radio/radio.component.d.ts +5 -0
  101. package/dist/components/inputs/radio/radio.component.d.ts.map +1 -0
  102. package/dist/components/inputs/radio/radio.component.js +69 -0
  103. package/dist/components/inputs/radio/radio.scss +36 -0
  104. package/dist/components/inputs/radio/radio.test.js +190 -0
  105. package/dist/components/inputs/select/dropdown.component.d.ts +5 -0
  106. package/dist/components/inputs/select/dropdown.component.d.ts.map +1 -0
  107. package/dist/components/inputs/select/dropdown.component.js +82 -0
  108. package/dist/components/inputs/select/dropdown.scss +11 -0
  109. package/dist/components/inputs/select/dropdown.test.js +157 -0
  110. package/dist/components/inputs/text/text.component.d.ts +5 -0
  111. package/dist/components/inputs/text/text.component.d.ts.map +1 -0
  112. package/dist/components/inputs/text/text.component.js +62 -0
  113. package/dist/components/inputs/text/text.scss +15 -0
  114. package/dist/components/inputs/text/text.test.js +184 -0
  115. package/dist/components/inputs/text-area/text-area.component.d.ts +5 -0
  116. package/dist/components/inputs/text-area/text-area.component.d.ts.map +1 -0
  117. package/dist/components/inputs/text-area/text-area.component.js +60 -0
  118. package/dist/components/inputs/text-area/text-area.scss +11 -0
  119. package/dist/components/inputs/toggle/toggle.component.d.ts +5 -0
  120. package/dist/components/inputs/toggle/toggle.component.d.ts.map +1 -0
  121. package/dist/components/inputs/toggle/toggle.component.js +57 -0
  122. package/dist/components/inputs/toggle/toggle.scss +12 -0
  123. package/dist/components/inputs/ui-select-extended/ui-select-extended.component.d.ts +5 -0
  124. package/dist/components/inputs/ui-select-extended/ui-select-extended.component.d.ts.map +1 -0
  125. package/dist/components/inputs/ui-select-extended/ui-select-extended.component.js +203 -0
  126. package/dist/components/inputs/ui-select-extended/ui-select-extended.scss +19 -0
  127. package/dist/components/inputs/ui-select-extended/ui-select-extended.test.js +250 -0
  128. package/dist/components/inputs/unspecified/unspecified.component.d.ts +11 -0
  129. package/dist/components/inputs/unspecified/unspecified.component.d.ts.map +1 -0
  130. package/dist/components/inputs/unspecified/unspecified.component.js +65 -0
  131. package/dist/components/inputs/unspecified/unspecified.scss +7 -0
  132. package/dist/components/inputs/unspecified/unspecified.test.js +152 -0
  133. package/dist/components/inputs/workspace-launcher/workspace-launcher.component.d.ts +5 -0
  134. package/dist/components/inputs/workspace-launcher/workspace-launcher.component.d.ts.map +1 -0
  135. package/dist/components/inputs/workspace-launcher/workspace-launcher.component.js +64 -0
  136. package/dist/components/inputs/workspace-launcher/workspace-launcher.scss +21 -0
  137. package/dist/components/inputs/workspace-launcher/workspace-launcher.test.js +174 -0
  138. package/dist/components/label/label.component.d.ts +8 -0
  139. package/dist/components/label/label.component.d.ts.map +1 -0
  140. package/dist/components/label/label.component.js +15 -0
  141. package/dist/components/label/label.scss +15 -0
  142. package/dist/components/loaders/loader.component.d.ts +4 -0
  143. package/dist/components/loaders/loader.component.d.ts.map +1 -0
  144. package/dist/components/loaders/loader.component.js +14 -0
  145. package/dist/components/loaders/loader.scss +20 -0
  146. package/dist/components/patient-banner/patient-banner.component.d.ts +7 -0
  147. package/dist/components/patient-banner/patient-banner.component.d.ts.map +1 -0
  148. package/dist/components/patient-banner/patient-banner.component.js +16 -0
  149. package/dist/components/patient-banner/patient-banner.scss +12 -0
  150. package/dist/components/previous-value-review/previous-value-review.component.d.ts +12 -0
  151. package/dist/components/previous-value-review/previous-value-review.component.d.ts.map +1 -0
  152. package/dist/components/previous-value-review/previous-value-review.component.js +29 -0
  153. package/dist/components/previous-value-review/previous-value-review.scss +36 -0
  154. package/dist/components/processor-factory/form-processor-factory.component.d.ts +10 -0
  155. package/dist/components/processor-factory/form-processor-factory.component.d.ts.map +1 -0
  156. package/dist/components/processor-factory/form-processor-factory.component.js +114 -0
  157. package/dist/components/renderer/custom-hooks-renderer.component.d.ts +13 -0
  158. package/dist/components/renderer/custom-hooks-renderer.component.d.ts.map +1 -0
  159. package/dist/components/renderer/custom-hooks-renderer.component.js +13 -0
  160. package/dist/components/renderer/field/fieldLogic.d.ts +16 -0
  161. package/dist/components/renderer/field/fieldLogic.d.ts.map +1 -0
  162. package/dist/components/renderer/field/fieldLogic.js +238 -0
  163. package/dist/components/renderer/field/fieldLogic.test.js +140 -0
  164. package/dist/components/renderer/field/fieldRenderUtils.d.ts +9 -0
  165. package/dist/components/renderer/field/fieldRenderUtils.d.ts.map +1 -0
  166. package/dist/components/renderer/field/fieldRenderUtils.js +8 -0
  167. package/dist/components/renderer/field/fieldRenderUtils.test.js +51 -0
  168. package/dist/components/renderer/field/form-field-renderer.component.d.ts +19 -0
  169. package/dist/components/renderer/field/form-field-renderer.component.d.ts.map +1 -0
  170. package/dist/components/renderer/field/form-field-renderer.component.js +214 -0
  171. package/dist/components/renderer/field/form-field-renderer.scss +5 -0
  172. package/dist/components/renderer/form/form-renderer.component.d.ts +10 -0
  173. package/dist/components/renderer/form/form-renderer.component.d.ts.map +1 -0
  174. package/dist/components/renderer/form/form-renderer.component.js +102 -0
  175. package/dist/components/renderer/form/state.d.ts +41 -0
  176. package/dist/components/renderer/form/state.d.ts.map +1 -0
  177. package/dist/components/renderer/form/state.js +69 -0
  178. package/dist/components/renderer/page/page.renderer.component.d.ts +9 -0
  179. package/dist/components/renderer/page/page.renderer.component.d.ts.map +1 -0
  180. package/dist/components/renderer/page/page.renderer.component.js +85 -0
  181. package/dist/components/renderer/page/page.renderer.scss +74 -0
  182. package/dist/components/renderer/section/section-renderer.component.d.ts +6 -0
  183. package/dist/components/renderer/section/section-renderer.component.d.ts.map +1 -0
  184. package/dist/components/renderer/section/section-renderer.component.js +20 -0
  185. package/dist/components/renderer/section/section-renderer.scss +19 -0
  186. package/dist/components/repeat/helpers.d.ts +6 -0
  187. package/dist/components/repeat/helpers.d.ts.map +1 -0
  188. package/dist/components/repeat/helpers.js +64 -0
  189. package/dist/components/repeat/helpers.test.js +25 -0
  190. package/dist/components/repeat/repeat-controls.component.d.ts +12 -0
  191. package/dist/components/repeat/repeat-controls.component.d.ts.map +1 -0
  192. package/dist/components/repeat/repeat-controls.component.js +22 -0
  193. package/dist/components/repeat/repeat-controls.scss +7 -0
  194. package/dist/components/repeat/repeat.component.d.ts +5 -0
  195. package/dist/components/repeat/repeat.component.d.ts.map +1 -0
  196. package/dist/components/repeat/repeat.component.js +185 -0
  197. package/dist/components/repeat/repeat.scss +30 -0
  198. package/dist/components/repeat/repeat.test.js +25 -0
  199. package/dist/components/sidebar/page-observer.d.ts +20 -0
  200. package/dist/components/sidebar/page-observer.d.ts.map +1 -0
  201. package/dist/components/sidebar/page-observer.js +60 -0
  202. package/dist/components/sidebar/sidebar.component.d.ts +14 -0
  203. package/dist/components/sidebar/sidebar.component.d.ts.map +1 -0
  204. package/dist/components/sidebar/sidebar.component.js +77 -0
  205. package/dist/components/sidebar/sidebar.scss +114 -0
  206. package/dist/components/sidebar/useCurrentActivePage.d.ts +34 -0
  207. package/dist/components/sidebar/useCurrentActivePage.d.ts.map +1 -0
  208. package/dist/components/sidebar/useCurrentActivePage.js +114 -0
  209. package/dist/components/sidebar/useCurrentActivePage.test.js +208 -0
  210. package/dist/components/sidebar/usePageObserver.d.ts +11 -0
  211. package/dist/components/sidebar/usePageObserver.d.ts.map +1 -0
  212. package/dist/components/sidebar/usePageObserver.js +42 -0
  213. package/dist/components/value/value.component.d.ts +6 -0
  214. package/dist/components/value/value.component.d.ts.map +1 -0
  215. package/dist/components/value/value.component.js +24 -0
  216. package/dist/components/value/value.scss +17 -0
  217. package/dist/components/value/view/field-value-view.component.d.ts +10 -0
  218. package/dist/components/value/view/field-value-view.component.d.ts.map +1 -0
  219. package/dist/components/value/view/field-value-view.component.js +29 -0
  220. package/dist/components/value/view/field-value-view.scss +31 -0
  221. package/dist/constants.d.ts +9 -0
  222. package/dist/constants.d.ts.map +1 -0
  223. package/dist/constants.js +13 -0
  224. package/dist/datasources/concept-data-source.d.ts +6 -0
  225. package/dist/datasources/concept-data-source.d.ts.map +1 -0
  226. package/dist/datasources/concept-data-source.js +35 -0
  227. package/dist/datasources/data-source.d.ts +10 -0
  228. package/dist/datasources/data-source.d.ts.map +1 -0
  229. package/dist/datasources/data-source.js +41 -0
  230. package/dist/datasources/encounter-role-datasource.d.ts +6 -0
  231. package/dist/datasources/encounter-role-datasource.d.ts.map +1 -0
  232. package/dist/datasources/encounter-role-datasource.js +13 -0
  233. package/dist/datasources/historical-data-source.d.ts +6 -0
  234. package/dist/datasources/historical-data-source.d.ts.map +1 -0
  235. package/dist/datasources/historical-data-source.js +24 -0
  236. package/dist/datasources/location-data-source.d.ts +6 -0
  237. package/dist/datasources/location-data-source.d.ts.map +1 -0
  238. package/dist/datasources/location-data-source.js +24 -0
  239. package/dist/datasources/provider-datasource.d.ts +6 -0
  240. package/dist/datasources/provider-datasource.d.ts.map +1 -0
  241. package/dist/datasources/provider-datasource.js +13 -0
  242. package/dist/datasources/select-concept-answers-datasource.d.ts +9 -0
  243. package/dist/datasources/select-concept-answers-datasource.d.ts.map +1 -0
  244. package/dist/datasources/select-concept-answers-datasource.js +19 -0
  245. package/dist/declarations.d.js +0 -0
  246. package/dist/external-function-context.d.ts +7 -0
  247. package/dist/external-function-context.d.ts.map +1 -0
  248. package/dist/external-function-context.js +2 -0
  249. package/dist/form-engine.component.d.ts +23 -0
  250. package/dist/form-engine.component.d.ts.map +1 -0
  251. package/dist/form-engine.component.js +174 -0
  252. package/dist/form-engine.scss +148 -0
  253. package/dist/form-engine.test.js +1253 -0
  254. package/dist/globals.d.ts +3 -0
  255. package/dist/globals.d.ts.map +1 -0
  256. package/dist/globals.js +2 -0
  257. package/dist/hooks/useConcepts.d.ts +23 -0
  258. package/dist/hooks/useConcepts.d.ts.map +1 -0
  259. package/dist/hooks/useConcepts.js +31 -0
  260. package/dist/hooks/useDataSourceDependentValue.d.ts +4 -0
  261. package/dist/hooks/useDataSourceDependentValue.d.ts.map +1 -0
  262. package/dist/hooks/useDataSourceDependentValue.js +14 -0
  263. package/dist/hooks/useEncounter.d.ts +7 -0
  264. package/dist/hooks/useEncounter.d.ts.map +1 -0
  265. package/dist/hooks/useEncounter.js +38 -0
  266. package/dist/hooks/useEncounterRole.d.ts +7 -0
  267. package/dist/hooks/useEncounterRole.d.ts.map +1 -0
  268. package/dist/hooks/useEncounterRole.js +18 -0
  269. package/dist/hooks/useEvaluateFormFieldExpressions.d.ts +7 -0
  270. package/dist/hooks/useEvaluateFormFieldExpressions.d.ts.map +1 -0
  271. package/dist/hooks/useEvaluateFormFieldExpressions.js +112 -0
  272. package/dist/hooks/useExternalFormAction.d.ts +43 -0
  273. package/dist/hooks/useExternalFormAction.d.ts.map +1 -0
  274. package/dist/hooks/useExternalFormAction.js +71 -0
  275. package/dist/hooks/useFormCollapse.d.ts +6 -0
  276. package/dist/hooks/useFormCollapse.d.ts.map +1 -0
  277. package/dist/hooks/useFormCollapse.js +35 -0
  278. package/dist/hooks/useFormFieldValidators.d.ts +3 -0
  279. package/dist/hooks/useFormFieldValidators.d.ts.map +1 -0
  280. package/dist/hooks/useFormFieldValidators.js +20 -0
  281. package/dist/hooks/useFormFieldValueAdapters.d.ts +3 -0
  282. package/dist/hooks/useFormFieldValueAdapters.d.ts.map +1 -0
  283. package/dist/hooks/useFormFieldValueAdapters.js +21 -0
  284. package/dist/hooks/useFormFields.d.ts +6 -0
  285. package/dist/hooks/useFormFields.d.ts.map +1 -0
  286. package/dist/hooks/useFormFields.js +62 -0
  287. package/dist/hooks/useFormFieldsMeta.d.ts +4 -0
  288. package/dist/hooks/useFormFieldsMeta.d.ts.map +1 -0
  289. package/dist/hooks/useFormFieldsMeta.js +42 -0
  290. package/dist/hooks/useFormJson.d.ts +19 -0
  291. package/dist/hooks/useFormJson.d.ts.map +1 -0
  292. package/dist/hooks/useFormJson.js +198 -0
  293. package/dist/hooks/useFormJson.test.js +194 -0
  294. package/dist/hooks/useFormStateHelpers.d.ts +15 -0
  295. package/dist/hooks/useFormStateHelpers.d.ts.map +1 -0
  296. package/dist/hooks/useFormStateHelpers.js +83 -0
  297. package/dist/hooks/useFormWorkspaceSize.d.ts +7 -0
  298. package/dist/hooks/useFormWorkspaceSize.d.ts.map +1 -0
  299. package/dist/hooks/useFormWorkspaceSize.js +46 -0
  300. package/dist/hooks/useFormWorkspaceSize.test.js +141 -0
  301. package/dist/hooks/useInitialValues.d.ts +9 -0
  302. package/dist/hooks/useInitialValues.d.ts.map +1 -0
  303. package/dist/hooks/useInitialValues.js +29 -0
  304. package/dist/hooks/useInitialValues.test.js +78 -0
  305. package/dist/hooks/usePatientData.d.ts +6 -0
  306. package/dist/hooks/usePatientData.d.ts.map +1 -0
  307. package/dist/hooks/usePatientData.js +30 -0
  308. package/dist/hooks/usePatientPrograms.d.ts +7 -0
  309. package/dist/hooks/usePatientPrograms.d.ts.map +1 -0
  310. package/dist/hooks/usePatientPrograms.js +22 -0
  311. package/dist/hooks/usePostSubmissionActions.d.ts +13 -0
  312. package/dist/hooks/usePostSubmissionActions.d.ts.map +1 -0
  313. package/dist/hooks/usePostSubmissionActions.js +23 -0
  314. package/dist/hooks/usePostSubmissionActions.test.js +55 -0
  315. package/dist/hooks/useProcessorDependencies.d.ts +8 -0
  316. package/dist/hooks/useProcessorDependencies.d.ts.map +1 -0
  317. package/dist/hooks/useProcessorDependencies.js +33 -0
  318. package/dist/index.d.ts +12 -0
  319. package/dist/index.d.ts.map +1 -0
  320. package/dist/index.js +11 -0
  321. package/dist/lifecycle.d.ts +11 -0
  322. package/dist/lifecycle.d.ts.map +1 -0
  323. package/dist/lifecycle.js +25 -0
  324. package/dist/post-submission-actions/mark-patient-deceased-action.d.ts +4 -0
  325. package/dist/post-submission-actions/mark-patient-deceased-action.d.ts.map +1 -0
  326. package/dist/post-submission-actions/mark-patient-deceased-action.js +53 -0
  327. package/dist/post-submission-actions/program-enrollment-action.d.ts +4 -0
  328. package/dist/post-submission-actions/program-enrollment-action.d.ts.map +1 -0
  329. package/dist/post-submission-actions/program-enrollment-action.js +105 -0
  330. package/dist/processors/encounter/encounter-form-processor.d.ts +26 -0
  331. package/dist/processors/encounter/encounter-form-processor.d.ts.map +1 -0
  332. package/dist/processors/encounter/encounter-form-processor.js +376 -0
  333. package/dist/processors/encounter/encounter-form-processor.test.js +207 -0
  334. package/dist/processors/encounter/encounter-processor-helper.d.ts +19 -0
  335. package/dist/processors/encounter/encounter-processor-helper.d.ts.map +1 -0
  336. package/dist/processors/encounter/encounter-processor-helper.js +293 -0
  337. package/dist/processors/form-processor.d.ts +25 -0
  338. package/dist/processors/form-processor.d.ts.map +1 -0
  339. package/dist/processors/form-processor.js +26 -0
  340. package/dist/provider/form-factory-helper.d.ts +8 -0
  341. package/dist/provider/form-factory-helper.d.ts.map +1 -0
  342. package/dist/provider/form-factory-helper.js +73 -0
  343. package/dist/provider/form-factory-provider.d.ts +48 -0
  344. package/dist/provider/form-factory-provider.d.ts.map +1 -0
  345. package/dist/provider/form-factory-provider.js +136 -0
  346. package/dist/provider/form-provider.d.ts +26 -0
  347. package/dist/provider/form-provider.d.ts.map +1 -0
  348. package/dist/provider/form-provider.js +17 -0
  349. package/dist/registry/inbuilt-components/InbuiltPostSubmissionActions.d.ts +4 -0
  350. package/dist/registry/inbuilt-components/InbuiltPostSubmissionActions.d.ts.map +1 -0
  351. package/dist/registry/inbuilt-components/InbuiltPostSubmissionActions.js +10 -0
  352. package/dist/registry/inbuilt-components/control-templates.d.ts +4 -0
  353. package/dist/registry/inbuilt-components/control-templates.d.ts.map +1 -0
  354. package/dist/registry/inbuilt-components/control-templates.js +54 -0
  355. package/dist/registry/inbuilt-components/inbuiltControls.d.ts +7 -0
  356. package/dist/registry/inbuilt-components/inbuiltControls.d.ts.map +1 -0
  357. package/dist/registry/inbuilt-components/inbuiltControls.js +94 -0
  358. package/dist/registry/inbuilt-components/inbuiltDataSources.d.ts +8 -0
  359. package/dist/registry/inbuilt-components/inbuiltDataSources.d.ts.map +1 -0
  360. package/dist/registry/inbuilt-components/inbuiltDataSources.js +36 -0
  361. package/dist/registry/inbuilt-components/inbuiltFieldValueAdapters.d.ts +4 -0
  362. package/dist/registry/inbuilt-components/inbuiltFieldValueAdapters.d.ts.map +1 -0
  363. package/dist/registry/inbuilt-components/inbuiltFieldValueAdapters.js +71 -0
  364. package/dist/registry/inbuilt-components/inbuiltTransformers.d.ts +4 -0
  365. package/dist/registry/inbuilt-components/inbuiltTransformers.d.ts.map +1 -0
  366. package/dist/registry/inbuilt-components/inbuiltTransformers.js +7 -0
  367. package/dist/registry/inbuilt-components/inbuiltValidators.d.ts +7 -0
  368. package/dist/registry/inbuilt-components/inbuiltValidators.d.ts.map +1 -0
  369. package/dist/registry/inbuilt-components/inbuiltValidators.js +29 -0
  370. package/dist/registry/inbuilt-components/template-component-map.d.ts +5 -0
  371. package/dist/registry/inbuilt-components/template-component-map.d.ts.map +1 -0
  372. package/dist/registry/inbuilt-components/template-component-map.js +27 -0
  373. package/dist/registry/registry.d.ts +61 -0
  374. package/dist/registry/registry.d.ts.map +1 -0
  375. package/dist/registry/registry.js +184 -0
  376. package/dist/registry/registry.test.js +17 -0
  377. package/dist/setup-tests.js +30 -0
  378. package/dist/transformers/default-schema-transformer.d.ts +4 -0
  379. package/dist/transformers/default-schema-transformer.d.ts.map +1 -0
  380. package/dist/transformers/default-schema-transformer.js +308 -0
  381. package/dist/transformers/default-schema-transformer.test.js +319 -0
  382. package/dist/types/domain.d.ts +219 -0
  383. package/dist/types/domain.d.ts.map +1 -0
  384. package/dist/types/domain.js +1 -0
  385. package/dist/types/index.d.ts +126 -0
  386. package/dist/types/index.d.ts.map +1 -0
  387. package/dist/types/index.js +2 -0
  388. package/dist/types/schema.d.ts +243 -0
  389. package/dist/types/schema.d.ts.map +1 -0
  390. package/dist/types/schema.js +1 -0
  391. package/dist/typings.d.js +1 -0
  392. package/dist/utils/boolean-utils.d.ts +13 -0
  393. package/dist/utils/boolean-utils.d.ts.map +1 -0
  394. package/dist/utils/boolean-utils.js +22 -0
  395. package/dist/utils/common-expression-helpers.d.ts +261 -0
  396. package/dist/utils/common-expression-helpers.d.ts.map +1 -0
  397. package/dist/utils/common-expression-helpers.js +538 -0
  398. package/dist/utils/common-expression-helpers.test.js +461 -0
  399. package/dist/utils/common-utils.d.ts +51 -0
  400. package/dist/utils/common-utils.d.ts.map +1 -0
  401. package/dist/utils/common-utils.js +102 -0
  402. package/dist/utils/common-utils.test.js +134 -0
  403. package/dist/utils/error-utils.d.ts +11 -0
  404. package/dist/utils/error-utils.d.ts.map +1 -0
  405. package/dist/utils/error-utils.js +34 -0
  406. package/dist/utils/expression-runner.d.ts +25 -0
  407. package/dist/utils/expression-runner.d.ts.map +1 -0
  408. package/dist/utils/expression-runner.js +104 -0
  409. package/dist/utils/expression-runner.test.js +362 -0
  410. package/dist/utils/form-helper.d.ts +37 -0
  411. package/dist/utils/form-helper.d.ts.map +1 -0
  412. package/dist/utils/form-helper.js +239 -0
  413. package/dist/utils/form-helper.test.js +638 -0
  414. package/dist/utils/form-page-utils.d.ts +3 -0
  415. package/dist/utils/form-page-utils.d.ts.map +1 -0
  416. package/dist/utils/form-page-utils.js +10 -0
  417. package/dist/utils/forms-loader.d.ts +45 -0
  418. package/dist/utils/forms-loader.d.ts.map +1 -0
  419. package/dist/utils/forms-loader.js +246 -0
  420. package/dist/utils/forms-loader.test.js +333 -0
  421. package/dist/utils/post-submission-action-helper.d.ts +2 -0
  422. package/dist/utils/post-submission-action-helper.d.ts.map +1 -0
  423. package/dist/utils/post-submission-action-helper.js +57 -0
  424. package/dist/utils/test-utils.js +66 -0
  425. package/dist/utils/zscore-service.d.ts +6 -0
  426. package/dist/utils/zscore-service.d.ts.map +1 -0
  427. package/dist/utils/zscore-service.js +54 -0
  428. package/dist/validators/conditional-answered-validator.d.ts +3 -0
  429. package/dist/validators/conditional-answered-validator.d.ts.map +1 -0
  430. package/dist/validators/conditional-answered-validator.js +18 -0
  431. package/dist/validators/conditional-answered-validator.test.js +63 -0
  432. package/dist/validators/date-validator.d.ts +3 -0
  433. package/dist/validators/date-validator.d.ts.map +1 -0
  434. package/dist/validators/date-validator.js +21 -0
  435. package/dist/validators/date-validator.test.js +53 -0
  436. package/dist/validators/default-value-validator.d.ts +3 -0
  437. package/dist/validators/default-value-validator.d.ts.map +1 -0
  438. package/dist/validators/default-value-validator.js +46 -0
  439. package/dist/validators/default-value-validator.test.js +95 -0
  440. package/dist/validators/form-validator.d.ts +9 -0
  441. package/dist/validators/form-validator.d.ts.map +1 -0
  442. package/dist/validators/form-validator.js +82 -0
  443. package/dist/validators/form-validator.test.js +158 -0
  444. package/dist/validators/js-expression-validator.d.ts +3 -0
  445. package/dist/validators/js-expression-validator.d.ts.map +1 -0
  446. package/dist/validators/js-expression-validator.js +25 -0
  447. package/dist/validators/js-expression-validator.test.js +115 -0
  448. package/dist/validators/schema.d.ts +1 -0
  449. package/dist/validators/schema.d.ts.map +1 -0
  450. package/dist/validators/schema.js +32 -0
  451. package/dist/zscore/bfa_boys_5_above.json +2522 -0
  452. package/dist/zscore/bfa_girls_5_above.json +2522 -0
  453. package/dist/zscore/hfa_boys_5_above.json +2186 -0
  454. package/dist/zscore/hfa_boys_below5.json +22286 -0
  455. package/dist/zscore/hfa_girls_5_above.json +2186 -0
  456. package/dist/zscore/hfa_girls_below5.json +22286 -0
  457. package/dist/zscore/wfl_boys_below5.json +7814 -0
  458. package/dist/zscore/wfl_girls_below5.json +7814 -0
  459. package/dist/zscore-tests/bmi-age.test.js +84 -0
  460. package/dist/zscore-tests/height-age.test.js +88 -0
  461. package/dist/zscore-tests/weight-height.test.js +82 -0
  462. package/package.json +105 -0
  463. package/src/adapters/control-adapter.ts +29 -0
  464. package/src/adapters/encounter-datetime-adapter.ts +38 -0
  465. package/src/adapters/encounter-diagnosis-adapter.ts +121 -0
  466. package/src/adapters/encounter-location-adapter.ts +39 -0
  467. package/src/adapters/encounter-provider-adapter.ts +48 -0
  468. package/src/adapters/encounter-role-adapter.ts +54 -0
  469. package/src/adapters/inline-date-adapter.ts +59 -0
  470. package/src/adapters/obs-adapter.ts +349 -0
  471. package/src/adapters/obs-comment-adapter.ts +61 -0
  472. package/src/adapters/orders-adapter.ts +82 -0
  473. package/src/adapters/patient-identifier-adapter.ts +46 -0
  474. package/src/adapters/person-attribute-adapter.ts +45 -0
  475. package/src/adapters/program-state-adapter.ts +57 -0
  476. package/src/api/index.ts +224 -0
  477. package/src/components/error/error-modal.component.tsx +37 -0
  478. package/src/components/error/error.scss +4 -0
  479. package/src/components/extension/extension-parcel.component.tsx +32 -0
  480. package/src/components/field-label/field-label.component.tsx +55 -0
  481. package/src/components/field-label/field-label.scss +15 -0
  482. package/src/components/group/obs-group.component.tsx +59 -0
  483. package/src/components/group/obs-group.scss +16 -0
  484. package/src/components/inputs/content-switcher/content-switcher.component.tsx +81 -0
  485. package/src/components/inputs/content-switcher/content-switcher.scss +55 -0
  486. package/src/components/inputs/date/date.component.tsx +141 -0
  487. package/src/components/inputs/date/date.scss +37 -0
  488. package/src/components/inputs/file/file-thumbnail.component.tsx +55 -0
  489. package/src/components/inputs/file/file-thumbnail.scss +42 -0
  490. package/src/components/inputs/file/file.component.tsx +98 -0
  491. package/src/components/inputs/file/file.scss +21 -0
  492. package/src/components/inputs/fixed-value/fixed-value.component.tsx +19 -0
  493. package/src/components/inputs/markdown/markdown-wrapper.component.tsx +14 -0
  494. package/src/components/inputs/markdown/markdown.component.tsx +24 -0
  495. package/src/components/inputs/multi-select/multi-select.component.tsx +152 -0
  496. package/src/components/inputs/multi-select/multi-select.scss +25 -0
  497. package/src/components/inputs/number/number.component.tsx +85 -0
  498. package/src/components/inputs/number/number.scss +15 -0
  499. package/src/components/inputs/radio/radio.component.tsx +81 -0
  500. package/src/components/inputs/radio/radio.scss +36 -0
  501. package/src/components/inputs/select/dropdown.component.tsx +86 -0
  502. package/src/components/inputs/select/dropdown.scss +11 -0
  503. package/src/components/inputs/text/text.component.tsx +67 -0
  504. package/src/components/inputs/text/text.scss +15 -0
  505. package/src/components/inputs/text-area/text-area.component.tsx +63 -0
  506. package/src/components/inputs/text-area/text-area.scss +11 -0
  507. package/src/components/inputs/toggle/toggle.component.tsx +66 -0
  508. package/src/components/inputs/toggle/toggle.scss +12 -0
  509. package/src/components/inputs/ui-select-extended/ui-select-extended.component.tsx +208 -0
  510. package/src/components/inputs/ui-select-extended/ui-select-extended.scss +19 -0
  511. package/src/components/inputs/unspecified/unspecified.component.tsx +84 -0
  512. package/src/components/inputs/unspecified/unspecified.scss +7 -0
  513. package/src/components/inputs/workspace-launcher/workspace-launcher.component.tsx +80 -0
  514. package/src/components/inputs/workspace-launcher/workspace-launcher.scss +21 -0
  515. package/src/components/label/label.component.tsx +20 -0
  516. package/src/components/label/label.scss +15 -0
  517. package/src/components/loaders/loader.component.tsx +16 -0
  518. package/src/components/loaders/loader.scss +20 -0
  519. package/src/components/patient-banner/patient-banner.component.tsx +20 -0
  520. package/src/components/patient-banner/patient-banner.scss +12 -0
  521. package/src/components/previous-value-review/previous-value-review.component.tsx +49 -0
  522. package/src/components/previous-value-review/previous-value-review.scss +36 -0
  523. package/src/components/processor-factory/form-processor-factory.component.tsx +128 -0
  524. package/src/components/renderer/custom-hooks-renderer.component.tsx +30 -0
  525. package/src/components/renderer/field/fieldLogic.ts +314 -0
  526. package/src/components/renderer/field/fieldRenderUtils.ts +16 -0
  527. package/src/components/renderer/field/form-field-renderer.component.tsx +291 -0
  528. package/src/components/renderer/field/form-field-renderer.scss +5 -0
  529. package/src/components/renderer/form/form-renderer.component.tsx +123 -0
  530. package/src/components/renderer/form/state.ts +59 -0
  531. package/src/components/renderer/page/page.renderer.component.tsx +120 -0
  532. package/src/components/renderer/page/page.renderer.scss +74 -0
  533. package/src/components/renderer/section/section-renderer.component.tsx +25 -0
  534. package/src/components/renderer/section/section-renderer.scss +19 -0
  535. package/src/components/repeat/helpers.ts +77 -0
  536. package/src/components/repeat/repeat-controls.component.tsx +38 -0
  537. package/src/components/repeat/repeat-controls.scss +7 -0
  538. package/src/components/repeat/repeat.component.tsx +206 -0
  539. package/src/components/repeat/repeat.scss +30 -0
  540. package/src/components/sidebar/page-observer.ts +58 -0
  541. package/src/components/sidebar/sidebar.component.tsx +121 -0
  542. package/src/components/sidebar/sidebar.scss +114 -0
  543. package/src/components/sidebar/useCurrentActivePage.ts +137 -0
  544. package/src/components/sidebar/usePageObserver.ts +45 -0
  545. package/src/components/value/value.component.tsx +30 -0
  546. package/src/components/value/value.scss +17 -0
  547. package/src/components/value/view/field-value-view.component.tsx +36 -0
  548. package/src/components/value/view/field-value-view.scss +31 -0
  549. package/src/constants.ts +14 -0
  550. package/src/datasources/concept-data-source.ts +42 -0
  551. package/src/datasources/data-source.ts +34 -0
  552. package/src/datasources/encounter-role-datasource.ts +15 -0
  553. package/src/datasources/historical-data-source.ts +11 -0
  554. package/src/datasources/location-data-source.ts +27 -0
  555. package/src/datasources/provider-datasource.ts +15 -0
  556. package/src/datasources/select-concept-answers-datasource.ts +25 -0
  557. package/src/declarations.d.ts +2 -0
  558. package/src/external-function-context.tsx +8 -0
  559. package/src/form-engine.component.tsx +222 -0
  560. package/src/form-engine.scss +148 -0
  561. package/src/globals.ts +2 -0
  562. package/src/hooks/useConcepts.ts +58 -0
  563. package/src/hooks/useDataSourceDependentValue.ts +16 -0
  564. package/src/hooks/useEncounter.ts +40 -0
  565. package/src/hooks/useEncounterRole.ts +15 -0
  566. package/src/hooks/useEvaluateFormFieldExpressions.ts +152 -0
  567. package/src/hooks/useExternalFormAction.ts +94 -0
  568. package/src/hooks/useFormCollapse.ts +36 -0
  569. package/src/hooks/useFormFieldValidators.ts +22 -0
  570. package/src/hooks/useFormFieldValueAdapters.ts +23 -0
  571. package/src/hooks/useFormFields.ts +65 -0
  572. package/src/hooks/useFormFieldsMeta.ts +48 -0
  573. package/src/hooks/useFormJson.ts +257 -0
  574. package/src/hooks/useFormStateHelpers.ts +72 -0
  575. package/src/hooks/useFormWorkspaceSize.ts +52 -0
  576. package/src/hooks/useInitialValues.ts +39 -0
  577. package/src/hooks/usePatientData.ts +32 -0
  578. package/src/hooks/usePatientPrograms.ts +38 -0
  579. package/src/hooks/usePostSubmissionActions.ts +31 -0
  580. package/src/hooks/useProcessorDependencies.ts +42 -0
  581. package/src/index.ts +11 -0
  582. package/src/lifecycle.ts +32 -0
  583. package/src/post-submission-actions/mark-patient-deceased-action.ts +68 -0
  584. package/src/post-submission-actions/program-enrollment-action.ts +137 -0
  585. package/src/processors/encounter/encounter-form-processor.ts +445 -0
  586. package/src/processors/encounter/encounter-processor-helper.ts +387 -0
  587. package/src/processors/form-processor.ts +40 -0
  588. package/src/provider/form-factory-helper.ts +106 -0
  589. package/src/provider/form-factory-provider.tsx +211 -0
  590. package/src/provider/form-provider.tsx +39 -0
  591. package/src/registry/inbuilt-components/InbuiltPostSubmissionActions.ts +13 -0
  592. package/src/registry/inbuilt-components/control-templates.ts +57 -0
  593. package/src/registry/inbuilt-components/inbuiltControls.ts +99 -0
  594. package/src/registry/inbuilt-components/inbuiltDataSources.ts +41 -0
  595. package/src/registry/inbuilt-components/inbuiltFieldValueAdapters.ts +74 -0
  596. package/src/registry/inbuilt-components/inbuiltTransformers.ts +10 -0
  597. package/src/registry/inbuilt-components/inbuiltValidators.ts +33 -0
  598. package/src/registry/inbuilt-components/template-component-map.ts +28 -0
  599. package/src/registry/registry.ts +290 -0
  600. package/src/transformers/default-schema-transformer.ts +340 -0
  601. package/src/types/domain.ts +237 -0
  602. package/src/types/index.ts +153 -0
  603. package/src/types/schema.ts +259 -0
  604. package/src/typings.d.ts +9 -0
  605. package/src/utils/boolean-utils.ts +25 -0
  606. package/src/utils/common-expression-helpers.ts +636 -0
  607. package/src/utils/common-utils.ts +108 -0
  608. package/src/utils/error-utils.ts +37 -0
  609. package/src/utils/expression-runner.ts +172 -0
  610. package/src/utils/form-helper.ts +283 -0
  611. package/src/utils/form-page-utils.ts +13 -0
  612. package/src/utils/forms-loader.ts +306 -0
  613. package/src/utils/post-submission-action-helper.ts +71 -0
  614. package/src/utils/zscore-service.ts +59 -0
  615. package/src/validators/conditional-answered-validator.ts +17 -0
  616. package/src/validators/date-validator.ts +19 -0
  617. package/src/validators/default-value-validator.ts +36 -0
  618. package/src/validators/form-validator.ts +95 -0
  619. package/src/validators/js-expression-validator.ts +44 -0
  620. package/src/validators/schema.ts +34 -0
  621. package/src/zscore/bfa_boys_5_above.json +2522 -0
  622. package/src/zscore/bfa_girls_5_above.json +2522 -0
  623. package/src/zscore/hfa_boys_5_above.json +2186 -0
  624. package/src/zscore/hfa_boys_below5.json +22286 -0
  625. package/src/zscore/hfa_girls_5_above.json +2186 -0
  626. package/src/zscore/hfa_girls_below5.json +22286 -0
  627. package/src/zscore/wfl_boys_below5.json +7814 -0
  628. package/src/zscore/wfl_girls_below5.json +7814 -0
@@ -0,0 +1,461 @@
1
+ import dayjs from "dayjs";
2
+ import { CommonExpressionHelpers, simpleHash } from "./common-expression-helpers.js";
3
+ describe('CommonExpressionHelpers', ()=>{
4
+ let helpers;
5
+ const mockPatient = {
6
+ birthDate: '1990-01-01',
7
+ sex: 'male'
8
+ };
9
+ const mockFields = [
10
+ {
11
+ label: 'Question 1',
12
+ type: 'obs',
13
+ questionOptions: {
14
+ rendering: 'radio',
15
+ concept: 'question1_concept',
16
+ answers: []
17
+ },
18
+ id: 'question1'
19
+ },
20
+ {
21
+ label: 'Question 2',
22
+ type: 'obs',
23
+ questionOptions: {
24
+ rendering: 'radio',
25
+ concept: 'question2_concept',
26
+ answers: []
27
+ },
28
+ id: 'question2'
29
+ }
30
+ ];
31
+ const mockFieldValues = {};
32
+ beforeEach(()=>{
33
+ helpers = new CommonExpressionHelpers(null, mockPatient, mockFields, mockFieldValues);
34
+ });
35
+ describe('isEmpty', ()=>{
36
+ it('should return true if value is empty, null or undefined', ()=>{
37
+ let val = '';
38
+ expect(helpers.isEmpty(val)).toBe(true);
39
+ val = 'test';
40
+ expect(helpers.isEmpty(val)).toBe(false);
41
+ val = null;
42
+ expect(helpers.isEmpty(val)).toBe(true);
43
+ val = undefined;
44
+ expect(helpers.isEmpty(val)).toBe(true);
45
+ });
46
+ });
47
+ describe('today', ()=>{
48
+ it("should return today's date", ()=>{
49
+ const today = helpers.today();
50
+ expect(today).toBeInstanceOf(Date);
51
+ expect(today.toDateString()).toBe(new Date().toDateString());
52
+ });
53
+ });
54
+ describe('includes', ()=>{
55
+ it('should return true if the collection includes the value', ()=>{
56
+ const collection = [
57
+ 1,
58
+ 2,
59
+ 3
60
+ ];
61
+ const value = 2;
62
+ expect(helpers.includes(collection, value)).toBe(true);
63
+ });
64
+ it('should return false if the collection does not include the value', ()=>{
65
+ const collection = [
66
+ 1,
67
+ 2,
68
+ 3
69
+ ];
70
+ const value = 4;
71
+ expect(helpers.includes(collection, value)).toBe(false);
72
+ });
73
+ });
74
+ describe('isDateBefore', ()=>{
75
+ it('should return true if the left date is before the right date', ()=>{
76
+ const left = new Date('2021-01-01');
77
+ const right = '2021-12-31';
78
+ expect(helpers.isDateBefore(left, right)).toBe(true);
79
+ });
80
+ it('should return false if the left date is not before the right date', ()=>{
81
+ const left = new Date('2021-12-31');
82
+ const right = '2021-01-01';
83
+ expect(helpers.isDateBefore(left, right)).toBe(false);
84
+ });
85
+ });
86
+ describe('isDateAfter', ()=>{
87
+ it('should return true if the selected date is after the calculated date', ()=>{
88
+ const selectedDate = new Date('2022-01-01');
89
+ const baseDate = new Date('2021-01-01');
90
+ const duration = 1;
91
+ const timePeriod = 'years';
92
+ expect(helpers.isDateAfter(selectedDate, baseDate, duration, timePeriod)).toBe(true);
93
+ });
94
+ it('should return false if the selected date is not after the calculated date', ()=>{
95
+ const selectedDate = new Date('2021-01-01');
96
+ const baseDate = new Date('2022-01-01');
97
+ const duration = 1;
98
+ const timePeriod = 'years';
99
+ expect(helpers.isDateAfter(selectedDate, baseDate, duration, timePeriod)).toBe(false);
100
+ });
101
+ });
102
+ describe('isDateAfterSimple', ()=>{
103
+ it('should return true if the left date is after the right date', ()=>{
104
+ const left = new Date('2021-12-31');
105
+ const right = '2021-01-01';
106
+ expect(helpers.isDateAfterSimple(left, right)).toBe(true);
107
+ });
108
+ it('should return false if the left date is not after the right date', ()=>{
109
+ const left = new Date('2021-01-01');
110
+ const right = '2021-12-31';
111
+ expect(helpers.isDateAfterSimple(left, right)).toBe(false);
112
+ });
113
+ it('should accept a Date object as the right parameter', ()=>{
114
+ const left = new Date('2021-12-31');
115
+ const right = new Date('2021-01-01');
116
+ expect(helpers.isDateAfterSimple(left, right)).toBe(true);
117
+ });
118
+ it('should use custom format when provided', ()=>{
119
+ const left = new Date('2021-12-31');
120
+ const right = '31/01/2021';
121
+ expect(helpers.isDateAfterSimple(left, right, 'DD/MM/YYYY')).toBe(true);
122
+ });
123
+ });
124
+ describe('addWeeksToDate', ()=>{
125
+ it('should add weeks to a date correctly', ()=>{
126
+ const date = new Date('2021-01-01');
127
+ const result = helpers.addWeeksToDate(date, 2);
128
+ expect(result).toEqual(new Date('2021-01-15'));
129
+ });
130
+ it('should not mutate the original date', ()=>{
131
+ const date = new Date('2021-01-01');
132
+ const originalTime = date.getTime();
133
+ helpers.addWeeksToDate(date, 2);
134
+ expect(date.getTime()).toBe(originalTime);
135
+ });
136
+ });
137
+ describe('addDaysToDate', ()=>{
138
+ it('should add days to a date correctly', ()=>{
139
+ const date = new Date('2021-01-01');
140
+ const result = helpers.addDaysToDate(date, 10);
141
+ expect(result).toEqual(new Date('2021-01-11'));
142
+ });
143
+ it('should not mutate the original date', ()=>{
144
+ const date = new Date('2021-01-01');
145
+ const originalTime = date.getTime();
146
+ helpers.addDaysToDate(date, 10);
147
+ expect(date.getTime()).toBe(originalTime);
148
+ });
149
+ it('should handle negative days', ()=>{
150
+ const date = new Date('2021-01-15');
151
+ const result = helpers.addDaysToDate(date, -5);
152
+ expect(result).toEqual(new Date('2021-01-10'));
153
+ });
154
+ });
155
+ describe('useFieldValue', ()=>{
156
+ it('should return the field value if the key exists', ()=>{
157
+ helpers.allFieldValues = {
158
+ question1: 'value1'
159
+ };
160
+ expect(helpers.useFieldValue('question1')).toBe('value1');
161
+ });
162
+ it('should return null if the key does not exist', ()=>{
163
+ expect(helpers.useFieldValue('question2')).toBe(null);
164
+ });
165
+ it("should register dependency of the current node to it's determinant", ()=>{
166
+ // question1 as the current node
167
+ helpers.node = {
168
+ value: mockFields[0],
169
+ type: 'field'
170
+ };
171
+ helpers.allFieldValues = {
172
+ question1: 'value1',
173
+ question2: 'value2'
174
+ };
175
+ helpers.useFieldValue('question2');
176
+ // assert that question2 lists question1 as dependent
177
+ expect(Array.from(mockFields[1].fieldDependents)).toStrictEqual([
178
+ 'question1'
179
+ ]);
180
+ });
181
+ });
182
+ describe('doesNotMatchExpression', ()=>{
183
+ it('should return true if the value does not match the regex', ()=>{
184
+ const regex = '^abc$';
185
+ const value = 'def';
186
+ expect(helpers.doesNotMatchExpression(regex, value)).toBe(true);
187
+ });
188
+ it('should return false if the value matches the regex', ()=>{
189
+ const regex = '^abc$';
190
+ const value = 'abc';
191
+ expect(helpers.doesNotMatchExpression(regex, value)).toBe(false);
192
+ });
193
+ });
194
+ describe('calcBMI', ()=>{
195
+ it('should return the correct BMI value', ()=>{
196
+ const height = 180;
197
+ const weight = 75;
198
+ expect(helpers.calcBMI(height, weight)).toBeCloseTo(23.1, 1);
199
+ });
200
+ it('should return null if height or weight is not provided', ()=>{
201
+ expect(helpers.calcBMI(null, 75)).toBe(null);
202
+ expect(helpers.calcBMI(180, null)).toBe(null);
203
+ });
204
+ });
205
+ describe('calcBSA', ()=>{
206
+ it('should return the correct BSA value using Mosteller formula', ()=>{
207
+ // BSA = sqrt((height * weight) / 3600)
208
+ // For height=180cm, weight=75kg: sqrt((180 * 75) / 3600) = sqrt(3.75) ≈ 1.94
209
+ const height = 180;
210
+ const weight = 75;
211
+ expect(helpers.calcBSA(height, weight)).toBeCloseTo(1.94, 2);
212
+ });
213
+ it('should return null if height or weight is not provided', ()=>{
214
+ expect(helpers.calcBSA(null, 75)).toBe(null);
215
+ expect(helpers.calcBSA(180, null)).toBe(null);
216
+ expect(helpers.calcBSA(0, 75)).toBe(null);
217
+ expect(helpers.calcBSA(180, 0)).toBe(null);
218
+ });
219
+ });
220
+ describe('calcEDD', ()=>{
221
+ it('should return the expected date of delivery', ()=>{
222
+ const lmp = new Date('2021-01-01');
223
+ const expectedEDD = new Date('2021-10-08');
224
+ expect(helpers.calcEDD(lmp)).toEqual(expectedEDD);
225
+ });
226
+ it('should return null if lmp is not provided', ()=>{
227
+ expect(helpers.calcEDD(null)).toBe(null);
228
+ });
229
+ });
230
+ describe('calcMonthsOnART', ()=>{
231
+ it('should return the correct number of months on ART', ()=>{
232
+ const artStartDate = new Date('2020-01-01');
233
+ const today = new Date();
234
+ const monthsOnART = dayjs(today).diff(dayjs(artStartDate), 'months');
235
+ expect(helpers.calcMonthsOnART(artStartDate)).toBe(monthsOnART);
236
+ });
237
+ it('should return null if artStartDate is not provided', ()=>{
238
+ expect(helpers.calcMonthsOnART(null)).toBe(null);
239
+ });
240
+ });
241
+ describe('calcViralLoadStatus', ()=>{
242
+ it('should return the correct viral load status', ()=>{
243
+ expect(helpers.calcViralLoadStatus(100)).toBe('a6768be6-c08e-464d-8f53-5f4229508e54');
244
+ expect(helpers.calcViralLoadStatus(50)).toBe('5d5e42cc-acc4-4069-b3a8-7163e0db5d96');
245
+ });
246
+ it('should return null if viralLoadCount is not provided', ()=>{
247
+ expect(helpers.calcViralLoadStatus(null)).toBe(null);
248
+ });
249
+ });
250
+ describe('calcNextVisitDate', ()=>{
251
+ it('should return the correct next visit date', ()=>{
252
+ const followupDate = new Date('2021-01-01');
253
+ const arvDispensedInDays = 30;
254
+ const expectedNextVisitDate = new Date('2021-01-31');
255
+ expect(helpers.calcNextVisitDate(followupDate, arvDispensedInDays)).toEqual(expectedNextVisitDate);
256
+ });
257
+ it('should return null if followupDate or arvDispensedInDays is not provided', ()=>{
258
+ expect(helpers.calcNextVisitDate(null, 30)).toBe(null);
259
+ expect(helpers.calcNextVisitDate(new Date('2021-01-01'), null)).toBe(null);
260
+ });
261
+ });
262
+ describe('calcTreatmentEndDate', ()=>{
263
+ it('should return the correct treatment end date', ()=>{
264
+ const followupDate = new Date('2021-01-01');
265
+ const arvDispensedInDays = 30;
266
+ const patientStatus = '160429AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
267
+ const expectedTreatmentEndDate = new Date('2021-03-02');
268
+ expect(helpers.calcTreatmentEndDate(followupDate, arvDispensedInDays, patientStatus)).toEqual(expectedTreatmentEndDate);
269
+ });
270
+ it('should return null if followupDate, arvDispensedInDays, or patientStatus is not provided', ()=>{
271
+ expect(helpers.calcTreatmentEndDate(null, 30, '160429AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')).toBe(null);
272
+ expect(helpers.calcTreatmentEndDate(new Date('2021-01-01'), null, '160429AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')).toBe(null);
273
+ expect(helpers.calcTreatmentEndDate(new Date('2021-01-01'), 30, null)).toBe(null);
274
+ });
275
+ });
276
+ describe('calcAgeBasedOnDate', ()=>{
277
+ it('should return the correct age based on the date provided', ()=>{
278
+ const dateValue = '2021-01-01';
279
+ const expectedAge = 31;
280
+ expect(helpers.calcAgeBasedOnDate(dateValue)).toBe(expectedAge);
281
+ });
282
+ it('should return the correct age based on the current date if no date is provided', ()=>{
283
+ const currentYear = new Date().getFullYear();
284
+ const birthYear = new Date(mockPatient.birthDate).getFullYear();
285
+ const expectedAge = currentYear - birthYear;
286
+ expect(helpers.calcAgeBasedOnDate()).toBe(expectedAge);
287
+ });
288
+ });
289
+ describe('arrayContains', ()=>{
290
+ it('should return true if the array contains all members', ()=>{
291
+ const array = [
292
+ 1,
293
+ 2,
294
+ 3
295
+ ];
296
+ const members = [
297
+ 1,
298
+ 2
299
+ ];
300
+ expect(helpers.arrayContains(array, members)).toBe(true);
301
+ });
302
+ it('should return false if the array does not contain all members', ()=>{
303
+ const array = [
304
+ 1,
305
+ 2,
306
+ 3
307
+ ];
308
+ const members = [
309
+ 1,
310
+ 4
311
+ ];
312
+ expect(helpers.arrayContains(array, members)).toBe(false);
313
+ });
314
+ });
315
+ describe('arrayContainsAny', ()=>{
316
+ it('should return true if the array contains any of the members', ()=>{
317
+ const array = [
318
+ 1,
319
+ 2,
320
+ 3
321
+ ];
322
+ const members = [
323
+ 1,
324
+ 4
325
+ ];
326
+ expect(helpers.arrayContainsAny(array, members)).toBe(true);
327
+ });
328
+ it('should return false if the array does not contain any of the members', ()=>{
329
+ const array = [
330
+ 1,
331
+ 2,
332
+ 3
333
+ ];
334
+ const members = [
335
+ 4,
336
+ 5
337
+ ];
338
+ expect(helpers.arrayContainsAny(array, members)).toBe(false);
339
+ });
340
+ });
341
+ describe('parseDate', ()=>{
342
+ it('returns a Date object', ()=>{
343
+ const result = helpers.parseDate('2023-04-13');
344
+ expect(result instanceof Date).toBe(true);
345
+ });
346
+ it('uses default format and offset values when passed as null arguments', ()=>{
347
+ const result = helpers.parseDate('2023-04-13T01:23:45.678Z');
348
+ expect(result.toISOString()).toEqual('2023-04-13T01:23:45.678Z');
349
+ });
350
+ });
351
+ describe('formatDate', ()=>{
352
+ it('should return a formatted date string', ()=>{
353
+ const dateValue = '2022-11-21';
354
+ const formattedDate = helpers.formatDate(dateValue, 'DD/MM/YYYY');
355
+ expect(formattedDate).toBe('21/11/2022');
356
+ });
357
+ it('defaults to openmrs locale format if no format is passed', ()=>{
358
+ const formattedDate = helpers.formatDate('2023-04-13T01:23:45.678Z');
359
+ expect(formattedDate).toEqual('13-Apr-2023');
360
+ });
361
+ it('should throw an error if the value is not a valid date', ()=>{
362
+ const invalidDateString = 'not a valid date';
363
+ expect(()=>{
364
+ helpers.formatDate(invalidDateString);
365
+ }).toThrow('DateFormatException: value passed is not a valid date');
366
+ });
367
+ });
368
+ describe('extractRepeatingGroupValues', ()=>{
369
+ it('should return the values of the specified key from the array of objects', ()=>{
370
+ const array = [
371
+ {
372
+ key1: 'value1'
373
+ },
374
+ {
375
+ key1: 'value2'
376
+ }
377
+ ];
378
+ const key = 'key1';
379
+ expect(helpers.extractRepeatingGroupValues(key, array)).toEqual([
380
+ 'value1',
381
+ 'value2'
382
+ ]);
383
+ });
384
+ it('returns an empty array if the input array is empty', ()=>{
385
+ const emptyArray = [];
386
+ const values = helpers.extractRepeatingGroupValues('someKey', emptyArray);
387
+ expect(values).toEqual([]);
388
+ });
389
+ });
390
+ describe('calcGravida', ()=>{
391
+ it('should return the correct gravida value', ()=>{
392
+ const parityTerm = 2;
393
+ const parityAbortion = 1;
394
+ expect(helpers.calcGravida(parityTerm, parityAbortion)).toBe(3);
395
+ });
396
+ it('should throw an error if either input is not a valid number', ()=>{
397
+ expect(()=>{
398
+ helpers.calcGravida('invalid', 1);
399
+ }).toThrow('Both inputs must be valid numbers.');
400
+ });
401
+ });
402
+ describe('calcTimeDifference', ()=>{
403
+ it('should return the correct time difference in days', ()=>{
404
+ const obsDate = dayjs().subtract(5, 'days');
405
+ expect(helpers.calcTimeDifference(obsDate, 'd')).toBe(5);
406
+ });
407
+ it('should return the correct time difference in weeks', ()=>{
408
+ const obsDate = dayjs().subtract(2, 'weeks');
409
+ expect(helpers.calcTimeDifference(obsDate, 'w')).toBe(2);
410
+ });
411
+ it('should return the correct time difference in months', ()=>{
412
+ const obsDate = dayjs().subtract(3, 'months');
413
+ expect(helpers.calcTimeDifference(obsDate, 'm')).toBe(3);
414
+ });
415
+ it('should return the correct time difference in years', ()=>{
416
+ const obsDate = dayjs().subtract(1, 'year');
417
+ expect(helpers.calcTimeDifference(obsDate, 'y')).toBe(1);
418
+ });
419
+ it('should return 0 if obsDate is not provided', ()=>{
420
+ expect(helpers.calcTimeDifference(null, 'd')).toBe(0);
421
+ });
422
+ });
423
+ describe('resolve', ()=>{
424
+ it('should resolve the promise', async ()=>{
425
+ const promise = Promise.resolve('resolved value');
426
+ const result = await helpers.resolve(promise);
427
+ expect(result).toBe('resolved value');
428
+ });
429
+ });
430
+ });
431
+ describe('simpleHash', ()=>{
432
+ test('should return the same hash for the same input string', ()=>{
433
+ const expression = "linkedToCare == '488b58ff-64f5-4f8a-8979-fa79940b1594'";
434
+ const hash1 = simpleHash(expression);
435
+ const hash2 = simpleHash(expression);
436
+ expect(hash1).toBe(hash2);
437
+ });
438
+ test('should return different hashes for different input strings', ()=>{
439
+ const expression1 = "linkedToCare == '488b58ff-64f5-4f8a-8979-fa79940b1594'";
440
+ const expression2 = "linkedToCare !== '488b58ff-64f5-4f8a-8979-fa79940b1594'";
441
+ const hash1 = simpleHash(expression1);
442
+ const hash2 = simpleHash(expression2);
443
+ expect(hash1).not.toBe(hash2);
444
+ });
445
+ test('should handle empty string and return 0', ()=>{
446
+ const expression = '';
447
+ const hash = simpleHash(expression);
448
+ expect(hash).toBe(0);
449
+ });
450
+ test('should handle long strings without errors', ()=>{
451
+ const longExpression = 'left != right &'.repeat(1000);
452
+ const hash = simpleHash(longExpression);
453
+ expect(hash).toBeDefined();
454
+ });
455
+ test('should return consistent hash for strings with Unicode characters', ()=>{
456
+ const str = '😊💻';
457
+ const hash1 = simpleHash(str);
458
+ const hash2 = simpleHash(str);
459
+ expect(hash1).toBe(hash2);
460
+ });
461
+ });
@@ -0,0 +1,51 @@
1
+ import { type FormSchema, type FormField, type OpenmrsObs, type RenderType } from '../types';
2
+ export declare function flattenObsList(obsList: OpenmrsObs[]): OpenmrsObs[];
3
+ export declare function hasRendering(field: FormField, rendering: RenderType): boolean;
4
+ export declare function clearSubmission(field: FormField): void;
5
+ export declare function gracefullySetSubmission(field: FormField, newValue: any, voidedValue: any): any;
6
+ export declare function hasSubmission(field: FormField): boolean;
7
+ export declare function isViewMode(sessionMode: string): sessionMode is "view" | "embedded-view";
8
+ export declare function parseToLocalDateTime(dateString: string): Date;
9
+ export declare function formatDateAsDisplayString(field: FormField, date: Date): string;
10
+ /**
11
+ * Creates a new copy of `formJson` with updated references at the page and section levels.
12
+ * This ensures React re-renders properly by providing new references for nested arrays.
13
+ */
14
+ export declare function updateFormSectionReferences(formJson: FormSchema): {
15
+ name: string;
16
+ pages: Array<import("../types").FormPage>;
17
+ processor: string;
18
+ uuid: string;
19
+ referencedForms: Array<import("../types").ReferencedForm>;
20
+ encounterType: string;
21
+ encounter?: string | import("../types").OpenmrsEncounter;
22
+ allowUnspecifiedAll?: boolean;
23
+ defaultPage?: string;
24
+ readonly?: string | boolean;
25
+ inlineRendering?: "single-line" | "multiline" | "automatic";
26
+ markdown?: any;
27
+ postSubmissionActions?: Array<{
28
+ actionId: string;
29
+ enabled?: string;
30
+ config?: Record<string, any>;
31
+ }>;
32
+ formOptions?: {
33
+ usePreviousValueDisabled: boolean;
34
+ };
35
+ version?: string;
36
+ translations?: Record<string, string>;
37
+ meta?: {
38
+ programs?: {
39
+ hasProgramFields?: boolean;
40
+ [anythingElse: string]: any;
41
+ };
42
+ };
43
+ };
44
+ /**
45
+ * Converts a px value to a rem value
46
+ * @param px - The px value to convert
47
+ * @param fontSize - The font size to use for the conversion
48
+ * @returns The rem value
49
+ */
50
+ export declare function pxToRem(px: number, fontSize?: number): number;
51
+ //# sourceMappingURL=common-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-utils.d.ts","sourceRoot":"","sources":["../../src/utils/common-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAI7F,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAgBlE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,WAEnE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,QAS/C;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,OAWxF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,WAE7C;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,2CAE7C;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAgB7D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,UAQrE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,UAAU;;;;;;;;;;;;;;;eA9E1D,CAAA;cAGJ,CAAF;;;;;;;;gBAQkB,CAAC;4BAA2B,CAAC;;;;EAyE9C;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,UAExD"}
@@ -0,0 +1,102 @@
1
+ import dayjs from "dayjs";
2
+ import { isEmpty } from "../validators/form-validator.js";
3
+ import { formatDate } from "@openmrs/esm-framework";
4
+ export function flattenObsList(obsList) {
5
+ const flattenedList = [];
6
+ function flatten(obs) {
7
+ flattenedList.push(obs);
8
+ if (obs.groupMembers?.length) {
9
+ obs.groupMembers.forEach((groupMember)=>{
10
+ flatten(groupMember);
11
+ });
12
+ }
13
+ }
14
+ obsList.forEach((obs)=>{
15
+ flatten(obs);
16
+ });
17
+ return flattenedList;
18
+ }
19
+ export function hasRendering(field, rendering) {
20
+ return field.questionOptions.rendering === rendering;
21
+ }
22
+ export function clearSubmission(field) {
23
+ if (!field.meta?.submission) {
24
+ field.meta = {
25
+ ...field.meta || {},
26
+ submission: {}
27
+ };
28
+ }
29
+ field.meta.submission = {
30
+ ...field.meta.submission,
31
+ voidedValue: null,
32
+ newValue: null
33
+ };
34
+ }
35
+ export function gracefullySetSubmission(field, newValue, voidedValue) {
36
+ if (!field.meta?.submission) {
37
+ field.meta = {
38
+ ...field.meta || {},
39
+ submission: {}
40
+ };
41
+ }
42
+ if (!isEmpty(newValue)) {
43
+ field.meta.submission.newValue = newValue;
44
+ }
45
+ if (!isEmpty(voidedValue)) {
46
+ field.meta.submission.voidedValue = voidedValue;
47
+ }
48
+ return field.meta.submission.newValue;
49
+ }
50
+ export function hasSubmission(field) {
51
+ return !!field.meta.submission?.newValue || !!field.meta.submission?.voidedValue;
52
+ }
53
+ export function isViewMode(sessionMode) {
54
+ return sessionMode === 'view' || sessionMode === 'embedded-view';
55
+ }
56
+ export function parseToLocalDateTime(dateString) {
57
+ const dateObj = dayjs(dateString).toDate();
58
+ if (isNaN(dateObj.getTime())) {
59
+ return new Date(NaN);
60
+ }
61
+ try {
62
+ const timePart = dateString.split('T')[1];
63
+ if (timePart) {
64
+ const localTimeTokens = timePart.split(':');
65
+ dateObj.setHours(parseInt(localTimeTokens[0]), parseInt(localTimeTokens[1]), 0);
66
+ }
67
+ } catch (e) {
68
+ console.error(e);
69
+ }
70
+ return dateObj;
71
+ }
72
+ export function formatDateAsDisplayString(field, date) {
73
+ const options = {
74
+ noToday: true
75
+ };
76
+ if (field.datePickerFormat === 'calendar') {
77
+ options.time = false;
78
+ } else {
79
+ options.time = true;
80
+ }
81
+ return formatDate(date, options);
82
+ }
83
+ /**
84
+ * Creates a new copy of `formJson` with updated references at the page and section levels.
85
+ * This ensures React re-renders properly by providing new references for nested arrays.
86
+ */ export function updateFormSectionReferences(formJson) {
87
+ formJson.pages = formJson.pages.map((page)=>{
88
+ page.sections = Array.from(page.sections);
89
+ return page;
90
+ });
91
+ return {
92
+ ...formJson
93
+ };
94
+ }
95
+ /**
96
+ * Converts a px value to a rem value
97
+ * @param px - The px value to convert
98
+ * @param fontSize - The font size to use for the conversion
99
+ * @returns The rem value
100
+ */ export function pxToRem(px, fontSize = 16) {
101
+ return px / fontSize;
102
+ }