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

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 (305) 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/549.css +1 -0
  31. package/dist/549.css.map +1 -0
  32. package/dist/549.js +1 -0
  33. package/dist/549.js.map +1 -0
  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 +1339 -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.scss +20 -0
  251. package/src/reports/moh-740/registers/moh-222-daily-register/moh-222-daily-register.tsx +183 -0
  252. package/src/reports/moh-740/registers/moh-270-permanent-register/moh-270-permanent-register.scss +6 -0
  253. package/src/reports/moh-740/registers/moh-270-permanent-register/moh-270-permanent-register.tsx +151 -0
  254. package/src/reports/moh-740/registers/moh-740-patient-list.scss +0 -0
  255. package/src/reports/moh-740/registers/moh-740-patient-list.tsx +60 -0
  256. package/src/reports/moh-740/registers/moh-740.columns.ts +54 -0
  257. package/src/reports/moh-740/shared/data-cell/data-cell.scss +6 -0
  258. package/src/reports/moh-740/shared/data-cell/data-cell.tsx +23 -0
  259. package/src/reports/moh-740/shared/utils/indicator-register-map.ts +159 -0
  260. package/src/reports/moh-740/types/index.ts +223 -0
  261. package/src/reports/moh-745/moh-745.component.tsx +2058 -0
  262. package/src/reports/moh-745/moh-745.scss +142 -0
  263. package/src/reports/moh-745/registers/moh-412-register.component.scss +6 -0
  264. package/src/reports/moh-745/registers/moh-412-register.component.tsx +275 -0
  265. package/src/reports/moh-745/registers/moh-412.columns.ts +52 -0
  266. package/src/reports/moh-745/registers/type.ts +223 -0
  267. package/src/reports/table-wrapper/table-row-mapper.component.tsx +20 -5
  268. package/src/reports/table-wrapper/table-wrapper.component.tsx +23 -14
  269. package/src/reports/table-wrapper/table-wrapper.scss +1 -16
  270. package/src/resources/moh-267.resource.ts +27 -0
  271. package/src/resources/moh-362.resource.ts +27 -0
  272. package/src/resources/moh-505.resource.ts +69 -0
  273. package/src/resources/moh-705.resource.ts +118 -0
  274. package/src/resources/moh-706.resource.ts +80 -0
  275. package/src/resources/moh-710.resource.ts +60 -9
  276. package/src/resources/moh-711.resource.ts +206 -9
  277. package/src/resources/moh-717.resource.ts +26 -9
  278. package/src/resources/moh-729b.resource.ts +25 -0
  279. package/src/resources/moh-731.resource.ts +90 -0
  280. package/src/resources/moh-745.resource.ts +76 -0
  281. package/src/resources/patient-list-page.ts +66 -0
  282. package/src/resources/presumptive-tb.resource.ts +27 -0
  283. package/src/root.component.tsx +79 -8
  284. package/src/root.scss +36 -0
  285. package/src/routes.json +3 -1
  286. package/src/utils/format-indicator.ts +39 -0
  287. package/src/utils/get-base-url.ts +39 -7
  288. package/src/utils/utils.ts +30 -1
  289. package/tsconfig.json +1 -1
  290. package/webpack.config.js +22 -1
  291. package/dist/138.js +0 -2
  292. package/dist/138.js.LICENSE.txt +0 -20
  293. package/dist/138.js.map +0 -1
  294. package/dist/184.js +0 -2
  295. package/dist/184.js.LICENSE.txt +0 -14
  296. package/dist/184.js.map +0 -1
  297. package/dist/205.js +0 -1
  298. package/dist/205.js.map +0 -1
  299. package/dist/812.js +0 -1
  300. package/dist/812.js.map +0 -1
  301. package/dist/879.js +0 -1
  302. package/dist/879.js.map +0 -1
  303. package/dist/ampath-esm-reports-app.js.buildmanifest.json +0 -539
  304. package/dist/main.js +0 -1
  305. package/dist/main.js.map +0 -1
