@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,496 @@
1
+ @use '@carbon/layout';
2
+ @use '@openmrs/esm-styleguide/src/vars' as *;
3
+
4
+ /* A replica of the printed MOH 731 (Ver. July 2023) facility summary sheet,
5
+ laid out as a real A4 portrait page.
6
+
7
+ Everything is expressed in the units the document is drawn in -- millimetres
8
+ for geometry, points for type -- so the sheet occupies exactly one A4 page on
9
+ screen and prints at 1:1. */
10
+
11
+ $page-w: 210mm; // A4 portrait
12
+ $page-h: 297mm;
13
+ $page-margin: 8mm;
14
+
15
+ $ink: #000; // rules, borders and body text
16
+ $bar: #d9d9d9; // grey fill behind the numbered section bars
17
+ $rule: 1px solid $ink;
18
+ $dotted: 1px dotted $ink; // sub-block and column separators inside a section
19
+
20
+ /* Sized so the whole return fits one A4 page. The binding constraint is
21
+ height, not width: stacking the tallest column of each section plus the
22
+ masthead comes to 271mm of the 281mm available at a 2.7mm row. */
23
+
24
+ $text: 5.5pt; // body size for labels and codes
25
+ $title: 8pt; // masthead only
26
+ $caption: 4.5pt; // "Male" / "Female" column captions
27
+
28
+ $box-w: 8.5mm; // every value box
29
+ $box-h: 2.5mm; // a little taller than the label line, as on the form
30
+ $row-h: 2.7mm; // one indicator row: the box plus hairline clearance
31
+
32
+ $pad: 1.5mm; // padding inside columns and the sheet's bands
33
+ $gap: 0.8mm; // between a code and its box
34
+ $block-gap: 1mm; // above a sub-block heading
35
+ $label-gap: 4mm; // between a row label and its first code
36
+
37
+ /* Width of the label column. Fixed rather than content-sized so that every
38
+ block within a column lines its codes and boxes up at the same offset, as
39
+ the form does -- the blocks are separate tables, so left to size themselves
40
+ each one lands somewhere slightly different. Overridden per column in
41
+ section 3, whose columns are narrower. */
42
+ $label-w: 36mm;
43
+ $section-gap: 0.8mm; // around a divider
44
+
45
+ /* Form / Summary tabs, between the filters and the panels */
46
+ .tabList {
47
+ margin-top: layout.$spacing-05;
48
+ }
49
+
50
+ /* Each tab's panel brings its own spacing: both sit in the report card */
51
+ .formPanel,
52
+ .summaryPanel {
53
+ padding: 0;
54
+ }
55
+
56
+ /* The card the sheet sits in, drawn like the filter card above it (same rule
57
+ and fill) so the report reads as the second panel of one page.
58
+ It wraps `.viewport` rather than styling it: the page is scaled to the
59
+ viewport's width, so padding there would push the sheet into a scrollbar. */
60
+ .reportFrame {
61
+ /* clear of the foot of the page when scrolled to the end */
62
+ margin: layout.$spacing-05 0 layout.$spacing-07;
63
+ padding: layout.$spacing-05;
64
+ background-color: $ui-02;
65
+ border: 1px solid $ui-03;
66
+ }
67
+
68
+ /* Holds the fixed-width page without making the app scroll sideways.
69
+
70
+ No padding of its own: vertical padding here is dead space, and horizontal
71
+ padding would eat into the width the page needs and bring on a scrollbar that
72
+ is not otherwise required. The left and right gutter comes from `.page` in
73
+ root.scss, which every route already sits inside. */
74
+
75
+ .viewport {
76
+ overflow-x: auto;
77
+ }
78
+
79
+ /* On screen the sheet sits inside `.reportFrame`, whose padding is the margin:
80
+ drawn as a separate shadowed page with its own 8mm margins, it sat further
81
+ in from the card's edge than any other panel's content does. So the screen
82
+ sheet is the printable area only -- A4 less its margins, which `@page` puts
83
+ back for print -- and `usePageScale` is told that width. */
84
+ .form {
85
+ box-sizing: border-box;
86
+ width: $page-w - 2 * $page-margin;
87
+ margin: 0 auto;
88
+ color: $ink;
89
+ font-size: $text;
90
+ line-height: 1.15;
91
+ background-color: #fff;
92
+ /* Set by `usePageScale` from the measured container width, floored at 1 so
93
+ the sheet is never drawn smaller than the paper. Reset to 1 for print. */
94
+ zoom: var(--page-zoom, 1);
95
+ }
96
+
97
+ /* Ministry line, above the ruled sheet */
98
+
99
+ .ministryLine {
100
+ display: flex;
101
+ justify-content: space-between;
102
+ margin-bottom: $pad;
103
+ font-weight: 700;
104
+ font-size: $text;
105
+ }
106
+
107
+ /* The ruled sheet itself */
108
+
109
+ .sheet {
110
+ border: $rule;
111
+ }
112
+
113
+ /* Masthead */
114
+
115
+ /* The title is centred on the full width of the sheet, not on the space left
116
+ over beside the version box. The version box is taken out of flow so it
117
+ cannot push the title off centre. */
118
+
119
+ .formHeader {
120
+ position: relative;
121
+ padding: $pad;
122
+ border-bottom: $rule;
123
+ }
124
+
125
+ .formTitle {
126
+ text-align: center;
127
+
128
+ strong {
129
+ display: block;
130
+ font-size: $title;
131
+ font-weight: 700;
132
+ }
133
+ }
134
+
135
+ .formVersion {
136
+ position: absolute;
137
+ top: $pad;
138
+ right: $pad;
139
+ padding: 0.5mm 1mm;
140
+ font-size: $text;
141
+ border: $dotted;
142
+ white-space: nowrap;
143
+ }
144
+
145
+ /* County / Sub County / Facility fill-in line */
146
+
147
+ .locationContainer {
148
+ display: flex;
149
+ flex-wrap: nowrap;
150
+ align-items: baseline;
151
+ justify-content: center;
152
+ gap: 2.5mm;
153
+ padding: $pad;
154
+ font-size: $text;
155
+ white-space: nowrap;
156
+ border-bottom: $rule;
157
+ }
158
+
159
+ /* These carry the facility and period once a report is generated, so they need
160
+ to hold text on the rule rather than just draw it. */
161
+
162
+ .line,
163
+ .shortLine {
164
+ display: inline-block;
165
+ padding: 0 1mm;
166
+ margin-left: 1mm;
167
+ overflow: hidden;
168
+ font-weight: 600;
169
+ text-align: center;
170
+ text-overflow: ellipsis;
171
+ white-space: nowrap;
172
+ vertical-align: bottom;
173
+ border-bottom: $rule;
174
+ }
175
+
176
+ .line {
177
+ width: 27mm;
178
+ }
179
+
180
+ .shortLine {
181
+ width: 12mm;
182
+ }
183
+
184
+ /* Numbered section bar, full width of the sheet. `text-align` is stated rather
185
+ than left to inherit: CSS Modules does not scope bare element selectors, and
186
+ other report stylesheets ship a global `h5 { text-align: center }`. */
187
+
188
+ .sectionHeader {
189
+ padding: 0.8mm $pad;
190
+ text-align: left;
191
+ font-size: $text;
192
+ font-weight: 700;
193
+ background-color: $bar;
194
+ border-bottom: $rule;
195
+ }
196
+
197
+ /* The same bar, but scoped to one column -- sections 4 and 5 sit inside the
198
+ right-hand column of section 3 on the printed form. */
199
+
200
+ .columnHeader {
201
+ padding: 0.8mm $pad;
202
+ text-align: left;
203
+ margin: $block-gap (-$pad) $pad;
204
+ font-size: $text;
205
+ font-weight: 700;
206
+ background-color: $bar;
207
+ border-top: $rule;
208
+ border-bottom: $rule;
209
+ }
210
+
211
+ /* Column grid inside a section */
212
+
213
+ .flexRow {
214
+ display: flex;
215
+ align-items: stretch;
216
+ border-bottom: $rule;
217
+
218
+ /* the sheet's own border closes the last section; a second rule there
219
+ doubles the line */
220
+ &:last-child {
221
+ border-bottom: none;
222
+ }
223
+ }
224
+
225
+ .flexColumn {
226
+ flex: 1 1 0;
227
+ min-width: 0;
228
+ padding: $pad;
229
+ }
230
+
231
+ /* No rule between columns by default: on the form only section 3 divides its
232
+ columns, and it does so with a dotted line (see `.borderRight` below). */
233
+
234
+ /* Section 3 only: columns 1 and 2 are grouped so the sign-off can run along
235
+ their foot while section 5 continues in column 3 beside it. */
236
+
237
+ /* Section 3's columns are not equal thirds on the form. Column 1 carries a
238
+ male and a female value on every row, so it takes 45% of the width, against
239
+ 26% and 29% for the single-value columns beside it. Splitting evenly left
240
+ column 1 about 21mm short, which forced its labels to wrap. */
241
+
242
+ .colGroup {
243
+ display: flex;
244
+ flex: 71 1 0; // columns 1 and 2 together
245
+ flex-direction: column;
246
+ min-width: 0;
247
+ }
248
+
249
+ .colPair > .borderRight {
250
+ flex: 63 1 0; // column 1, of the pair
251
+ --label-w: 24mm;
252
+ }
253
+
254
+ .colPair > .flexColumn:last-child {
255
+ flex: 37 1 0; // column 2
256
+ --label-w: 25mm;
257
+ }
258
+
259
+ .flexRow > .borderLeft {
260
+ flex: 29 1 0; // column 3
261
+ --label-w: 30mm;
262
+ }
263
+
264
+ .colPair {
265
+ display: flex;
266
+ flex: 1 1 auto;
267
+ align-items: stretch;
268
+ min-width: 0;
269
+ /* clearance between the last indicator rows and the sign-off rule below */
270
+ padding-bottom: 1.5mm;
271
+ }
272
+
273
+
274
+
275
+ /* Section 3's column separators, dotted as on the form */
276
+
277
+ .borderRight {
278
+ padding: $pad;
279
+ border-right: $dotted;
280
+ }
281
+
282
+ .borderLeft {
283
+ padding: $pad;
284
+ border-left: $dotted;
285
+ }
286
+
287
+ /* Indicator rows.
288
+
289
+ Measured off the form: each section splits into two equal 90mm halves, and a
290
+ block occupies only about 70mm of its half, left aligned, leaving ~15mm of
291
+ trailing slack. That slack is what reads as the gap between column 1 and
292
+ column 2 -- there is no gutter between them. So the table is sized to its
293
+ content rather than stretched: stretching pushed the value boxes onto the
294
+ column boundary and closed the gap up.
295
+
296
+ Auto layout, not fixed: `.textBox` is `nowrap` (a code must never be split
297
+ from its box) so it has a hard minimum width, and a fixed layout would hand
298
+ out narrower columns and push the pair outside the section rule. */
299
+
300
+ .block {
301
+ width: auto;
302
+ max-width: 100%;
303
+ border-collapse: collapse;
304
+ table-layout: auto;
305
+
306
+ td {
307
+ height: $row-h;
308
+ padding: 0.1mm 0.8mm 0.1mm 0;
309
+ font-size: $text;
310
+ vertical-align: middle;
311
+ }
312
+
313
+ /* Fixed width so codes and boxes align across every block in the column */
314
+ td:first-child:not([colspan]) {
315
+ box-sizing: border-box;
316
+ width: var(--label-w, #{$label-w});
317
+ padding-right: $label-gap;
318
+ overflow-wrap: anywhere;
319
+ }
320
+ }
321
+
322
+ /* Sub-block heading, e.g. "1.1 HIV Tests". Flush with the column's left edge,
323
+ in line with the row labels beneath it. */
324
+
325
+ .blockTitle {
326
+ padding-top: $block-gap;
327
+ padding-bottom: 0.6mm;
328
+ padding-left: 0;
329
+ font-size: $text;
330
+ font-weight: 700;
331
+ }
332
+
333
+ /* A heading within a block, e.g. "Below 6 months" */
334
+
335
+ .groupTitle {
336
+ padding-top: 1mm;
337
+ padding-left: 0;
338
+ font-size: $text;
339
+ font-weight: 700;
340
+ }
341
+
342
+ /* "Male" / "Female (including PMTCT)" column captions */
343
+
344
+ .subTitle {
345
+ padding-bottom: 0.5mm;
346
+ font-size: $caption;
347
+ font-weight: 400;
348
+ text-align: center;
349
+ vertical-align: bottom;
350
+ }
351
+
352
+ /* The separator between sub-blocks: one dotted rule across the column, so every
353
+ separator in a section is the same length. */
354
+
355
+ .divider {
356
+ height: 0;
357
+ margin: $section-gap 0;
358
+ border: none;
359
+ border-top: $dotted;
360
+ }
361
+
362
+ .spaceAfter {
363
+ padding-right: 2mm;
364
+ }
365
+
366
+ .emptyColumn {
367
+ width: auto;
368
+ }
369
+
370
+ /* Code plus its value box */
371
+
372
+ .textBox,
373
+ .textBox2 {
374
+ display: flex;
375
+ align-items: center;
376
+ justify-content: flex-end;
377
+ gap: $gap;
378
+ white-space: nowrap;
379
+ }
380
+
381
+ .textBox span {
382
+ font-size: $text;
383
+ font-variant-numeric: tabular-nums;
384
+ }
385
+
386
+ .rectangle {
387
+ display: inline-flex;
388
+ align-items: center;
389
+ justify-content: center;
390
+ flex-shrink: 0;
391
+ box-sizing: border-box;
392
+ width: $box-w;
393
+ height: $box-h;
394
+ font-size: $text;
395
+ font-variant-numeric: tabular-nums;
396
+ background-color: #fff;
397
+ border: $rule;
398
+ }
399
+
400
+ /* Only the boxes wired to a register drill-down carry the hover text, so the
401
+ attribute doubles as the selector: a box with no linelist behind it must not
402
+ offer a pointer cursor it cannot honour. */
403
+
404
+ .rectangle[title]:hover {
405
+ background-color: $brand-primary-10;
406
+ border-color: var(--brand-01);
407
+ cursor: pointer;
408
+ }
409
+
410
+ /* Sign-off strip along the foot of the sheet */
411
+
412
+ .reviewSection {
413
+ display: grid;
414
+ grid-template-columns: 22mm repeat(4, 1fr);
415
+ align-items: end;
416
+ column-gap: 4mm;
417
+ /* the form leaves about 1.7mm clear between a label and its rule */
418
+ row-gap: 1.5mm;
419
+ /* pushed to the foot of the grouped columns, clear of the rows above */
420
+ margin-top: auto;
421
+ padding: 1.5mm $pad 1mm;
422
+ font-size: $text;
423
+ /* full-width rule across columns 1 and 2, as on the form */
424
+ border-top: $rule;
425
+
426
+ span {
427
+ text-align: center;
428
+ }
429
+ }
430
+
431
+ .reviewLabel {
432
+ text-align: left;
433
+ }
434
+
435
+ /* A fixed height keeps the prefilled cells (name, date) on the same baseline as
436
+ the blank ones (designation, signature), which have no content to give them
437
+ height. */
438
+
439
+ .reviewRule {
440
+ min-height: $row-h;
441
+ padding-bottom: 0.3mm;
442
+ text-align: center;
443
+ border-bottom: $rule;
444
+ }
445
+
446
+ /* No responsive reflow: this is a replica of a fixed A4 sheet, so on a narrow
447
+ screen the page keeps its proportions and scrolls inside `.viewport` rather
448
+ than restacking into something the printed form does not do. */
449
+
450
+ @media print {
451
+ @page {
452
+ size: A4 portrait;
453
+ margin: $page-margin;
454
+ }
455
+
456
+ /* The app chrome is hidden by `.page` in root.scss; this only needs to undo
457
+ the on-screen scroll container. */
458
+
459
+ .viewport {
460
+ overflow: visible;
461
+ }
462
+
463
+ /* Download PDF prints the form whichever tab is open */
464
+ .tabList,
465
+ .summaryPanel {
466
+ display: none !important;
467
+ }
468
+
469
+ .formPanel[hidden] {
470
+ display: block !important;
471
+ }
472
+
473
+ /* the card is screen chrome; the printout is the bare sheet */
474
+ .reportFrame {
475
+ margin: 0;
476
+ padding: 0;
477
+ background: none;
478
+ border: none;
479
+ }
480
+
481
+ .form {
482
+ width: auto;
483
+ min-height: 0;
484
+ padding: 0;
485
+ margin: 0;
486
+ box-shadow: none;
487
+ /* paper geometry stands on its own; magnification is for screens */
488
+ zoom: 1;
489
+ }
490
+
491
+ .flexRow,
492
+ .reviewSection {
493
+ break-inside: avoid;
494
+ page-break-inside: avoid;
495
+ }
496
+ }
@@ -0,0 +1,38 @@
1
+ import { ageBandColumns, type RegisterColumn } from '../../../common/report-register';
2
+
3
+ const tbColumn = (heading: string, field: string, under15: boolean): RegisterColumn => ({
4
+ header: `${heading} ${under15 ? '< 15 yrs' : '15+ yrs'}`,
5
+ value: (row) => ((under15 ? row.age < 15 : row.age >= 15) ? (row.started_on_art === 'Y' ? row[field] : 'NA') : ''),
6
+ });
7
+
8
+ /**
9
+ * The columns the MOH 366 register prints, in order.
10
+ *
11
+ * Kept beside the table it mirrors: most cells are not fields but a
12
+ * presentation of them -- an age band crossed with a gender -- so an export
13
+ * that listed the raw response would not line up with the printed register at
14
+ * all.
15
+ */
16
+ export const moh366Columns: RegisterColumn[] = [
17
+ { header: 'No', value: (_row, index) => index + 1 },
18
+ { header: 'Date', value: (row) => (row.date ? new Date(row.date).toLocaleDateString('en-GB') : '') },
19
+ { header: 'AMRSID', value: (row) => row.amrsID },
20
+ { header: 'National Identification Number', value: (row) => row.national_id_number },
21
+ { header: 'Client CCC Number', value: (row) => row.ccc_number?.replace('-', '') },
22
+ { header: 'Age', value: (row) => row.age },
23
+
24
+ ...ageBandColumns('Starting ART', (row) => (row.started_on_art === 'Y' ? 'Y' : '')),
25
+
26
+ tbColumn('Screened for TB', 'screened_for_tb', true),
27
+ tbColumn('Screened for TB', 'screened_for_tb', false),
28
+ tbColumn('Started TPT', 'started_on_tpt', true),
29
+ tbColumn('Started TPT', 'started_on_tpt', false),
30
+
31
+ ...ageBandColumns('Currently on ART', (row) =>
32
+ row.revisit ? row.revisit : row.current_on_art > 0 ? row.current_on_art : 1,
33
+ ),
34
+
35
+ { header: 'DSD Status', value: (row) => row.dsd_status },
36
+ { header: 'DSD Type', value: (row) => row.dsd_type },
37
+ { header: 'Remarks', value: (row) => row.remarks },
38
+ ];