@ampath/esm-reports-app 1.0.0-next.8 → 1.0.0-next.80

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 (302) hide show
  1. package/dist/0.css +1 -0
  2. package/dist/0.css.map +1 -0
  3. package/dist/0.js +1 -0
  4. package/dist/0.js.map +1 -0
  5. package/dist/197.js +1 -1
  6. package/dist/282.js +1 -1
  7. package/dist/282.js.map +1 -1
  8. package/dist/295.css +1 -0
  9. package/dist/295.css.map +1 -0
  10. package/dist/295.js +1 -0
  11. package/dist/295.js.map +1 -0
  12. package/dist/299.js +2 -0
  13. package/dist/299.js.LICENSE.txt +3 -0
  14. package/dist/299.js.map +1 -0
  15. package/dist/300.js +1 -1
  16. package/dist/311.js +1 -1
  17. package/dist/311.js.map +1 -1
  18. package/dist/335.js +1 -1
  19. package/dist/353.js +1 -1
  20. package/dist/353.js.map +1 -1
  21. package/dist/354.js +2 -0
  22. package/dist/354.js.LICENSE.txt +20 -0
  23. package/dist/354.js.map +1 -0
  24. package/dist/410.js +1 -0
  25. package/dist/410.js.map +1 -0
  26. package/dist/457.js +2 -0
  27. package/dist/457.js.LICENSE.txt +261 -0
  28. package/dist/457.js.map +1 -0
  29. package/dist/478.js +1 -1
  30. package/dist/478.js.map +1 -1
  31. package/dist/480.js +1 -0
  32. package/dist/540.js +1 -1
  33. package/dist/540.js.map +1 -1
  34. package/dist/55.js +1 -1
  35. package/dist/600.js +2 -0
  36. package/dist/600.js.LICENSE.txt +35 -0
  37. package/dist/600.js.map +1 -0
  38. package/dist/652.js +1 -1
  39. package/dist/757.js +1 -0
  40. package/dist/757.js.map +1 -0
  41. package/dist/781.js +1 -0
  42. package/dist/781.js.map +1 -0
  43. package/dist/961.js +1 -1
  44. package/dist/961.js.map +1 -1
  45. package/dist/99.js +1 -1
  46. package/dist/99.js.map +1 -0
  47. package/dist/ampath-esm-reports-app.js +1 -1
  48. package/dist/ampath-esm-reports-app.js.map +1 -1
  49. package/dist/routes.json +1 -1
  50. package/package.json +4 -2
  51. package/src/common/daily-summary-table.tsx +55 -0
  52. package/src/common/linelist-table/index.ts +3 -0
  53. package/src/common/linelist-table/linelist-columns.ts +48 -0
  54. package/src/common/linelist-table/linelist-table.component.tsx +442 -0
  55. package/src/common/linelist-table/linelist-table.scss +306 -0
  56. package/src/common/linelist-table/linelist-table.test.tsx +120 -0
  57. package/src/common/linelist-table/use-all-rows.ts +93 -0
  58. package/src/common/linelist-table/use-column-layout.ts +123 -0
  59. package/src/common/report-error/index.ts +1 -0
  60. package/src/common/report-error/show-report-error.ts +25 -0
  61. package/src/common/report-filters/date-range.ts +137 -0
  62. package/src/common/report-filters/index.ts +4 -0
  63. package/src/common/report-filters/report-filters.component.tsx +317 -99
  64. package/src/common/report-filters/report-filters.scss +264 -32
  65. package/src/common/report-filters/types.ts +79 -0
  66. package/src/common/report-filters/use-restore-period.ts +43 -0
  67. package/src/common/report-header/index.ts +1 -0
  68. package/src/common/report-header/use-location-details.ts +58 -0
  69. package/src/common/report-page/download-sheet-pdf.ts +225 -0
  70. package/src/common/report-page/index.ts +3 -0
  71. package/src/common/report-page/report-page.component.tsx +32 -0
  72. package/src/common/report-page/report-page.scss +45 -0
  73. package/src/common/report-page/use-page-scale.ts +60 -0
  74. package/src/common/report-placeholder/has-report-data.ts +15 -0
  75. package/src/common/report-placeholder/index.ts +3 -0
  76. package/src/common/report-placeholder/report-placeholder.component.tsx +81 -0
  77. package/src/common/report-placeholder/report-placeholder.scss +48 -0
  78. package/src/common/report-placeholder/use-generated-location.ts +62 -0
  79. package/src/common/report-register/index.ts +6 -0
  80. package/src/common/report-register/register-columns.ts +46 -0
  81. package/src/common/report-register/register-layout.component.tsx +265 -0
  82. package/src/common/report-register/register-layout.scss +150 -0
  83. package/src/common/report-register/register-table.scss +71 -0
  84. package/src/common/report-register/report-parents.ts +29 -0
  85. package/src/common/report-register/rows-to-csv.ts +89 -0
  86. package/src/common/report-register/use-location-name.ts +54 -0
  87. package/src/common/report-register/use-patient-list.ts +92 -0
  88. package/src/common/report-skeleton/index.ts +1 -0
  89. package/src/common/report-skeleton/report-skeleton.component.tsx +46 -0
  90. package/src/common/report-skeleton/report-skeleton.scss +29 -0
  91. package/src/config-schema.ts +9 -1
  92. package/src/dashboard/report-catalog.ts +191 -0
  93. package/src/dashboard/reports-dasboard.tsx +189 -18
  94. package/src/dashboard/reports-dashboard.module.scss +357 -14
  95. package/src/index.ts +13 -1
  96. package/src/registers/moh-240/moh-240-register.scss +41 -0
  97. package/src/registers/moh-240/moh-240.component.test.tsx +166 -0
  98. package/src/registers/moh-240/moh-240.component.tsx +164 -0
  99. package/src/registers/moh-267/moh-267-register.component.tsx +407 -0
  100. package/src/registers/moh-267/moh-267-register.scss +298 -0
  101. package/src/registers/moh-267/moh-267-summary.ts +102 -0
  102. package/src/registers/moh-267/moh-267.component.tsx +94 -0
  103. package/src/registers/moh-267/moh-267.types.ts +47 -0
  104. package/src/registers/moh-362/moh-362-lab-register.component.tsx +551 -0
  105. package/src/registers/moh-362/moh-362-lab-register.scss +412 -0
  106. package/src/registers/moh-362/moh-362-linkage-register.component.tsx +215 -0
  107. package/src/registers/moh-362/moh-362-linkage-register.scss +91 -0
  108. package/src/registers/moh-362/moh-362.component.tsx +117 -0
  109. package/src/registers/moh-362/moh-362.scss +11 -0
  110. package/src/registers/moh-362/moh-362.types.ts +87 -0
  111. package/src/registers/presumptive-tb/presumptive-tb-register.component.tsx +391 -0
  112. package/src/registers/presumptive-tb/presumptive-tb-register.scss +262 -0
  113. package/src/registers/presumptive-tb/presumptive-tb.component.tsx +92 -0
  114. package/src/registers/presumptive-tb/presumptive-tb.types.ts +88 -0
  115. package/src/registers/register-catalog.ts +202 -0
  116. package/src/registers/register-file-name.ts +18 -0
  117. package/src/registers/tb-lab-register/tb-lab-register-table.component.tsx +116 -0
  118. package/src/registers/tb-lab-register/tb-lab-register-table.scss +123 -0
  119. package/src/registers/tb-lab-register/tb-lab-register.columns.ts +164 -0
  120. package/src/registers/tb-lab-register/tb-lab-register.component.test.tsx +232 -0
  121. package/src/registers/tb-lab-register/tb-lab-register.component.tsx +153 -0
  122. package/src/registers/tb4/tb4-parts.tsx +164 -0
  123. package/src/registers/tb4/tb4-patient-sheet.component.tsx +418 -0
  124. package/src/registers/tb4/tb4-register.scss +282 -0
  125. package/src/registers/tb4/tb4-treatment-sheet.component.tsx +349 -0
  126. package/src/registers/tb4/tb4.component.tsx +120 -0
  127. package/src/registers/tb4/tb4.types.ts +129 -0
  128. package/src/reports/acf-summary/acf-summary-form.component.tsx +176 -0
  129. package/src/reports/acf-summary/acf-summary-linelist.component.tsx +86 -0
  130. package/src/reports/acf-summary/acf-summary.component.tsx +97 -0
  131. package/src/reports/acf-summary/acf-summary.counts.ts +37 -0
  132. package/src/reports/acf-summary/acf-summary.scss +162 -0
  133. package/src/reports/datatable-wrapper/datatable-wrapper.component.tsx +63 -48
  134. package/src/reports/moh-240/moh-240-header.component.tsx +62 -0
  135. package/src/reports/moh-240/moh-240.columns.ts +113 -0
  136. package/src/reports/moh-240/moh-240.component.tsx +72 -9
  137. package/src/reports/moh-240/moh-240.scss +40 -0
  138. package/src/reports/moh-240/sub-reports/moh-240-register.component.tsx +31 -37
  139. package/src/reports/moh-240/sub-reports/page-summary.component.tsx +143 -106
  140. package/src/reports/moh-505/moh-505-header.component.tsx +67 -0
  141. package/src/reports/moh-505/moh-505.component.tsx +441 -0
  142. package/src/reports/moh-505/moh-505.scss +117 -0
  143. package/src/reports/moh-705B/moh-204b-register.component.tsx +246 -0
  144. package/src/reports/moh-705B/moh-204b.columns.ts +39 -0
  145. package/src/reports/moh-705B/moh-705b.component.tsx +659 -0
  146. package/src/reports/moh-705B/moh-705b.scss +172 -0
  147. package/src/reports/moh-705a/moh-705a.component.tsx +661 -0
  148. package/src/reports/moh-705a/moh-705a.scss +172 -0
  149. package/src/reports/moh-705a/registers/moh-204a-register.component.tsx +331 -0
  150. package/src/reports/moh-705a/registers/moh-204a.columns.ts +57 -0
  151. package/src/reports/moh-705a/type.ts +6 -0
  152. package/src/reports/moh-706/moh-706-header.component.tsx +66 -0
  153. package/src/reports/moh-706/moh-706.component.tsx +150 -24
  154. package/src/reports/moh-706/moh-706.scss +119 -11
  155. package/src/reports/moh-706/sub-reports/bacteriology/bacteriology.component.tsx +35 -28
  156. package/src/reports/moh-706/sub-reports/blood-chemistry/blood-chemistry.component.tsx +229 -305
  157. package/src/reports/moh-706/sub-reports/haematology/haematology.component.tsx +26 -19
  158. package/src/reports/moh-706/sub-reports/histology-and-cytology/histology-and-cytology.component.tsx +23 -23
  159. package/src/reports/moh-706/sub-reports/parasitology/parasitology.component.tsx +25 -18
  160. package/src/reports/moh-706/sub-reports/serology/serology.component.tsx +21 -14
  161. package/src/reports/moh-706/sub-reports/specimen-referral-to-higher-levels/specimen-referral-to-higher-levels.component.tsx +2 -2
  162. package/src/reports/moh-706/sub-reports/urine-analysis/urine-analysis.component.tsx +27 -20
  163. package/src/reports/moh-710/moh-710.component.tsx +815 -632
  164. package/src/reports/moh-710/moh-710.scss +142 -21
  165. package/src/reports/moh-710/registers/moh-413/moh-413-columns.ts +22 -0
  166. package/src/reports/moh-710/registers/moh-413/moh-413.component.tsx +140 -0
  167. package/src/reports/moh-710/registers/moh-413/moh-413.scss +64 -0
  168. package/src/reports/moh-710/registers/moh-510/moh-510.columns.ts +40 -0
  169. package/src/reports/moh-710/registers/moh-510/moh-510.component.tsx +191 -0
  170. package/src/reports/moh-710/registers/moh-510/moh-510.scss +130 -0
  171. package/src/reports/moh-710/registers/moh-511-710-register.component.tsx +268 -0
  172. package/src/reports/moh-710/registers/moh-511-710.columns.ts +52 -0
  173. package/src/reports/moh-710/registers/type.ts +31 -0
  174. package/src/reports/moh-711/moh-711.component.tsx +153 -1269
  175. package/src/reports/moh-711/moh711.scss +135 -20
  176. package/src/reports/moh-711/registers/moh-333-register.component.tsx +680 -0
  177. package/src/reports/moh-711/registers/moh-333.columns.ts +119 -0
  178. package/src/reports/moh-711/registers/moh-405-register.component.tsx +566 -0
  179. package/src/reports/moh-711/registers/moh-405.columns.ts +120 -0
  180. package/src/reports/moh-711/registers/moh-406-register.component.tsx +581 -0
  181. package/src/reports/moh-711/registers/moh-406.columns.ts +133 -0
  182. package/src/reports/moh-711/registers/moh-407-register.component.tsx +157 -0
  183. package/src/reports/moh-711/registers/moh-407.columns.ts +24 -0
  184. package/src/reports/moh-711/registers/moh-407.scss +64 -0
  185. package/src/reports/moh-711/registers/moh-510-register.component.tsx +55 -0
  186. package/src/reports/moh-711/registers/moh-511-register.component.tsx +270 -0
  187. package/src/reports/moh-711/registers/moh-511.columns.ts +59 -0
  188. package/src/reports/moh-711/registers/moh-512-columns.ts +94 -0
  189. package/src/reports/moh-711/registers/moh-512.component.tsx +191 -0
  190. package/src/reports/moh-711/registers/moh-512.scss +64 -0
  191. package/src/reports/moh-711/registers/tb-register-columns.ts +17 -0
  192. package/src/reports/moh-711/registers/tb-register.component.tsx +96 -0
  193. package/src/reports/moh-711/registers/tb-register.scss +64 -0
  194. package/src/reports/moh-711/registers/type.ts +192 -0
  195. package/src/reports/moh-711/sections/anc.component.tsx +159 -0
  196. package/src/reports/moh-711/sections/cervical-cancer.component.tsx +148 -0
  197. package/src/reports/moh-711/sections/chanis.component.tsx +389 -0
  198. package/src/reports/moh-711/sections/family-planning.component.tsx +299 -0
  199. package/src/reports/moh-711/sections/gbv.component.tsx +115 -0
  200. package/src/reports/moh-711/sections/maternity.component.tsx +321 -0
  201. package/src/reports/moh-711/sections/medical-social-work.component.tsx +73 -0
  202. package/src/reports/moh-711/sections/other.component.tsx +47 -0
  203. package/src/reports/moh-711/sections/physiotherapy.component.tsx +61 -0
  204. package/src/reports/moh-711/sections/pnc.component.tsx +127 -0
  205. package/src/reports/moh-711/sections/post-abortion.component.tsx +42 -0
  206. package/src/reports/moh-711/sections/rehabilitation.component.tsx +57 -0
  207. package/src/reports/moh-711/sections/report-compiled-by.component.tsx +50 -0
  208. package/src/reports/moh-711/sections/tb-screening.component.tsx +94 -0
  209. package/src/reports/moh-717/moh-717.component.tsx +149 -985
  210. package/src/reports/moh-717/moh717.scss +217 -21
  211. package/src/reports/moh-717/registers/nutrition-register.component.tsx +48 -0
  212. package/src/reports/moh-717/sections/finance.component.tsx +42 -0
  213. package/src/reports/moh-717/sections/inpatient.component.tsx +374 -0
  214. package/src/reports/moh-717/sections/maternity.component.tsx +126 -0
  215. package/src/reports/moh-717/sections/medical-records.component.tsx +35 -0
  216. package/src/reports/moh-717/sections/mortuary.component.tsx +43 -0
  217. package/src/reports/moh-717/sections/operations.component.tsx +53 -0
  218. package/src/reports/moh-717/sections/orthopaedic-trauma.component.tsx +98 -0
  219. package/src/reports/moh-717/sections/outpatient.component.tsx +597 -0
  220. package/src/reports/moh-717/sections/pharmacy.component.tsx +43 -0
  221. package/src/reports/moh-717/sections/preparedby.component.tsx +52 -0
  222. package/src/reports/moh-717/sections/special-services.component.tsx +114 -0
  223. package/src/reports/moh-729b/moh-729b-form.component.tsx +385 -0
  224. package/src/reports/moh-729b/moh-729b-linelist.component.tsx +205 -0
  225. package/src/reports/moh-729b/moh-729b-summary.component.tsx +258 -0
  226. package/src/reports/moh-729b/moh-729b-summary.config.ts +229 -0
  227. package/src/reports/moh-729b/moh-729b.component.tsx +157 -0
  228. package/src/reports/moh-729b/moh-729b.config.ts +235 -0
  229. package/src/reports/moh-729b/moh-729b.scss +276 -0
  230. package/src/reports/moh-729b/moh-729b.types.ts +111 -0
  231. package/src/reports/moh-731/linelist/moh-731-indicators.ts +1122 -0
  232. package/src/reports/moh-731/linelist/moh-731-linelist-sections.ts +472 -0
  233. package/src/reports/moh-731/linelist/moh-731-linelist.component.tsx +102 -0
  234. package/src/reports/moh-731/linelist/use-open-moh-731-linelist.ts +50 -0
  235. package/src/reports/moh-731/moh-731.component.tsx +269 -0
  236. package/src/reports/moh-731/moh-731.scss +496 -0
  237. package/src/reports/moh-731/registers/moh-366.columns.ts +38 -0
  238. package/src/reports/moh-731/registers/moh-366.component.tsx +471 -0
  239. package/src/reports/moh-731/registers/prep-register.component.tsx +284 -0
  240. package/src/reports/moh-731/registers/prep.columns.ts +34 -0
  241. package/src/reports/moh-731/sections/hiv-and-tb-treatment.component.tsx +1206 -0
  242. package/src/reports/moh-731/sections/hiv-testing-and-pre-exposure.component.tsx +727 -0
  243. package/src/reports/moh-731/sections/pmtct.component.tsx +572 -0
  244. package/src/reports/moh-731/summary/moh-731-summary.component.tsx +313 -0
  245. package/src/reports/moh-731/summary/moh-731-summary.config.ts +527 -0
  246. package/src/reports/moh-731/summary/moh-731-summary.scss +247 -0
  247. package/src/reports/moh-740/moh-740.component.scss +202 -0
  248. package/src/reports/moh-740/moh-740.component.tsx +1332 -0
  249. package/src/reports/moh-740/moh-740.resource.ts +54 -0
  250. package/src/reports/moh-740/registers/moh-222-daily-register/moh-222-daily-register.tsx +149 -0
  251. package/src/reports/moh-740/registers/moh-270-permanent-register/moh-270-permanent-register.tsx +123 -0
  252. package/src/reports/moh-740/registers/moh-740-patient-list.scss +0 -0
  253. package/src/reports/moh-740/registers/moh-740-patient-list.tsx +60 -0
  254. package/src/reports/moh-740/registers/moh-740.columns.ts +54 -0
  255. package/src/reports/moh-740/shared/data-cell/data-cell.scss +6 -0
  256. package/src/reports/moh-740/shared/data-cell/data-cell.tsx +23 -0
  257. package/src/reports/moh-740/shared/utils/indicator-register-map.ts +159 -0
  258. package/src/reports/moh-740/types/index.ts +223 -0
  259. package/src/reports/moh-745/moh-745.component.tsx +2058 -0
  260. package/src/reports/moh-745/moh-745.scss +142 -0
  261. package/src/reports/moh-745/registers/moh-412-register.component.tsx +249 -0
  262. package/src/reports/moh-745/registers/moh-412.columns.ts +52 -0
  263. package/src/reports/moh-745/registers/type.ts +223 -0
  264. package/src/reports/table-wrapper/table-row-mapper.component.tsx +20 -5
  265. package/src/reports/table-wrapper/table-wrapper.component.tsx +23 -14
  266. package/src/reports/table-wrapper/table-wrapper.scss +1 -16
  267. package/src/resources/moh-267.resource.ts +27 -0
  268. package/src/resources/moh-362.resource.ts +27 -0
  269. package/src/resources/moh-505.resource.ts +69 -0
  270. package/src/resources/moh-705.resource.ts +118 -0
  271. package/src/resources/moh-706.resource.ts +80 -0
  272. package/src/resources/moh-710.resource.ts +60 -9
  273. package/src/resources/moh-711.resource.ts +206 -9
  274. package/src/resources/moh-717.resource.ts +26 -9
  275. package/src/resources/moh-729b.resource.ts +25 -0
  276. package/src/resources/moh-731.resource.ts +90 -0
  277. package/src/resources/moh-745.resource.ts +76 -0
  278. package/src/resources/patient-list-page.ts +66 -0
  279. package/src/resources/presumptive-tb.resource.ts +27 -0
  280. package/src/root.component.tsx +79 -8
  281. package/src/root.scss +36 -0
  282. package/src/routes.json +3 -1
  283. package/src/utils/format-indicator.ts +39 -0
  284. package/src/utils/get-base-url.ts +39 -7
  285. package/src/utils/utils.ts +30 -1
  286. package/tsconfig.json +1 -1
  287. package/webpack.config.js +22 -1
  288. package/dist/138.js +0 -2
  289. package/dist/138.js.LICENSE.txt +0 -20
  290. package/dist/138.js.map +0 -1
  291. package/dist/184.js +0 -2
  292. package/dist/184.js.LICENSE.txt +0 -14
  293. package/dist/184.js.map +0 -1
  294. package/dist/205.js +0 -1
  295. package/dist/205.js.map +0 -1
  296. package/dist/812.js +0 -1
  297. package/dist/812.js.map +0 -1
  298. package/dist/879.js +0 -1
  299. package/dist/879.js.map +0 -1
  300. package/dist/ampath-esm-reports-app.js.buildmanifest.json +0 -539
  301. package/dist/main.js +0 -1
  302. package/dist/main.js.map +0 -1
