@ampath/esm-reports-app 1.0.0-next.7 → 1.0.0-next.71

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 (258) hide show
  1. package/dist/197.js +1 -1
  2. package/dist/282.js +1 -1
  3. package/dist/282.js.map +1 -1
  4. package/dist/295.css +1 -0
  5. package/dist/295.css.map +1 -0
  6. package/dist/295.js +1 -0
  7. package/dist/295.js.map +1 -0
  8. package/dist/299.js +2 -0
  9. package/dist/299.js.LICENSE.txt +3 -0
  10. package/dist/299.js.map +1 -0
  11. package/dist/300.js +1 -1
  12. package/dist/311.js +1 -1
  13. package/dist/311.js.map +1 -1
  14. package/dist/335.js +1 -1
  15. package/dist/353.js +1 -1
  16. package/dist/353.js.map +1 -1
  17. package/dist/354.js +2 -0
  18. package/dist/354.js.LICENSE.txt +20 -0
  19. package/dist/354.js.map +1 -0
  20. package/dist/410.js +1 -0
  21. package/dist/410.js.map +1 -0
  22. package/dist/457.js +2 -0
  23. package/dist/457.js.LICENSE.txt +261 -0
  24. package/dist/457.js.map +1 -0
  25. package/dist/478.js +1 -1
  26. package/dist/478.js.map +1 -1
  27. package/dist/480.js +1 -0
  28. package/dist/540.js +1 -1
  29. package/dist/540.js.map +1 -1
  30. package/dist/55.js +1 -1
  31. package/dist/580.js +1 -0
  32. package/dist/580.js.map +1 -0
  33. package/dist/600.js +2 -0
  34. package/dist/600.js.LICENSE.txt +35 -0
  35. package/dist/600.js.map +1 -0
  36. package/dist/652.js +1 -1
  37. package/dist/781.js +1 -0
  38. package/dist/781.js.map +1 -0
  39. package/dist/919.css +1 -0
  40. package/dist/919.css.map +1 -0
  41. package/dist/919.js +1 -0
  42. package/dist/919.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 +255 -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 +59 -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 +27 -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 +173 -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-362/moh-362-lab-register.component.tsx +392 -0
  100. package/src/registers/moh-362/moh-362-linkage-register.component.tsx +120 -0
  101. package/src/registers/moh-362/moh-362-register.scss +222 -0
  102. package/src/registers/moh-362/moh-362.component.tsx +99 -0
  103. package/src/registers/moh-362/moh-362.scss +11 -0
  104. package/src/registers/moh-362/moh-362.types.ts +97 -0
  105. package/src/registers/register-catalog.ts +96 -0
  106. package/src/registers/tb-lab-register/tb-lab-register-table.component.tsx +116 -0
  107. package/src/registers/tb-lab-register/tb-lab-register-table.scss +123 -0
  108. package/src/registers/tb-lab-register/tb-lab-register.columns.ts +164 -0
  109. package/src/registers/tb-lab-register/tb-lab-register.component.test.tsx +232 -0
  110. package/src/registers/tb-lab-register/tb-lab-register.component.tsx +153 -0
  111. package/src/reports/datatable-wrapper/datatable-wrapper.component.tsx +63 -48
  112. package/src/reports/moh-240/moh-240-header.component.tsx +62 -0
  113. package/src/reports/moh-240/moh-240.columns.ts +113 -0
  114. package/src/reports/moh-240/moh-240.component.tsx +72 -9
  115. package/src/reports/moh-240/moh-240.scss +40 -0
  116. package/src/reports/moh-240/sub-reports/moh-240-register.component.tsx +31 -37
  117. package/src/reports/moh-240/sub-reports/page-summary.component.tsx +143 -106
  118. package/src/reports/moh-505/moh-505-header.component.tsx +67 -0
  119. package/src/reports/moh-505/moh-505.component.tsx +441 -0
  120. package/src/reports/moh-505/moh-505.scss +117 -0
  121. package/src/reports/moh-705B/moh-204b-register.component.tsx +244 -0
  122. package/src/reports/moh-705B/moh-204b.columns.ts +39 -0
  123. package/src/reports/moh-705B/moh-705b.component.tsx +659 -0
  124. package/src/reports/moh-705B/moh-705b.scss +172 -0
  125. package/src/reports/moh-705a/moh-705a.component.tsx +661 -0
  126. package/src/reports/moh-705a/moh-705a.scss +172 -0
  127. package/src/reports/moh-705a/registers/moh-204a-register.component.tsx +329 -0
  128. package/src/reports/moh-705a/registers/moh-204a.columns.ts +57 -0
  129. package/src/reports/moh-705a/type.ts +6 -0
  130. package/src/reports/moh-706/moh-706-header.component.tsx +66 -0
  131. package/src/reports/moh-706/moh-706.component.tsx +150 -24
  132. package/src/reports/moh-706/moh-706.scss +119 -11
  133. package/src/reports/moh-706/sub-reports/bacteriology/bacteriology.component.tsx +54 -62
  134. package/src/reports/moh-706/sub-reports/blood-chemistry/blood-chemistry.component.tsx +228 -317
  135. package/src/reports/moh-706/sub-reports/drug-susceptibility-testing/drug-susceptibility-testing.component.tsx +31 -46
  136. package/src/reports/moh-706/sub-reports/haematology/haematology.component.tsx +47 -55
  137. package/src/reports/moh-706/sub-reports/histology-and-cytology/histology-and-cytology.component.tsx +43 -58
  138. package/src/reports/moh-706/sub-reports/parasitology/parasitology.component.tsx +31 -39
  139. package/src/reports/moh-706/sub-reports/serology/serology.component.tsx +26 -34
  140. package/src/reports/moh-706/sub-reports/specimen-referral-to-higher-levels/specimen-referral-to-higher-levels.component.tsx +9 -24
  141. package/src/reports/moh-706/sub-reports/urine-analysis/urine-analysis.component.tsx +43 -51
  142. package/src/reports/moh-710/moh-710.component.tsx +799 -632
  143. package/src/reports/moh-710/moh-710.scss +142 -21
  144. package/src/reports/moh-710/registers/moh-510/moh-510.columns.ts +40 -0
  145. package/src/reports/moh-710/registers/moh-510/moh-510.component.tsx +144 -0
  146. package/src/reports/moh-710/registers/moh-510/moh-510.scss +130 -0
  147. package/src/reports/moh-710/registers/moh-511-710-register.component.tsx +268 -0
  148. package/src/reports/moh-710/registers/moh-511-710.columns.ts +52 -0
  149. package/src/reports/moh-710/registers/type.ts +31 -0
  150. package/src/reports/moh-711/moh-711.component.tsx +138 -1269
  151. package/src/reports/moh-711/moh711.scss +135 -20
  152. package/src/reports/moh-711/registers/moh-333-register.component.tsx +637 -0
  153. package/src/reports/moh-711/registers/moh-333.columns.ts +119 -0
  154. package/src/reports/moh-711/registers/moh-405-register.component.tsx +520 -0
  155. package/src/reports/moh-711/registers/moh-405.columns.ts +120 -0
  156. package/src/reports/moh-711/registers/moh-406-register.component.tsx +530 -0
  157. package/src/reports/moh-711/registers/moh-406.columns.ts +133 -0
  158. package/src/reports/moh-711/registers/moh-510-register.component.tsx +55 -0
  159. package/src/reports/moh-711/registers/moh-511-register.component.tsx +270 -0
  160. package/src/reports/moh-711/registers/moh-511.columns.ts +59 -0
  161. package/src/reports/moh-711/registers/type.ts +192 -0
  162. package/src/reports/moh-711/sections/anc.component.tsx +159 -0
  163. package/src/reports/moh-711/sections/cervical-cancer.component.tsx +148 -0
  164. package/src/reports/moh-711/sections/chanis.component.tsx +366 -0
  165. package/src/reports/moh-711/sections/family-planning.component.tsx +221 -0
  166. package/src/reports/moh-711/sections/gbv.component.tsx +115 -0
  167. package/src/reports/moh-711/sections/maternity.component.tsx +321 -0
  168. package/src/reports/moh-711/sections/medical-social-work.component.tsx +73 -0
  169. package/src/reports/moh-711/sections/other.component.tsx +47 -0
  170. package/src/reports/moh-711/sections/physiotherapy.component.tsx +61 -0
  171. package/src/reports/moh-711/sections/pnc.component.tsx +127 -0
  172. package/src/reports/moh-711/sections/post-abortion.component.tsx +42 -0
  173. package/src/reports/moh-711/sections/rehabilitation.component.tsx +57 -0
  174. package/src/reports/moh-711/sections/report-compiled-by.component.tsx +50 -0
  175. package/src/reports/moh-711/sections/tb-screening.component.tsx +57 -0
  176. package/src/reports/moh-717/moh-717.component.tsx +149 -985
  177. package/src/reports/moh-717/moh717.scss +217 -21
  178. package/src/reports/moh-717/registers/nutrition-register.component.tsx +48 -0
  179. package/src/reports/moh-717/sections/finance.component.tsx +42 -0
  180. package/src/reports/moh-717/sections/inpatient.component.tsx +374 -0
  181. package/src/reports/moh-717/sections/maternity.component.tsx +126 -0
  182. package/src/reports/moh-717/sections/medical-records.component.tsx +35 -0
  183. package/src/reports/moh-717/sections/mortuary.component.tsx +43 -0
  184. package/src/reports/moh-717/sections/operations.component.tsx +53 -0
  185. package/src/reports/moh-717/sections/orthopaedic-trauma.component.tsx +98 -0
  186. package/src/reports/moh-717/sections/outpatient.component.tsx +597 -0
  187. package/src/reports/moh-717/sections/pharmacy.component.tsx +43 -0
  188. package/src/reports/moh-717/sections/preparedby.component.tsx +52 -0
  189. package/src/reports/moh-717/sections/special-services.component.tsx +114 -0
  190. package/src/reports/moh-731/linelist/moh-731-indicators.ts +1122 -0
  191. package/src/reports/moh-731/linelist/moh-731-linelist-sections.ts +472 -0
  192. package/src/reports/moh-731/linelist/moh-731-linelist.component.tsx +102 -0
  193. package/src/reports/moh-731/linelist/use-open-moh-731-linelist.ts +50 -0
  194. package/src/reports/moh-731/moh-731.component.tsx +266 -0
  195. package/src/reports/moh-731/moh-731.scss +499 -0
  196. package/src/reports/moh-731/registers/moh-366.columns.ts +38 -0
  197. package/src/reports/moh-731/registers/moh-366.component.tsx +471 -0
  198. package/src/reports/moh-731/registers/prep-register.component.tsx +284 -0
  199. package/src/reports/moh-731/registers/prep.columns.ts +34 -0
  200. package/src/reports/moh-731/sections/hiv-and-tb-treatment.component.tsx +1206 -0
  201. package/src/reports/moh-731/sections/hiv-testing-and-pre-exposure.component.tsx +727 -0
  202. package/src/reports/moh-731/sections/pmtct.component.tsx +572 -0
  203. package/src/reports/moh-731/summary/moh-731-summary.component.tsx +313 -0
  204. package/src/reports/moh-731/summary/moh-731-summary.config.ts +529 -0
  205. package/src/reports/moh-731/summary/moh-731-summary.scss +242 -0
  206. package/src/reports/moh-740/moh-740.component.scss +202 -0
  207. package/src/reports/moh-740/moh-740.component.tsx +1332 -0
  208. package/src/reports/moh-740/moh-740.resource.ts +54 -0
  209. package/src/reports/moh-740/registers/moh-222-daily-register/moh-222-daily-register.tsx +149 -0
  210. package/src/reports/moh-740/registers/moh-270-permanent-register/moh-270-permanent-register.tsx +123 -0
  211. package/src/reports/moh-740/registers/moh-740-patient-list.scss +0 -0
  212. package/src/reports/moh-740/registers/moh-740-patient-list.tsx +60 -0
  213. package/src/reports/moh-740/registers/moh-740.columns.ts +54 -0
  214. package/src/reports/moh-740/shared/data-cell/data-cell.scss +6 -0
  215. package/src/reports/moh-740/shared/data-cell/data-cell.tsx +23 -0
  216. package/src/reports/moh-740/shared/utils/indicator-register-map.ts +159 -0
  217. package/src/reports/moh-740/types/index.ts +223 -0
  218. package/src/reports/moh-745/moh-745.component.tsx +1021 -0
  219. package/src/reports/moh-745/moh-745.scss +132 -0
  220. package/src/reports/moh-745/registers/moh-412-register.component.tsx +249 -0
  221. package/src/reports/moh-745/registers/moh-412.columns.ts +52 -0
  222. package/src/reports/moh-745/registers/type.ts +181 -0
  223. package/src/reports/table-wrapper/table-row-mapper.component.tsx +57 -0
  224. package/src/reports/table-wrapper/table-wrapper.component.tsx +23 -14
  225. package/src/reports/table-wrapper/table-wrapper.scss +1 -16
  226. package/src/resources/moh-362.resource.ts +27 -0
  227. package/src/resources/moh-505.resource.ts +69 -0
  228. package/src/resources/moh-705.resource.ts +106 -0
  229. package/src/resources/moh-706.resource.ts +80 -0
  230. package/src/resources/moh-710.resource.ts +32 -9
  231. package/src/resources/moh-711.resource.ts +137 -9
  232. package/src/resources/moh-717.resource.ts +26 -9
  233. package/src/resources/moh-731.resource.ts +90 -0
  234. package/src/resources/moh-745.resource.ts +76 -0
  235. package/src/resources/patient-list-page.ts +65 -0
  236. package/src/root.component.tsx +59 -8
  237. package/src/root.scss +36 -0
  238. package/src/routes.json +3 -1
  239. package/src/utils/format-indicator.ts +39 -0
  240. package/src/utils/get-base-url.ts +39 -7
  241. package/src/utils/utils.ts +36 -0
  242. package/tsconfig.json +1 -1
  243. package/webpack.config.js +22 -1
  244. package/dist/138.js +0 -2
  245. package/dist/138.js.LICENSE.txt +0 -20
  246. package/dist/138.js.map +0 -1
  247. package/dist/184.js +0 -2
  248. package/dist/184.js.LICENSE.txt +0 -14
  249. package/dist/184.js.map +0 -1
  250. package/dist/205.js +0 -1
  251. package/dist/205.js.map +0 -1
  252. package/dist/711.js +0 -1
  253. package/dist/711.js.map +0 -1
  254. package/dist/812.js +0 -1
  255. package/dist/812.js.map +0 -1
  256. package/dist/ampath-esm-reports-app.js.buildmanifest.json +0 -539
  257. package/dist/main.js +0 -1
  258. package/dist/main.js.map +0 -1