@@ -0,0 +1,412 @@
1
+ @use '@carbon/layout';
2
+ @use '@openmrs/esm-styleguide/src/vars' as *;
3
+
4
+ /* MOH 362: HTS LAB REGISTER as A4 landscape pages, drawn in the units the paper
5
+ is measured in (mm, pt) so a page is one sheet: the ruled client rows and the
6
+ summary blocks inside one frame, as on page 5 of the form. Heights are fixed
7
+ so a page never spills over: 23 clients on a full page, and 15 clients with
8
+ the summary on the last. The referral and linkage register draws its pages
9
+ with these same page, frame and cell styles. */
10
+
11
+ /* On screen a page is the printable area only, A4 landscape less its 8mm
12
+ margins: the card around it (`.reportFrame`) gives the margin, as MOH 731's
13
+ does, and `usePageScale` is told this width. */
14
+ $page-w: 297mm - 2 * 8mm;
15
+ $page-h: 210mm - 2 * 8mm;
16
+
17
+ $ink: #000;
18
+ $rule: 0.6pt solid $ink;
19
+ $thick: 1.4pt solid $ink;
20
+ $dotted: 0.6pt dotted $ink;
21
+ $shade: #d9d9d9; // the grey label cells of the summary blocks
22
+ $lower-shade: #f2f2f2; // the lower half of columns (b) and (i)
23
+
24
+ $heading-h: 38mm;
25
+ $ids-h: 3.2mm;
26
+ $line-h: 2.95mm; // half a client row: each client takes two lines
27
+
28
+ /* The card the pages sit in, drawn like the filter card above it and like
29
+ MOH 731's report card (same margin, padding, rule and fill). It wraps
30
+ `.viewport` rather than styling it: the pages are scaled to the viewport's
31
+ width, so padding there would push them into a scrollbar. */
32
+ .reportFrame {
33
+ margin-top: layout.$spacing-05;
34
+ padding: layout.$spacing-05;
35
+ background-color: $ui-02;
36
+ border: 1px solid $ui-03;
37
+ }
38
+
39
+ /* Holds the fixed-width pages without making the app scroll sideways; the
40
+ pages are spaced apart as separate sheets */
41
+ .viewport {
42
+ display: flex;
43
+ flex-direction: column;
44
+ gap: layout.$spacing-09;
45
+ overflow-x: auto;
46
+ }
47
+
48
+ .page {
49
+ display: flex;
50
+ flex-direction: column;
51
+ flex: none;
52
+ box-sizing: border-box;
53
+ width: $page-w;
54
+ height: $page-h;
55
+ margin: 0 auto;
56
+ color: $ink;
57
+ font-family: Arial, Helvetica, sans-serif;
58
+ font-size: 6pt;
59
+ line-height: 1.15;
60
+ background-color: #fff;
61
+ /* set by `usePageScale` from the measured container width, floored at 1 */
62
+ zoom: var(--page-zoom, 1);
63
+ }
64
+
65
+ .runningHead {
66
+ display: grid;
67
+ grid-template-columns: 1fr auto 1fr;
68
+ font-size: 7.5pt;
69
+
70
+ span:nth-child(2) {
71
+ text-align: center;
72
+ }
73
+
74
+ span:last-child {
75
+ text-align: right;
76
+ }
77
+ }
78
+
79
+ .title {
80
+ margin: 1mm 0 0.6mm;
81
+ font-size: 8pt;
82
+ font-weight: 700;
83
+ line-height: 1;
84
+ text-align: center;
85
+ }
86
+
87
+ /* The ruled sheet: register, summary and sign-off in one border. A full page's
88
+ frame ends with its last row; the last page's runs down to the foot. */
89
+ .frame {
90
+ display: flex;
91
+ flex-direction: column;
92
+ min-height: 0;
93
+ border: $rule;
94
+ border-top: none;
95
+ }
96
+
97
+ .lastFrame {
98
+ flex: 1;
99
+ }
100
+
101
+ .register {
102
+ width: 100%;
103
+ table-layout: fixed;
104
+ border-collapse: collapse;
105
+
106
+ th,
107
+ td {
108
+ padding: 0 0.5mm;
109
+ overflow: hidden;
110
+ text-align: center;
111
+ vertical-align: middle;
112
+ border: $rule;
113
+ }
114
+
115
+ /* the frame draws the outer edge */
116
+ tr > :first-child {
117
+ border-left: none;
118
+ }
119
+
120
+ tr > :last-child {
121
+ border-right: none;
122
+ }
123
+
124
+ th {
125
+ font-weight: 400;
126
+ font-size: 5.5pt;
127
+ }
128
+ }
129
+
130
+ .headings th {
131
+ height: $heading-h;
132
+ }
133
+
134
+ /* (a), (b) ... under the headings, in a heavy rule as on the form */
135
+ .columnIds th {
136
+ height: $ids-h;
137
+ font-size: 5.5pt;
138
+ border-top: $thick;
139
+ border-bottom: $thick;
140
+ }
141
+
142
+ .upperLine td,
143
+ .lowerLine td {
144
+ height: $line-h;
145
+ white-space: nowrap;
146
+ }
147
+
148
+ .upperCell {
149
+ border-bottom: $dotted !important;
150
+ }
151
+
152
+ .lowerCell {
153
+ border-top: $dotted !important;
154
+ background-color: $lower-shade;
155
+ }
156
+
157
+ /* the final result in full: "Inconclusive" must fit the narrow column (n) */
158
+ .finalResult {
159
+ padding: 0 0.3mm !important;
160
+ font-size: 5.5pt;
161
+ }
162
+
163
+ /* national ID over the Client Registry ID (CR + 13 digits + check digit) */
164
+ .idCell {
165
+ padding: 0 0.3mm !important;
166
+ font-size: 5pt;
167
+ letter-spacing: -0.1pt;
168
+ }
169
+
170
+ .left {
171
+ text-align: left !important;
172
+ }
173
+
174
+ /* names and remarks may take both lines of the row, never more */
175
+ .clamp {
176
+ display: -webkit-box;
177
+ overflow: hidden;
178
+ white-space: normal;
179
+ -webkit-box-orient: vertical;
180
+ -webkit-line-clamp: 2;
181
+ }
182
+
183
+ .codeList {
184
+ text-align: left !important;
185
+ font-size: 5pt !important;
186
+ }
187
+
188
+ /* Headings ruled inside: each stack fills the heading's height */
189
+
190
+ .splitStack,
191
+ .headerStack,
192
+ .codedStack,
193
+ .referralStack {
194
+ display: flex;
195
+ flex-direction: column;
196
+ height: $heading-h;
197
+ }
198
+
199
+ .splitHeader,
200
+ .testHeader {
201
+ padding: 0 !important;
202
+ }
203
+
204
+ .splitStack span {
205
+ display: flex;
206
+ flex: 1;
207
+ align-items: center;
208
+ justify-content: center;
209
+ padding: 0 0.5mm;
210
+ }
211
+
212
+ .splitStack span:first-child {
213
+ border-bottom: $rule;
214
+ }
215
+
216
+ .headerStack {
217
+ text-align: left;
218
+
219
+ span {
220
+ padding: 0.3mm 0.5mm;
221
+ border-bottom: $rule;
222
+ }
223
+
224
+ /* the kit, lot and expiry used on this page, written in */
225
+ em {
226
+ display: block;
227
+ overflow: hidden;
228
+ font-style: normal;
229
+ font-weight: 700;
230
+ text-overflow: ellipsis;
231
+ white-space: nowrap;
232
+ }
233
+
234
+ .testName {
235
+ flex: 1.3;
236
+ }
237
+
238
+ .kit {
239
+ flex: 1.6;
240
+ }
241
+
242
+ span:nth-child(3),
243
+ span:nth-child(4) {
244
+ flex: 1.1;
245
+ }
246
+
247
+ .codes {
248
+ flex: 0.7;
249
+ text-align: center;
250
+ border-bottom: none;
251
+ }
252
+ }
253
+
254
+ /* A client's HIV test: the result in full, then the kit, lot and expiry used,
255
+ wrapped to the column's width in small type. The box is a fixed height
256
+ within the client's two lines, so the wrapped text never stretches the row
257
+ and its split cells keep their proportions (the full line is also the cell's
258
+ tooltip). */
259
+ .testCell {
260
+ padding: 0 0.4mm !important;
261
+ text-align: left !important;
262
+ vertical-align: top !important;
263
+ white-space: normal !important;
264
+ }
265
+
266
+ .testBox {
267
+ /* 2px short of the client's two lines, so the ruled row heights alone set
268
+ the layout: a box of the full height plus the cell's borders made each row
269
+ a fraction taller, and drawn for the PDF, where borders round to whole
270
+ pixels, the rows drifted until the last ran past the foot of the frame */
271
+ height: calc(2 * #{$line-h} - 2px);
272
+ overflow: hidden;
273
+ line-height: 1;
274
+
275
+ strong {
276
+ display: block;
277
+ font-size: 5pt;
278
+ font-weight: 700;
279
+ }
280
+ }
281
+
282
+ .testDetail {
283
+ display: block;
284
+ font-size: 3.6pt;
285
+ /* three lines of it fit under the result within the box */
286
+ line-height: 0.92;
287
+ overflow-wrap: anywhere;
288
+ }
289
+
290
+ .codedStack {
291
+ justify-content: center;
292
+
293
+ span:first-child {
294
+ flex: 1;
295
+ display: flex;
296
+ align-items: center;
297
+ justify-content: center;
298
+ border-bottom: $dotted;
299
+ }
300
+
301
+ .codes {
302
+ flex: 0 0 5.5mm;
303
+ display: flex;
304
+ align-items: center;
305
+ justify-content: center;
306
+ }
307
+ }
308
+
309
+ .referralStack {
310
+ justify-content: space-evenly;
311
+ }
312
+
313
+ /* Summary blocks at the foot of the page, laid out as on the form */
314
+
315
+ .summary {
316
+ display: flex;
317
+ flex: 1;
318
+ align-items: stretch;
319
+ justify-content: space-between;
320
+ padding: 2mm 3mm 0 7mm;
321
+ font-weight: 700;
322
+ }
323
+
324
+ .summaryColumn {
325
+ display: flex;
326
+ flex-direction: column;
327
+ justify-content: space-between;
328
+ }
329
+
330
+ .summaryTable {
331
+ border-collapse: collapse;
332
+
333
+ th,
334
+ td {
335
+ height: 4.2mm;
336
+ padding: 0 1mm;
337
+ font-size: 7pt;
338
+ text-align: center;
339
+ white-space: nowrap;
340
+ border: $rule;
341
+ }
342
+
343
+ td {
344
+ min-width: 8mm;
345
+ font-weight: 400;
346
+ }
347
+
348
+ thead th {
349
+ background-color: $shade;
350
+ }
351
+ }
352
+
353
+ .titleCell {
354
+ text-align: left !important;
355
+ font-size: 7.5pt !important;
356
+ }
357
+
358
+ .rowLabel {
359
+ text-align: right !important;
360
+ }
361
+
362
+ .summaryTable tbody .rowLabel {
363
+ background-color: transparent;
364
+ }
365
+
366
+ /* the HIV test block shades its labels, as on the form */
367
+ .summaryColumn:last-child .rowLabel {
368
+ background-color: $shade;
369
+ }
370
+
371
+ .figureLabel {
372
+ min-width: 25mm;
373
+ text-align: right !important;
374
+ background-color: $shade;
375
+ }
376
+
377
+ .figure {
378
+ min-width: 13mm !important;
379
+ }
380
+
381
+ .figureBox {
382
+ th {
383
+ min-width: 22mm;
384
+ }
385
+
386
+ td {
387
+ height: 8.6mm;
388
+ font-size: 8pt;
389
+ }
390
+ }
391
+
392
+ .signOff {
393
+ display: flex;
394
+ justify-content: flex-end;
395
+ gap: 20mm;
396
+ padding: 1mm 12mm 1.2mm 0;
397
+ font-size: 6.5pt;
398
+ }
399
+
400
+ .rule {
401
+ display: inline-block;
402
+ width: 32mm;
403
+ border-bottom: $rule;
404
+ }
405
+
406
+ .pageFoot {
407
+ display: flex;
408
+ justify-content: space-between;
409
+ margin-top: auto;
410
+ padding-top: 1.5mm;
411
+ font-size: 7.5pt;
412
+ }
@@ -0,0 +1,215 @@
1
+ import React from 'react';
2
+
3
+ import { usePageScale } from '../../common/report-page';
4
+ import { clientName, formDate, text, type Moh362Row } from './moh-362.types';
5
+ import sheet from './moh-362-lab-register.scss';
6
+ import styles from './moh-362-linkage-register.scss';
7
+
8
+ interface Moh362LinkageRegisterProps {
9
+ rows: Moh362Row[];
10
+ }
11
+
12
+ /** Rows ruled on each page of the paper form */
13
+ const ROWS_PER_PAGE = 15;
14
+
15
+ /** A4 landscape less its 8mm margins: the page as drawn on screen, inside the report card */
16
+ const PAGE_WIDTH_MM = 297 - 2 * 8;
17
+
18
+ const COLUMN_IDS = 'abcdefghij'.split('');
19
+
20
+ /** Column widths, measured off page 6 of the form, as fractions of the sheet */
21
+ const COLUMN_WIDTHS = [82, 204, 271, 180, 134, 193, 286, 147, 134, 182];
22
+ const COLUMN_TOTAL = COLUMN_WIDTHS.reduce((sum, width) => sum + width, 0);
23
+
24
+ /** Columns split into an upper and a lower cell: (b), (d) and (g) */
25
+ const SPLIT_COLUMNS = new Set(['b', 'd', 'g']);
26
+
27
+ const paginate = (rows: Moh362Row[]) => {
28
+ const pages: Moh362Row[][] = [];
29
+ for (let start = 0; start < rows.length; start += ROWS_PER_PAGE) {
30
+ pages.push(rows.slice(start, start + ROWS_PER_PAGE));
31
+ }
32
+ return pages.length ? pages : [[]];
33
+ };
34
+
35
+ /** A heading holding two labels: upper cell over lower cell */
36
+ const SplitHeader: React.FC<{ upper: React.ReactNode; lower: React.ReactNode }> = ({ upper, lower }) => (
37
+ <th className={styles.splitHeader}>
38
+ <div className={styles.splitStack}>
39
+ <span>{upper}</span>
40
+ <span>{lower}</span>
41
+ </div>
42
+ </th>
43
+ );
44
+
45
+ /** One client: two ruled lines, columns (b), (d) and (g) split into upper and lower cells */
46
+ const ClientRows: React.FC<{ row?: Moh362Row; serial: number }> = ({ row, serial }) => {
47
+ if (!row) {
48
+ return (
49
+ <>
50
+ <tr className={styles.clientUpper}>
51
+ {COLUMN_IDS.map((id) =>
52
+ SPLIT_COLUMNS.has(id) ? <td key={id} className={sheet.upperCell} /> : <td key={id} rowSpan={2} />,
53
+ )}
54
+ </tr>
55
+ <tr className={styles.clientLower}>
56
+ {[...SPLIT_COLUMNS].map((id) => (
57
+ <td key={id} className={sheet.lowerCell} />
58
+ ))}
59
+ </tr>
60
+ </>
61
+ );
62
+ }
63
+
64
+ return (
65
+ <>
66
+ <tr className={styles.clientUpper}>
67
+ <td rowSpan={2}>{serial}</td>
68
+ <td className={sheet.upperCell}>{text(row.id_number)}</td>
69
+ <td rowSpan={2} className={sheet.left}>
70
+ <span className={sheet.clamp}>{clientName(row)}</span>
71
+ </td>
72
+ <td className={sheet.upperCell}>{text(row.telephone)}</td>
73
+ <td rowSpan={2}>{text(row.client_tested_as)}</td>
74
+ <td rowSpan={2} className={sheet.left}>
75
+ <span className={sheet.clamp}>{text(row.referral_to)}</span>
76
+ </td>
77
+ <td className={`${sheet.upperCell} ${sheet.left}`}>{text(row.handed_to)}</td>
78
+ <td rowSpan={2}>{formDate(row.art_start_date)}</td>
79
+ <td rowSpan={2}>{text(row.ccc_number)}</td>
80
+ <td rowSpan={2} className={sheet.left}>
81
+ <span className={sheet.clamp}>{text(row.screening_remarks)}</span>
82
+ </td>
83
+ </tr>
84
+ <tr className={styles.clientLower}>
85
+ <td className={sheet.lowerCell}>{text(row.nupi)}</td>
86
+ <td className={`${sheet.lowerCell} ${sheet.left}`}>{text(row.residence)}</td>
87
+ {/* the receiving health worker's cadre is not recorded */}
88
+ <td className={sheet.lowerCell} />
89
+ </tr>
90
+ </>
91
+ );
92
+ };
93
+
94
+ /**
95
+ * One A4 landscape page of the register: 15 ruled client rows, and on the last
96
+ * page the total of clients linked across the whole register, in one frame.
97
+ */
98
+ const LinkageRegisterPage: React.FC<{
99
+ rows: Moh362Row[];
100
+ firstSerial: number;
101
+ page: number;
102
+ pages: number;
103
+ scale: number;
104
+ /** clients linked in the whole register, given only to the last page */
105
+ totalLinked?: number;
106
+ }> = ({ rows, firstSerial, page, pages, scale, totalLinked }) => (
107
+ <section className={sheet.page} data-register-page style={{ '--page-zoom': scale } as React.CSSProperties}>
108
+ <div className={sheet.runningHead}>
109
+ <span>Ministry Of Health</span>
110
+ <span>MOH 362 HTS LAB, REFERRAL AND LINKAGE REGISTER</span>
111
+ <span>Ver. July 2023</span>
112
+ </div>
113
+ <h4 className={`${sheet.title} ${styles.title}`}>REFERRAL AND LINKAGE REGISTER</h4>
114
+
115
+ <div className={sheet.frame}>
116
+ <table className={`${sheet.register} ${styles.linkageTable}`}>
117
+ <colgroup>
118
+ {COLUMN_WIDTHS.map((width, index) => (
119
+ <col key={index} style={{ width: `${(width / COLUMN_TOTAL) * 100}%` }} />
120
+ ))}
121
+ </colgroup>
122
+ <thead>
123
+ <tr className={styles.headingRow}>
124
+ <th>
125
+ Serial
126
+ <br />
127
+ Number
128
+ </th>
129
+ <SplitHeader
130
+ upper="National Identification Number"
131
+ lower="National Unique Patient Identifier (NUPI) Number"
132
+ />
133
+ <th>Client Names</th>
134
+ <SplitHeader upper="Telephone Number" lower="Residence" />
135
+ <th>
136
+ Identification Strategy
137
+ <br />
138
+ <span className={styles.regular}>(VCT/IT/HIVST /SNS)</span>
139
+ </th>
140
+ <th>Patient referred to</th>
141
+ <th>
142
+ Handed over to:
143
+ <br />
144
+ <span className={styles.regular}>
145
+ (Indicate Name (upper cell)
146
+ <br />
147
+ and Cadre (lower cell)
148
+ </span>
149
+ </th>
150
+ <th>Date started on ART</th>
151
+ <th>CCC Number</th>
152
+ <th>Remarks</th>
153
+ </tr>
154
+ <tr className={styles.idRow}>
155
+ {COLUMN_IDS.map((id) => (
156
+ <th key={id}>({id})</th>
157
+ ))}
158
+ </tr>
159
+ </thead>
160
+ <tbody>
161
+ {Array.from({ length: ROWS_PER_PAGE }, (_, index) => (
162
+ <ClientRows key={index} row={rows[index]} serial={firstSerial + index} />
163
+ ))}
164
+ {totalLinked !== undefined && (
165
+ <tr className={styles.totalRow}>
166
+ <th colSpan={3} className={styles.totalLabel}>
167
+ Totals Clients Linked
168
+ </th>
169
+ <td colSpan={6} className={styles.totalFill} />
170
+ <td className={styles.totalFigure}>{totalLinked}</td>
171
+ </tr>
172
+ )}
173
+ </tbody>
174
+ </table>
175
+ </div>
176
+
177
+ <div className={sheet.pageFoot}>
178
+ <span>
179
+ Page {page} of {pages}
180
+ </span>
181
+ <span>Ver. July 2023</span>
182
+ </div>
183
+ </section>
184
+ );
185
+
186
+ /**
187
+ * REFERRAL AND LINKAGE REGISTER (Ver. July 2023), page 6 of the MOH 362 form,
188
+ * as A4 landscape pages: the clients who tested HIV positive and were linked to
189
+ * care (started on ART), columns (a) to (j), with the total linked at the foot
190
+ * of the last page.
191
+ */
192
+ const Moh362LinkageRegister: React.FC<Moh362LinkageRegisterProps> = ({ rows }) => {
193
+ const { ref, scale } = usePageScale<HTMLDivElement>(PAGE_WIDTH_MM);
194
+ const pages = paginate(rows);
195
+
196
+ return (
197
+ <div className={sheet.reportFrame}>
198
+ <div className={sheet.viewport} ref={ref}>
199
+ {pages.map((pageRows, index) => (
200
+ <LinkageRegisterPage
201
+ key={index}
202
+ rows={pageRows}
203
+ firstSerial={index * ROWS_PER_PAGE + 1}
204
+ page={index + 1}
205
+ pages={pages.length}
206
+ scale={scale}
207
+ totalLinked={index === pages.length - 1 ? rows.length : undefined}
208
+ />
209
+ ))}
210
+ </div>
211
+ </div>
212
+ );
213
+ };
214
+
215
+ export default Moh362LinkageRegister;
@@ -0,0 +1,91 @@
1
+ /* REFERRAL AND LINKAGE REGISTER as A4 landscape pages. The page, frame, ruled
2
+ table and split cells come from the lab register's sheet styles; these are
3
+ page 6's own measurements: a shorter heading in larger bold type, and taller
4
+ client rows, 15 to a page, with the total of clients linked on the last. */
5
+
6
+ $ink: #000;
7
+ $rule: 0.6pt solid $ink;
8
+ $thick: 1.4pt solid $ink;
9
+ $dotted: 0.6pt dotted $ink;
10
+ $shade: #f2f2f2; // the lower cells and the totals row
11
+
12
+ $heading-h: 21mm;
13
+ $ids-h: 5.2mm;
14
+ $line-h: 4.6mm; // half a client row: each client takes two lines
15
+ $total-h: 6.7mm;
16
+
17
+ /* the title is set in a serif on this page of the form */
18
+ .title {
19
+ font-family: Georgia, 'Times New Roman', serif;
20
+ font-size: 10pt;
21
+ line-height: 1.2;
22
+ }
23
+
24
+ .linkageTable .headingRow th {
25
+ height: $heading-h;
26
+ font-size: 7.5pt;
27
+ font-weight: 700;
28
+ }
29
+
30
+ /* the strategy and handed-over headings keep their codes in regular type */
31
+ .linkageTable .headingRow .regular {
32
+ font-weight: 400;
33
+ }
34
+
35
+ .linkageTable .idRow th {
36
+ height: $ids-h;
37
+ font-size: 8pt;
38
+ font-weight: 700;
39
+ border-top: $thick;
40
+ border-bottom: $thick;
41
+ }
42
+
43
+ .linkageTable .clientUpper td,
44
+ .linkageTable .clientLower td {
45
+ height: $line-h;
46
+ font-size: 7pt;
47
+ white-space: nowrap;
48
+ }
49
+
50
+ /* a heading holding two labels: upper cell over lower cell, split by a dotted rule */
51
+ .splitHeader {
52
+ padding: 0 !important;
53
+ }
54
+
55
+ .splitStack {
56
+ display: flex;
57
+ flex-direction: column;
58
+ height: $heading-h;
59
+
60
+ span {
61
+ display: flex;
62
+ flex: 1;
63
+ align-items: center;
64
+ justify-content: center;
65
+ padding: 0 0.5mm;
66
+ }
67
+
68
+ span:first-child {
69
+ border-bottom: $dotted;
70
+ }
71
+ }
72
+
73
+ .linkageTable .totalRow > * {
74
+ height: $total-h;
75
+ font-size: 7pt;
76
+ font-weight: 700;
77
+ border-top: $thick;
78
+ }
79
+
80
+ .totalLabel {
81
+ text-align: left !important;
82
+ }
83
+
84
+ .totalFill,
85
+ .totalFigure {
86
+ background-color: $shade;
87
+ }
88
+
89
+ .totalFigure {
90
+ font-size: 8pt !important;
91
+ }