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..3c5631b0e --- /dev/null +++ b/src/__demo__/data/event/eventstatus.data.hidena.json @@ -0,0 +1,122 @@ +{ + "headers": [ + { + "name": "A03MvHHogjR.ou", + "column": "Organisation unit", + "valueType": "ORGANISATION_UNIT", + "type": "org.hisp.dhis.organisationunit.OrganisationUnit", + "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", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true + }, + { + "name": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + } + ], + "metaData": { + "items": { + "202511": { + "name": "202511" + }, + "202512": { + "name": "202512" + }, + "202601": { + "name": "202601" + }, + "ImspTQPwCqd": { + "name": "Sierra Leone" + }, + "A03MvHHogjR.eventdate": { + "name": "Report date" + }, + "A03MvHHogjR.eventstatus": { + "name": "Event status" + }, + "A03MvHHogjR.eventstatus_ACTIVE": { + "name": "Active" + }, + "IpHINAT79UW": { + "name": "Child Programme" + }, + "ZzYYXq4fJie": { + "name": "Baby Postnatal" + }, + "USER_ORGUNIT": { + "organisationUnits": [ + "ImspTQPwCqd" + ] + }, + "A03MvHHogjR": { + "name": "Birth" + }, + "A03MvHHogjR.ou": { + "name": "Organisation unit" + } + }, + "dimensions": { + "A03MvHHogjR.eventdate": [ + "202511", + "202512", + "202601" + ], + "A03MvHHogjR.eventstatus": [ + "A03MvHHogjR.eventstatus_ACTIVE" + ], + "pe": [], + "A03MvHHogjR.ou": [ + "ImspTQPwCqd" + ] + } + }, + "rowContext": {}, + "width": 4, + "headerWidth": 4, + "height": 3, + "rows": [ + [ + "ImspTQPwCqd", + "202511", + "A03MvHHogjR.eventstatus_ACTIVE", + "925" + ], + [ + "ImspTQPwCqd", + "202512", + "A03MvHHogjR.eventstatus_ACTIVE", + "858" + ], + [ + "ImspTQPwCqd", + "202601", + "A03MvHHogjR.eventstatus_ACTIVE", + "690" + ], + [ + "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 new file mode 100644 index 000000000..21e306b6c --- /dev/null +++ b/src/__demo__/data/event/eventstatus.data.json @@ -0,0 +1,132 @@ +{ + "headers": [ + { + "name": "A03MvHHogjR.ou", + "column": "Organisation unit", + "valueType": "ORGANISATION_UNIT", + "type": "org.hisp.dhis.organisationunit.OrganisationUnit", + "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", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true + }, + { + "name": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + } + ], + "metaData": { + "items": { + "202511": { + "name": "202511" + }, + "202512": { + "name": "202512" + }, + "202601": { + "name": "202601" + }, + "ImspTQPwCqd": { + "name": "Sierra Leone" + }, + "A03MvHHogjR.eventdate": { + "name": "Report date" + }, + "A03MvHHogjR.eventstatus": { + "name": "Event status" + }, + "A03MvHHogjR.eventstatus_ACTIVE": { + "name": "Active" + }, + "IpHINAT79UW": { + "name": "Child Programme" + }, + "ZzYYXq4fJie": { + "name": "Baby Postnatal" + }, + "USER_ORGUNIT": { + "organisationUnits": [ + "ImspTQPwCqd" + ] + }, + "A03MvHHogjR": { + "name": "Birth" + }, + "A03MvHHogjR.ou": { + "name": "Organisation unit" + }, + "": { + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } + } + }, + "dimensions": { + "A03MvHHogjR.eventdate": [ + "202511", + "202512", + "202601" + ], + "A03MvHHogjR.eventstatus": [ + "A03MvHHogjR.eventstatus_ACTIVE", + "" + ], + "pe": [], + "A03MvHHogjR.ou": [ + "ImspTQPwCqd" + ] + } + }, + "rowContext": {}, + "width": 4, + "headerWidth": 4, + "height": 3, + "rows": [ + [ + "ImspTQPwCqd", + "202511", + "A03MvHHogjR.eventstatus_ACTIVE", + "925" + ], + [ + "ImspTQPwCqd", + "202512", + "A03MvHHogjR.eventstatus_ACTIVE", + "858" + ], + [ + "ImspTQPwCqd", + "202601", + "A03MvHHogjR.eventstatus_ACTIVE", + "690" + ], + [ + "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 new file mode 100644 index 000000000..23823ef9a --- /dev/null +++ b/src/__demo__/data/event/eventstatus.data.org.json @@ -0,0 +1,117 @@ +{ + "headers": [ + { + "name": "A03MvHHogjR.ou", + "column": "Organisation unit", + "valueType": "ORGANISATION_UNIT", + "type": "org.hisp.dhis.organisationunit.OrganisationUnit", + "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", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true + }, + { + "name": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + } + ], + "metaData": { + "items": { + "202511": { + "name": "202511" + }, + "202512": { + "name": "202512" + }, + "202601": { + "name": "202601" + }, + "ImspTQPwCqd": { + "name": "Sierra Leone" + }, + "A03MvHHogjR.eventdate": { + "name": "Report date" + }, + "A03MvHHogjR.eventstatus": { + "name": "Event status" + }, + "IpHINAT79UW": { + "name": "Child Programme" + }, + "ZzYYXq4fJie": { + "name": "Baby Postnatal" + }, + "USER_ORGUNIT": { + "organisationUnits": [ + "ImspTQPwCqd" + ] + }, + "A03MvHHogjR": { + "name": "Birth" + }, + "A03MvHHogjR.ou": { + "name": "Organisation unit" + } + }, + "dimensions": { + "A03MvHHogjR.eventdate": [ + "202511", + "202512", + "202601" + ], + "A03MvHHogjR.eventstatus": [], + "pe": [], + "A03MvHHogjR.ou": [ + "ImspTQPwCqd" + ] + } + }, + "rowContext": {}, + "width": 4, + "headerWidth": 4, + "height": 3, + "rows": [ + [ + "ImspTQPwCqd", + "202511", + "ACTIVE", + "925" + ], + [ + "ImspTQPwCqd", + "202512", + "ACTIVE", + "858" + ], + [ + "ImspTQPwCqd", + "202601", + "ACTIVE", + "690" + ], + [ + "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 new file mode 100644 index 000000000..04dd512b6 --- /dev/null +++ b/src/__demo__/data/event/eventstatus.visualization.json @@ -0,0 +1,154 @@ +{ + "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": [ + { + "name": "Sierra Leone", + "id": "ImspTQPwCqd" + } + ], + "dimension": "A03MvHHogjR.ou", + "programStage": { + "id": "A03MvHHogjR" + } + }, + { + "items": [], + "programStage": { + "id": "A03MvHHogjR" + }, + "dimension": "A03MvHHogjR.eventstatus" + } + ], + "rows": [ + { + "items": [ + { + "dimensionItemType": "PERIOD", + "id": "202512" + }, + { + "dimensionItemType": "PERIOD", + "id": "202511" + }, + { + "dimensionItemType": "PERIOD", + "id": "202510" + } + ], + "dimension": "A03MvHHogjR.eventdate", + "programStage": { + "id": "A03MvHHogjR" + } + } + ], + "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/__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 + } + }) +} 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..499975d30 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,20 @@ export const getItemFormatterByValueType = (valueType) => { } } +const includeHeaderChecks = [ + header => Boolean(header.meta), + header => header.name !== DIMENSION_ID_PERIOD, + 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 } = {}) => { // Do not modify the original response // Rows is mapped by the handlers @@ -82,17 +114,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 +139,7 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { transformedResponse, header.index, { - itemFormatter: getItemFormatterByValueType( - header.valueType - ), + itemFormatter: getItemFormatter(header) } ) }