From 6a96c1056ba68532de06fc42d97787afecb72c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Fri, 13 Feb 2026 14:09:36 +0100 Subject: [PATCH 1/3] fix: event and program status wip --- src/__demo__/PivotTable.event.stories.js | 41 +++ .../data/event/eventstatus.data.hidena.json | 208 ++++++++++++++ src/__demo__/data/event/eventstatus.data.json | 224 +++++++++++++++ .../data/event/eventstatus.data.org.json | 206 ++++++++++++++ .../data/event/eventstatus.visualization.json | 145 ++++++++++ src/__demo__/data/event/integer.data.json | 264 +++++++++++++++--- .../response/event/__tests__/response.spec.js | 28 +- src/modules/response/event/default.js | 10 +- src/modules/response/event/response.js | 35 ++- 9 files changed, 1108 insertions(+), 53 deletions(-) create mode 100644 src/__demo__/data/event/eventstatus.data.hidena.json create mode 100644 src/__demo__/data/event/eventstatus.data.json create mode 100644 src/__demo__/data/event/eventstatus.data.org.json create mode 100644 src/__demo__/data/event/eventstatus.visualization.json diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index e0fdd1e85..1c87c2386 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -13,6 +13,9 @@ import datetimeVisualization from './data/event/datetime.visualization.json' import emailDataHideNa from './data/event/email.data.hidena.json' import emailData from './data/event/email.data.json' import emailVisualization from './data/event/email.visualization.json' +import eventstatusDataHideNa from './data/event/eventstatus.data.hidena.json' +import eventstatusData from './data/event/eventstatus.data.json' +import eventstatusVisualization from './data/event/eventstatus.visualization.json' import integerDataHideNa from './data/event/integer.data.hidena.json' import integerData from './data/event/integer.data.json' import integerVisualization from './data/event/integer.visualization.json' @@ -385,3 +388,41 @@ export const Yesonly = (_, { pivotTableOptions }) => { } Yesonly.storyName = 'Yesonly' + +export const EventstatusNA = (_, { pivotTableOptions }) => { + const visualization = { + ...eventstatusVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +EventstatusNA.storyName = 'Eventstatus N/A' + +export const Eventstatus = (_, { pivotTableOptions }) => { + const visualization = { + ...eventstatusVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +Eventstatus.storyName = 'Eventstatus' diff --git a/src/__demo__/data/event/eventstatus.data.hidena.json b/src/__demo__/data/event/eventstatus.data.hidena.json new file mode 100644 index 000000000..d3516f732 --- /dev/null +++ b/src/__demo__/data/event/eventstatus.data.hidena.json @@ -0,0 +1,208 @@ +{ + "headers": [ + { + "name": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + }, + { + "name": "pe", + "column": "Period", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true + }, + { + "name": "A03MvHHogjR.ou", + "column": "Organisation unit", + "valueType": "ORGANISATION_UNIT", + "type": "org.hisp.dhis.organisationunit.OrganisationUnit", + "hidden": false, + "meta": true + }, + { + "name": "A03MvHHogjR.eventstatus", + "column": "Event status", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true + } + ], + "metaData": { + "pager": { + "page": 1, + "pageSize": 50, + "isLastPage": true + }, + "items": { + "202601": { + "name": "January 2026" + }, + "202602": { + "name": "February 2026" + }, + "202603": { + "name": "March 2026" + }, + "202604": { + "name": "April 2026" + }, + "202605": { + "name": "May 2026" + }, + "202606": { + "name": "June 2026" + }, + "202607": { + "name": "July 2026" + }, + "202608": { + "name": "August 2026" + }, + "202609": { + "name": "September 2026" + }, + "202610": { + "name": "October 2026" + }, + "202611": { + "name": "November 2026" + }, + "202612": { + "name": "December 2026" + }, + "IpHINAT79UW": { + "name": "Child Programme" + }, + "ZzYYXq4fJie": { + "name": "Baby Postnatal" + }, + "USER_ORGUNIT": { + "organisationUnits": [ + "ImspTQPwCqd" + ] + }, + "A03MvHHogjR.ou": { + "name": "Organisation unit" + }, + "A03MvHHogjR.eventstatus": { + "name": "Event status" + }, + "pe": {}, + "A03MvHHogjR": { + "name": "Birth" + } + }, + "dimensions": { + "A03MvHHogjR.eventstatus": [ + "A03MvHHogjR.eventstatus_ACTIVE" + ], + "pe": [ + "202601", + "202602", + "202603", + "202604", + "202605", + "202606", + "202607", + "202608", + "202609", + "202610", + "202611", + "202612" + ], + "A03MvHHogjR.ou": [ + "ImspTQPwCqd" + ] + } + }, + "rowContext": {}, + "height": 12, + "headerWidth": 4, + "width": 4, + "rows": [ + [ + "949", + "202601", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "841", + "202602", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "1007", + "202603", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "932", + "202604", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "866", + "202605", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "897", + "202606", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "950", + "202607", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "968", + "202608", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "837", + "202609", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "973", + "202610", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "925", + "202611", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "858", + "202612", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "12", + "202601", + "ImspTQPwCqd", + "" + ] + ] +} \ No newline at end of file diff --git a/src/__demo__/data/event/eventstatus.data.json b/src/__demo__/data/event/eventstatus.data.json new file mode 100644 index 000000000..883a1e07d --- /dev/null +++ b/src/__demo__/data/event/eventstatus.data.json @@ -0,0 +1,224 @@ +{ + "headers": [ + { + "name": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + }, + { + "name": "pe", + "column": "Period", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true + }, + { + "name": "A03MvHHogjR.ou", + "column": "Organisation unit", + "valueType": "ORGANISATION_UNIT", + "type": "org.hisp.dhis.organisationunit.OrganisationUnit", + "hidden": false, + "meta": true + }, + { + "name": "A03MvHHogjR.eventstatus", + "column": "Event status", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true + } + ], + "metaData": { + "pager": { + "page": 1, + "pageSize": 50, + "isLastPage": true + }, + "items": { + "202601": { + "name": "January 2026" + }, + "202602": { + "name": "February 2026" + }, + "202603": { + "name": "March 2026" + }, + "202604": { + "name": "April 2026" + }, + "202605": { + "name": "May 2026" + }, + "202606": { + "name": "June 2026" + }, + "202607": { + "name": "July 2026" + }, + "202608": { + "name": "August 2026" + }, + "202609": { + "name": "September 2026" + }, + "202610": { + "name": "October 2026" + }, + "202611": { + "name": "November 2026" + }, + "202612": { + "name": "December 2026" + }, + "IpHINAT79UW": { + "name": "Child Programme" + }, + "ZzYYXq4fJie": { + "name": "Baby Postnatal" + }, + "USER_ORGUNIT": { + "organisationUnits": [ + "ImspTQPwCqd" + ] + }, + "A03MvHHogjR.ou": { + "name": "Organisation unit" + }, + "A03MvHHogjR.eventstatus": { + "name": "Event status" + }, + "pe": {}, + "ImspTQPwCqd": { + "name": "Sierra Leone" + }, + "A03MvHHogjR": { + "name": "Birth" + }, + "A03MvHHogjR.eventstatus_ACTIVE": { + "name": "Active" + }, + "": { + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } + } + }, + "dimensions": { + "A03MvHHogjR.eventstatus": [ + "A03MvHHogjR.eventstatus_ACTIVE", + "" + ], + "pe": [ + "202601", + "202602", + "202603", + "202604", + "202605", + "202606", + "202607", + "202608", + "202609", + "202610", + "202611", + "202612" + ], + "A03MvHHogjR.ou": [ + "ImspTQPwCqd" + ] + } + }, + "rowContext": {}, + "height": 12, + "headerWidth": 4, + "width": 4, + "rows": [ + [ + "949", + "202601", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "841", + "202602", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "1007", + "202603", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "932", + "202604", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "866", + "202605", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "897", + "202606", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "950", + "202607", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "968", + "202608", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "837", + "202609", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "973", + "202610", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "925", + "202611", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "858", + "202612", + "ImspTQPwCqd", + "A03MvHHogjR.eventstatus_ACTIVE" + ], + [ + "12", + "202601", + "ImspTQPwCqd", + "" + ] + ] +} \ No newline at end of file diff --git a/src/__demo__/data/event/eventstatus.data.org.json b/src/__demo__/data/event/eventstatus.data.org.json new file mode 100644 index 000000000..bea202d3b --- /dev/null +++ b/src/__demo__/data/event/eventstatus.data.org.json @@ -0,0 +1,206 @@ +{ + "headers": [ + { + "name": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + }, + { + "name": "pe", + "column": "Period", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true + }, + { + "name": "A03MvHHogjR.ou", + "column": "Organisation unit", + "valueType": "ORGANISATION_UNIT", + "type": "org.hisp.dhis.organisationunit.OrganisationUnit", + "hidden": false, + "meta": true + }, + { + "name": "A03MvHHogjR.eventstatus", + "column": "Event status", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true + } + ], + "metaData": { + "pager": { + "page": 1, + "pageSize": 50, + "isLastPage": true + }, + "items": { + "202601": { + "name": "January 2026" + }, + "202602": { + "name": "February 2026" + }, + "202603": { + "name": "March 2026" + }, + "202604": { + "name": "April 2026" + }, + "202605": { + "name": "May 2026" + }, + "202606": { + "name": "June 2026" + }, + "202607": { + "name": "July 2026" + }, + "202608": { + "name": "August 2026" + }, + "202609": { + "name": "September 2026" + }, + "202610": { + "name": "October 2026" + }, + "202611": { + "name": "November 2026" + }, + "202612": { + "name": "December 2026" + }, + "IpHINAT79UW": { + "name": "Child Programme" + }, + "ZzYYXq4fJie": { + "name": "Baby Postnatal" + }, + "USER_ORGUNIT": { + "organisationUnits": [ + "ImspTQPwCqd" + ] + }, + "A03MvHHogjR.ou": { + "name": "Organisation unit" + }, + "A03MvHHogjR.eventstatus": { + "name": "Event status" + }, + "pe": {}, + "A03MvHHogjR": { + "name": "Birth" + } + }, + "dimensions": { + "A03MvHHogjR.eventstatus": [], + "pe": [ + "202601", + "202602", + "202603", + "202604", + "202605", + "202606", + "202607", + "202608", + "202609", + "202610", + "202611", + "202612" + ], + "A03MvHHogjR.ou": [ + "ImspTQPwCqd" + ] + } + }, + "rowContext": {}, + "height": 12, + "headerWidth": 4, + "width": 4, + "rows": [ + [ + "949", + "202601", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "841", + "202602", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "1007", + "202603", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "932", + "202604", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "866", + "202605", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "897", + "202606", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "950", + "202607", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "968", + "202608", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "837", + "202609", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "973", + "202610", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "925", + "202611", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "858", + "202612", + "ImspTQPwCqd", + "ACTIVE" + ], + [ + "12", + "202601", + "ImspTQPwCqd", + "" + ] + ] +} \ No newline at end of file diff --git a/src/__demo__/data/event/eventstatus.visualization.json b/src/__demo__/data/event/eventstatus.visualization.json new file mode 100644 index 000000000..c1c8f5b95 --- /dev/null +++ b/src/__demo__/data/event/eventstatus.visualization.json @@ -0,0 +1,145 @@ +{ + "name": "Event status", + "created": "2025-07-02T10:27:50.483", + "lastUpdated": "2025-07-02T10:27:50.483", + "translations": [], + "createdBy": { + "id": "xE7jOejl9FI", + "code": null, + "name": "John Traore", + "displayName": "John Traore", + "username": "admin" + }, + "favorites": [], + "lastUpdatedBy": { + "id": "xE7jOejl9FI", + "code": null, + "name": "John Traore", + "displayName": "John Traore", + "username": "admin" + }, + "sharing": { + "owner": "xE7jOejl9FI", + "external": false, + "users": {}, + "userGroups": {}, + "public": "rw------" + }, + "regressionType": "NONE", + "displayDensity": "NORMAL", + "fontSize": "NORMAL", + "sortOrder": 0, + "topLimit": 0, + "hideEmptyRows": false, + "showHierarchy": false, + "completedOnly": false, + "skipRounding": false, + "dataDimensionItems": [], + "dataElementGroupSetDimensions": [], + "organisationUnitGroupSetDimensions": [], + "categoryDimensions": [], + "categoryOptionGroupSetDimensions": [], + "attributeDimensions": [], + "programIndicatorDimensions": [], + "subscribers": [], + "digitGroupSeparator": "SPACE", + "hideEmptyRowItems": "NONE", + "hideLegend": false, + "noSpaceBetweenColumns": false, + "cumulativeValues": false, + "percentStackedValues": false, + "showData": false, + "colTotals": true, + "rowTotals": true, + "rowSubTotals": true, + "colSubTotals": true, + "hideTitle": false, + "hideSubtitle": false, + "showDimensionLabels": true, + "interpretations": [], + "program": { + "enrollmentDateLabel": "Date of enrollment", + "incidentDateLabel": "Date of birth", + "id": "IpHINAT79UW", + "name": "Child Programme" + }, + "programStage": { + "executionDateLabel": "Report date", + "id": "A03MvHHogjR", + "name": "Birth" + }, + "dataType": "AGGREGATED_VALUES", + "outputType": "EVENT", + "collapseDataDimensions": false, + "hideNaData": false, + "simpleDimensions": [ + { + "parent": "COLUMN", + "dimension": "ou", + "values": [ + "ImspTQPwCqd" + ] + } + ], + "legacy": true, + "type": "PIVOT_TABLE", + "filters": [], + "parentGraphMap": { + "ImspTQPwCqd": "" + }, + "columns": [ + { + "items": [ + { + "dimensionItemType": "ORGANISATION_UNIT", + "name": "Sierra Leone", + "id": "ImspTQPwCqd" + } + ], + "dimension": "A03MvHHogjR.ou", + "programStage": { + "id": "A03MvHHogjR" + } + }, + { + "items": [], + "programStage": { + "id": "A03MvHHogjR" + }, + "dimension": "A03MvHHogjR.eventstatus" + } + ], + "rows": [ + { + "items": [ + { + "dimensionItemType": "PERIOD", + "id": "MONTHS_THIS_YEAR", + "name": "MONTHS_THIS_YEAR" + } + ], + "dimension": "pe" + } + ], + "displayName": "Email", + "access": { + "manage": true, + "externalize": true, + "write": true, + "read": true, + "update": true, + "delete": true + }, + "user": { + "id": "xE7jOejl9FI", + "code": null, + "name": "John Traore", + "displayName": "John Traore", + "username": "admin" + }, + "favorite": false, + "subscribed": false, + "displayFormName": "Email", + "id": "xLPn5T11Vd4", + "attributeValues": [] +} \ No newline at end of file diff --git a/src/__demo__/data/event/integer.data.json b/src/__demo__/data/event/integer.data.json index fc8d9f0e6..1a45381e8 100644 --- a/src/__demo__/data/event/integer.data.json +++ b/src/__demo__/data/event/integer.data.json @@ -112,7 +112,11 @@ } }, "dimensions": { - "pe": ["202503", "202504", "202505"], + "pe": [ + "202503", + "202504", + "202505" + ], "Zj7UnCAulEk.qrur9Dvnyt5": [ "Zj7UnCAulEk.qrur9Dvnyt5_0", "Zj7UnCAulEk.qrur9Dvnyt5_1", @@ -127,49 +131,231 @@ "Zj7UnCAulEk.qrur9Dvnyt5_10", "" ], - "ou": ["ImspTQPwCqd"] + "ou": [ + "ImspTQPwCqd" + ] } }, "rowContext": {}, "width": 4, "rows": [ - ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202505", "67"], - ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202503", "70"], - ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202505", "65"], - ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202505", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202503", "56"], - ["", "ImspTQPwCqd", "202505", "5"], - ["", "ImspTQPwCqd", "202504", "12"], - ["", "ImspTQPwCqd", "202503", "10"] + [ + "Zj7UnCAulEk.qrur9Dvnyt5_8", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_3", + "ImspTQPwCqd", + "202505", + "67" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_0", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_5", + "ImspTQPwCqd", + "202503", + "70" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_10", + "ImspTQPwCqd", + "202505", + "61" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_7", + "ImspTQPwCqd", + "202505", + "52" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_9", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_6", + "ImspTQPwCqd", + "202505", + "65" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_9", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_6", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_2", + "ImspTQPwCqd", + "202504", + "45" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_10", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_2", + "ImspTQPwCqd", + "202505", + "51" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_3", + "ImspTQPwCqd", + "202504", + "38" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_2", + "ImspTQPwCqd", + "202503", + "41" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_8", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_7", + "ImspTQPwCqd", + "202504", + "40" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_4", + "ImspTQPwCqd", + "202505", + "41" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_4", + "ImspTQPwCqd", + "202504", + "42" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_9", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_0", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_8", + "ImspTQPwCqd", + "202505", + "43" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_5", + "ImspTQPwCqd", + "202504", + "63" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_6", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_4", + "ImspTQPwCqd", + "202503", + "54" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_10", + "ImspTQPwCqd", + "202504", + "46" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_1", + "ImspTQPwCqd", + "202503", + "44" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_7", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_5", + "ImspTQPwCqd", + "202505", + "46" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_0", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_1", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_1", + "ImspTQPwCqd", + "202505", + "53" + ], + [ + "Zj7UnCAulEk.qrur9Dvnyt5_3", + "ImspTQPwCqd", + "202503", + "56" + ], + [ + "", + "ImspTQPwCqd", + "202505", + "5" + ], + [ + "", + "ImspTQPwCqd", + "202504", + "12" + ], + [ + "", + "ImspTQPwCqd", + "202503", + "10" + ] ], "height": 267, "headerWidth": 4 -} +} \ No newline at end of file diff --git a/src/modules/response/event/__tests__/response.spec.js b/src/modules/response/event/__tests__/response.spec.js index 8566ef653..dea5ecfd5 100644 --- a/src/modules/response/event/__tests__/response.spec.js +++ b/src/modules/response/event/__tests__/response.spec.js @@ -10,6 +10,9 @@ import responseDatetimeOrg from '../../../../__demo__/data/event/datetime.data.o import responseTextHideNa from '../../../../__demo__/data/event/email.data.hidena.json' import responseText from '../../../../__demo__/data/event/email.data.json' import responseTextOrg from '../../../../__demo__/data/event/email.data.org.json' +import responseEventstatusHideNa from '../../../../__demo__/data/event/eventstatus.data.hidena.json' +import responseEventstatus from '../../../../__demo__/data/event/eventstatus.data.json' +import responseEventstatusOrg from '../../../../__demo__/data/event/eventstatus.data.org.json' import responseNumericHideNa from '../../../../__demo__/data/event/integer.data.hidena.json' import responseNumeric from '../../../../__demo__/data/event/integer.data.json' import responseNumericOrg from '../../../../__demo__/data/event/integer.data.org.json' @@ -30,9 +33,20 @@ import { VALUE_TYPE_PERCENTAGE, VALUE_TYPE_TRUE_ONLY, } from '../../../valueTypes.js' -import { getItemFormatterByValueType, transformResponse } from '../response.js' +import { getItemFormatterByHeaderName, getItemFormatterByValueType, transformResponse } from '../response.js' describe('response', () => { + describe('getItemFormatterByHeaderName', () => { + it('should return the correct formatter and format correctly', () => { + expect(getItemFormatterByHeaderName('eventstatus')('ACTIVE')).toBe('Active') + expect(getItemFormatterByHeaderName('eventstatus')('COMPLETED')).toBe('Completed') + expect(getItemFormatterByHeaderName('eventstatus')('SCHEDULE')).toBe('Scheduled') + expect(getItemFormatterByHeaderName('programstatus')('ACTIVE')).toBe('Active') + expect(getItemFormatterByHeaderName('programstatus')('COMPLETED')).toBe('Completed') + expect(getItemFormatterByHeaderName('programstatus')('CANCELLED')).toBe('Cancelled') + }) + }) + describe('getItemFormatterByValueType', () => { it('should return the correct formatter and format correctly', () => { expect(getItemFormatterByValueType(VALUE_TYPE_BOOLEAN)('1')).toBe( @@ -178,5 +192,17 @@ describe('response', () => { ).toEqual(responseYesOnlyHideNa) }) }) + + describe('eventstatus', () => { + it('transforms response', () => { + expect(transformResponse(responseEventstatusOrg)).toEqual(responseEventstatus) + }) + + it('transforms response and hides N/A data', () => { + expect( + transformResponse(responseEventstatusOrg, { hideNaData: true }) + ).toEqual(responseEventstatusHideNa) + }) + }) }) }) diff --git a/src/modules/response/event/default.js b/src/modules/response/event/default.js index f98e71e67..fc9f818ed 100644 --- a/src/modules/response/event/default.js +++ b/src/modules/response/event/default.js @@ -10,12 +10,12 @@ export const getUnique = (array) => [...new Set(array)] export const getValuesUniqueSortedAsc = (values, valueType = VALUE_TYPE_TEXT) => isNumericValueType(valueType) || isBooleanValueType(valueType) ? getUnique(values) - .map((x) => [Number(x), x]) - .sort((a, b) => a[0] - b[0]) - .map((arr) => arr[1]) + .map((x) => [Number(x), x]) + .sort((a, b) => a[0] - b[0]) + .map((arr) => arr[1]) : getUnique(values) - .slice() - .sort((a, b) => a.localeCompare(b)) + .slice() + .sort((a, b) => a.localeCompare(b)) export const getPrefixedValue = (value, prefix) => `${prefix}${PREFIX_SEPARATOR}${value}` diff --git a/src/modules/response/event/response.js b/src/modules/response/event/response.js index b25f8ad7b..c36f051a7 100644 --- a/src/modules/response/event/response.js +++ b/src/modules/response/event/response.js @@ -41,6 +41,24 @@ export const UNSUPPORTED_VALUE_TYPES = [ VALUE_TYPE_REFERENCE, ] +const STATUSES = { + ACTIVE: i18n.t('Active'), + COMPLETED: i18n.t('Completed'), + SCHEDULE: i18n.t('Scheduled'), + CANCELLED: i18n.t('Cancelled'), +} + +export const getItemFormatter = ({ name, valueType }) => + getItemFormatterByHeaderName(name) || getItemFormatterByValueType(valueType) + +export const getItemFormatterByHeaderName = name => { + if (name.endsWith("eventstatus") || name.endsWith("programstatus")) { + return n => STATUSES[n] || n + } + + return undefined +} + export const getItemFormatterByValueType = (valueType) => { switch (valueType) { case VALUE_TYPE_AGE: @@ -58,6 +76,12 @@ export const getItemFormatterByValueType = (valueType) => { } } +const includeHeaderChecks = [ + header => Boolean(header.meta), + header => header.name !== DIMENSION_ID_PERIOD, + header => header.name !== DIMENSION_ID_ORGUNIT && !header.name.endsWith('.ou') +] + export const transformResponse = (response, { hideNaData = false } = {}) => { // Do not modify the original response // Rows is mapped by the handlers @@ -82,17 +106,14 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { index, })) .filter( - (header) => - Boolean(header.meta) && - ![DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT].includes( - header.name - ) + (header) => includeHeaderChecks.every(check => check(header)) ) // Legendsets use uids and do not need transformation // Skip unsupported value types // Option set and Boolean have separate handlers // All other types use default handler with specific item formatter + console.log("metaHeaders", metaHeaders) metaHeaders.forEach((header) => { if ( !( @@ -110,9 +131,7 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { transformedResponse, header.index, { - itemFormatter: getItemFormatterByValueType( - header.valueType - ), + itemFormatter: getItemFormatter(header) } ) } From 66b84a5c5c539f397800952d4eca2a961bef191e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 26 Feb 2026 11:44:44 +0100 Subject: [PATCH 2/3] fix: transform eventstatus programstatus --- .../data/event/eventstatus.data.hidena.json | 192 +++++------------ src/__demo__/data/event/eventstatus.data.json | 196 +++++------------- .../data/event/eventstatus.data.org.json | 191 +++++------------ .../data/event/eventstatus.visualization.json | 17 +- src/modules/response/event/response.js | 12 +- 5 files changed, 179 insertions(+), 429 deletions(-) diff --git a/src/__demo__/data/event/eventstatus.data.hidena.json b/src/__demo__/data/event/eventstatus.data.hidena.json index d3516f732..3c5631b0e 100644 --- a/src/__demo__/data/event/eventstatus.data.hidena.json +++ b/src/__demo__/data/event/eventstatus.data.hidena.json @@ -1,21 +1,5 @@ { "headers": [ - { - "name": "value", - "column": "Value", - "valueType": "NUMBER", - "type": "java.lang.Double", - "hidden": false, - "meta": false - }, - { - "name": "pe", - "column": "Period", - "valueType": "TEXT", - "type": "java.lang.String", - "hidden": false, - "meta": true - }, { "name": "A03MvHHogjR.ou", "column": "Organisation unit", @@ -24,6 +8,14 @@ "hidden": false, "meta": true }, + { + "name": "A03MvHHogjR.eventdate", + "column": "Report date", + "valueType": "DATE", + "type": "java.time.LocalDate", + "hidden": false, + "meta": true + }, { "name": "A03MvHHogjR.eventstatus", "column": "Event status", @@ -31,50 +23,38 @@ "type": "java.lang.String", "hidden": false, "meta": true + }, + { + "name": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false } ], "metaData": { - "pager": { - "page": 1, - "pageSize": 50, - "isLastPage": true - }, "items": { - "202601": { - "name": "January 2026" - }, - "202602": { - "name": "February 2026" - }, - "202603": { - "name": "March 2026" + "202511": { + "name": "202511" }, - "202604": { - "name": "April 2026" + "202512": { + "name": "202512" }, - "202605": { - "name": "May 2026" - }, - "202606": { - "name": "June 2026" - }, - "202607": { - "name": "July 2026" - }, - "202608": { - "name": "August 2026" + "202601": { + "name": "202601" }, - "202609": { - "name": "September 2026" + "ImspTQPwCqd": { + "name": "Sierra Leone" }, - "202610": { - "name": "October 2026" + "A03MvHHogjR.eventdate": { + "name": "Report date" }, - "202611": { - "name": "November 2026" + "A03MvHHogjR.eventstatus": { + "name": "Event status" }, - "202612": { - "name": "December 2026" + "A03MvHHogjR.eventstatus_ACTIVE": { + "name": "Active" }, "IpHINAT79UW": { "name": "Child Programme" @@ -87,122 +67,56 @@ "ImspTQPwCqd" ] }, - "A03MvHHogjR.ou": { - "name": "Organisation unit" - }, - "A03MvHHogjR.eventstatus": { - "name": "Event status" - }, - "pe": {}, "A03MvHHogjR": { "name": "Birth" + }, + "A03MvHHogjR.ou": { + "name": "Organisation unit" } }, "dimensions": { + "A03MvHHogjR.eventdate": [ + "202511", + "202512", + "202601" + ], "A03MvHHogjR.eventstatus": [ "A03MvHHogjR.eventstatus_ACTIVE" ], - "pe": [ - "202601", - "202602", - "202603", - "202604", - "202605", - "202606", - "202607", - "202608", - "202609", - "202610", - "202611", - "202612" - ], + "pe": [], "A03MvHHogjR.ou": [ "ImspTQPwCqd" ] } }, "rowContext": {}, - "height": 12, - "headerWidth": 4, "width": 4, + "headerWidth": 4, + "height": 3, "rows": [ [ - "949", - "202601", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "841", - "202602", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "1007", - "202603", "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" + "202511", + "A03MvHHogjR.eventstatus_ACTIVE", + "925" ], [ - "932", - "202604", "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" + "202512", + "A03MvHHogjR.eventstatus_ACTIVE", + "858" ], [ - "866", - "202605", "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "897", - "202606", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "950", - "202607", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "968", - "202608", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "837", - "202609", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "973", - "202610", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "925", - "202611", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "858", - "202612", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" + "202601", + "A03MvHHogjR.eventstatus_ACTIVE", + "690" ], [ - "12", - "202601", "ImspTQPwCqd", - "" + "202511", + "", + "12" ] ] } \ No newline at end of file diff --git a/src/__demo__/data/event/eventstatus.data.json b/src/__demo__/data/event/eventstatus.data.json index 883a1e07d..21e306b6c 100644 --- a/src/__demo__/data/event/eventstatus.data.json +++ b/src/__demo__/data/event/eventstatus.data.json @@ -1,21 +1,5 @@ { "headers": [ - { - "name": "value", - "column": "Value", - "valueType": "NUMBER", - "type": "java.lang.Double", - "hidden": false, - "meta": false - }, - { - "name": "pe", - "column": "Period", - "valueType": "TEXT", - "type": "java.lang.String", - "hidden": false, - "meta": true - }, { "name": "A03MvHHogjR.ou", "column": "Organisation unit", @@ -24,6 +8,14 @@ "hidden": false, "meta": true }, + { + "name": "A03MvHHogjR.eventdate", + "column": "Report date", + "valueType": "DATE", + "type": "java.time.LocalDate", + "hidden": false, + "meta": true + }, { "name": "A03MvHHogjR.eventstatus", "column": "Event status", @@ -31,50 +23,38 @@ "type": "java.lang.String", "hidden": false, "meta": true + }, + { + "name": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false } ], "metaData": { - "pager": { - "page": 1, - "pageSize": 50, - "isLastPage": true - }, "items": { - "202601": { - "name": "January 2026" - }, - "202602": { - "name": "February 2026" - }, - "202603": { - "name": "March 2026" - }, - "202604": { - "name": "April 2026" - }, - "202605": { - "name": "May 2026" - }, - "202606": { - "name": "June 2026" + "202511": { + "name": "202511" }, - "202607": { - "name": "July 2026" + "202512": { + "name": "202512" }, - "202608": { - "name": "August 2026" + "202601": { + "name": "202601" }, - "202609": { - "name": "September 2026" + "ImspTQPwCqd": { + "name": "Sierra Leone" }, - "202610": { - "name": "October 2026" + "A03MvHHogjR.eventdate": { + "name": "Report date" }, - "202611": { - "name": "November 2026" + "A03MvHHogjR.eventstatus": { + "name": "Event status" }, - "202612": { - "name": "December 2026" + "A03MvHHogjR.eventstatus_ACTIVE": { + "name": "Active" }, "IpHINAT79UW": { "name": "Child Programme" @@ -87,21 +67,11 @@ "ImspTQPwCqd" ] }, - "A03MvHHogjR.ou": { - "name": "Organisation unit" - }, - "A03MvHHogjR.eventstatus": { - "name": "Event status" - }, - "pe": {}, - "ImspTQPwCqd": { - "name": "Sierra Leone" - }, "A03MvHHogjR": { "name": "Birth" }, - "A03MvHHogjR.eventstatus_ACTIVE": { - "name": "Active" + "A03MvHHogjR.ou": { + "name": "Organisation unit" }, "": { "name": "No value", @@ -114,111 +84,49 @@ } }, "dimensions": { + "A03MvHHogjR.eventdate": [ + "202511", + "202512", + "202601" + ], "A03MvHHogjR.eventstatus": [ "A03MvHHogjR.eventstatus_ACTIVE", "" ], - "pe": [ - "202601", - "202602", - "202603", - "202604", - "202605", - "202606", - "202607", - "202608", - "202609", - "202610", - "202611", - "202612" - ], + "pe": [], "A03MvHHogjR.ou": [ "ImspTQPwCqd" ] } }, "rowContext": {}, - "height": 12, - "headerWidth": 4, "width": 4, + "headerWidth": 4, + "height": 3, "rows": [ [ - "949", - "202601", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "841", - "202602", "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" + "202511", + "A03MvHHogjR.eventstatus_ACTIVE", + "925" ], [ - "1007", - "202603", "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" + "202512", + "A03MvHHogjR.eventstatus_ACTIVE", + "858" ], [ - "932", - "202604", "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "866", - "202605", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "897", - "202606", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "950", - "202607", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "968", - "202608", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "837", - "202609", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "973", - "202610", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "925", - "202611", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" - ], - [ - "858", - "202612", - "ImspTQPwCqd", - "A03MvHHogjR.eventstatus_ACTIVE" + "202601", + "A03MvHHogjR.eventstatus_ACTIVE", + "690" ], [ - "12", - "202601", "ImspTQPwCqd", - "" + "202511", + "", + "12" ] ] } \ No newline at end of file diff --git a/src/__demo__/data/event/eventstatus.data.org.json b/src/__demo__/data/event/eventstatus.data.org.json index bea202d3b..23823ef9a 100644 --- a/src/__demo__/data/event/eventstatus.data.org.json +++ b/src/__demo__/data/event/eventstatus.data.org.json @@ -1,21 +1,5 @@ { "headers": [ - { - "name": "value", - "column": "Value", - "valueType": "NUMBER", - "type": "java.lang.Double", - "hidden": false, - "meta": false - }, - { - "name": "pe", - "column": "Period", - "valueType": "TEXT", - "type": "java.lang.String", - "hidden": false, - "meta": true - }, { "name": "A03MvHHogjR.ou", "column": "Organisation unit", @@ -24,6 +8,14 @@ "hidden": false, "meta": true }, + { + "name": "A03MvHHogjR.eventdate", + "column": "Report date", + "valueType": "DATE", + "type": "java.time.LocalDate", + "hidden": false, + "meta": true + }, { "name": "A03MvHHogjR.eventstatus", "column": "Event status", @@ -31,50 +23,35 @@ "type": "java.lang.String", "hidden": false, "meta": true + }, + { + "name": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false } ], "metaData": { - "pager": { - "page": 1, - "pageSize": 50, - "isLastPage": true - }, "items": { - "202601": { - "name": "January 2026" - }, - "202602": { - "name": "February 2026" - }, - "202603": { - "name": "March 2026" + "202511": { + "name": "202511" }, - "202604": { - "name": "April 2026" + "202512": { + "name": "202512" }, - "202605": { - "name": "May 2026" - }, - "202606": { - "name": "June 2026" - }, - "202607": { - "name": "July 2026" - }, - "202608": { - "name": "August 2026" - }, - "202609": { - "name": "September 2026" + "202601": { + "name": "202601" }, - "202610": { - "name": "October 2026" + "ImspTQPwCqd": { + "name": "Sierra Leone" }, - "202611": { - "name": "November 2026" + "A03MvHHogjR.eventdate": { + "name": "Report date" }, - "202612": { - "name": "December 2026" + "A03MvHHogjR.eventstatus": { + "name": "Event status" }, "IpHINAT79UW": { "name": "Child Programme" @@ -87,120 +64,54 @@ "ImspTQPwCqd" ] }, - "A03MvHHogjR.ou": { - "name": "Organisation unit" - }, - "A03MvHHogjR.eventstatus": { - "name": "Event status" - }, - "pe": {}, "A03MvHHogjR": { "name": "Birth" + }, + "A03MvHHogjR.ou": { + "name": "Organisation unit" } }, "dimensions": { - "A03MvHHogjR.eventstatus": [], - "pe": [ - "202601", - "202602", - "202603", - "202604", - "202605", - "202606", - "202607", - "202608", - "202609", - "202610", - "202611", - "202612" + "A03MvHHogjR.eventdate": [ + "202511", + "202512", + "202601" ], + "A03MvHHogjR.eventstatus": [], + "pe": [], "A03MvHHogjR.ou": [ "ImspTQPwCqd" ] } }, "rowContext": {}, - "height": 12, - "headerWidth": 4, "width": 4, + "headerWidth": 4, + "height": 3, "rows": [ [ - "949", - "202601", - "ImspTQPwCqd", - "ACTIVE" - ], - [ - "841", - "202602", - "ImspTQPwCqd", - "ACTIVE" - ], - [ - "1007", - "202603", - "ImspTQPwCqd", - "ACTIVE" - ], - [ - "932", - "202604", "ImspTQPwCqd", - "ACTIVE" + "202511", + "ACTIVE", + "925" ], [ - "866", - "202605", "ImspTQPwCqd", - "ACTIVE" + "202512", + "ACTIVE", + "858" ], [ - "897", - "202606", "ImspTQPwCqd", - "ACTIVE" - ], - [ - "950", - "202607", - "ImspTQPwCqd", - "ACTIVE" - ], - [ - "968", - "202608", - "ImspTQPwCqd", - "ACTIVE" - ], - [ - "837", - "202609", - "ImspTQPwCqd", - "ACTIVE" - ], - [ - "973", - "202610", - "ImspTQPwCqd", - "ACTIVE" - ], - [ - "925", - "202611", - "ImspTQPwCqd", - "ACTIVE" - ], - [ - "858", - "202612", - "ImspTQPwCqd", - "ACTIVE" + "202601", + "ACTIVE", + "690" ], [ - "12", - "202601", "ImspTQPwCqd", - "" + "202511", + "", + "12" ] ] } \ No newline at end of file diff --git a/src/__demo__/data/event/eventstatus.visualization.json b/src/__demo__/data/event/eventstatus.visualization.json index c1c8f5b95..04dd512b6 100644 --- a/src/__demo__/data/event/eventstatus.visualization.json +++ b/src/__demo__/data/event/eventstatus.visualization.json @@ -91,7 +91,6 @@ { "items": [ { - "dimensionItemType": "ORGANISATION_UNIT", "name": "Sierra Leone", "id": "ImspTQPwCqd" } @@ -114,11 +113,21 @@ "items": [ { "dimensionItemType": "PERIOD", - "id": "MONTHS_THIS_YEAR", - "name": "MONTHS_THIS_YEAR" + "id": "202512" + }, + { + "dimensionItemType": "PERIOD", + "id": "202511" + }, + { + "dimensionItemType": "PERIOD", + "id": "202510" } ], - "dimension": "pe" + "dimension": "A03MvHHogjR.eventdate", + "programStage": { + "id": "A03MvHHogjR" + } } ], "displayName": "Email", diff --git a/src/modules/response/event/response.js b/src/modules/response/event/response.js index c36f051a7..499975d30 100644 --- a/src/modules/response/event/response.js +++ b/src/modules/response/event/response.js @@ -52,7 +52,7 @@ export const getItemFormatter = ({ name, valueType }) => getItemFormatterByHeaderName(name) || getItemFormatterByValueType(valueType) export const getItemFormatterByHeaderName = name => { - if (name.endsWith("eventstatus") || name.endsWith("programstatus")) { + if (name.endsWith('eventstatus') || name.endsWith('programstatus')) { return n => STATUSES[n] || n } @@ -79,7 +79,15 @@ export const getItemFormatterByValueType = (valueType) => { const includeHeaderChecks = [ header => Boolean(header.meta), header => header.name !== DIMENSION_ID_PERIOD, - header => header.name !== DIMENSION_ID_ORGUNIT && !header.name.endsWith('.ou') + header => header.name !== DIMENSION_ID_ORGUNIT, + header => !header.name.endsWith('.eventdate'), + header => !header.name.endsWith('.enrollmentdate'), + header => !header.name.endsWith('.scheduleddate'), + header => !header.name.endsWith('.incidentdate'), + header => header.name !== 'lastupdated', + header => header.name !== 'created', + header => header.name !== 'completed', + header => !header.name.endsWith('.ou') ] export const transformResponse = (response, { hideNaData = false } = {}) => { From 65c35aa934123b98710ba3b182e3045b84a476f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Fri, 27 Feb 2026 11:02:16 +0100 Subject: [PATCH 3/3] fix: map vis id to header --- .../data/event/integer.visualization.json | 6 +- src/modules/dimensions.js | 75 +++++++++++++++++++ .../eventVisualization/eventVisualization.js | 35 +++++++++ 3 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 src/modules/dimensions.js create mode 100644 src/modules/eventVisualization/eventVisualization.js diff --git a/src/__demo__/data/event/integer.visualization.json b/src/__demo__/data/event/integer.visualization.json index 9f2d66272..4f4885cdf 100644 --- a/src/__demo__/data/event/integer.visualization.json +++ b/src/__demo__/data/event/integer.visualization.json @@ -87,7 +87,9 @@ { "parent": "COLUMN", "dimension": "ou", - "values": ["ImspTQPwCqd"] + "values": [ + "ImspTQPwCqd" + ] } ], "legacy": true, @@ -160,4 +162,4 @@ "displayFormName": "Integer", "id": "kNl4fqsY9hJ", "attributeValues": [] -} +} \ No newline at end of file diff --git a/src/modules/dimensions.js b/src/modules/dimensions.js new file mode 100644 index 000000000..1a1dbc4f1 --- /dev/null +++ b/src/modules/dimensions.js @@ -0,0 +1,75 @@ +const EVENT_DIMENSIONS = [ + { + vis: 'ou', + dim: 'ou', + header: 'ouname', + }, + { + vis: 'eventDate', + dim: 'EVENT_DATE', + header: 'eventdate', + }, + { + vis: 'enrollmentDate', + dim: 'ENROLLMENT_DATE', + header: 'enrollmentdate', + }, + { + vis: 'scheduledDate', + dim: 'SCHEDULED_DATE', + header: 'scheduleddate', + }, + { + vis: 'incidentDate', + dim: 'INCIDENT_DATE', + header: 'incidentdate', + }, + { + vis: 'lastUpdated', + dim: 'LAST_UPDATED', + header: 'lastupdated', + }, + { + vis: 'created', + dim: 'CREATED', + header: 'created', + }, + { + vis: 'completed', + dim: 'COMPLETED', + header: 'completed', + }, + { + vis: 'eventStatus', + dim: 'EVENT_STATUS', + header: 'eventstatus', + }, + { + vis: 'programStatus', + dim: 'PROGRAM_STATUS', + header: 'programstatus', + }, + { + vis: 'enrollmentOu', + dim: 'ENROLLMENT_OU', + header: 'enrollmentouname', + }, + { + vis: 'createdBy', + dim: '', + header: 'createdbydisplayname', + }, + { + vis: 'lastUpdatedBy', + dim: '', + header: 'lastupdatedbydisplayname', + }, + { + vis: 'createdBy', + dim: '', + header: 'createdbydisplayname', + }, +] + +export const getHeaderByVis = (vis) => + EVENT_DIMENSIONS.find((d) => d.vis === vis)?.header \ No newline at end of file diff --git a/src/modules/eventVisualization/eventVisualization.js b/src/modules/eventVisualization/eventVisualization.js new file mode 100644 index 000000000..7b2dfe238 --- /dev/null +++ b/src/modules/eventVisualization/eventVisualization.js @@ -0,0 +1,35 @@ +import { getHeaderByVis } from "../dimensions" +import { layoutGetAllDimensions } from "../layout/layoutGetAllDimensions" + +export const transformEventVisualization = (vis) => { + // Do not modify the original visualization + let transformedVis = { + ...vis, + columns: [ + ...vis.columns.map(col => ({ + ...col + })) + ], + rows: [ + ...vis.rows.map(row => ({ + ...row + })) + ], + } + + let headerName + + layoutGetAllDimensions(vis).forEach(dim => { + headerName = getHeaderByVis(dim.dimension) + + if (dim.program?.id) { + dim.dimension = `${dim.program.id}.${headerName}` + } + else if (dim.programStage?.id) { + dim.dimension = `${dim.programStage.id}.${headerName}` + } + else { + dim.dimension = headerName + } + }) +}