@ampath/esm-reports-app 1.0.0-next.8 → 1.0.0-next.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/549.css +1 -0
- package/dist/549.css.map +1 -0
- package/dist/549.js +1 -0
- package/dist/549.js.map +1 -0
- 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 +1339 -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.scss +20 -0
- package/src/reports/moh-740/registers/moh-222-daily-register/moh-222-daily-register.tsx +183 -0
- package/src/reports/moh-740/registers/moh-270-permanent-register/moh-270-permanent-register.scss +6 -0
- package/src/reports/moh-740/registers/moh-270-permanent-register/moh-270-permanent-register.tsx +151 -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.scss +6 -0
- package/src/reports/moh-745/registers/moh-412-register.component.tsx +275 -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
|
@@ -1,49 +1,281 @@
|
|
|
1
|
+
@use '@carbon/layout';
|
|
2
|
+
@use '@carbon/type';
|
|
3
|
+
@use '@openmrs/esm-styleguide/src/vars' as *;
|
|
1
4
|
|
|
5
|
+
.filters {
|
|
6
|
+
padding: layout.$spacing-05 0 0;
|
|
7
|
+
}
|
|
2
8
|
|
|
3
|
-
.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
9
|
+
/* Breadcrumb trail. The trailing crumb is the page heading, so the items are
|
|
10
|
+
baseline-aligned rather than centred on differing font sizes. */
|
|
11
|
+
|
|
12
|
+
.breadcrumb {
|
|
13
|
+
margin-bottom: layout.$spacing-04;
|
|
14
|
+
|
|
15
|
+
:global(.cds--breadcrumb-item) {
|
|
16
|
+
display: inline-flex;
|
|
17
|
+
align-items: baseline;
|
|
18
|
+
}
|
|
8
19
|
}
|
|
9
20
|
|
|
21
|
+
/* An `h3` inside the trailing crumb, so it keeps heading semantics without
|
|
22
|
+
repeating the report name in a separate title row. */
|
|
10
23
|
.title {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
color: green;
|
|
15
|
-
text-decoration: underline;
|
|
24
|
+
@include type.type-style('productive-heading-03');
|
|
25
|
+
display: inline;
|
|
26
|
+
color: $color-gray-100;
|
|
16
27
|
}
|
|
17
28
|
|
|
18
|
-
|
|
19
|
-
|
|
29
|
+
/* Filter card */
|
|
30
|
+
|
|
31
|
+
.filtersContainer {
|
|
32
|
+
padding: layout.$spacing-04 layout.$spacing-05;
|
|
33
|
+
background-color: $ui-02;
|
|
34
|
+
border: 1px solid $ui-03;
|
|
20
35
|
}
|
|
21
36
|
|
|
22
|
-
.
|
|
23
|
-
display:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
37
|
+
.fields {
|
|
38
|
+
display: flex;
|
|
39
|
+
flex-wrap: wrap;
|
|
40
|
+
align-items: flex-end;
|
|
41
|
+
gap: layout.$spacing-05;
|
|
42
|
+
margin-bottom: layout.$spacing-04;
|
|
27
43
|
}
|
|
28
44
|
|
|
29
|
-
|
|
30
|
-
|
|
45
|
+
/* Nested so it beats the `flex: 0 1 auto` that Carbon puts on `.cds--form-item`.
|
|
46
|
+
|
|
47
|
+
Fields grow into the row but stop at a width suited to what they hold. Left
|
|
48
|
+
to share the row unbounded, a monthly report -- which shows only Year and
|
|
49
|
+
Month -- gave a four-digit year a 434px box and the month 650px. The cap
|
|
50
|
+
keeps every control a sensible size and leaves the slack at the end of the
|
|
51
|
+
row rather than inside the inputs. */
|
|
52
|
+
|
|
53
|
+
.fields .field {
|
|
54
|
+
flex: 1 1 auto;
|
|
55
|
+
min-width: 0;
|
|
31
56
|
}
|
|
32
57
|
|
|
33
|
-
.
|
|
58
|
+
.fields .periodField {
|
|
59
|
+
min-width: 14rem;
|
|
60
|
+
max-width: 16rem;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* Wide enough for the validation message, not just the value. Carbon renders
|
|
64
|
+
`invalidText` under the input at the field's own width, so a field sized to
|
|
65
|
+
"2026" or "September" makes "That month has not started yet." wrap onto a
|
|
66
|
+
second line and jog the row below it. */
|
|
67
|
+
|
|
68
|
+
.fields .yearField {
|
|
69
|
+
min-width: 7rem;
|
|
70
|
+
max-width: 9rem;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.fields .monthField {
|
|
74
|
+
min-width: 9rem;
|
|
75
|
+
max-width: 13rem;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* The range picker holds two inputs, so it is allowed roughly twice the width */
|
|
79
|
+
.fields .rangeField {
|
|
80
|
+
min-width: 16rem;
|
|
81
|
+
max-width: 24rem;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* Matches Carbon's `.cds--label` so the switcher's label sits on the same
|
|
85
|
+
baseline as the labels Carbon renders for the selects. */
|
|
86
|
+
.fieldLabel {
|
|
87
|
+
@include type.type-style('label-01');
|
|
88
|
+
display: inline-block;
|
|
89
|
+
color: $text-02;
|
|
90
|
+
line-height: 1rem;
|
|
91
|
+
margin-bottom: layout.$spacing-03;
|
|
92
|
+
vertical-align: baseline;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Carbon sizes these to their content, so they need telling to fill the field */
|
|
96
|
+
|
|
97
|
+
.switcher,
|
|
98
|
+
.fields .field :global(.cds--select-input) {
|
|
99
|
+
width: 100%;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.datePicker {
|
|
103
|
+
display: flex;
|
|
104
|
+
gap: layout.$spacing-05;
|
|
105
|
+
width: 100%;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* Carbon pins `inline-size: 143.5px` on both the container and the input in
|
|
109
|
+
range mode, so the two dates never fill the field. `.datePicker` lands on
|
|
110
|
+
the form-item wrapper, not on the range element itself, so the range is
|
|
111
|
+
matched as its descendant. */
|
|
112
|
+
.fields .datePicker :global(.cds--date-picker--range) {
|
|
113
|
+
gap: layout.$spacing-05;
|
|
34
114
|
width: 100%;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
115
|
+
|
|
116
|
+
:global(.cds--date-picker-container) {
|
|
117
|
+
flex: 1 1 0;
|
|
118
|
+
inline-size: auto;
|
|
119
|
+
min-inline-size: 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
:global(.cds--date-picker__input) {
|
|
123
|
+
inline-size: 100%;
|
|
124
|
+
min-inline-size: 0;
|
|
125
|
+
}
|
|
39
126
|
}
|
|
40
|
-
|
|
41
|
-
|
|
127
|
+
|
|
128
|
+
/* Action row */
|
|
129
|
+
|
|
130
|
+
.actions {
|
|
131
|
+
display: flex;
|
|
132
|
+
align-items: center;
|
|
133
|
+
justify-content: space-between;
|
|
134
|
+
flex-wrap: wrap;
|
|
135
|
+
gap: layout.$spacing-04;
|
|
136
|
+
padding-top: layout.$spacing-04;
|
|
137
|
+
border-top: 1px solid $ui-03;
|
|
42
138
|
}
|
|
43
139
|
|
|
44
|
-
.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
140
|
+
.summary {
|
|
141
|
+
@include type.type-style('body-short-01');
|
|
142
|
+
display: flex;
|
|
143
|
+
flex: 1 1 18rem;
|
|
144
|
+
align-items: flex-start;
|
|
145
|
+
gap: layout.$spacing-03;
|
|
146
|
+
min-width: 0;
|
|
147
|
+
margin: 0;
|
|
148
|
+
color: $text-02;
|
|
149
|
+
|
|
150
|
+
/* level with the first line however many lines the message wraps to */
|
|
151
|
+
svg {
|
|
152
|
+
flex-shrink: 0;
|
|
153
|
+
margin-top: 0.0625rem;
|
|
154
|
+
fill: var(--brand-01);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* a period such as "01 Sep 2026 to 30 Sep 2026" never breaks mid-range */
|
|
158
|
+
strong {
|
|
159
|
+
color: $color-gray-100;
|
|
160
|
+
font-weight: 600;
|
|
161
|
+
white-space: nowrap;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.actionButtons {
|
|
166
|
+
display: flex;
|
|
167
|
+
align-items: center;
|
|
168
|
+
gap: layout.$spacing-03;
|
|
169
|
+
margin-left: auto;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* The filter bar is application chrome, not part of the report */
|
|
173
|
+
|
|
174
|
+
@media print {
|
|
175
|
+
.filters {
|
|
176
|
+
display: none;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
@media (max-width: $breakpoint-tablet-max) {
|
|
181
|
+
.filters {
|
|
182
|
+
padding: layout.$spacing-05 0 0;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.fields,
|
|
186
|
+
.datePicker {
|
|
187
|
+
flex-direction: column;
|
|
188
|
+
align-items: stretch;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.fields .field,
|
|
192
|
+
.switcher {
|
|
193
|
+
min-width: 0;
|
|
194
|
+
width: 100%;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.actionButtons {
|
|
198
|
+
margin-left: 0;
|
|
199
|
+
width: 100%;
|
|
200
|
+
|
|
201
|
+
button {
|
|
202
|
+
flex: 1 1 0;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* The summary doubles as the blocking reason when the period is not valid */
|
|
208
|
+
.summaryInvalid {
|
|
209
|
+
color: $danger;
|
|
210
|
+
|
|
211
|
+
svg {
|
|
212
|
+
fill: $danger;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/* The filters no longer match the report on screen. A quiet note rather than
|
|
217
|
+
a banner, in smaller italic type: nothing is wrong, the figures are simply
|
|
218
|
+
for another period. Warning-toned rather than error-toned. */
|
|
219
|
+
|
|
220
|
+
.summaryStale {
|
|
221
|
+
@include type.type-style('label-01');
|
|
222
|
+
align-items: center;
|
|
223
|
+
font-style: italic;
|
|
224
|
+
color: $text-02;
|
|
225
|
+
|
|
226
|
+
svg {
|
|
227
|
+
width: 0.875rem;
|
|
228
|
+
height: 0.875rem;
|
|
229
|
+
margin-top: 0;
|
|
230
|
+
fill: #b28600; // Carbon yellow 50: the warning hue, legible on white
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
strong {
|
|
234
|
+
font-weight: 600;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/* Stacked fields fill the card. The desktop caps above (a year box no wider
|
|
239
|
+
than a year needs) would otherwise leave each stacked field a different,
|
|
240
|
+
arbitrary width. Placed after them so it wins at equal specificity. */
|
|
241
|
+
@media (max-width: $breakpoint-tablet-max) {
|
|
242
|
+
.fields .periodField,
|
|
243
|
+
.fields .yearField,
|
|
244
|
+
.fields .monthField,
|
|
245
|
+
.fields .rangeField {
|
|
246
|
+
max-width: none;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/* Carbon caps buttons at 20rem; sharing the row, they should split it */
|
|
250
|
+
.actionButtons :global(.cds--btn) {
|
|
251
|
+
max-width: none;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* Phones: one column throughout. Side by side, "Download PDF" and "Generate
|
|
256
|
+
report" each wrapped onto two lines and together overran the card. */
|
|
257
|
+
@media (max-width: $breakpoint-phone-max) {
|
|
258
|
+
.filtersContainer {
|
|
259
|
+
padding: layout.$spacing-04;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.actions {
|
|
263
|
+
flex-direction: column;
|
|
264
|
+
align-items: stretch;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/* Its flex basis is a width on the row; stacked, it would become a height */
|
|
268
|
+
.summary {
|
|
269
|
+
flex: none;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.actionButtons {
|
|
273
|
+
flex-direction: column;
|
|
274
|
+
align-items: stretch;
|
|
275
|
+
|
|
276
|
+
:global(.cds--btn) {
|
|
277
|
+
flex: none;
|
|
278
|
+
width: 100%;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which period controls a report offers.
|
|
3
|
+
*
|
|
4
|
+
* `monthly` suits returns that are only ever compiled for a calendar month --
|
|
5
|
+
* offering a date range there invites a period the return is not defined for.
|
|
6
|
+
* `range` suits reports read over arbitrary dates. `both` lets the user choose.
|
|
7
|
+
*/
|
|
8
|
+
export type ReportFilterMode =
|
|
9
|
+
| 'monthly' // year and month only
|
|
10
|
+
| 'range' // start and end date only
|
|
11
|
+
| 'both'; // a switcher between the two
|
|
12
|
+
|
|
13
|
+
export interface FacilityOption {
|
|
14
|
+
value: string;
|
|
15
|
+
label: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* What the filter bar hands back when the user generates a report.
|
|
20
|
+
*
|
|
21
|
+
* `startDate` and `endDate` are always resolved to `YYYY-MM-DD`, whichever way
|
|
22
|
+
* the period was picked, so a report never has to expand a month into a range
|
|
23
|
+
* itself.
|
|
24
|
+
*/
|
|
25
|
+
export interface ReportPeriod {
|
|
26
|
+
startDate: string;
|
|
27
|
+
endDate: string;
|
|
28
|
+
/** Set only when the user picked a whole month, as `YYYY-MM` */
|
|
29
|
+
month?: string;
|
|
30
|
+
/** Set only when the caller supplied `facilities` */
|
|
31
|
+
facility?: string;
|
|
32
|
+
/** Human readable period, e.g. `June 2026` or `01 Jun 2026 to 14 Jun 2026` */
|
|
33
|
+
label: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface ReportFiltersProps {
|
|
37
|
+
/** Shown as the page title, e.g. `MOH-731 Report` */
|
|
38
|
+
reportName: string;
|
|
39
|
+
/** Defaults to `both`. See {@link ReportFilterMode}. */
|
|
40
|
+
mode?: ReportFilterMode;
|
|
41
|
+
/** Renders a facility picker when supplied. Omit to hide it. */
|
|
42
|
+
facilities?: FacilityOption[];
|
|
43
|
+
/** How many years the year dropdown offers, counting back from now */
|
|
44
|
+
yearsBack?: number;
|
|
45
|
+
/** Disables the generate button and shows a pending label */
|
|
46
|
+
isLoading?: boolean;
|
|
47
|
+
/** Reveals the Download PDF button beside Generate once a report is on screen */
|
|
48
|
+
isReportGenerated?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* The period the report currently on screen was generated for.
|
|
51
|
+
*
|
|
52
|
+
* Reports that restore their data from session storage come back with a
|
|
53
|
+
* report showing but no record here of which period produced it. Passing it
|
|
54
|
+
* lets the filter bar flag stale figures on the first change after a reload,
|
|
55
|
+
* rather than only after the user has generated once in this session.
|
|
56
|
+
*/
|
|
57
|
+
generatedPeriod?: { startDate?: string; endDate?: string };
|
|
58
|
+
onGenerate: (period: ReportPeriod) => void;
|
|
59
|
+
/**
|
|
60
|
+
* Fires whenever the selected period changes, before Generate is pressed.
|
|
61
|
+
*
|
|
62
|
+
* Lets a report show the period on its form as soon as it is chosen, rather
|
|
63
|
+
* than only once figures have been fetched for it.
|
|
64
|
+
*/
|
|
65
|
+
onPeriodChange?: (period: ReportPeriod) => void;
|
|
66
|
+
/**
|
|
67
|
+
* Saves the report as a PDF file. Without it, Download PDF opens the
|
|
68
|
+
* browser's print dialog on the report's print layout.
|
|
69
|
+
*/
|
|
70
|
+
onDownloadPdf?: () => Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* The period type a `both` filter bar opens on when the URL carries no
|
|
73
|
+
* period: `monthly` (last month, the reports' default) or `custom` (today to
|
|
74
|
+
* today, the registers' default).
|
|
75
|
+
*/
|
|
76
|
+
defaultTab?: 'monthly' | 'custom';
|
|
77
|
+
/** Where the breadcrumb leads back to; defaults to All reports on the landing page */
|
|
78
|
+
backLink?: { label: string; to: string };
|
|
79
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
import { useSearchParams } from 'react-router-dom';
|
|
3
|
+
|
|
4
|
+
import { describePeriod } from './date-range';
|
|
5
|
+
import { type ReportPeriod } from './types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Regenerates a report when its URL carries a period.
|
|
9
|
+
*
|
|
10
|
+
* A register's breadcrumb links back to the report the figure came from, and
|
|
11
|
+
* carries the period it was generated for. Without this the user lands on the
|
|
12
|
+
* report's "not generated yet" placeholder and has to pick the same month
|
|
13
|
+
* again -- the trail leads back to the page but not to what was on it.
|
|
14
|
+
*
|
|
15
|
+
* Reports that keep their figures in session storage restore themselves
|
|
16
|
+
* already; this is for the ones that do not.
|
|
17
|
+
*/
|
|
18
|
+
export function useRestorePeriod(onRestore: (period: ReportPeriod) => void) {
|
|
19
|
+
const [searchParams] = useSearchParams();
|
|
20
|
+
|
|
21
|
+
const startDate = searchParams.get('startDate');
|
|
22
|
+
const endDate = searchParams.get('endDate');
|
|
23
|
+
const month = searchParams.get('month') ?? undefined;
|
|
24
|
+
|
|
25
|
+
/* Keyed on the period rather than a bare "has run" flag, so following a
|
|
26
|
+
second register back to a different month still regenerates. */
|
|
27
|
+
const restored = useRef<string | null>(null);
|
|
28
|
+
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (!startDate || !endDate) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const key = `${startDate}|${endDate}`;
|
|
35
|
+
|
|
36
|
+
if (restored.current === key) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
restored.current = key;
|
|
41
|
+
onRestore({ startDate, endDate, month, label: describePeriod(startDate, endDate, month) });
|
|
42
|
+
}, [startDate, endDate, month, onRestore]);
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './use-location-details';
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { openmrsFetch, useSession } from '@openmrs/esm-framework';
|
|
3
|
+
|
|
4
|
+
export interface LocationDetails {
|
|
5
|
+
county?: string;
|
|
6
|
+
subCounty?: string;
|
|
7
|
+
/** The location attribute carrying the Kenya Master Health Facility List code */
|
|
8
|
+
kmhflCode?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The extra masthead facts the MOH forms print but the session object does
|
|
13
|
+
* not carry: County / Sub-County map to the location's address fields, and
|
|
14
|
+
* the KMHFL code is whichever location attribute's type names the master
|
|
15
|
+
* facility list (its exact type name varies by server, so the type is
|
|
16
|
+
* matched by name). Values stay blank until the location answers.
|
|
17
|
+
*/
|
|
18
|
+
export function useLocationDetails(): LocationDetails {
|
|
19
|
+
const session = useSession();
|
|
20
|
+
const locationUuid = session?.sessionLocation?.uuid;
|
|
21
|
+
const [details, setDetails] = useState<LocationDetails>({});
|
|
22
|
+
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!locationUuid) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const abortController = new AbortController();
|
|
29
|
+
|
|
30
|
+
openmrsFetch(
|
|
31
|
+
`/ws/rest/v1/location/${locationUuid}?v=custom:(display,stateProvince,countyDistrict,attributes:(display,attributeType:(display)))`,
|
|
32
|
+
{ signal: abortController.signal },
|
|
33
|
+
)
|
|
34
|
+
.then(async (response) => {
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const location = await response.json();
|
|
40
|
+
const kmhfl = (location?.attributes ?? []).find((attribute: any) =>
|
|
41
|
+
/kmhfl|mfl|master health facility/i.test(attribute?.attributeType?.display ?? ''),
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
setDetails({
|
|
45
|
+
county: location?.stateProvince || undefined,
|
|
46
|
+
subCounty: location?.countyDistrict || undefined,
|
|
47
|
+
kmhflCode: kmhfl?.display || undefined,
|
|
48
|
+
});
|
|
49
|
+
})
|
|
50
|
+
.catch(() => {
|
|
51
|
+
/* the header simply keeps its blanks when the lookup fails */
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
return () => abortController.abort();
|
|
55
|
+
}, [locationUuid]);
|
|
56
|
+
|
|
57
|
+
return details;
|
|
58
|
+
}
|