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