@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
@@ -0,0 +1,418 @@
1
+ import React from 'react';
2
+
3
+ import { usePageScale } from '../../common/report-page';
4
+ import {
5
+ Columns,
6
+ Heading,
7
+ KeyTable,
8
+ NutritionStack,
9
+ PAGE_WIDTH_MM,
10
+ ROWS_PER_PAGE,
11
+ Stack,
12
+ Tb4Page,
13
+ Value,
14
+ paginate,
15
+ } from './tb4-parts';
16
+ import { formDate, text, type Tb4Row, type Tb4Test } from './tb4.types';
17
+ import styles from './tb4-register.scss';
18
+
19
+ /** Column widths, measured off page 8 of the form: A to O, P (X-ray, others), Q, R, S (molecular, five smears), T */
20
+ const COLUMN_WIDTHS = [
21
+ 51, 62, 59, 218, 48, 64, 85, 105, 68, 68, 76, 57, 55, 122, 60, 47, 46, 89, 50, 77, 52, 52, 50, 45, 48, 136,
22
+ ];
23
+
24
+ const SMEAR_MONTHS = [0, 2, 3, 5, 6] as const;
25
+
26
+ /** A test's serial number, date and result, down the row (S) */
27
+ const TestStack: React.FC<{ test?: Tb4Test | null }> = ({ test }) => (
28
+ <Stack
29
+ parts={[
30
+ { share: 0.292, boxes: [{ value: text(test?.serial) }] },
31
+ { share: 0.295, boxes: [{ value: formDate(test?.date) }] },
32
+ { share: 0.413, boxes: [{ value: text(test?.result) }] },
33
+ ]}
34
+ />
35
+ );
36
+
37
+ /** One patient: A to T across one tall row, divided inside as printed */
38
+ const PatientRow: React.FC<{ row?: Tb4Row }> = ({ row }) => (
39
+ <tr>
40
+ <td>
41
+ <Value>{text(row?.serial_number)}</Value>
42
+ </td>
43
+ <td>
44
+ <Value>{formDate(row?.registration_date)}</Value>
45
+ </td>
46
+ <td>
47
+ <Value>{text(row?.sub_county_tb_number)}</Value>
48
+ </td>
49
+ <td>
50
+ <Value left wrap>
51
+ {text(row?.full_name)}
52
+ </Value>
53
+ </td>
54
+ <td>
55
+ <Value>{text(row?.sex)}</Value>
56
+ </td>
57
+ <td>
58
+ <Value>{text(row?.age)}</Value>
59
+ </td>
60
+ <td>
61
+ <Stack
62
+ parts={[
63
+ { share: 0.146, boxes: [{ heading: 'Nationality' }] },
64
+ { share: 0.295, boxes: [{ value: text(row?.nationality) }] },
65
+ { share: 0.146, boxes: [{ heading: 'Number' }] },
66
+ { share: 0.413, boxes: [{ value: text(row?.id_number) }] },
67
+ ]}
68
+ />
69
+ </td>
70
+ <td>
71
+ <Value left wrap>
72
+ {[row?.physical_address, row?.patient_phone, row?.supporter_phone]
73
+ .map(text)
74
+ .filter(Boolean)
75
+ .map((line) => (
76
+ <React.Fragment key={line}>
77
+ {line}
78
+ <br />
79
+ </React.Fragment>
80
+ ))}
81
+ </Value>
82
+ </td>
83
+ <td>
84
+ <Value>{text(row?.key_population)}</Value>
85
+ </td>
86
+ <td>
87
+ <Value>{text(row?.referred_by)}</Value>
88
+ </td>
89
+ <td>
90
+ <NutritionStack nutrition={row?.nutrition_start} />
91
+ </td>
92
+ <td>
93
+ <Value>{text(row?.severity)}</Value>
94
+ </td>
95
+ <td>
96
+ <Value>{text(row?.tb_type)}</Value>
97
+ </td>
98
+ <td>
99
+ <Stack
100
+ parts={[
101
+ { share: 0.441, boxes: [{ value: text(row?.eptb_subtype) }] },
102
+ { share: 0.146, boxes: [{ value: text(row?.lymph_node_type) }] },
103
+ { share: 0.146 },
104
+ { share: 0.267 },
105
+ ]}
106
+ />
107
+ </td>
108
+ <td>
109
+ <Value>{text(row?.patient_type)}</Value>
110
+ </td>
111
+ <td>
112
+ <Stack
113
+ parts={[
114
+ { share: 0.183, boxes: [{ tag: 'Date', value: formDate(row?.xray_date) }] },
115
+ { share: 0.258, boxes: [{ tag: 'Score', value: text(row?.xray_score) }] },
116
+ { share: 0.559, boxes: [{ tag: 'Finding', value: text(row?.xray_finding) }] },
117
+ ]}
118
+ />
119
+ </td>
120
+ <td>
121
+ <Value>{text(row?.other_imaging)}</Value>
122
+ </td>
123
+ <td>
124
+ <Stack
125
+ parts={[
126
+ { share: 0.146 },
127
+ { share: 0.295, boxes: [{ value: formDate(row?.tb_lamp?.date) }] },
128
+ { share: 0.146 },
129
+ { share: 0.413, boxes: [{ value: text(row?.tb_lamp?.result) }] },
130
+ ]}
131
+ />
132
+ </td>
133
+ <td>
134
+ <Value>
135
+ {text(row?.lf_lam?.result)}
136
+ <br />
137
+ {formDate(row?.lf_lam?.date)}
138
+ </Value>
139
+ </td>
140
+ <td>
141
+ <TestStack test={row?.molecular} />
142
+ </td>
143
+ {SMEAR_MONTHS.map((month) => (
144
+ <td key={month}>
145
+ <TestStack test={row?.smears?.[month]} />
146
+ </td>
147
+ ))}
148
+ <td>
149
+ <Stack
150
+ parts={[
151
+ { share: 0.146, boxes: [{ value: text(row?.culture?.result) }] },
152
+ { share: 0.146, boxes: [{ heading: 'Date' }] },
153
+ { share: 0.149, boxes: [{ value: formDate(row?.culture?.date) }] },
154
+ { share: 0.146 },
155
+ {
156
+ share: 0.146,
157
+ boxes: [{ heading: 'R' }, { heading: 'H' }, { heading: 'Z' }, { heading: 'E', grow: 2.2 }],
158
+ },
159
+ {
160
+ share: 0.267,
161
+ boxes: [
162
+ { value: text(row?.dst?.r) },
163
+ { value: text(row?.dst?.h) },
164
+ { value: text(row?.dst?.z) },
165
+ { value: text(row?.dst?.e), grow: 2.2 },
166
+ ],
167
+ },
168
+ ]}
169
+ />
170
+ </td>
171
+ </tr>
172
+ );
173
+
174
+ /** Keys 1 to 6a, beneath the register on the left-hand pages */
175
+ const PatientKeys: React.FC = () => (
176
+ <div className={styles.keys}>
177
+ <div className={styles.keyColumn}>
178
+ <p className={styles.keyTitle}>KEY:</p>
179
+ <KeyTable
180
+ title="Key 1: Patient referred by"
181
+ widthMm={68}
182
+ rows={[
183
+ ['HTC', 'HTC'],
184
+ ['Comprehensive care unit', 'CCC'],
185
+ ['Diabetes', 'DC'],
186
+ ['Private Sector', 'PS'],
187
+ ['Antenatal/PMTCT clinic', 'PMTCT'],
188
+ ['Self referral', 'SR'],
189
+ ['Contact Invitation', 'CI'],
190
+ ['Chemist/Pharmacy', 'CP'],
191
+ ['Community Health Promoter', 'CHP'],
192
+ ]}
193
+ />
194
+ </div>
195
+ <div className={styles.keyColumn}>
196
+ <KeyTable
197
+ title="Key 2: Severity Score"
198
+ widthMm={79}
199
+ rows={[
200
+ [
201
+ 'Non- Severe',
202
+ <>
203
+ No danger signs
204
+ <br />
205
+ Diagnosed and managed at the outpatient/ No hospitalization
206
+ </>,
207
+ ],
208
+ [
209
+ 'Severe',
210
+ <>
211
+ Requiring hospitalization at diagnosis
212
+ <br />
213
+ Hospitalized at diagnosis/Diagnosed while an inpatient
214
+ <br />
215
+ Severely ill at diagnosis with any danger signs children who are BC
216
+ </>,
217
+ ],
218
+ ]}
219
+ />
220
+ <KeyTable
221
+ title="Key 3: lymphadenitis"
222
+ widthMm={79}
223
+ rows={[
224
+ [
225
+ 'Complicated',
226
+ <>
227
+ a) Has a Leaking Sinus/ associated abscess
228
+ <br />
229
+ b) Causing nerve/ nearby structure compression
230
+ <br />
231
+ c) TB Spread to any other organ
232
+ </>,
233
+ ],
234
+ ['Uncomplicated', 'Simple nodes with none of the above'],
235
+ ]}
236
+ />
237
+ </div>
238
+ <KeyTable
239
+ title="Key 4: Type of patient:"
240
+ widthMm={74}
241
+ leftTitle
242
+ rows={[
243
+ ['New', 'N'],
244
+ ['Treatment after loss follow up', 'TLF'],
245
+ ['Recurrent', 'R'],
246
+ ['Previous Treatment History unknown', 'THU'],
247
+ ['Treatment after Failure', 'TF'],
248
+ ['Transfer In', 'TI'],
249
+ ['Others previously treated', 'PT'],
250
+ ]}
251
+ />
252
+ <KeyTable
253
+ title="Key 5 : X-Ray"
254
+ widthMm={68}
255
+ subheadings={[4]}
256
+ rows={[
257
+ ['N', 'Normal'],
258
+ ['SG', 'Abnormal Suggestive TB'],
259
+ ['AO', 'Abnormal Others'],
260
+ ['ND', 'Not Done'],
261
+ ['CT - Scan'],
262
+ ['FSTB', 'Finding Suggestive of TB'],
263
+ ['FSM', 'Finding Suggestive of Malignancy'],
264
+ ]}
265
+ />
266
+ <KeyTable
267
+ title="Key 6 a: Molecular test results"
268
+ widthMm={82}
269
+ rows={[
270
+ ['TS', 'MTB detected, rifampicin resistance not detected;'],
271
+ ['RR', 'MTB detected, rifampicin resistance detected;'],
272
+ ['TI', 'MTB detected, rifampicin resistance indeterminate'],
273
+ ['N', 'MTB not detected;'],
274
+ ['I', 'Invalid/no result/error'],
275
+ ['NA', 'Not Applicable'],
276
+ ['TR', 'MTB detected Trace'],
277
+ ]}
278
+ />
279
+ </div>
280
+ );
281
+
282
+ /**
283
+ * The left-hand pages of the TB4 register (page 8 of the form): the patient,
284
+ * diagnosis and investigations, columns A to T, five patients a page, with
285
+ * Keys 1 to 6a beneath.
286
+ */
287
+ const Tb4PatientSheet: React.FC<{ rows: Tb4Row[] }> = ({ rows }) => {
288
+ const { ref, scale } = usePageScale<HTMLDivElement>(PAGE_WIDTH_MM);
289
+ const pages = paginate(rows);
290
+
291
+ return (
292
+ <div className={styles.viewport} ref={ref}>
293
+ {pages.map((pageRows, index) => (
294
+ <Tb4Page
295
+ key={index}
296
+ page={index + 1}
297
+ pages={pages.length}
298
+ side="Patient, diagnosis and investigations (A–T)"
299
+ scale={scale}
300
+ keys={<PatientKeys />}
301
+ table={
302
+ <table className={styles.register}>
303
+ <Columns widths={COLUMN_WIDTHS} />
304
+ <thead>
305
+ <tr style={{ height: '14mm' }}>
306
+ <Heading letter="A" rowSpan={3}>
307
+ Serial No.
308
+ </Heading>
309
+ <Heading letter="B" rowSpan={3}>
310
+ Date of Sub- County Reg.
311
+ </Heading>
312
+ <Heading letter="C" rowSpan={3}>
313
+ Sub County TB Reg No.
314
+ </Heading>
315
+ <Heading letter="D" rowSpan={3} centre>
316
+ &quot;Name (Write 3 names)&quot;
317
+ </Heading>
318
+ <Heading letter="E" rowSpan={3}>
319
+ Sex (M/F Other)
320
+ </Heading>
321
+ <Heading letter="F" rowSpan={3}>
322
+ Age in years and months
323
+ </Heading>
324
+ <Heading letter="G" rowSpan={3} centre>
325
+ Nationality and National ID/ Passport / UPI/NEMIS Number/Alien ID Number
326
+ </Heading>
327
+ <Heading letter="H" rowSpan={3}>
328
+ Physical address (Neighbour/ School/ Church/ Mosque)
329
+ <br />
330
+ <br />
331
+ Phone No. of patient
332
+ <br />
333
+ <br />
334
+ Phone No. treatment supporter
335
+ </Heading>
336
+ <Heading letter="I" rowSpan={3}>
337
+ Is the patient a key vulnerable population (HCW, Truck driver prisoner or miner) or None
338
+ </Heading>
339
+ <Heading letter="J" rowSpan={3} centre>
340
+ Patient Referred By (Key 1)
341
+ </Heading>
342
+ <Heading letter="K" rowSpan={3}>
343
+ Nutritional status at the start of TB Treatment (Kgs)/ Height/ Length (Cm)
344
+ </Heading>
345
+ <Heading letter="L" rowSpan={3} centre>
346
+ Severity Score (Severe/ Non- Severe Key 2)
347
+ </Heading>
348
+ <Heading letter="M" rowSpan={3}>
349
+ Type of TB (PTB/ EPTB
350
+ </Heading>
351
+ <Heading letter="N" rowSpan={3}>
352
+ EPTB Sub-type
353
+ <br />
354
+ <br />
355
+ (If lymph nodes, specify complicated/ uncomplicated Key 3)
356
+ </Heading>
357
+ <Heading letter="O" rowSpan={3} centre>
358
+ Type of patient (Key 4)
359
+ </Heading>
360
+ <Heading letter="P" rowSpan={2} colSpan={2}>
361
+ Imaging (Key5)
362
+ </Heading>
363
+ <Heading letter="Q" rowSpan={3}>
364
+ TB LAMP
365
+ <br />
366
+ <br />
367
+ Date
368
+ <br />
369
+ <br />
370
+ Results (Pos/ Neg/ND)
371
+ </Heading>
372
+ <Heading letter="R" rowSpan={3} centre>
373
+ LF LAM
374
+ <br />
375
+ <br />
376
+ (Pos/ Neg/ ND) and date
377
+ </Heading>
378
+ <Heading letter="S" colSpan={6} centre>
379
+ Molecular/Microbiological Tests (Serial no., date and result sputum smear examination,
380
+ quantification)
381
+ </Heading>
382
+ <Heading letter="T" rowSpan={3} centre>
383
+ <br />
384
+ Culture/DST Results Resistant (R)/Sensitive (S) and Date collected (Growth/No Growth/ Done No
385
+ Results/ Contaminated/Not done) (Key7a/7b)
386
+ </Heading>
387
+ </tr>
388
+ <tr style={{ height: '9.5mm' }}>
389
+ <th className={styles.boldHeading}>Molecular test (Key 6a/6b)</th>
390
+ <th colSpan={5} className={styles.boldHeading}>
391
+ Smear
392
+ </th>
393
+ </tr>
394
+ <tr style={{ height: '18.5mm' }}>
395
+ <th className={styles.tinyHeading}>X-ray Finding</th>
396
+ <th className={styles.tinyHeading}>Others Specify)</th>
397
+ <th className={styles.boldHeading}>Month 0</th>
398
+ {SMEAR_MONTHS.map((month) => (
399
+ <th key={month} className={styles.boldHeading}>
400
+ Month {month}
401
+ </th>
402
+ ))}
403
+ </tr>
404
+ </thead>
405
+ <tbody>
406
+ {Array.from({ length: ROWS_PER_PAGE }, (_, rowIndex) => (
407
+ <PatientRow key={rowIndex} row={pageRows[rowIndex]} />
408
+ ))}
409
+ </tbody>
410
+ </table>
411
+ }
412
+ />
413
+ ))}
414
+ </div>
415
+ );
416
+ };
417
+
418
+ export default Tb4PatientSheet;
@@ -0,0 +1,282 @@
1
+ @use '@carbon/layout';
2
+ @use '@openmrs/esm-styleguide/src/vars' as *;
3
+
4
+ /* The TB4 Notification and Treatment Register (MOH/REG/DLTLDP/01) as A3
5
+ landscape pages, drawn in the units the paper is measured in (mm, pt) so a
6
+ page is one sheet, as on pages 8 and 9 of the form: the two facing pages of
7
+ each spread, five patients to a page, with the keys beneath. Each patient's
8
+ row is divided inside as printed (nationality over number, weight beside
9
+ height over BMI and MUAC, …), drawn as stacks of fixed fractions of the row
10
+ so every page keeps the form's proportions. */
11
+
12
+ /* On screen a page is the printable area only, A3 landscape less its 8mm
13
+ margins: the card around it gives the margin, and `usePageScale` is told
14
+ this width. */
15
+ $page-w: 420mm - 2 * 8mm;
16
+ $page-h: 297mm - 2 * 8mm;
17
+
18
+ $ink: #000;
19
+ $rule: 0.6pt solid #555;
20
+ $frame: 1.2pt solid $ink;
21
+ $key-fill: #d6e3bc; // the keys' headings
22
+
23
+ $heading-h: 42mm;
24
+ $row-h: 32mm;
25
+
26
+ /* The card the pages sit in, drawn like the filter card above it */
27
+ .reportFrame {
28
+ margin: layout.$spacing-05 0 layout.$spacing-07;
29
+ padding: layout.$spacing-05;
30
+ background-color: $ui-02;
31
+ border: 1px solid $ui-03;
32
+ }
33
+
34
+ /* The two facing pages as tabs, under the filters */
35
+ .sheetTabs {
36
+ margin-top: layout.$spacing-05;
37
+ }
38
+
39
+ .sheetPanel {
40
+ padding: 0;
41
+ }
42
+
43
+ /* Holds the fixed-width pages without making the app scroll sideways */
44
+ .viewport {
45
+ display: flex;
46
+ flex-direction: column;
47
+ gap: layout.$spacing-09;
48
+ overflow-x: auto;
49
+ }
50
+
51
+ .page {
52
+ display: flex;
53
+ flex-direction: column;
54
+ flex: none;
55
+ box-sizing: border-box;
56
+ width: $page-w;
57
+ height: $page-h;
58
+ margin: 0 auto;
59
+ color: $ink;
60
+ font-family: Arial, Helvetica, sans-serif;
61
+ font-size: 7pt;
62
+ line-height: 1.15;
63
+ background-color: #fff;
64
+ /* set by `usePageScale` from the measured container width, floored at 1 */
65
+ zoom: var(--page-zoom, 1);
66
+ }
67
+
68
+ .register {
69
+ width: 100%;
70
+ table-layout: fixed;
71
+ border-collapse: collapse;
72
+ border: $frame;
73
+
74
+ th,
75
+ td {
76
+ padding: 0;
77
+ overflow: hidden;
78
+ border: $rule;
79
+ }
80
+
81
+ th {
82
+ padding: 0.8mm 0.8mm;
83
+ font-size: 6.5pt;
84
+ font-weight: 400;
85
+ text-align: left;
86
+ vertical-align: top;
87
+ }
88
+
89
+ /* each patient's row is ruled off heavier, as printed */
90
+ tbody tr {
91
+ height: $row-h;
92
+ border-top: $frame;
93
+ }
94
+
95
+ td {
96
+ height: $row-h;
97
+ vertical-align: middle;
98
+ }
99
+ }
100
+
101
+ /* the column letter, bold over its heading */
102
+ .letter {
103
+ display: block;
104
+ font-weight: 700;
105
+ text-align: center;
106
+ }
107
+
108
+ .centreHeading {
109
+ text-align: center !important;
110
+ }
111
+
112
+ .boldHeading {
113
+ font-weight: 700 !important;
114
+ text-align: center !important;
115
+ }
116
+
117
+ /* the small headings under the imaging column */
118
+ .tinyHeading {
119
+ font-size: 5pt !important;
120
+ font-weight: 700 !important;
121
+ text-align: center !important;
122
+ vertical-align: middle !important;
123
+ }
124
+
125
+ /* the months of the drug collection grid */
126
+ .monthHeading {
127
+ padding: 0 !important;
128
+ font-size: 5.5pt !important;
129
+ font-weight: 700 !important;
130
+ text-align: center !important;
131
+ vertical-align: middle !important;
132
+ }
133
+
134
+ /* A whole cell's entry */
135
+ .value {
136
+ display: block;
137
+ padding: 0.6mm 0.8mm;
138
+ text-align: center;
139
+ overflow-wrap: anywhere;
140
+ }
141
+
142
+ .valueLeft {
143
+ text-align: left;
144
+ }
145
+
146
+ /* names, addresses and remarks wrap within their cell */
147
+ .wrap {
148
+ display: -webkit-box;
149
+ overflow: hidden;
150
+ -webkit-box-orient: vertical;
151
+ -webkit-line-clamp: 6;
152
+ }
153
+
154
+ /* A divided cell: parts stacked down the row's height, each holding one or
155
+ more boxes side by side */
156
+ .stack {
157
+ display: grid;
158
+ height: $row-h;
159
+ }
160
+
161
+ .part {
162
+ display: flex;
163
+ min-height: 0;
164
+ border-top: $rule;
165
+
166
+ &:first-child {
167
+ border-top: none;
168
+ }
169
+ }
170
+
171
+ .box {
172
+ position: relative;
173
+ display: flex;
174
+ flex: 1 1 0;
175
+ align-items: center;
176
+ justify-content: center;
177
+ min-width: 0;
178
+ padding: 0 0.6mm;
179
+ overflow: hidden;
180
+ text-align: center;
181
+ border-left: $rule;
182
+
183
+ &:first-child {
184
+ border-left: none;
185
+ }
186
+ }
187
+
188
+ /* a printed label filling its box: "Nationality", "Outcome", "R", … */
189
+ .heading {
190
+ font-size: 6.5pt;
191
+ font-weight: 700;
192
+ }
193
+
194
+ /* a printed label in the corner of a box that is also written in: "BMI/Z score", "MUAC" */
195
+ .tag {
196
+ position: absolute;
197
+ top: 0.6mm;
198
+ left: 0.6mm;
199
+ font-size: 4.8pt;
200
+ font-weight: 700;
201
+ }
202
+
203
+ .boxValue {
204
+ overflow-wrap: anywhere;
205
+ }
206
+
207
+ /* An initial phase collection (W): its date written up the narrow column */
208
+ .collection {
209
+ text-align: center;
210
+ }
211
+
212
+ .vertical {
213
+ display: inline-block;
214
+ font-size: 6pt;
215
+ white-space: nowrap;
216
+ writing-mode: vertical-rl;
217
+ transform: rotate(180deg);
218
+ }
219
+
220
+ /* The keys beneath the register, spaced across the sheet as on the form */
221
+
222
+ .keys {
223
+ display: flex;
224
+ align-items: flex-start;
225
+ justify-content: space-between;
226
+ gap: 4mm;
227
+ margin-top: 4mm;
228
+ }
229
+
230
+ .keyTitle {
231
+ margin: 0 0 1.5mm;
232
+ font-size: 10pt;
233
+ font-weight: 700;
234
+ }
235
+
236
+ .keyColumn {
237
+ display: flex;
238
+ flex-direction: column;
239
+ gap: 0;
240
+ }
241
+
242
+ .keyTable {
243
+ border-collapse: collapse;
244
+ font-size: 6.8pt;
245
+ line-height: 1.12;
246
+
247
+ th,
248
+ td {
249
+ padding: 0.6mm 1.2mm;
250
+ text-align: left;
251
+ vertical-align: middle;
252
+ border: 0.6pt solid #7f7f7f;
253
+ }
254
+
255
+ thead th {
256
+ font-size: 7.2pt;
257
+ font-weight: 700;
258
+ text-align: center;
259
+ background-color: $key-fill;
260
+ }
261
+
262
+ td {
263
+ height: 4.6mm;
264
+ }
265
+ }
266
+
267
+ /* a heading within a key, e.g. "CT - Scan", "Comorbidities" */
268
+ .keySubheading td {
269
+ font-weight: 700;
270
+ }
271
+
272
+ .leftHeadingKey thead th {
273
+ text-align: left;
274
+ }
275
+
276
+ .pageFoot {
277
+ display: flex;
278
+ justify-content: space-between;
279
+ margin-top: auto;
280
+ padding-top: 1.5mm;
281
+ font-size: 7.5pt;
282
+ }