@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.
- package/dist/0.css +1 -0
- package/dist/0.css.map +1 -0
- package/dist/0.js +1 -0
- package/dist/0.js.map +1 -0
- package/dist/197.js +1 -1
- package/dist/282.js +1 -1
- package/dist/282.js.map +1 -1
- package/dist/295.css +1 -0
- package/dist/295.css.map +1 -0
- package/dist/295.js +1 -0
- package/dist/295.js.map +1 -0
- package/dist/299.js +2 -0
- package/dist/299.js.LICENSE.txt +3 -0
- package/dist/299.js.map +1 -0
- package/dist/300.js +1 -1
- package/dist/311.js +1 -1
- package/dist/311.js.map +1 -1
- package/dist/335.js +1 -1
- package/dist/353.js +1 -1
- package/dist/353.js.map +1 -1
- package/dist/354.js +2 -0
- package/dist/354.js.LICENSE.txt +20 -0
- package/dist/354.js.map +1 -0
- package/dist/410.js +1 -0
- package/dist/410.js.map +1 -0
- package/dist/457.js +2 -0
- package/dist/457.js.LICENSE.txt +261 -0
- package/dist/457.js.map +1 -0
- package/dist/478.js +1 -1
- package/dist/478.js.map +1 -1
- package/dist/480.js +1 -0
- package/dist/540.js +1 -1
- package/dist/540.js.map +1 -1
- package/dist/55.js +1 -1
- package/dist/600.js +2 -0
- package/dist/600.js.LICENSE.txt +35 -0
- package/dist/600.js.map +1 -0
- package/dist/652.js +1 -1
- package/dist/757.js +1 -0
- package/dist/757.js.map +1 -0
- package/dist/781.js +1 -0
- package/dist/781.js.map +1 -0
- package/dist/961.js +1 -1
- package/dist/961.js.map +1 -1
- package/dist/99.js +1 -1
- package/dist/99.js.map +1 -0
- package/dist/ampath-esm-reports-app.js +1 -1
- package/dist/ampath-esm-reports-app.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +4 -2
- package/src/common/daily-summary-table.tsx +55 -0
- package/src/common/linelist-table/index.ts +3 -0
- package/src/common/linelist-table/linelist-columns.ts +48 -0
- package/src/common/linelist-table/linelist-table.component.tsx +442 -0
- package/src/common/linelist-table/linelist-table.scss +306 -0
- package/src/common/linelist-table/linelist-table.test.tsx +120 -0
- package/src/common/linelist-table/use-all-rows.ts +93 -0
- package/src/common/linelist-table/use-column-layout.ts +123 -0
- package/src/common/report-error/index.ts +1 -0
- package/src/common/report-error/show-report-error.ts +25 -0
- package/src/common/report-filters/date-range.ts +137 -0
- package/src/common/report-filters/index.ts +4 -0
- package/src/common/report-filters/report-filters.component.tsx +317 -99
- package/src/common/report-filters/report-filters.scss +264 -32
- package/src/common/report-filters/types.ts +79 -0
- package/src/common/report-filters/use-restore-period.ts +43 -0
- package/src/common/report-header/index.ts +1 -0
- package/src/common/report-header/use-location-details.ts +58 -0
- package/src/common/report-page/download-sheet-pdf.ts +225 -0
- package/src/common/report-page/index.ts +3 -0
- package/src/common/report-page/report-page.component.tsx +32 -0
- package/src/common/report-page/report-page.scss +45 -0
- package/src/common/report-page/use-page-scale.ts +60 -0
- package/src/common/report-placeholder/has-report-data.ts +15 -0
- package/src/common/report-placeholder/index.ts +3 -0
- package/src/common/report-placeholder/report-placeholder.component.tsx +81 -0
- package/src/common/report-placeholder/report-placeholder.scss +48 -0
- package/src/common/report-placeholder/use-generated-location.ts +62 -0
- package/src/common/report-register/index.ts +6 -0
- package/src/common/report-register/register-columns.ts +46 -0
- package/src/common/report-register/register-layout.component.tsx +265 -0
- package/src/common/report-register/register-layout.scss +150 -0
- package/src/common/report-register/register-table.scss +71 -0
- package/src/common/report-register/report-parents.ts +29 -0
- package/src/common/report-register/rows-to-csv.ts +89 -0
- package/src/common/report-register/use-location-name.ts +54 -0
- package/src/common/report-register/use-patient-list.ts +92 -0
- package/src/common/report-skeleton/index.ts +1 -0
- package/src/common/report-skeleton/report-skeleton.component.tsx +46 -0
- package/src/common/report-skeleton/report-skeleton.scss +29 -0
- package/src/config-schema.ts +9 -1
- package/src/dashboard/report-catalog.ts +191 -0
- package/src/dashboard/reports-dasboard.tsx +189 -18
- package/src/dashboard/reports-dashboard.module.scss +357 -14
- package/src/index.ts +13 -1
- package/src/registers/moh-240/moh-240-register.scss +41 -0
- package/src/registers/moh-240/moh-240.component.test.tsx +166 -0
- package/src/registers/moh-240/moh-240.component.tsx +164 -0
- package/src/registers/moh-267/moh-267-register.component.tsx +407 -0
- package/src/registers/moh-267/moh-267-register.scss +298 -0
- package/src/registers/moh-267/moh-267-summary.ts +102 -0
- package/src/registers/moh-267/moh-267.component.tsx +94 -0
- package/src/registers/moh-267/moh-267.types.ts +47 -0
- package/src/registers/moh-362/moh-362-lab-register.component.tsx +551 -0
- package/src/registers/moh-362/moh-362-lab-register.scss +412 -0
- package/src/registers/moh-362/moh-362-linkage-register.component.tsx +215 -0
- package/src/registers/moh-362/moh-362-linkage-register.scss +91 -0
- package/src/registers/moh-362/moh-362.component.tsx +117 -0
- package/src/registers/moh-362/moh-362.scss +11 -0
- package/src/registers/moh-362/moh-362.types.ts +87 -0
- package/src/registers/presumptive-tb/presumptive-tb-register.component.tsx +391 -0
- package/src/registers/presumptive-tb/presumptive-tb-register.scss +262 -0
- package/src/registers/presumptive-tb/presumptive-tb.component.tsx +92 -0
- package/src/registers/presumptive-tb/presumptive-tb.types.ts +88 -0
- package/src/registers/register-catalog.ts +202 -0
- package/src/registers/register-file-name.ts +18 -0
- package/src/registers/tb-lab-register/tb-lab-register-table.component.tsx +116 -0
- package/src/registers/tb-lab-register/tb-lab-register-table.scss +123 -0
- package/src/registers/tb-lab-register/tb-lab-register.columns.ts +164 -0
- package/src/registers/tb-lab-register/tb-lab-register.component.test.tsx +232 -0
- package/src/registers/tb-lab-register/tb-lab-register.component.tsx +153 -0
- package/src/registers/tb4/tb4-parts.tsx +164 -0
- package/src/registers/tb4/tb4-patient-sheet.component.tsx +418 -0
- package/src/registers/tb4/tb4-register.scss +282 -0
- package/src/registers/tb4/tb4-treatment-sheet.component.tsx +349 -0
- package/src/registers/tb4/tb4.component.tsx +120 -0
- package/src/registers/tb4/tb4.types.ts +129 -0
- package/src/reports/acf-summary/acf-summary-form.component.tsx +176 -0
- package/src/reports/acf-summary/acf-summary-linelist.component.tsx +86 -0
- package/src/reports/acf-summary/acf-summary.component.tsx +97 -0
- package/src/reports/acf-summary/acf-summary.counts.ts +37 -0
- package/src/reports/acf-summary/acf-summary.scss +162 -0
- package/src/reports/datatable-wrapper/datatable-wrapper.component.tsx +63 -48
- package/src/reports/moh-240/moh-240-header.component.tsx +62 -0
- package/src/reports/moh-240/moh-240.columns.ts +113 -0
- package/src/reports/moh-240/moh-240.component.tsx +72 -9
- package/src/reports/moh-240/moh-240.scss +40 -0
- package/src/reports/moh-240/sub-reports/moh-240-register.component.tsx +31 -37
- package/src/reports/moh-240/sub-reports/page-summary.component.tsx +143 -106
- package/src/reports/moh-505/moh-505-header.component.tsx +67 -0
- package/src/reports/moh-505/moh-505.component.tsx +441 -0
- package/src/reports/moh-505/moh-505.scss +117 -0
- package/src/reports/moh-705B/moh-204b-register.component.tsx +246 -0
- package/src/reports/moh-705B/moh-204b.columns.ts +39 -0
- package/src/reports/moh-705B/moh-705b.component.tsx +659 -0
- package/src/reports/moh-705B/moh-705b.scss +172 -0
- package/src/reports/moh-705a/moh-705a.component.tsx +661 -0
- package/src/reports/moh-705a/moh-705a.scss +172 -0
- package/src/reports/moh-705a/registers/moh-204a-register.component.tsx +331 -0
- package/src/reports/moh-705a/registers/moh-204a.columns.ts +57 -0
- package/src/reports/moh-705a/type.ts +6 -0
- package/src/reports/moh-706/moh-706-header.component.tsx +66 -0
- package/src/reports/moh-706/moh-706.component.tsx +150 -24
- package/src/reports/moh-706/moh-706.scss +119 -11
- package/src/reports/moh-706/sub-reports/bacteriology/bacteriology.component.tsx +35 -28
- package/src/reports/moh-706/sub-reports/blood-chemistry/blood-chemistry.component.tsx +229 -305
- package/src/reports/moh-706/sub-reports/haematology/haematology.component.tsx +26 -19
- package/src/reports/moh-706/sub-reports/histology-and-cytology/histology-and-cytology.component.tsx +23 -23
- package/src/reports/moh-706/sub-reports/parasitology/parasitology.component.tsx +25 -18
- package/src/reports/moh-706/sub-reports/serology/serology.component.tsx +21 -14
- package/src/reports/moh-706/sub-reports/specimen-referral-to-higher-levels/specimen-referral-to-higher-levels.component.tsx +2 -2
- package/src/reports/moh-706/sub-reports/urine-analysis/urine-analysis.component.tsx +27 -20
- package/src/reports/moh-710/moh-710.component.tsx +815 -632
- package/src/reports/moh-710/moh-710.scss +142 -21
- package/src/reports/moh-710/registers/moh-413/moh-413-columns.ts +22 -0
- package/src/reports/moh-710/registers/moh-413/moh-413.component.tsx +140 -0
- package/src/reports/moh-710/registers/moh-413/moh-413.scss +64 -0
- package/src/reports/moh-710/registers/moh-510/moh-510.columns.ts +40 -0
- package/src/reports/moh-710/registers/moh-510/moh-510.component.tsx +191 -0
- package/src/reports/moh-710/registers/moh-510/moh-510.scss +130 -0
- package/src/reports/moh-710/registers/moh-511-710-register.component.tsx +268 -0
- package/src/reports/moh-710/registers/moh-511-710.columns.ts +52 -0
- package/src/reports/moh-710/registers/type.ts +31 -0
- package/src/reports/moh-711/moh-711.component.tsx +153 -1269
- package/src/reports/moh-711/moh711.scss +135 -20
- package/src/reports/moh-711/registers/moh-333-register.component.tsx +680 -0
- package/src/reports/moh-711/registers/moh-333.columns.ts +119 -0
- package/src/reports/moh-711/registers/moh-405-register.component.tsx +566 -0
- package/src/reports/moh-711/registers/moh-405.columns.ts +120 -0
- package/src/reports/moh-711/registers/moh-406-register.component.tsx +581 -0
- package/src/reports/moh-711/registers/moh-406.columns.ts +133 -0
- package/src/reports/moh-711/registers/moh-407-register.component.tsx +157 -0
- package/src/reports/moh-711/registers/moh-407.columns.ts +24 -0
- package/src/reports/moh-711/registers/moh-407.scss +64 -0
- package/src/reports/moh-711/registers/moh-510-register.component.tsx +55 -0
- package/src/reports/moh-711/registers/moh-511-register.component.tsx +270 -0
- package/src/reports/moh-711/registers/moh-511.columns.ts +59 -0
- package/src/reports/moh-711/registers/moh-512-columns.ts +94 -0
- package/src/reports/moh-711/registers/moh-512.component.tsx +191 -0
- package/src/reports/moh-711/registers/moh-512.scss +64 -0
- package/src/reports/moh-711/registers/tb-register-columns.ts +17 -0
- package/src/reports/moh-711/registers/tb-register.component.tsx +96 -0
- package/src/reports/moh-711/registers/tb-register.scss +64 -0
- package/src/reports/moh-711/registers/type.ts +192 -0
- package/src/reports/moh-711/sections/anc.component.tsx +159 -0
- package/src/reports/moh-711/sections/cervical-cancer.component.tsx +148 -0
- package/src/reports/moh-711/sections/chanis.component.tsx +389 -0
- package/src/reports/moh-711/sections/family-planning.component.tsx +299 -0
- package/src/reports/moh-711/sections/gbv.component.tsx +115 -0
- package/src/reports/moh-711/sections/maternity.component.tsx +321 -0
- package/src/reports/moh-711/sections/medical-social-work.component.tsx +73 -0
- package/src/reports/moh-711/sections/other.component.tsx +47 -0
- package/src/reports/moh-711/sections/physiotherapy.component.tsx +61 -0
- package/src/reports/moh-711/sections/pnc.component.tsx +127 -0
- package/src/reports/moh-711/sections/post-abortion.component.tsx +42 -0
- package/src/reports/moh-711/sections/rehabilitation.component.tsx +57 -0
- package/src/reports/moh-711/sections/report-compiled-by.component.tsx +50 -0
- package/src/reports/moh-711/sections/tb-screening.component.tsx +94 -0
- package/src/reports/moh-717/moh-717.component.tsx +149 -985
- package/src/reports/moh-717/moh717.scss +217 -21
- package/src/reports/moh-717/registers/nutrition-register.component.tsx +48 -0
- package/src/reports/moh-717/sections/finance.component.tsx +42 -0
- package/src/reports/moh-717/sections/inpatient.component.tsx +374 -0
- package/src/reports/moh-717/sections/maternity.component.tsx +126 -0
- package/src/reports/moh-717/sections/medical-records.component.tsx +35 -0
- package/src/reports/moh-717/sections/mortuary.component.tsx +43 -0
- package/src/reports/moh-717/sections/operations.component.tsx +53 -0
- package/src/reports/moh-717/sections/orthopaedic-trauma.component.tsx +98 -0
- package/src/reports/moh-717/sections/outpatient.component.tsx +597 -0
- package/src/reports/moh-717/sections/pharmacy.component.tsx +43 -0
- package/src/reports/moh-717/sections/preparedby.component.tsx +52 -0
- package/src/reports/moh-717/sections/special-services.component.tsx +114 -0
- package/src/reports/moh-729b/moh-729b-form.component.tsx +385 -0
- package/src/reports/moh-729b/moh-729b-linelist.component.tsx +205 -0
- package/src/reports/moh-729b/moh-729b-summary.component.tsx +258 -0
- package/src/reports/moh-729b/moh-729b-summary.config.ts +229 -0
- package/src/reports/moh-729b/moh-729b.component.tsx +157 -0
- package/src/reports/moh-729b/moh-729b.config.ts +235 -0
- package/src/reports/moh-729b/moh-729b.scss +276 -0
- package/src/reports/moh-729b/moh-729b.types.ts +111 -0
- package/src/reports/moh-731/linelist/moh-731-indicators.ts +1122 -0
- package/src/reports/moh-731/linelist/moh-731-linelist-sections.ts +472 -0
- package/src/reports/moh-731/linelist/moh-731-linelist.component.tsx +102 -0
- package/src/reports/moh-731/linelist/use-open-moh-731-linelist.ts +50 -0
- package/src/reports/moh-731/moh-731.component.tsx +269 -0
- package/src/reports/moh-731/moh-731.scss +496 -0
- package/src/reports/moh-731/registers/moh-366.columns.ts +38 -0
- package/src/reports/moh-731/registers/moh-366.component.tsx +471 -0
- package/src/reports/moh-731/registers/prep-register.component.tsx +284 -0
- package/src/reports/moh-731/registers/prep.columns.ts +34 -0
- package/src/reports/moh-731/sections/hiv-and-tb-treatment.component.tsx +1206 -0
- package/src/reports/moh-731/sections/hiv-testing-and-pre-exposure.component.tsx +727 -0
- package/src/reports/moh-731/sections/pmtct.component.tsx +572 -0
- package/src/reports/moh-731/summary/moh-731-summary.component.tsx +313 -0
- package/src/reports/moh-731/summary/moh-731-summary.config.ts +527 -0
- package/src/reports/moh-731/summary/moh-731-summary.scss +247 -0
- package/src/reports/moh-740/moh-740.component.scss +202 -0
- package/src/reports/moh-740/moh-740.component.tsx +1332 -0
- package/src/reports/moh-740/moh-740.resource.ts +54 -0
- package/src/reports/moh-740/registers/moh-222-daily-register/moh-222-daily-register.tsx +149 -0
- package/src/reports/moh-740/registers/moh-270-permanent-register/moh-270-permanent-register.tsx +123 -0
- package/src/reports/moh-740/registers/moh-740-patient-list.scss +0 -0
- package/src/reports/moh-740/registers/moh-740-patient-list.tsx +60 -0
- package/src/reports/moh-740/registers/moh-740.columns.ts +54 -0
- package/src/reports/moh-740/shared/data-cell/data-cell.scss +6 -0
- package/src/reports/moh-740/shared/data-cell/data-cell.tsx +23 -0
- package/src/reports/moh-740/shared/utils/indicator-register-map.ts +159 -0
- package/src/reports/moh-740/types/index.ts +223 -0
- package/src/reports/moh-745/moh-745.component.tsx +2058 -0
- package/src/reports/moh-745/moh-745.scss +142 -0
- package/src/reports/moh-745/registers/moh-412-register.component.tsx +249 -0
- package/src/reports/moh-745/registers/moh-412.columns.ts +52 -0
- package/src/reports/moh-745/registers/type.ts +223 -0
- package/src/reports/table-wrapper/table-row-mapper.component.tsx +20 -5
- package/src/reports/table-wrapper/table-wrapper.component.tsx +23 -14
- package/src/reports/table-wrapper/table-wrapper.scss +1 -16
- package/src/resources/moh-267.resource.ts +27 -0
- package/src/resources/moh-362.resource.ts +27 -0
- package/src/resources/moh-505.resource.ts +69 -0
- package/src/resources/moh-705.resource.ts +118 -0
- package/src/resources/moh-706.resource.ts +80 -0
- package/src/resources/moh-710.resource.ts +60 -9
- package/src/resources/moh-711.resource.ts +206 -9
- package/src/resources/moh-717.resource.ts +26 -9
- package/src/resources/moh-729b.resource.ts +25 -0
- package/src/resources/moh-731.resource.ts +90 -0
- package/src/resources/moh-745.resource.ts +76 -0
- package/src/resources/patient-list-page.ts +66 -0
- package/src/resources/presumptive-tb.resource.ts +27 -0
- package/src/root.component.tsx +79 -8
- package/src/root.scss +36 -0
- package/src/routes.json +3 -1
- package/src/utils/format-indicator.ts +39 -0
- package/src/utils/get-base-url.ts +39 -7
- package/src/utils/utils.ts +30 -1
- package/tsconfig.json +1 -1
- package/webpack.config.js +22 -1
- package/dist/138.js +0 -2
- package/dist/138.js.LICENSE.txt +0 -20
- package/dist/138.js.map +0 -1
- package/dist/184.js +0 -2
- package/dist/184.js.LICENSE.txt +0 -14
- package/dist/184.js.map +0 -1
- package/dist/205.js +0 -1
- package/dist/205.js.map +0 -1
- package/dist/812.js +0 -1
- package/dist/812.js.map +0 -1
- package/dist/879.js +0 -1
- package/dist/879.js.map +0 -1
- package/dist/ampath-esm-reports-app.js.buildmanifest.json +0 -539
- package/dist/main.js +0 -1
- package/dist/main.js.map +0 -1
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
@use '@carbon/layout';
|
|
2
|
+
@use '@openmrs/esm-styleguide/src/vars' as *;
|
|
3
|
+
|
|
4
|
+
/* The Presumptive TB Register (MOH/REG/DNTLDP/02) as A3 landscape pages, drawn
|
|
5
|
+
in the units the paper is measured in (mm, pt) so a page is one sheet, as
|
|
6
|
+
on page 4 of the form: the green-headed ruled table, and beneath it on the
|
|
7
|
+
last page the page summary and the code tables. Heights are fixed so a page
|
|
8
|
+
never spills over: 15 cases on a full page, 9 with the summary on the last. */
|
|
9
|
+
|
|
10
|
+
/* On screen a page is the printable area only, A3 landscape less its 8mm
|
|
11
|
+
margins: the card around it gives the margin, and `usePageScale` is told
|
|
12
|
+
this width. */
|
|
13
|
+
$page-w: 420mm - 2 * 8mm;
|
|
14
|
+
$page-h: 297mm - 2 * 8mm;
|
|
15
|
+
|
|
16
|
+
$ink: #000;
|
|
17
|
+
$rule: 0.6pt solid #404040;
|
|
18
|
+
$green: #70ad47; // the letter row and the code tables' headings
|
|
19
|
+
$green-light: #e2efd9; // the column headings
|
|
20
|
+
$green-code: #d8e4bc; // the lab result code cells
|
|
21
|
+
|
|
22
|
+
$letters-h: 5.9mm;
|
|
23
|
+
$heading-1: 20.6mm; // to the foot of "Nationality", "Write the Investigation…"
|
|
24
|
+
$heading-2: 24mm; // to the foot of "Type of Sample", the investigation names
|
|
25
|
+
$heading-3: 18.5mm;
|
|
26
|
+
$line-h: 6.75mm; // half a case's row: each case takes two lines
|
|
27
|
+
|
|
28
|
+
/* The card the pages sit in, drawn like the filter card above it */
|
|
29
|
+
.reportFrame {
|
|
30
|
+
margin: layout.$spacing-05 0 layout.$spacing-07;
|
|
31
|
+
padding: layout.$spacing-05;
|
|
32
|
+
background-color: $ui-02;
|
|
33
|
+
border: 1px solid $ui-03;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Holds the fixed-width pages without making the app scroll sideways */
|
|
37
|
+
.viewport {
|
|
38
|
+
display: flex;
|
|
39
|
+
flex-direction: column;
|
|
40
|
+
gap: layout.$spacing-09;
|
|
41
|
+
overflow-x: auto;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.page {
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
flex: none;
|
|
48
|
+
box-sizing: border-box;
|
|
49
|
+
width: $page-w;
|
|
50
|
+
height: $page-h;
|
|
51
|
+
margin: 0 auto;
|
|
52
|
+
color: $ink;
|
|
53
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
54
|
+
font-size: 7.5pt;
|
|
55
|
+
line-height: 1.2;
|
|
56
|
+
background-color: #fff;
|
|
57
|
+
/* set by `usePageScale` from the measured container width, floored at 1 */
|
|
58
|
+
zoom: var(--page-zoom, 1);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.register {
|
|
62
|
+
width: 100%;
|
|
63
|
+
table-layout: fixed;
|
|
64
|
+
border-collapse: collapse;
|
|
65
|
+
|
|
66
|
+
th,
|
|
67
|
+
td {
|
|
68
|
+
padding: 0.6mm 0.9mm;
|
|
69
|
+
overflow: hidden;
|
|
70
|
+
border: $rule;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
th {
|
|
74
|
+
font-weight: 400;
|
|
75
|
+
text-align: center;
|
|
76
|
+
vertical-align: top;
|
|
77
|
+
background-color: $green-light;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
td {
|
|
81
|
+
vertical-align: middle;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* A, B, C … across the top, white on green */
|
|
86
|
+
.letters th {
|
|
87
|
+
height: $letters-h;
|
|
88
|
+
padding: 0;
|
|
89
|
+
font-size: 8pt;
|
|
90
|
+
font-weight: 700;
|
|
91
|
+
color: #fff;
|
|
92
|
+
vertical-align: middle;
|
|
93
|
+
background-color: $green;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.heading1 th {
|
|
97
|
+
height: $heading-1;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.heading2 th {
|
|
101
|
+
height: $heading-2;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.heading3 th {
|
|
105
|
+
height: $heading-3;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* the investigation and registration headings start at the left, as printed */
|
|
109
|
+
.leftHeading {
|
|
110
|
+
text-align: left !important;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* A case: two ruled lines, the split columns holding an upper and a lower entry */
|
|
114
|
+
.upperLine td,
|
|
115
|
+
.lowerLine td {
|
|
116
|
+
height: $line-h;
|
|
117
|
+
white-space: nowrap;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.left {
|
|
121
|
+
text-align: left;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.centre {
|
|
125
|
+
text-align: center;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* names, addresses and remarks may take both lines of the row, never more */
|
|
129
|
+
/* National ID and CR number (CR + 13 digits + check digit): small enough to fit G on one line */
|
|
130
|
+
.idCell {
|
|
131
|
+
font-size: 5.5pt;
|
|
132
|
+
white-space: nowrap;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.clamp {
|
|
136
|
+
display: -webkit-box;
|
|
137
|
+
overflow: hidden;
|
|
138
|
+
white-space: normal;
|
|
139
|
+
-webkit-box-orient: vertical;
|
|
140
|
+
-webkit-line-clamp: 2;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* sample type over the date it was collected, in one cell of the row */
|
|
144
|
+
.stacked {
|
|
145
|
+
display: block;
|
|
146
|
+
white-space: nowrap;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* Beneath the table on the last page: the page summary and the code tables,
|
|
150
|
+
spaced across the sheet as on the form */
|
|
151
|
+
|
|
152
|
+
.footer {
|
|
153
|
+
display: flex;
|
|
154
|
+
align-items: flex-start;
|
|
155
|
+
justify-content: space-between;
|
|
156
|
+
margin-top: 6mm;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.pageSummary {
|
|
160
|
+
width: 62mm;
|
|
161
|
+
|
|
162
|
+
h5 {
|
|
163
|
+
margin: 0 0 3mm;
|
|
164
|
+
font-size: 8pt;
|
|
165
|
+
font-weight: 700;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
p {
|
|
169
|
+
margin: 0 0 3.2mm;
|
|
170
|
+
font-size: 7.5pt;
|
|
171
|
+
line-height: 1.9;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
strong {
|
|
175
|
+
font-weight: 700;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* the figure written on the line */
|
|
180
|
+
.blank {
|
|
181
|
+
display: inline-block;
|
|
182
|
+
min-width: 20mm;
|
|
183
|
+
padding: 0 1mm;
|
|
184
|
+
font-weight: 700;
|
|
185
|
+
text-align: center;
|
|
186
|
+
border-bottom: 0.6pt solid $ink;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.codeTable {
|
|
190
|
+
border-collapse: collapse;
|
|
191
|
+
font-size: 7pt;
|
|
192
|
+
|
|
193
|
+
th,
|
|
194
|
+
td {
|
|
195
|
+
height: 5.9mm;
|
|
196
|
+
padding: 0 1.4mm;
|
|
197
|
+
text-align: left;
|
|
198
|
+
vertical-align: middle;
|
|
199
|
+
border: $rule;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
thead th {
|
|
203
|
+
font-weight: 700;
|
|
204
|
+
color: #fff;
|
|
205
|
+
background-color: $green;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.results {
|
|
210
|
+
width: 51mm;
|
|
211
|
+
|
|
212
|
+
thead th {
|
|
213
|
+
font-size: 8pt;
|
|
214
|
+
text-align: center;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
td {
|
|
218
|
+
width: 50%;
|
|
219
|
+
font-size: 7.5pt;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.labCodes {
|
|
224
|
+
width: 153mm;
|
|
225
|
+
|
|
226
|
+
thead th:first-child {
|
|
227
|
+
width: 18mm;
|
|
228
|
+
text-align: center;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
thead th:nth-child(2) {
|
|
232
|
+
text-align: center;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
td:first-child {
|
|
236
|
+
background-color: $green-code;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
td:nth-child(2) {
|
|
240
|
+
width: 27mm;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.referredBy {
|
|
245
|
+
width: 66mm;
|
|
246
|
+
|
|
247
|
+
td:last-child {
|
|
248
|
+
width: 13mm;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.investigations {
|
|
253
|
+
width: 33mm;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.pageFoot {
|
|
257
|
+
display: flex;
|
|
258
|
+
justify-content: space-between;
|
|
259
|
+
margin-top: auto;
|
|
260
|
+
padding-top: 1.5mm;
|
|
261
|
+
font-size: 7.5pt;
|
|
262
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import React, { useRef, useState } from 'react';
|
|
2
|
+
import { useSession } from '@openmrs/esm-framework';
|
|
3
|
+
|
|
4
|
+
import { ReportFiltersComponent, type ReportPeriod, useRestorePeriod } from '../../common/report-filters';
|
|
5
|
+
import { downloadSheetsPdf } from '../../common/report-page';
|
|
6
|
+
import { showReportError } from '../../common/report-error';
|
|
7
|
+
import { ReportSkeleton } from '../../common/report-skeleton';
|
|
8
|
+
import { getPresumptiveTb } from '../../resources/presumptive-tb.resource';
|
|
9
|
+
import { registerFileName } from '../register-file-name';
|
|
10
|
+
import { ReportPlaceholder, useGeneratedLocation } from '../../common/report-placeholder';
|
|
11
|
+
import PresumptiveTbRegister from './presumptive-tb-register.component';
|
|
12
|
+
import { type PresumptiveTbRow } from './presumptive-tb.types';
|
|
13
|
+
import styles from './presumptive-tb-register.scss';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Presumptive TB Register (MOH/REG/DNTLDP/02), opened from the landing page's
|
|
17
|
+
* Registers tab, with the reports' filter bar.
|
|
18
|
+
*
|
|
19
|
+
* The cases are the TB encounters (331) in the period, for the whole facility,
|
|
20
|
+
* already in the register's columns (/presumptive-tb-register).
|
|
21
|
+
*/
|
|
22
|
+
const PresumptiveTbRegisterPage: React.FC = () => {
|
|
23
|
+
const [rows, setRows] = useState<PresumptiveTbRow[] | null>(null);
|
|
24
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
25
|
+
const [period, setPeriod] = useState<{ startDate: string; endDate: string }>({ startDate: '', endDate: '' });
|
|
26
|
+
|
|
27
|
+
const session = useSession();
|
|
28
|
+
const locationUuids = session?.sessionLocation?.uuid ?? '';
|
|
29
|
+
/* Only a register for the current location counts */
|
|
30
|
+
const { isForCurrentLocation, hasLocationChanged, markGenerated } = useGeneratedLocation('presumptiveTbLocation');
|
|
31
|
+
const isGenerated = rows !== null && isForCurrentLocation;
|
|
32
|
+
|
|
33
|
+
const generate = async ({ startDate, endDate }: ReportPeriod) => {
|
|
34
|
+
setIsLoading(true);
|
|
35
|
+
setPeriod({ startDate, endDate });
|
|
36
|
+
try {
|
|
37
|
+
setRows((await getPresumptiveTb({ locationUuids, startDate, endDate })) as PresumptiveTbRow[]);
|
|
38
|
+
markGenerated(locationUuids);
|
|
39
|
+
} catch (error) {
|
|
40
|
+
showReportError('the Presumptive TB register', error);
|
|
41
|
+
} finally {
|
|
42
|
+
setIsLoading(false);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
useRestorePeriod(generate);
|
|
47
|
+
|
|
48
|
+
/* Download PDF saves every page of the register as an A3 landscape page,
|
|
49
|
+
made from copies, so the pages on screen are left as they are */
|
|
50
|
+
const sheetsRef = useRef<HTMLDivElement>(null);
|
|
51
|
+
const downloadPdf = async () => {
|
|
52
|
+
const pages = Array.from(sheetsRef.current?.querySelectorAll<HTMLElement>('[data-register-page]') ?? []);
|
|
53
|
+
const name = registerFileName('Presumptive-TB-Register', session?.sessionLocation?.display ?? '', period);
|
|
54
|
+
/* styled by its own stylesheets in Arial only, and may run to many pages */
|
|
55
|
+
await downloadSheetsPdf(pages, name, {
|
|
56
|
+
paperSize: 'a3',
|
|
57
|
+
orientation: 'landscape',
|
|
58
|
+
stylesheetsOnly: true,
|
|
59
|
+
image: 'jpeg',
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<>
|
|
65
|
+
<ReportFiltersComponent
|
|
66
|
+
reportName="Presumptive TB Register"
|
|
67
|
+
mode="both"
|
|
68
|
+
onGenerate={generate}
|
|
69
|
+
isLoading={isLoading}
|
|
70
|
+
isReportGenerated={isGenerated}
|
|
71
|
+
generatedPeriod={period}
|
|
72
|
+
defaultTab="custom"
|
|
73
|
+
backLink={{ label: 'All registers', to: '/?tab=registers' }}
|
|
74
|
+
onDownloadPdf={downloadPdf}
|
|
75
|
+
/>
|
|
76
|
+
{isLoading && <ReportSkeleton />}
|
|
77
|
+
{!isLoading && !isGenerated && (
|
|
78
|
+
<ReportPlaceholder
|
|
79
|
+
reportName="Presumptive TB Register"
|
|
80
|
+
isLocationChanged={rows !== null && hasLocationChanged}
|
|
81
|
+
/>
|
|
82
|
+
)}
|
|
83
|
+
{!isLoading && isGenerated && (
|
|
84
|
+
<div className={styles.reportFrame} ref={sheetsRef}>
|
|
85
|
+
<PresumptiveTbRegister rows={rows} />
|
|
86
|
+
</div>
|
|
87
|
+
)}
|
|
88
|
+
</>
|
|
89
|
+
);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export default PresumptiveTbRegisterPage;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* One presumptive TB case in the register, column by column as on the form
|
|
5
|
+
* (MOH/REG/DNTLDP/02, February 2023). Where a column holds two lines, the
|
|
6
|
+
* upper and lower are separate fields.
|
|
7
|
+
*
|
|
8
|
+
* These are the columns the ETL returns (/presumptive-tb-register), one row
|
|
9
|
+
* per TB encounter in the period.
|
|
10
|
+
*/
|
|
11
|
+
export interface PresumptiveTbRow {
|
|
12
|
+
/** (A) cumulative from the start of each year */
|
|
13
|
+
serial_number?: number | string | null;
|
|
14
|
+
/** (B) patient department number, e.g. CCC or OPD number */
|
|
15
|
+
department_number?: string | null;
|
|
16
|
+
/** (C) date registered as a presumed TB/DR-TB case */
|
|
17
|
+
date?: string | null;
|
|
18
|
+
/** (D) first, middle and last names */
|
|
19
|
+
full_name?: string | null;
|
|
20
|
+
/** (E) M, F or other */
|
|
21
|
+
sex?: string | null;
|
|
22
|
+
/** (F) completed years, or months for a child under one, e.g. `35 Yrs` or `8 Mo` */
|
|
23
|
+
age?: string | number | null;
|
|
24
|
+
/** (G) upper: national ID (identifier type 5) */
|
|
25
|
+
national_id?: string | null;
|
|
26
|
+
/** (G) lower: Client Registry number (identifier type 55), in place of UPI */
|
|
27
|
+
cr_number?: string | null;
|
|
28
|
+
/** (H) upper: nearest landmark */
|
|
29
|
+
physical_address?: string | null;
|
|
30
|
+
/** (H) lower */
|
|
31
|
+
phone_number?: string | null;
|
|
32
|
+
/** (I) PS, SR, CI, CP, CHV or ISP */
|
|
33
|
+
referred_by?: string | null;
|
|
34
|
+
/** (J) upper: Positive, Negative or Not Done, in full */
|
|
35
|
+
hiv_result?: string | null;
|
|
36
|
+
/** (J) lower */
|
|
37
|
+
hiv_test_date?: string | null;
|
|
38
|
+
/** (K) type of sample (code) */
|
|
39
|
+
sample_type?: string | null;
|
|
40
|
+
/** (K) date the sputum sample was collected */
|
|
41
|
+
sample_date?: string | null;
|
|
42
|
+
/** (L) upper: N, SG, AO or ND */
|
|
43
|
+
xray_result?: string | null;
|
|
44
|
+
/** (L) lower */
|
|
45
|
+
xray_date?: string | null;
|
|
46
|
+
/** (M) upper: other radiological test(s) and result */
|
|
47
|
+
other_radiology_result?: string | null;
|
|
48
|
+
/** (M) lower */
|
|
49
|
+
other_radiology_date?: string | null;
|
|
50
|
+
/** (N) upper: molecular / culture test(s) and result, e.g. MTB + RS */
|
|
51
|
+
molecular_result?: string | null;
|
|
52
|
+
/** (N) lower */
|
|
53
|
+
molecular_date?: string | null;
|
|
54
|
+
/** (O) upper: microscopy / TB LAMP result */
|
|
55
|
+
microscopy_result?: string | null;
|
|
56
|
+
/** (O) lower */
|
|
57
|
+
microscopy_date?: string | null;
|
|
58
|
+
/** (P) DSTB, DRTB or No TB */
|
|
59
|
+
outcome?: string | null;
|
|
60
|
+
/** (Q) upper: Yes or No */
|
|
61
|
+
started_tb_treatment?: string | null;
|
|
62
|
+
/** (Q) lower: sub-county TB registration number & start date */
|
|
63
|
+
tb_registration?: string | null;
|
|
64
|
+
/** (R) upper: Yes or No */
|
|
65
|
+
tpt_started?: string | null;
|
|
66
|
+
/** (R) lower: TPT sub-county register number & start date */
|
|
67
|
+
tpt_registration?: string | null;
|
|
68
|
+
remarks?: string | null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Blank rather than "null" / "undefined" in a cell */
|
|
72
|
+
export const text = (value: unknown) => (value === null || value === undefined ? '' : String(value));
|
|
73
|
+
|
|
74
|
+
/** DD/MM/YYYY, as the form asks */
|
|
75
|
+
export const formDate = (value: unknown) => (value ? dayjs(String(value)).format('DD/MM/YYYY') : '');
|
|
76
|
+
|
|
77
|
+
/** Diagnosed with TB: drug-sensitive or drug-resistant */
|
|
78
|
+
export const isDiagnosed = (row: PresumptiveTbRow) => ['DSTB', 'DRTB'].includes(text(row.outcome).toUpperCase());
|
|
79
|
+
|
|
80
|
+
/** Investigated for TB: a sample collected or any investigation recorded */
|
|
81
|
+
export const isInvestigated = (row: PresumptiveTbRow) =>
|
|
82
|
+
[row.sample_date, row.xray_result, row.other_radiology_result, row.molecular_result, row.microscopy_result].some(
|
|
83
|
+
(value) => text(value) !== '',
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
/** A diagnosed case started on anti-TB treatment */
|
|
87
|
+
export const isInitiated = (row: PresumptiveTbRow) =>
|
|
88
|
+
isDiagnosed(row) && /^y(es)?$/i.test(text(row.started_tb_treatment));
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { Activity, Chemistry, Medication, Microscope, Stethoscope, TaskView } from '@carbon/react/icons';
|
|
2
|
+
|
|
3
|
+
import { type ReportCategory } from '../dashboard/report-catalog';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The registers listed on the landing page's Registers tab, grouped as the
|
|
7
|
+
* reports are. Each opens on its own route (root.component.tsx) with the same
|
|
8
|
+
* filter bar as the reports, opening on a custom range of today
|
|
9
|
+
* (`defaultTab="custom"`), where the reports open on last month.
|
|
10
|
+
*/
|
|
11
|
+
export const registerCategories: ReportCategory[] = [
|
|
12
|
+
{
|
|
13
|
+
id: 'hiv-testing',
|
|
14
|
+
title: 'HIV Testing Services & Pre-Exposure Prophylaxis',
|
|
15
|
+
description: 'HTS and PrEP daily registers',
|
|
16
|
+
tone: 'violet',
|
|
17
|
+
reports: [
|
|
18
|
+
{
|
|
19
|
+
code: 'MOH 362',
|
|
20
|
+
name: 'HTS lab, referral & linkage',
|
|
21
|
+
description: 'Clients tested for HIV, their test kits and results, and referral and linkage to care.',
|
|
22
|
+
path: '/moh-362',
|
|
23
|
+
icon: Microscope,
|
|
24
|
+
keywords: ['hts', 'hiv testing', 'lab', 'referral', 'linkage', 'kits'],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
code: 'MOH 267',
|
|
28
|
+
name: 'PrEP daily activity',
|
|
29
|
+
description: 'PrEP visits: clients new, continuing or restarting, their PrEP method, HIV results and STIs.',
|
|
30
|
+
path: '/moh-267',
|
|
31
|
+
icon: Medication,
|
|
32
|
+
keywords: ['prep', 'pre-exposure', 'prophylaxis', 'daily activity', 'dar', 'sti'],
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 'tb',
|
|
38
|
+
title: 'Tuberculosis',
|
|
39
|
+
description: 'TB case finding registers',
|
|
40
|
+
tone: 'teal',
|
|
41
|
+
reports: [
|
|
42
|
+
{
|
|
43
|
+
code: 'MOH/REG/DNTLDP/02',
|
|
44
|
+
name: 'Presumptive TB',
|
|
45
|
+
description:
|
|
46
|
+
'Presumptive TB cases, their investigations and results, and whether started on TB treatment or TPT.',
|
|
47
|
+
path: '/presumptive-tb',
|
|
48
|
+
icon: Stethoscope,
|
|
49
|
+
keywords: ['tb', 'tuberculosis', 'presumptive', 'acf', 'case finding', 'sputum', 'genexpert', 'tpt'],
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
code: 'TB4',
|
|
53
|
+
name: 'Notification & treatment',
|
|
54
|
+
description:
|
|
55
|
+
'Drug-sensitive TB patients notified: diagnosis, investigations, treatment, follow-up and outcome.',
|
|
56
|
+
path: '/tb4',
|
|
57
|
+
icon: TaskView,
|
|
58
|
+
keywords: ['tb', 'tb4', 'tuberculosis', 'dstb', 'notification', 'treatment', 'outcome', 'smear', 'culture'],
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: 'diabetes-and-hypertension',
|
|
64
|
+
title: 'Diabetes and Hypertension services',
|
|
65
|
+
description: 'Diabetes and Hypertension comprehensive care',
|
|
66
|
+
tone: 'violet',
|
|
67
|
+
reports: [
|
|
68
|
+
{
|
|
69
|
+
code: 'MOH 222',
|
|
70
|
+
name: 'Diabetes and Hypertension Comprehensive Care Daily Register',
|
|
71
|
+
description: 'Diabetes and Hypertension Comprehensive Care Daily Register',
|
|
72
|
+
path: '/moh-222',
|
|
73
|
+
icon: Activity,
|
|
74
|
+
keywords: ['cdm', 'ncd', 'diabetes', 'hypertetion'],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
code: 'MOH 270',
|
|
78
|
+
name: 'Diabetes & Hypertension Comprehensive Care Permanent register',
|
|
79
|
+
description: 'Diabetes & Hypertension Comprehensive Care Permanent register',
|
|
80
|
+
path: '/moh-270',
|
|
81
|
+
icon: Activity,
|
|
82
|
+
keywords: ['cdm', 'ncd', 'diabetes', 'hypertetion'],
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: 'laboratory',
|
|
88
|
+
title: 'Laboratory',
|
|
89
|
+
description: 'Laboratory specimen and testing registers',
|
|
90
|
+
tone: 'blue',
|
|
91
|
+
reports: [
|
|
92
|
+
{
|
|
93
|
+
code: 'MOH 240',
|
|
94
|
+
name: 'Laboratory (LAB) Register',
|
|
95
|
+
description:
|
|
96
|
+
'Specimens collected and analysed by the laboratory: investigations, results, billing and referral.',
|
|
97
|
+
path: '/moh-240-register',
|
|
98
|
+
icon: Chemistry,
|
|
99
|
+
keywords: ['lab', 'laboratory', 'specimen', 'results', 'malaria', 'referral'],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
code: 'TB LAB',
|
|
103
|
+
name: 'TB Laboratory Register',
|
|
104
|
+
description:
|
|
105
|
+
'TB specimens tested: microscopy (AFB), TB-LAMP, LF-LAM and GeneXpert/Truenat results with turnaround.',
|
|
106
|
+
path: '/tb-lab-register',
|
|
107
|
+
icon: Chemistry,
|
|
108
|
+
keywords: ['tb', 'tuberculosis', 'afb', 'microscopy', 'sputum', 'genexpert', 'truenat', 'lamp', 'tat'],
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
id: 'cancer-screening',
|
|
114
|
+
title: 'Cancer Screening services',
|
|
115
|
+
description: 'Cancer Screening Summary',
|
|
116
|
+
tone: 'violet',
|
|
117
|
+
reports: [
|
|
118
|
+
{
|
|
119
|
+
code: 'MOH 412',
|
|
120
|
+
name: 'Cancer Screening Register',
|
|
121
|
+
description: 'Cancer Screening Register',
|
|
122
|
+
path: '/moh-412-register',
|
|
123
|
+
icon: Activity,
|
|
124
|
+
keywords: ['cancer', 'cervical', 'screening'],
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
id: 'MOH 711',
|
|
130
|
+
title: 'MOH 711',
|
|
131
|
+
description: 'MOH 711 Summary',
|
|
132
|
+
tone: 'violet',
|
|
133
|
+
reports: [
|
|
134
|
+
{
|
|
135
|
+
code: 'MOH 405',
|
|
136
|
+
name: 'MOH 405 Register',
|
|
137
|
+
description: 'MOH 405 Register',
|
|
138
|
+
path: '/moh-405-register',
|
|
139
|
+
icon: Activity,
|
|
140
|
+
keywords: ['anc'],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
code: 'MOH 406',
|
|
144
|
+
name: 'MOH 406 Register',
|
|
145
|
+
description: 'MOH 406 Register',
|
|
146
|
+
path: '/moh-406-register',
|
|
147
|
+
icon: Activity,
|
|
148
|
+
keywords: ['pnc'],
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
code: 'MOH 333',
|
|
152
|
+
name: 'MOH 333 Register',
|
|
153
|
+
description: 'MOH 333 Register',
|
|
154
|
+
path: '/moh-333-register',
|
|
155
|
+
icon: Activity,
|
|
156
|
+
keywords: ['anc'],
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
code: 'MOH 407',
|
|
160
|
+
name: 'MOH 407 Register',
|
|
161
|
+
description: 'Child Health and Nutrition Register',
|
|
162
|
+
path: '/moh-407-register',
|
|
163
|
+
icon: Activity,
|
|
164
|
+
keywords: ['child health', 'nutrition', 'chanis'],
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
code: 'MOH 512',
|
|
168
|
+
name: 'MOH 512 Register',
|
|
169
|
+
description: 'MOH 512 Register',
|
|
170
|
+
path: '/moh-512-register',
|
|
171
|
+
icon: Activity,
|
|
172
|
+
keywords: ['family', 'planning'],
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: 'MOH 710',
|
|
178
|
+
title: 'MOH 710',
|
|
179
|
+
description: 'MOH 710',
|
|
180
|
+
tone: 'violet',
|
|
181
|
+
reports: [
|
|
182
|
+
{
|
|
183
|
+
code: 'MOH 510',
|
|
184
|
+
name: 'Immunization Register',
|
|
185
|
+
description: 'Immunization Register',
|
|
186
|
+
path: '/moh-510-register',
|
|
187
|
+
icon: Activity,
|
|
188
|
+
keywords: ['immunization'],
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
code: 'MOH 413',
|
|
192
|
+
name: 'HPV Register',
|
|
193
|
+
description: 'HPV Register',
|
|
194
|
+
path: '/moh-413-register',
|
|
195
|
+
icon: Activity,
|
|
196
|
+
keywords: ['hpv'],
|
|
197
|
+
},
|
|
198
|
+
],
|
|
199
|
+
},
|
|
200
|
+
];
|
|
201
|
+
|
|
202
|
+
export const totalRegisterCount = registerCategories.reduce((count, category) => count + category.reports.length, 0);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A register's PDF file name: its code, the facility and the period, e.g.
|
|
5
|
+
* `MOH-267_Kesses_2026-09.pdf` for a whole month, or
|
|
6
|
+
* `MOH-267_Kesses_2026-10-01_to_2026-10-28.pdf` for any other range.
|
|
7
|
+
*/
|
|
8
|
+
export function registerFileName(code: string, facility: string, period: { startDate: string; endDate: string }) {
|
|
9
|
+
const start = dayjs(period.startDate);
|
|
10
|
+
const end = dayjs(period.endDate);
|
|
11
|
+
const isWholeMonth = start.isSame(start.startOf('month'), 'day') && end.isSame(start.endOf('month'), 'day');
|
|
12
|
+
const range = isWholeMonth ? start.format('YYYY-MM') : `${start.format('YYYY-MM-DD')}_to_${end.format('YYYY-MM-DD')}`;
|
|
13
|
+
const name = [code, facility, period.startDate ? range : '']
|
|
14
|
+
.filter(Boolean)
|
|
15
|
+
.join('_')
|
|
16
|
+
.replace(/[^a-z0-9_-]+/gi, '-');
|
|
17
|
+
return `${name}.pdf`;
|
|
18
|
+
}
|