@@ -13,10 +13,15 @@ interface TableRowMapperProps {
13
13
  rowSpan: number;
14
14
  }>
15
15
  }[],
16
- data?: any
16
+ data?: any,
17
+ redirectTo?: string,
18
+ locationUuids?: string,
19
+ startDate?: string,
20
+ endDate?: string
21
+ report?: string,
17
22
  }
18
23
 
19
- const TableRowMapper: React.FC<TableRowMapperProps> = ({ tableRows, data }) => {
24
+ const TableRowMapper: React.FC<TableRowMapperProps> = ({ tableRows, data, redirectTo = "home/reports/moh-240", locationUuids, startDate, endDate, report = "moh-706" }) => {
20
25
  return <>
21
26
  {tableRows.map((tR) => (
22
27
  <TableRow>
@@ -24,12 +29,22 @@ const TableRowMapper: React.FC<TableRowMapperProps> = ({ tableRows, data }) => {
24
29
  const value = data ? data[tC.key] : "";
25
30
 
26
31
  const onClick = () => {
27
- if (!tC.label) {
28
- navigate({ to: "home/reports/moh-240" });
32
+ if (!tC.label && tC.key) {
33
+ const params = new URLSearchParams();
34
+ if (locationUuids) params.append('locationUuids', locationUuids);
35
+ if (startDate) params.append('startDate', startDate);
36
+ if (endDate) params.append('endDate', endDate);
37
+ if (tC.key) params.append('indicators', tC.key);
38
+ params.append('report', report);
39
+ // the row's own label, so the register header reads
40
+ // the form row ("1.3 Ketones") instead of the key
41
+ const rowLabel = tR.tableCells.find((c: any) => c.label)?.label;
42
+ if (rowLabel) params.append('label', String(rowLabel));
43
+ navigate({ to: `${redirectTo}?${params.toString()}` });
29
44
  }
30
45
  };
31
46
 
32
- return <TableCell className={styles.dataCell} colSpan={tC.colSpan} key={i} onClick={onClick}>
47
+ return <TableCell className={styles.dataCell} colSpan={tC.colSpan} key={i} onClick={onClick} {...({ rowSpan: tC.rowSpan } as any)}>
33
48
  {tC.label ? (tC.strong ? <strong>{tC.label}</strong> : tC.label) : value}
34
49
  </TableCell>
35
50
 
@@ -1,21 +1,30 @@
1
1
  import React from 'react';
2
- import { Table, TableBody } from '@carbon/react';
2
+ import classNames from 'classnames';
3
3
  import styles from './table-wrapper.scss';
4
4
 
5
5
  interface TableWrapperProps {
6
- children: React.ReactNode;
6
+ children: React.ReactNode;
7
+ /** Applied to the wrapper, so a report can use its own stylesheet */
8
+ className?: string;
7
9
  }
8
10
 
9
- const TableWrapper: React.FC<TableWrapperProps> = ({ children }) => {
10
- return <>
11
- <div className={styles.tableWrapper}>
12
- <Table size="sm" className={styles.tableComponent}>
13
- <TableBody>
14
- {children}
15
- </TableBody>
16
- </Table>
17
- </div>
18
- </>
19
- }
11
+ /**
12
+ * The frame the form-shaped reports render their tables in.
13
+ *
14
+ * This used to be Carbon's `<Table>`, but every report that uses it is a
15
+ * printed form rather than a data grid: Carbon sizes its rows to 2rem and pads
16
+ * its cells to 1rem, at a specificity no report stylesheet can reasonably
17
+ * outrank. A plain table carries none of those rules, so the reports size their
18
+ * own cells for A4.
19
+ */
20
+ const TableWrapper: React.FC<TableWrapperProps> = ({ children, className }) => {
21
+ return (
22
+ <div className={classNames(styles.tableWrapper, className)}>
23
+ <table>
24
+ <tbody>{children}</tbody>
25
+ </table>
26
+ </div>
27
+ );
28
+ };
20
29
 
21
- export default TableWrapper;
30
+ export default TableWrapper;
@@ -1,20 +1,5 @@
1
1
  .tableWrapper {
2
2
  overflow-x: auto;
3
- border: 1px solid #d0d0d0;
4
- border-radius: 4px;
5
- }
6
-
7
- .tableContainer {
8
- width: 100%;
9
- border-collapse: collapse;
10
-
11
- thead {
12
- background-color: #f4f4f4;
13
- }
14
-
15
- tbody tr {
16
- border-bottom: 1px solid #e0e0e0;
17
- }
18
3
  }
19
4
 
20
5
  .dataCell {
@@ -28,4 +13,4 @@
28
13
  &:hover {
29
14
  background-color: #f0f7ff;
30
15
  }
31
- }
16
+ }
@@ -0,0 +1,27 @@
1
+ import { openmrsFetch } from '@openmrs/esm-framework';
2
+ import { buildEtlUrl } from '../utils/get-base-url';
3
+
4
+ interface Moh267Params {
5
+ locationUuids: string;
6
+ startDate: string;
7
+ endDate: string;
8
+ }
9
+
10
+ /**
11
+ * MOH 267 PrEP Daily Activity Register: one row per PrEP visit in the period --
12
+ * the same visits as MOH 731 1.3 to 1.5 -- for the whole facility of the
13
+ * location, with the register's columns.
14
+ */
15
+ export async function getMoh267(params: Moh267Params): Promise<Array<Record<string, unknown>>> {
16
+ const url = await buildEtlUrl('moh-267-register', {
17
+ locationUuids: params.locationUuids,
18
+ startDate: params.startDate,
19
+ endDate: params.endDate,
20
+ });
21
+ const response = await openmrsFetch(url);
22
+ if (!response.ok) {
23
+ throw new Error(`Failed to fetch the MOH 267 register: ${response.status} - ${await response.text()}`);
24
+ }
25
+ const data = await response.json();
26
+ return Array.isArray(data) ? data : [];
27
+ }
@@ -0,0 +1,27 @@
1
+ import { openmrsFetch } from '@openmrs/esm-framework';
2
+ import { buildEtlUrl } from '../utils/get-base-url';
3
+
4
+ interface Moh362Params {
5
+ locationUuids: string;
6
+ startDate: string;
7
+ endDate: string;
8
+ }
9
+
10
+ /**
11
+ * MOH 362 HTS Lab, Referral & Linkage Register: one row per test in the
12
+ * period -- the same tests as MOH 731 1.1 HIV Tests -- for the whole facility of
13
+ * the location, with the register's details.
14
+ */
15
+ export async function getMoh362(params: Moh362Params): Promise<Array<Record<string, unknown>>> {
16
+ const url = await buildEtlUrl('moh-362-register', {
17
+ locationUuids: params.locationUuids,
18
+ startDate: params.startDate,
19
+ endDate: params.endDate,
20
+ });
21
+ const response = await openmrsFetch(url);
22
+ if (!response.ok) {
23
+ throw new Error(`Failed to fetch the MOH 362 register: ${response.status} - ${await response.text()}`);
24
+ }
25
+ const data = await response.json();
26
+ return Array.isArray(data) ? data : [];
27
+ }
@@ -0,0 +1,69 @@
1
+ import { openmrsFetch } from '@openmrs/esm-framework';
2
+ import { buildEtlUrl } from '../utils/get-base-url';
3
+ import {
4
+ PAGE_SIZE,
5
+ pageParams,
6
+ toPatientListPage,
7
+ type PatientListPage,
8
+ type PatientListParams,
9
+ } from './patient-list-page';
10
+
11
+ interface Moh505Params {
12
+ locationUuids: string;
13
+ startDate?: string;
14
+ endDate?: string;
15
+ }
16
+
17
+ interface Moh505Response {
18
+ result: Array<Record<string, unknown>>;
19
+ }
20
+
21
+ export async function getMoh505(params: Moh505Params): Promise<Array<Record<string, unknown>>> {
22
+ const url = await buildEtlUrl('moh-505', {
23
+ locationUuids: params.locationUuids || '',
24
+ startDate: params.startDate || '',
25
+ endDate: params.endDate || '',
26
+ });
27
+ try {
28
+ const response = await openmrsFetch(url);
29
+
30
+ if (!response.ok) {
31
+ const errorText = await response.text();
32
+ throw new Error(`Failed to fetch MOH-505 report: ${response.status} - ${errorText}`);
33
+ }
34
+
35
+ const data = await response.json();
36
+
37
+ if (!Array.isArray(data.result)) {
38
+ throw new Error('Invalid MOH-505 response format: missing result array.');
39
+ }
40
+
41
+ return data.result;
42
+ } catch (error: any) {
43
+ throw new Error(`An error occurred while fetching the MOH-505 report: ${error.message}`);
44
+ }
45
+ }
46
+
47
+ export async function getMoh505PatientList(params: PatientListParams): Promise<PatientListPage> {
48
+ const url = await buildEtlUrl('moh-505/patient-list', {
49
+ locationUuids: params.locationUuids || '',
50
+ startDate: params.startDate || '',
51
+ endDate: params.endDate || '',
52
+ indicators: params.indicators || '',
53
+ ...pageParams(params),
54
+ });
55
+ try {
56
+ const response = await openmrsFetch(url);
57
+
58
+ if (!response.ok) {
59
+ const errorText = await response.text();
60
+ throw new Error(`Failed to fetch MOH-505 patient list: ${response.status} - ${errorText}`);
61
+ }
62
+
63
+ const data = await response.json();
64
+
65
+ return toPatientListPage(data, params.startIndex ?? 0, params.limit ?? PAGE_SIZE);
66
+ } catch (error: any) {
67
+ throw new Error(`An error occurred while fetching the MOH-505 patient list: ${error.message}`);
68
+ }
69
+ }
@@ -0,0 +1,118 @@
1
+ import { openmrsFetch } from '@openmrs/esm-framework';
2
+ import { buildEtlUrl } from '../utils/get-base-url';
3
+ import {
4
+ PAGE_SIZE,
5
+ pageParams,
6
+ toPatientListPage,
7
+ type PatientListPage,
8
+ type PatientListParams,
9
+ } from './patient-list-page';
10
+
11
+ interface Moh710Params {
12
+ locationUuids: string;
13
+ startDate?: string;
14
+ endDate?: string;
15
+ indicator?: string | string[];
16
+ }
17
+
18
+ export async function getMoh705a(params: Moh710Params): Promise<any> {
19
+ const url = await buildEtlUrl('moh-705a', {
20
+ locationUuids: params.locationUuids || '',
21
+ startDate: params.startDate || '',
22
+ endDate: params.endDate || '',
23
+ });
24
+ try {
25
+ const response = await openmrsFetch(url);
26
+
27
+ if (!response.ok) {
28
+ const errorText = await response.text();
29
+ throw new Error(`Failed to fetch dashboard summary: ${response.status} - ${errorText}`);
30
+ }
31
+
32
+ const data = await response.json();
33
+ return data;
34
+ } catch (error: any) {
35
+ throw new Error(`An error occurred while fetching the MOH-710 report: ${error.message}`);
36
+ }
37
+ }
38
+
39
+ export async function getMoh705aPatientList(params: PatientListParams): Promise<PatientListPage> {
40
+ const endPoint = (() => {
41
+ if (params.from && params.from?.toLowerCase() === "moh-717") {
42
+ return "moh-717-patient-list";
43
+ }
44
+ return 'moh-705a-patient-list';
45
+ })();
46
+ const url = await buildEtlUrl(endPoint, {
47
+ locationUuids: params.locationUuids || '',
48
+ startDate: params.startDate || '',
49
+ endDate: params.endDate || '',
50
+ indicator: Array.isArray(params.indicator) ? params.indicator.join(',') : params.indicator || '',
51
+ ...pageParams(params),
52
+ });
53
+ try {
54
+ const response = await openmrsFetch(url);
55
+
56
+ if (!response.ok) {
57
+ const errorText = await response.text();
58
+ throw new Error(`Failed to fetch patient list: ${response.status} - ${errorText}`);
59
+ }
60
+
61
+ const data = await response.json();
62
+
63
+ return toPatientListPage(data, params.startIndex ?? 0, params.limit ?? PAGE_SIZE);
64
+ } catch (error: any) {
65
+ throw new Error(`An error occurred while fetching the MOH-705 patient list: ${error.message}`);
66
+ }
67
+ }
68
+
69
+ export async function getMoh705b(params: Moh710Params): Promise<any> {
70
+ const url = await buildEtlUrl('moh-705b', {
71
+ locationUuids: params.locationUuids || '',
72
+ startDate: params.startDate || '',
73
+ endDate: params.endDate || '',
74
+ });
75
+ try {
76
+ const response = await openmrsFetch(url);
77
+
78
+ if (!response.ok) {
79
+ const errorText = await response.text();
80
+ throw new Error(`Failed to fetch dashboard summary: ${response.status} - ${errorText}`);
81
+ }
82
+
83
+ const data = await response.json();
84
+ return data;
85
+ } catch (error: any) {
86
+ throw new Error(`An error occurred while fetching the MOH-710 report: ${error.message}`);
87
+ }
88
+ }
89
+
90
+ export async function getMoh705bPatientList(params: PatientListParams): Promise<PatientListPage> {
91
+ const endPoint = (() => {
92
+ if (params.from && params.from?.toLowerCase() === "moh-717") {
93
+ return "moh-717-patient-list";
94
+ }
95
+ return 'moh-705b-patient-list';
96
+ })();
97
+ const url = await buildEtlUrl(endPoint, {
98
+ locationUuids: params.locationUuids || '',
99
+ startDate: params.startDate || '',
100
+ endDate: params.endDate || '',
101
+ indicator: Array.isArray(params.indicator) ? params.indicator.join(',') : params.indicator || '',
102
+ ...pageParams(params),
103
+ });
104
+ try {
105
+ const response = await openmrsFetch(url);
106
+
107
+ if (!response.ok) {
108
+ const errorText = await response.text();
109
+ throw new Error(`Failed to fetch patient list: ${response.status} - ${errorText}`);
110
+ }
111
+
112
+ const data = await response.json();
113
+
114
+ return toPatientListPage(data, params.startIndex ?? 0, params.limit ?? PAGE_SIZE);
115
+ } catch (error: any) {
116
+ throw new Error(`An error occurred while fetching the MOH-705 patient list: ${error.message}`);
117
+ }
118
+ }
@@ -0,0 +1,80 @@
1
+ import { openmrsFetch } from '@openmrs/esm-framework';
2
+ import { buildEtlUrl } from '../utils/get-base-url';
3
+ import {
4
+ PAGE_SIZE,
5
+ pageParams,
6
+ toPatientListPage,
7
+ type PatientListPage,
8
+ type PatientListParams,
9
+ } from './patient-list-page';
10
+
11
+ interface Moh706Params {
12
+ locationUuids: string;
13
+ startDate?: string;
14
+ endDate?: string;
15
+ }
16
+
17
+ interface Moh706Response {
18
+ result: Array<Record<string, unknown>>;
19
+ }
20
+
21
+ interface Moh706PatientListResponse {
22
+ result: Array<Record<string, unknown>>;
23
+ }
24
+
25
+ /**
26
+ * The ETL server validates the OpenMRS session cookie (JSESSIONID), so every
27
+ * request must carry it. `credentials: 'include'` keeps same-origin proxies
28
+ * working and is required when the ETL base URL is another origin.
29
+ */
30
+ const WITH_SESSION_COOKIE = { credentials: 'include' as RequestCredentials };
31
+
32
+ export async function getMoh706(params: Moh706Params): Promise<Array<Record<string, unknown>>> {
33
+ const url = await buildEtlUrl('lab-706', {
34
+ locationUuids: params.locationUuids || '',
35
+ startDate: params.startDate || '',
36
+ endDate: params.endDate || '',
37
+ });
38
+ try {
39
+ const response = await openmrsFetch(url, WITH_SESSION_COOKIE);
40
+
41
+ if (!response.ok) {
42
+ const errorText = await response.text();
43
+ throw new Error(`Failed to fetch MOH-706 report: ${response.status} - ${errorText}`);
44
+ }
45
+
46
+ const data = await response.json();
47
+
48
+ if (!Array.isArray(data.result)) {
49
+ throw new Error('Invalid MOH-706 response format: missing result array.');
50
+ }
51
+
52
+ return data.result;
53
+ } catch (error: any) {
54
+ throw new Error(`An error occurred while fetching the MOH-706 report: ${error.message}`);
55
+ }
56
+ }
57
+
58
+ export async function getMoh706PatientList(params: PatientListParams): Promise<PatientListPage> {
59
+ const url = await buildEtlUrl('lab-706/patient-list', {
60
+ locationUuids: params.locationUuids || '',
61
+ startDate: params.startDate || '',
62
+ endDate: params.endDate || '',
63
+ indicators: params.indicators || '',
64
+ ...pageParams(params),
65
+ });
66
+ try {
67
+ const response = await openmrsFetch(url, WITH_SESSION_COOKIE);
68
+
69
+ if (!response.ok) {
70
+ const errorText = await response.text();
71
+ throw new Error(`Failed to fetch MOH-706 patient list: ${response.status} - ${errorText}`);
72
+ }
73
+
74
+ const data = await response.json();
75
+
76
+ return toPatientListPage(data, params.startIndex ?? 0, params.limit ?? PAGE_SIZE);
77
+ } catch (error: any) {
78
+ throw new Error(`An error occurred while fetching the MOH-706 patient list: ${error.message}`);
79
+ }
80
+ }
@@ -1,25 +1,25 @@
1
1
  import { openmrsFetch } from '@openmrs/esm-framework';
2
- import { getEtlBaseUrl } from '../utils/get-base-url';
2
+ import { buildEtlUrl } from '../utils/get-base-url';
3
+ import { PAGE_SIZE, toPatientListPage, pageParams, type PatientListParams } from './patient-list-page';
3
4
 
4
5
  interface Moh710Params {
5
6
  locationUuids: string;
6
7
  startDate?: string;
7
8
  endDate?: string;
9
+ indicator?: string | string[];
10
+ startIndex?: number;
11
+ limit?: number;
12
+ reportName?: string;
8
13
  }
9
14
 
10
15
  export async function getMoh710(params: Moh710Params): Promise<any> {
11
- const etlBaseUrl = await getEtlBaseUrl();
12
- const url = `${etlBaseUrl}/moh-710`;
13
- const queryparams = {
16
+ const url = await buildEtlUrl('moh-710', {
14
17
  locationUuids: params.locationUuids || '',
15
18
  startDate: params.startDate || '',
16
19
  endDate: params.endDate || '',
17
- };
18
- const queryString = new URLSearchParams(
19
- Object.fromEntries(Object.entries(queryparams).filter(([_, v]) => v !== undefined && v !== null)),
20
- ).toString();
20
+ });
21
21
  try {
22
- const response = await openmrsFetch(`${url}?${queryString}`);
22
+ const response = await openmrsFetch(url);
23
23
 
24
24
  if (!response.ok) {
25
25
  const errorText = await response.text();
@@ -32,3 +32,54 @@ export async function getMoh710(params: Moh710Params): Promise<any> {
32
32
  throw new Error(`An error occurred while fetching the MOH-710 report: ${error.message}`);
33
33
  }
34
34
  }
35
+
36
+ export async function getMoh510PatientList(params: PatientListParams): Promise<any> {
37
+ const url = await buildEtlUrl('moh-510-patient-list', {
38
+ locationUuids: params.locationUuids || '',
39
+ startDate: params.startDate || '',
40
+ endDate: params.endDate || '',
41
+ indicator: Array.isArray(params.indicator) ? params.indicator.join(',') : params.indicator || '',
42
+ reportName: params.reportName || 'moh710Report',
43
+ ...pageParams(params),
44
+ });
45
+
46
+ try {
47
+ const response = await openmrsFetch(url);
48
+
49
+ if (!response.ok) {
50
+ const errorText = await response.text();
51
+ throw new Error(`Failed to fetch dashboard summary: ${response.status} - ${errorText}`);
52
+ }
53
+
54
+ const data = await response.json();
55
+ return toPatientListPage(data, params.startIndex ?? 0, params.limit ?? PAGE_SIZE);
56
+ } catch (error: any) {
57
+ throw new Error(`An error occurred while fetching the MOH-510 REgister: ${error.message}`);
58
+ }
59
+ }
60
+
61
+ export async function getMoh413PatientList(params: PatientListParams): Promise<any> {
62
+ const url = await buildEtlUrl('moh-413-patient-list', {
63
+ locationUuids: params.locationUuids || '',
64
+ startDate: params.startDate || '',
65
+ endDate: params.endDate || '',
66
+ indicator: Array.isArray(params.indicator) ? params.indicator.join(',') : params.indicator || '',
67
+ reportName: params.reportName || 'moh710Report',
68
+ ...pageParams(params),
69
+ });
70
+
71
+ try {
72
+ const response = await openmrsFetch(url);
73
+
74
+ if (!response.ok) {
75
+ const errorText = await response.text();
76
+ throw new Error(`Failed to fetch moh-413: ${response.status} - ${errorText}`);
77
+ }
78
+
79
+ const data = await response.json();
80
+
81
+ return toPatientListPage(data, params.startIndex ?? 0, params.limit ?? PAGE_SIZE);
82
+ } catch (error: any) {
83
+ throw new Error(`An error occurred while fetching the MOH-413 Register: ${error.message}`);
84
+ }
85
+ }