@@ -0,0 +1,472 @@
1
+ import { type LinelistColumn } from '../../../common/linelist-table';
2
+ import { getMoh366PatientList } from '../../../resources/moh-731.resource';
3
+ import { type PatientListPage, type PatientListParams } from '../../../resources/patient-list-page';
4
+
5
+ /** How one family of MOH 731 figures is listed: where the rows come from and how they are shown */
6
+ export interface Moh731LinelistSection {
7
+ /** Shown above the table, e.g. `HIV Testing Services` */
8
+ title: string;
9
+ fetchPatientList: (params: PatientListParams) => Promise<PatientListPage>;
10
+ columns: LinelistColumn[];
11
+ }
12
+
13
+ const formatDate = (value: unknown) => (value ? new Date(String(value)).toLocaleDateString('en-GB') : '');
14
+
15
+ /* Columns every section starts from. Each section lists its own columns below,
16
+ so a column added to one section does not appear in the others. The table
17
+ numbers the rows itself. */
18
+ const cccNumber: LinelistColumn = { header: 'CCC Number', field: 'ccc_number', text: true };
19
+ const name: LinelistColumn = { header: 'Name', field: 'person_name' };
20
+ const nupi: LinelistColumn = { header: 'NUPI', field: 'upi_number', text: true };
21
+ const sex: LinelistColumn = { header: 'Sex', field: 'gender' };
22
+ const age: LinelistColumn = { header: 'Age', field: 'age' };
23
+ const phoneNumber: LinelistColumn = { header: 'Phone Number', field: 'phone_number', text: true };
24
+
25
+ /**
26
+ * The linelist definition behind each part of the MOH 731 sheet.
27
+ *
28
+ * To add a column to a linelist, add it to that section's `columns`. To point a
29
+ * section at its own query, give it its own `fetchPatientList`. Which figures
30
+ * open which section is set in `moh-731-indicators.ts`.
31
+ */
32
+ export const MOH_731_LINELIST_SECTIONS = {
33
+ /* 1.1 HIV Tests, 1.2 HIV Positive Results, 2.1 Maternal HIV Testing, 2.2 HIV
34
+ Positive Results and 2.3 Start HAART at ANC, L&D and PNC, 2.4 HBV Screening and
35
+ 2.5 AGYW (HV01-01 to HV01-18, HV01-47/48, HV02-02 to HV02-28 except the
36
+ known-positive figures).
37
+ Both are counted from one dataset of tested clients in the ETL
38
+ (service/moh-731/ver-2023/hiv-tests), so these are its columns, and every
39
+ figure lists exactly the tests it counted. */
40
+ hivTests: {
41
+ title: 'HIV Testing Services',
42
+ fetchPatientList: getMoh366PatientList,
43
+ columns: [
44
+ { header: 'Test Date', value: (row) => formatDate(row.test_date), sortValue: (row) => row.test_date },
45
+ /* Shown by default on the PNC figures (showColumns in moh-731-indicators.ts) */
46
+ {
47
+ header: 'Delivery Date',
48
+ value: (row) => formatDate(row.delivery_date),
49
+ sortValue: (row) => row.delivery_date,
50
+ hidden: true,
51
+ },
52
+ { header: 'Name', field: 'full_name' },
53
+ { header: 'AMRS Number', field: 'amrs_number', text: true },
54
+ { header: 'CCC Number', field: 'ccc_number', text: true },
55
+ { header: 'NUPI', field: 'nupi', text: true },
56
+ { header: 'Sex', field: 'gender' },
57
+ { header: 'Age', field: 'age_at_test' },
58
+ { header: 'Service', field: 'service' },
59
+ { header: 'Test Type', field: 'test_type' },
60
+ { header: 'Setting', field: 'hts_setting' },
61
+ { header: 'Population Type', field: 'population_type' },
62
+ { header: 'Final Result', field: 'final_result' },
63
+ /* HBV screening in the period; available from the Columns menu */
64
+ { header: 'Screened HBV', field: 'screened_hbv', hidden: true },
65
+ { header: 'HBV Result', field: 'hbv_result', hidden: true },
66
+ {
67
+ header: 'HBV Test Date',
68
+ value: (row) => formatDate(row.hbv_test_date),
69
+ sortValue: (row) => row.hbv_test_date,
70
+ hidden: true,
71
+ },
72
+ { header: 'HBV Recorded On', field: 'hbv_encounter_types', hidden: true },
73
+ { header: 'Initiated in Care', field: 'initiated_in_care' },
74
+ {
75
+ header: 'ART Start Date',
76
+ value: (row) => formatDate(row.arv_first_regimen_start_date),
77
+ sortValue: (row) => row.arv_first_regimen_start_date,
78
+ },
79
+ { header: 'Location', field: 'location' },
80
+ { header: 'Entered By', field: 'entered_by' },
81
+ /* Available from the Columns menu */
82
+ { header: 'Encounter Type', field: 'encounter_type', hidden: true },
83
+ { header: 'Typology', field: 'typology', hidden: true },
84
+ { header: 'Infant Prophylaxis Dispensed', field: 'infant_prophylaxis_dispensed', hidden: true },
85
+ { header: 'Infant Prophylaxis Regimen', field: 'infant_prophylaxis_regimen', hidden: true },
86
+ {
87
+ header: 'Date of Birth',
88
+ value: (row) => formatDate(row.birthdate),
89
+ sortValue: (row) => row.birthdate,
90
+ hidden: true,
91
+ },
92
+ { header: 'Encounter ID', field: 'encounter_id', hidden: true },
93
+ ],
94
+ },
95
+ /* 1.3 No. Initiated on PrEP, 1.4 No. on PrEP Diagnosed with STI and 1.5 No.
96
+ Seroconverted while on PrEP (HV01-19 to HV01-46). Fields are the columns of
97
+ the PrEP visits dataset in the ETL (service/moh-731/ver-2023/prep), which
98
+ both counts these figures and lists the visits behind them. */
99
+ prepVisits: {
100
+ title: 'Pre-Exposure Prophylaxis',
101
+ fetchPatientList: getMoh366PatientList,
102
+ columns: [
103
+ { header: 'Visit Date', value: (row) => formatDate(row.visit_date), sortValue: (row) => row.visit_date },
104
+ { header: 'Visit', field: 'visit' },
105
+ { header: 'Name', field: 'full_name' },
106
+ { header: 'AMRS Number', field: 'amrs_number', text: true },
107
+ { header: 'NUPI', field: 'nupi', text: true },
108
+ { header: 'Sex', field: 'gender' },
109
+ { header: 'Age', field: 'age' },
110
+ { header: 'Population', field: 'population_category' },
111
+ {
112
+ header: 'PrEP Start Date',
113
+ value: (row) => formatDate(row.prep_start_date),
114
+ sortValue: (row) => row.prep_start_date,
115
+ },
116
+ { header: 'Transfer In', field: 'transfer_in' },
117
+ { header: 'PrEP Status', field: 'prep_status' },
118
+ { header: 'PrEP Type', field: 'prep_type' },
119
+ { header: 'Regimen', field: 'regimen', wrap: true },
120
+ { header: 'HIV Test', field: 'hiv_test' },
121
+ { header: 'STI', field: 'has_sti' },
122
+ { header: 'STI Signs', field: 'sti_signs', wrap: true },
123
+ { header: 'Location', field: 'location' },
124
+ { header: 'Entered By', field: 'entered_by' },
125
+ /* Available from the Columns menu */
126
+ { header: 'Encounter Type', field: 'encounter_type', hidden: true },
127
+ { header: 'Population Recorded', field: 'population_recorded', hidden: true },
128
+ { header: 'Pregnant / Breastfeeding', value: (row) => (Number(row.is_pbfw) === 1 ? 'Yes' : 'No'), hidden: true },
129
+ {
130
+ header: 'Date of Birth',
131
+ value: (row) => formatDate(row.birthdate),
132
+ sortValue: (row) => row.birthdate,
133
+ hidden: true,
134
+ },
135
+ { header: 'Encounter ID', field: 'encounter_id', hidden: true },
136
+ ],
137
+ },
138
+ /* 2.1 Known Positive at 1st ANC (HV02-01) and 2.3 On HAART at 1st ANC (HV02-14).
139
+ Fields are the columns of the
140
+ known-positive ANC dataset in the ETL (service/moh-731/ver-2023/known-positive-anc),
141
+ which counts the figure and lists the visits behind it. */
142
+ ancKnownPositives: {
143
+ title: 'Elimination of Mother-to-Child Transmission (EMTCT)',
144
+ fetchPatientList: getMoh366PatientList,
145
+ columns: [
146
+ { header: 'ANC Date', value: (row) => formatDate(row.anc_date), sortValue: (row) => row.anc_date },
147
+ { header: 'Visit', field: 'visit' },
148
+ { header: 'ANC Visit No.', field: 'anc_visit_number' },
149
+ { header: 'Name', field: 'full_name' },
150
+ { header: 'AMRS Number', field: 'amrs_number', text: true },
151
+ { header: 'CCC Number', field: 'ccc_number', text: true },
152
+ { header: 'NUPI', field: 'nupi', text: true },
153
+ { header: 'Age', field: 'age_at_anc' },
154
+ { header: 'HIV Status', field: 'hiv_status' },
155
+ { header: 'Initiated in Care', field: 'initiated_in_care' },
156
+ {
157
+ header: 'ART Start Date',
158
+ value: (row) => formatDate(row.arv_first_regimen_start_date),
159
+ sortValue: (row) => row.arv_first_regimen_start_date,
160
+ },
161
+ { header: 'Infant Prophylaxis Dispensed', field: 'infant_prophylaxis_dispensed' },
162
+ { header: 'Infant Prophylaxis Regimen', field: 'infant_prophylaxis_regimen' },
163
+ { header: 'Location', field: 'location' },
164
+ { header: 'Entered By', field: 'entered_by' },
165
+ /* Available from the Columns menu */
166
+ { header: 'Encounter Type', field: 'encounter_type', hidden: true },
167
+ { header: 'Known Positive Source', field: 'known_positive_source', hidden: true },
168
+ { header: 'Screened HBV', field: 'screened_hbv', hidden: true },
169
+ { header: 'HBV Result', field: 'hbv_result', hidden: true },
170
+ {
171
+ header: 'HBV Test Date',
172
+ value: (row) => formatDate(row.hbv_test_date),
173
+ sortValue: (row) => row.hbv_test_date,
174
+ hidden: true,
175
+ },
176
+ { header: 'HBV Recorded On', field: 'hbv_encounter_types', hidden: true },
177
+ { header: 'Sex', field: 'gender', hidden: true },
178
+ {
179
+ header: 'Date of Birth',
180
+ value: (row) => formatDate(row.birthdate),
181
+ sortValue: (row) => row.birthdate,
182
+ hidden: true,
183
+ },
184
+ { header: 'Encounter ID', field: 'encounter_id', hidden: true },
185
+ ],
186
+ },
187
+ /* 2.6 Infant Prophylaxis (HV02-29 to HV02-31). Fields are the columns of the
188
+ HIV-positive mothers dataset in the ETL (service/moh-731/ver-2023/infant-prophylaxis):
189
+ women newly positive at an ANC, L&D or PNC test and women known positive at ANC. */
190
+ /* 2.4 HBV Screening at ANC (HV02-19, HV02-20). Fields are the columns of the
191
+ ANC HBV dataset in the ETL (service/moh-731/ver-2023/hbv-screening): ANC visits
192
+ that are an ANC test or a known-positive visit, with the client's HBV screening. */
193
+ ancHbv: {
194
+ title: 'Elimination of Mother-to-Child Transmission (EMTCT)',
195
+ fetchPatientList: getMoh366PatientList,
196
+ columns: [
197
+ { header: 'ANC Date', value: (row) => formatDate(row.anc_date), sortValue: (row) => row.anc_date },
198
+ { header: 'Visit', field: 'visit' },
199
+ { header: 'ANC Visit No.', field: 'anc_visit_number' },
200
+ { header: 'Group', field: 'anc_group' },
201
+ { header: 'HIV Result', field: 'hiv_result' },
202
+ { header: 'Name', field: 'full_name' },
203
+ { header: 'AMRS Number', field: 'amrs_number', text: true },
204
+ { header: 'CCC Number', field: 'ccc_number', text: true },
205
+ { header: 'NUPI', field: 'nupi', text: true },
206
+ { header: 'Age', field: 'age_at_anc' },
207
+ { header: 'Screened HBV', field: 'screened_hbv' },
208
+ { header: 'HBV Result', field: 'hbv_result' },
209
+ {
210
+ header: 'HBV Test Date',
211
+ value: (row) => formatDate(row.hbv_test_date),
212
+ sortValue: (row) => row.hbv_test_date,
213
+ },
214
+ { header: 'HBV Recorded On', field: 'hbv_encounter_types' },
215
+ { header: 'Location', field: 'location' },
216
+ { header: 'Entered By', field: 'entered_by' },
217
+ /* Available from the Columns menu */
218
+ { header: 'Encounter Type', field: 'encounter_type', hidden: true },
219
+ {
220
+ header: 'Date of Birth',
221
+ value: (row) => formatDate(row.birthdate),
222
+ sortValue: (row) => row.birthdate,
223
+ hidden: true,
224
+ },
225
+ { header: 'Encounter ID', field: 'encounter_id', hidden: true },
226
+ ],
227
+ },
228
+ hivPositiveMothers: {
229
+ title: 'Elimination of Mother-to-Child Transmission (EMTCT)',
230
+ fetchPatientList: getMoh366PatientList,
231
+ columns: [
232
+ { header: 'Visit Date', value: (row) => formatDate(row.visit_date), sortValue: (row) => row.visit_date },
233
+ /* Shown by default on the PNC figure (showColumns in moh-731-indicators.ts) */
234
+ {
235
+ header: 'Delivery Date',
236
+ value: (row) => formatDate(row.delivery_date),
237
+ sortValue: (row) => row.delivery_date,
238
+ hidden: true,
239
+ },
240
+ { header: 'Name', field: 'full_name' },
241
+ { header: 'AMRS Number', field: 'amrs_number', text: true },
242
+ { header: 'CCC Number', field: 'ccc_number', text: true },
243
+ { header: 'NUPI', field: 'nupi', text: true },
244
+ { header: 'Age', field: 'age' },
245
+ { header: 'Service', field: 'service' },
246
+ { header: 'HIV Status', field: 'hiv_status' },
247
+ { header: 'ANC Visit No.', field: 'anc_visit_number' },
248
+ { header: 'Infant Prophylaxis Given', field: 'infant_prophylaxis_dispensed' },
249
+ { header: 'Prophylaxis Regimen', field: 'infant_prophylaxis_regimen' },
250
+ { header: 'Initiated in Care', field: 'initiated_in_care' },
251
+ {
252
+ header: 'ART Start Date',
253
+ value: (row) => formatDate(row.arv_first_regimen_start_date),
254
+ sortValue: (row) => row.arv_first_regimen_start_date,
255
+ },
256
+ { header: 'Location', field: 'location' },
257
+ { header: 'Entered By', field: 'entered_by' },
258
+ /* Available from the Columns menu */
259
+ { header: 'Encounter Type', field: 'encounter_type', hidden: true },
260
+ {
261
+ header: 'Date of Birth',
262
+ value: (row) => formatDate(row.birthdate),
263
+ sortValue: (row) => row.birthdate,
264
+ hidden: true,
265
+ },
266
+ { header: 'Encounter ID', field: 'encounter_id', hidden: true },
267
+ ],
268
+ },
269
+ /* 2.7 Infant Feeding (HV02-32 to HV02-34). Fields are the columns of the HEI
270
+ feeding dataset in the ETL (service/moh-731/ver-2023/infant-feeding): HEI
271
+ follow-ups seen before the end of the period whose return-to-clinic date is
272
+ on or after its start. */
273
+ infantFeeding: {
274
+ title: 'Elimination of Mother-to-Child Transmission (EMTCT)',
275
+ fetchPatientList: getMoh366PatientList,
276
+ columns: [
277
+ {
278
+ header: 'Visit Date',
279
+ value: (row) => formatDate(row.encounter_datetime),
280
+ sortValue: (row) => row.encounter_datetime,
281
+ },
282
+ { header: 'RTC Date', value: (row) => formatDate(row.rtc_date), sortValue: (row) => row.rtc_date },
283
+ { header: 'Name', field: 'full_name' },
284
+ { header: 'AMRS Number', field: 'amrs_number', text: true },
285
+ { header: 'CCC Number', field: 'ccc_number', text: true },
286
+ { header: 'NUPI', field: 'nupi', text: true },
287
+ { header: 'Sex', field: 'gender' },
288
+ { header: 'Age (Months)', field: 'age_months' },
289
+ { header: 'Feeding Method', field: 'feeding_methods', wrap: true },
290
+ { header: 'Feeding Category', field: 'feeding_category' },
291
+ { header: 'MOH 731 Code', field: 'moh731_code' },
292
+ { header: 'Location', field: 'location' },
293
+ { header: 'Entered By', field: 'entered_by' },
294
+ /* Available from the Columns menu */
295
+ { header: 'Encounter Type', field: 'encounter_type', hidden: true },
296
+ {
297
+ header: 'Date of Birth',
298
+ value: (row) => formatDate(row.birthdate),
299
+ sortValue: (row) => row.birthdate,
300
+ hidden: true,
301
+ },
302
+ { header: 'Encounter ID', field: 'encounter_id', hidden: true },
303
+ ],
304
+ },
305
+ /* 3.1 Starting ART and 3.2 Currently on ART (HV03-01 to HV03-028). Fields are
306
+ the columns of the ART monthly dataset in the ETL (service/moh-731/ver-2023/art),
307
+ read from the HIV monthly report dataset for the month. */
308
+ artMonthly: {
309
+ title: 'HIV and TB Treatment',
310
+ fetchPatientList: getMoh366PatientList,
311
+ columns: [
312
+ { header: 'Name', field: 'full_name' },
313
+ { header: 'CCC Number', field: 'ccc_number', text: true },
314
+ { header: 'NUPI', field: 'nupi', text: true },
315
+ { header: 'AMRS Number', field: 'amrs_number', text: true },
316
+ { header: 'Sex', field: 'gender' },
317
+ { header: 'Age', field: 'age' },
318
+ { header: 'ART Status', field: 'art_status' },
319
+ {
320
+ header: 'ART Start Date',
321
+ value: (row) => formatDate(row.arv_first_regimen_start_date),
322
+ sortValue: (row) => row.arv_first_regimen_start_date,
323
+ },
324
+ { header: 'Current Regimen', field: 'cur_arv_meds', wrap: true },
325
+ { header: 'ARV Line', field: 'cur_arv_line' },
326
+ {
327
+ header: 'Last Visit',
328
+ value: (row) => formatDate(row.last_visit_date),
329
+ sortValue: (row) => row.last_visit_date,
330
+ },
331
+ { header: 'RTC Date', value: (row) => formatDate(row.rtc_date), sortValue: (row) => row.rtc_date },
332
+ { header: 'Location', field: 'location' },
333
+ /* Available from the Columns menu */
334
+ {
335
+ header: 'Enrollment Date',
336
+ value: (row) => formatDate(row.enrollment_date),
337
+ sortValue: (row) => row.enrollment_date,
338
+ hidden: true,
339
+ },
340
+ { header: 'Transfer In This Month', field: 'transfer_in', hidden: true },
341
+ { header: 'Pregnant', field: 'pregnant', hidden: true },
342
+ { header: 'Latest VL', field: 'vl_1', hidden: true },
343
+ {
344
+ header: 'Latest VL Date',
345
+ value: (row) => formatDate(row.vl_1_date),
346
+ sortValue: (row) => row.vl_1_date,
347
+ hidden: true,
348
+ },
349
+ {
350
+ header: 'Date of Birth',
351
+ value: (row) => formatDate(row.birthdate),
352
+ sortValue: (row) => row.birthdate,
353
+ hidden: true,
354
+ },
355
+ ],
356
+ },
357
+ /* 3.3 TB Screening, 3.4 Starting TPT and 3.5 Differentiated Service Delivery
358
+ (HV03-029 to HV03-036). Fields are the columns of the TB, TPT and DSD datasets in
359
+ the ETL (service/moh-731/ver-2023/tb-tpt-dsd); each figure lists one row per client. */
360
+ tbDsd: {
361
+ title: 'HIV and TB Treatment',
362
+ fetchPatientList: getMoh366PatientList,
363
+ columns: [
364
+ { header: 'Name', field: 'full_name' },
365
+ { header: 'CCC Number', field: 'ccc_number', text: true },
366
+ { header: 'NUPI', field: 'nupi', text: true },
367
+ { header: 'AMRS Number', field: 'amrs_number', text: true },
368
+ { header: 'Sex', field: 'gender' },
369
+ { header: 'Age', field: 'age' },
370
+ {
371
+ header: 'ART Start Date',
372
+ value: (row) => formatDate(row.arv_first_regimen_start_date),
373
+ sortValue: (row) => row.arv_first_regimen_start_date,
374
+ },
375
+ {
376
+ header: 'TB Screening Date',
377
+ value: (row) => formatDate(row.tb_screening_date),
378
+ sortValue: (row) => row.tb_screening_date,
379
+ },
380
+ { header: 'TB Screening Result', field: 'tb_screening_result' },
381
+ {
382
+ header: 'TPT Start Date',
383
+ value: (row) => formatDate(row.ipt_start_date),
384
+ sortValue: (row) => row.ipt_start_date,
385
+ },
386
+ { header: 'DSD Status', field: 'dsd_status' },
387
+ { header: 'DSD Model', field: 'dsd_model' },
388
+ {
389
+ header: 'DSD Recorded',
390
+ value: (row) => formatDate(row.dsd_obs_date),
391
+ sortValue: (row) => row.dsd_obs_date,
392
+ },
393
+ {
394
+ header: 'Last Visit',
395
+ value: (row) => formatDate(row.last_visit_date),
396
+ sortValue: (row) => row.last_visit_date,
397
+ },
398
+ { header: 'Location', field: 'location' },
399
+ ],
400
+ },
401
+ art: {
402
+ title: 'HIV Treatment',
403
+ fetchPatientList: getMoh366PatientList,
404
+ columns: [cccNumber, name, nupi, sex, age, phoneNumber],
405
+ },
406
+ tb: {
407
+ title: 'TB Screening, TPT and HIV in TB Clinic',
408
+ fetchPatientList: getMoh366PatientList,
409
+ columns: [cccNumber, name, nupi, sex, age, phoneNumber],
410
+ },
411
+ /* 3.6 Nutrition and HIV (HV03-037 to HV03-060): one row per client, their
412
+ latest SAM / MAM status in the period, from the ETL's nutrition dataset
413
+ (service/moh-731/ver-2023/nutrition) */
414
+ nutrition: {
415
+ title: 'Nutrition and HIV',
416
+ fetchPatientList: getMoh366PatientList,
417
+ columns: [
418
+ {
419
+ header: 'Visit Date',
420
+ value: (row) => formatDate(row.encounter_date),
421
+ sortValue: (row) => row.encounter_date,
422
+ },
423
+ { header: 'Name', field: 'full_name' },
424
+ { header: 'CCC Number', field: 'ccc_number', text: true },
425
+ { header: 'NUPI', field: 'nupi', text: true },
426
+ { header: 'AMRS Number', field: 'amrs_number', text: true },
427
+ { header: 'Sex', field: 'gender' },
428
+ { header: 'Age', field: 'age' },
429
+ { header: 'Age (Months)', field: 'age_months', hidden: true },
430
+ { header: 'SAM / MAM', field: 'sam_mam' },
431
+ { header: 'Food Given', field: 'food_given' },
432
+ { header: 'Pregnant / Lactating', field: 'pregnant_lactating' },
433
+ { header: 'Current ARV Regimen', field: 'current_arv_regimen' },
434
+ { header: 'ARV Line', field: 'cur_arv_line', hidden: true },
435
+ {
436
+ header: 'ART Start Date',
437
+ value: (row) => formatDate(row.art_start_date),
438
+ sortValue: (row) => row.art_start_date,
439
+ },
440
+ { header: 'RTC Date', value: (row) => formatDate(row.rtc_date), sortValue: (row) => row.rtc_date },
441
+ { header: 'HIV Clinic', field: 'hiv_clinic', hidden: true },
442
+ { header: 'Encounter Type', field: 'encounter_type', hidden: true },
443
+ { header: 'Location', field: 'location' },
444
+ { header: 'Entered By', field: 'entered_by', hidden: true },
445
+ ],
446
+ },
447
+ /* 5. Post Exposure Prophylaxis (HV05-01 to HV05-04): one row per exposure, from
448
+ the ETL's PEP dataset (service/moh-731/ver-2023/pep) */
449
+ pep: {
450
+ title: 'Post Exposure Prophylaxis',
451
+ fetchPatientList: getMoh366PatientList,
452
+ columns: [
453
+ {
454
+ header: 'Exposure Date',
455
+ value: (row) => formatDate(row.exposure_date),
456
+ sortValue: (row) => row.exposure_date,
457
+ },
458
+ { header: 'Name', field: 'full_name' },
459
+ { header: 'CCC Number', field: 'ccc_number', text: true },
460
+ { header: 'NUPI', field: 'nupi', text: true },
461
+ { header: 'AMRS Number', field: 'amrs_number', text: true },
462
+ { header: 'Sex', field: 'gender' },
463
+ { header: 'Age', field: 'age' },
464
+ { header: 'Exposure Type', field: 'exposure_type' },
465
+ { header: 'PEP Given', field: 'pep_given_status' },
466
+ { header: 'Location', field: 'location' },
467
+ { header: 'Entered By', field: 'entered_by' },
468
+ ],
469
+ },
470
+ } satisfies Record<string, Moh731LinelistSection>;
471
+
472
+ export type Moh731SectionId = keyof typeof MOH_731_LINELIST_SECTIONS;
@@ -0,0 +1,102 @@
1
+ import React, { useMemo } from 'react';
2
+ import { useSearchParams } from 'react-router-dom';
3
+
4
+ import { LinelistTable, useAllRows } from '../../../common/linelist-table';
5
+ import { RegisterLayout, useLocationName } from '../../../common/report-register';
6
+ import { MOH_731_INDICATORS } from './moh-731-indicators';
7
+ import { MOH_731_LINELIST_SECTIONS } from './moh-731-linelist-sections';
8
+
9
+ const GENDERS: Record<string, string> = { M: 'Male', F: 'Female' };
10
+
11
+ /**
12
+ * The linelist behind one figure on the MOH 731 sheet, or behind a total of
13
+ * several figures on the Summary tab.
14
+ *
15
+ * The link carries the figure's code (or, for a total, its figures' codes with
16
+ * a label) and the report period; each code is looked up in `MOH_731_INDICATORS`
17
+ * for what to list, and the section it belongs to decides where the rows come
18
+ * from and which columns they are shown in. A total lists its figures' rows one
19
+ * after another -- its figures never overlap, so each client appears once.
20
+ */
21
+ const Moh731Linelist: React.FC = () => {
22
+ const [searchParams] = useSearchParams();
23
+
24
+ const code = searchParams.get('code') ?? '';
25
+ const totalCodes = (searchParams.get('codes') ?? '').split(',').filter(Boolean);
26
+ const totalLabel = searchParams.get('label') ?? '';
27
+ const totalBlock = searchParams.get('block') ?? '';
28
+ const startDate = searchParams.get('startDate');
29
+ const endDate = searchParams.get('endDate');
30
+ const locationUuids = searchParams.get('locationUuids');
31
+
32
+ const locationName = useLocationName(locationUuids);
33
+
34
+ const isTotal = totalCodes.length > 0;
35
+ const parts = (isTotal ? totalCodes : [code]).map((partCode) => MOH_731_INDICATORS[partCode]);
36
+ /* every figure of a total comes from the same section, so it is listed in one table */
37
+ const figure = parts.every((part) => part && part.section === parts[0].section) ? parts[0] : undefined;
38
+ const section = figure ? MOH_731_LINELIST_SECTIONS[figure.section] : undefined;
39
+
40
+ const { rows, isLoading } = useAllRows(
41
+ section
42
+ ? parts.map(
43
+ (part) =>
44
+ ({ startIndex, limit }) =>
45
+ section.fetchPatientList({
46
+ locationUuids,
47
+ startDate,
48
+ endDate,
49
+ indicator: part.indicator,
50
+ gender: part.gender ?? '',
51
+ startIndex,
52
+ limit,
53
+ }),
54
+ )
55
+ : () => Promise.resolve({ results: [], total: 0, isTotalExact: true }),
56
+ [code, totalCodes.join(','), startDate, endDate, locationUuids],
57
+ );
58
+
59
+ /* A figure can start some of its section's hidden columns visible. It keeps
60
+ its own saved layout, so a layout saved on the section's other figures
61
+ does not hide them again. */
62
+ const showColumns = figure?.showColumns;
63
+ const columns = useMemo(
64
+ () =>
65
+ (section?.columns ?? []).map((column) =>
66
+ showColumns?.includes(column.header) ? { ...column, hidden: false } : column,
67
+ ),
68
+ [section, showColumns],
69
+ );
70
+ const layoutKey = `moh-731:${figure?.section}${showColumns ? `:${showColumns.join(',')}` : ''}`;
71
+
72
+ const sex = figure?.gender ? ` (${GENDERS[figure.gender]})` : '';
73
+ const heading = !figure
74
+ ? `Unknown MOH 731 figure ${isTotal ? totalCodes.join(', ') : code}`
75
+ : isTotal
76
+ ? `${totalLabel} linelist`
77
+ : `${figure.label}${sex} ${code} linelist`;
78
+ const block = isTotal ? totalBlock : figure?.block;
79
+
80
+ return (
81
+ <RegisterLayout
82
+ parentLabel="MOH-731 Report"
83
+ parentPath="/moh-731"
84
+ title={figure ? `${section.title} · ${block}` : 'MOH 731 Linelist'}
85
+ heading={heading}
86
+ location={locationName}
87
+ isLoading={isLoading}
88
+ isEmpty={rows.length === 0}
89
+ >
90
+ {section && (
91
+ <LinelistTable
92
+ rows={rows}
93
+ columns={columns}
94
+ layoutKey={layoutKey}
95
+ exportName={`${heading} ${startDate ?? ''} ${endDate ?? ''}`}
96
+ />
97
+ )}
98
+ </RegisterLayout>
99
+ );
100
+ };
101
+
102
+ export default Moh731Linelist;
@@ -0,0 +1,50 @@
1
+ import { useCallback } from 'react';
2
+ import { useNavigate } from 'react-router-dom';
3
+
4
+ /** A linelist made of several figures, e.g. a total on the Summary tab */
5
+ export interface Moh731LinelistTotal {
6
+ /** The figures it is made of, by code; they must not overlap */
7
+ codes: string[];
8
+ /** Heading, e.g. `Total tests` */
9
+ label: string;
10
+ /** The sub-section it totals, e.g. `1.1 HIV Tests` */
11
+ block: string;
12
+ }
13
+
14
+ /**
15
+ * Opens the linelist behind a figure on the MOH 731 sheet, by the code printed
16
+ * beside it (e.g. `HV01-03`), or behind a total made of several figures. What a
17
+ * code lists is defined in `moh-731-indicators.ts`. `view` is the report tab it
18
+ * was opened from, and `section` the Summary section tab, so the breadcrumb
19
+ * returns to them.
20
+ */
21
+ export function useOpenMoh731Linelist(
22
+ startDate: string,
23
+ endDate: string,
24
+ locationUuids: string,
25
+ view?: 'summary',
26
+ section?: string,
27
+ ) {
28
+ const navigate = useNavigate();
29
+
30
+ return useCallback(
31
+ (figure: string | Moh731LinelistTotal) => {
32
+ const params = new URLSearchParams({ startDate, endDate, locationUuids, from: 'moh-731' });
33
+ if (typeof figure === 'string') {
34
+ params.set('code', figure);
35
+ } else {
36
+ params.set('codes', figure.codes.join(','));
37
+ params.set('label', figure.label);
38
+ params.set('block', figure.block);
39
+ }
40
+ if (view) {
41
+ params.set('view', view);
42
+ }
43
+ if (section) {
44
+ params.set('section', section);
45
+ }
46
+ navigate(`/moh-731-linelist?${params}`);
47
+ },
48
+ [navigate, startDate, endDate, locationUuids, view, section],
49
+ );
50
+ }