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 01/13] 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 02/13] 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 03/13] 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 + } + }) +} From 69cb54e4857a52fc87eb6ed1e5810933e5500b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 6 Apr 2026 15:13:34 +0200 Subject: [PATCH 04/13] chore: upgrade to storybook 10 --- .storybook/main.js | 4 +- .storybook/preview.js | 2 - package.json | 165 ++++----- yarn.lock | 843 +++++++++++++++++++++++++----------------- 4 files changed, 595 insertions(+), 419 deletions(-) diff --git a/.storybook/main.js b/.storybook/main.js index 6bbc19cd3..108674e76 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -1,7 +1,9 @@ // Direct path required because the package exports field doesn't expose this subpath +import { createRequire } from 'node:module' +const require = createRequire(import.meta.url) const makeBabelConfig = require('../node_modules/@dhis2/cli-app-scripts/config/makeBabelConfig.js') -module.exports = { +export default { addons: ['@storybook/preset-create-react-app'], stories: ['../src/__demo__/**/*.stories.@(js)'], diff --git a/.storybook/preview.js b/.storybook/preview.js index da1a421d3..3fcea95df 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -1,9 +1,7 @@ import { CssReset } from '@dhis2/ui' import React from 'react' -const { withJsx } = require('@mihkeleidast/storybook-addon-source') export const decorators = [ - withJsx, (Story) => (
diff --git a/package.json b/package.json index 7ba77e7ae..1ab6fb8a4 100644 --- a/package.json +++ b/package.json @@ -1,84 +1,83 @@ { - "name": "@dhis2/analytics", - "version": "29.4.2", - "main": "./build/cjs/index.js", - "module": "./build/es/index.js", - "exports": { - "import": "./build/es/index.js", - "require": "./build/cjs/index.js" - }, - "sideEffects": [ - "./build/es/locales/index.js", - "./build/cjs/locales/index.js" - ], - "repository": "git@github.com:dhis2/analytics.git", - "author": "Jennifer Jones Arnesen ", - "license": "BSD-3-Clause", - "private": false, - "publishConfig": { - "access": "public" - }, - "scripts": { - "build": "d2-app-scripts build", - "build-storybook": "storybook build", - "start-storybook": "storybook dev --port 5000", - "start": "yarn start-storybook", - "test": "d2-app-scripts test", - "lint": "d2-style check", - "format": "d2-style apply", - "validate-commit": "d2-style check --staged", - "validate-push": "yarn test" - }, - "devDependencies": { - "@dhis2/app-runtime": "^3.14.1", - "@dhis2/cli-app-scripts": "^12.11.0", - "@dhis2/cli-style": "^10.7.9", - "@dhis2/d2-i18n": "^1.1.0", - "@dhis2/ui": "^10.12.7", - "@mihkeleidast/storybook-addon-source": "^1.0.1", - "@storybook/preset-create-react-app": "^8.3.6", - "@storybook/react": "^8.3.6", - "@storybook/react-webpack5": "^8.3.6", - "@testing-library/dom": "^10.4.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "fs-extra": "^10.1.0", - "prop-types": "^15", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-scripts": "^5.0.1", - "storybook": "^8.3.6", - "styled-jsx": "^4.0.1" - }, - "peerDependencies": { - "@dhis2/app-runtime": "^3", - "@dhis2/d2-i18n": "^1.1", - "@dhis2/ui": "^10", - "prop-types": "^15", - "react": "^16.3 || ^18", - "react-dom": "^16.3 || ^ 18", - "styled-jsx": "^4.0.1" - }, - "dependencies": { - "@dhis2/multi-calendar-dates": "^1.2.2", - "@dnd-kit/core": "^6.0.7", - "@dnd-kit/sortable": "^7.0.2", - "@dnd-kit/utilities": "^3.2.1", - "@react-hook/debounce": "^4.0.0", - "classnames": "^2.3.1", - "crypto-js": "^4.2.0", - "d2-utilizr": "^0.2.16", - "d3-color": "^1.2.3", - "highcharts": "^12.1.2", - "lodash": "^4.17.21", - "markdown-it": "^13.0.1", - "mathjs": "^9.4.2", - "react-beautiful-dnd": "^10.1.1", - "resize-observer-polyfill": "^1.5.1" - }, - "files": [ - "build" - ], - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" -} + "name": "@dhis2/analytics", + "version": "29.4.2", + "main": "./build/cjs/index.js", + "module": "./build/es/index.js", + "exports": { + "import": "./build/es/index.js", + "require": "./build/cjs/index.js" + }, + "sideEffects": [ + "./build/es/locales/index.js", + "./build/cjs/locales/index.js" + ], + "repository": "git@github.com:dhis2/analytics.git", + "author": "Jennifer Jones Arnesen ", + "license": "BSD-3-Clause", + "private": false, + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "d2-app-scripts build", + "build-storybook": "storybook build", + "start-storybook": "storybook dev --port 5000", + "start": "yarn start-storybook", + "test": "d2-app-scripts test", + "lint": "d2-style check", + "format": "d2-style apply", + "validate-commit": "d2-style check --staged", + "validate-push": "yarn test" + }, + "devDependencies": { + "@dhis2/app-runtime": "^3.14.1", + "@dhis2/cli-app-scripts": "^12.11.0", + "@dhis2/cli-style": "^10.7.9", + "@dhis2/d2-i18n": "^1.1.0", + "@dhis2/ui": "^10.12.7", + "@storybook/preset-create-react-app": "^10.3.4", + "@storybook/react-webpack5": "^10.3.4", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "fs-extra": "^10.1.0", + "prop-types": "^15", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-scripts": "^5.0.1", + "storybook": "^10.3.4", + "styled-jsx": "^4.0.1", + "eslint-plugin-storybook": "10.3.4" + }, + "peerDependencies": { + "@dhis2/app-runtime": "^3", + "@dhis2/d2-i18n": "^1.1", + "@dhis2/ui": "^10", + "prop-types": "^15", + "react": "^16.3 || ^18", + "react-dom": "^16.3 || ^ 18", + "styled-jsx": "^4.0.1" + }, + "dependencies": { + "@dhis2/multi-calendar-dates": "^1.2.2", + "@dnd-kit/core": "^6.0.7", + "@dnd-kit/sortable": "^7.0.2", + "@dnd-kit/utilities": "^3.2.1", + "@react-hook/debounce": "^4.0.0", + "classnames": "^2.3.1", + "crypto-js": "^4.2.0", + "d2-utilizr": "^0.2.16", + "d3-color": "^1.2.3", + "highcharts": "^12.1.2", + "lodash": "^4.17.21", + "markdown-it": "^13.0.1", + "mathjs": "^9.4.2", + "react-beautiful-dnd": "^10.1.1", + "resize-observer-polyfill": "^1.5.1" + }, + "files": [ + "build" + ], + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 23ba7bd98..bab02b3c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1111,7 +1111,7 @@ "@babel/parser" "^7.28.6" "@babel/types" "^7.28.6" -"@babel/traverse@^7.18.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0", "@babel/traverse@^7.7.2": +"@babel/traverse@^7.18.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.5", "@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0", "@babel/traverse@^7.7.2": version "7.29.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== @@ -2376,245 +2376,245 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== -"@esbuild/aix-ppc64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz#80fcbe36130e58b7670511e888b8e88a259ed76c" - integrity sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA== +"@esbuild/aix-ppc64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz#82b74f92aa78d720b714162939fb248c90addf53" + integrity sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg== "@esbuild/android-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== -"@esbuild/android-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz#8aa4965f8d0a7982dc21734bf6601323a66da752" - integrity sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg== +"@esbuild/android-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz#f78cb8a3121fc205a53285adb24972db385d185d" + integrity sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ== "@esbuild/android-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== -"@esbuild/android-arm@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz#300712101f7f50f1d2627a162e6e09b109b6767a" - integrity sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg== +"@esbuild/android-arm@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.7.tgz#593e10a1450bbfcac6cb321f61f468453bac209d" + integrity sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ== "@esbuild/android-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== -"@esbuild/android-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz#87dfb27161202bdc958ef48bb61b09c758faee16" - integrity sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg== +"@esbuild/android-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.7.tgz#453143d073326033d2d22caf9e48de4bae274b07" + integrity sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg== "@esbuild/darwin-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== -"@esbuild/darwin-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz#79197898ec1ff745d21c071e1c7cc3c802f0c1fd" - integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg== +"@esbuild/darwin-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz#6f23000fb9b40b7e04b7d0606c0693bd0632f322" + integrity sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw== "@esbuild/darwin-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== -"@esbuild/darwin-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz#146400a8562133f45c4d2eadcf37ddd09718079e" - integrity sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA== +"@esbuild/darwin-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz#27393dd18bb1263c663979c5f1576e00c2d024be" + integrity sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ== "@esbuild/freebsd-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== -"@esbuild/freebsd-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz#1c5f9ba7206e158fd2b24c59fa2d2c8bb47ca0fe" - integrity sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg== +"@esbuild/freebsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz#22e4638fa502d1c0027077324c97640e3adf3a62" + integrity sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w== "@esbuild/freebsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== -"@esbuild/freebsd-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz#ea631f4a36beaac4b9279fa0fcc6ca29eaeeb2b3" - integrity sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ== +"@esbuild/freebsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz#9224b8e4fea924ce2194e3efc3e9aebf822192d6" + integrity sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ== "@esbuild/linux-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== -"@esbuild/linux-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz#e1066bce58394f1b1141deec8557a5f0a22f5977" - integrity sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ== +"@esbuild/linux-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz#4f5d1c27527d817b35684ae21419e57c2bda0966" + integrity sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A== "@esbuild/linux-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== -"@esbuild/linux-arm@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz#452cd66b20932d08bdc53a8b61c0e30baf4348b9" - integrity sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw== +"@esbuild/linux-arm@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz#b9e9d070c8c1c0449cf12b20eac37d70a4595921" + integrity sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA== "@esbuild/linux-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== -"@esbuild/linux-ia32@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz#b24f8acc45bcf54192c7f2f3be1b53e6551eafe0" - integrity sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA== +"@esbuild/linux-ia32@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz#3f80fb696aa96051a94047f35c85b08b21c36f9e" + integrity sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg== "@esbuild/linux-loong64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== -"@esbuild/linux-loong64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz#f9cfffa7fc8322571fbc4c8b3268caf15bd81ad0" - integrity sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng== +"@esbuild/linux-loong64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz#9be1f2c28210b13ebb4156221bba356fe1675205" + integrity sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q== "@esbuild/linux-mips64el@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== -"@esbuild/linux-mips64el@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz#575a14bd74644ffab891adc7d7e60d275296f2cd" - integrity sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw== +"@esbuild/linux-mips64el@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz#4ab5ee67a3dfcbcb5e8fd7883dae6e735b1163b8" + integrity sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw== "@esbuild/linux-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== -"@esbuild/linux-ppc64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz#75b99c70a95fbd5f7739d7692befe60601591869" - integrity sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA== +"@esbuild/linux-ppc64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz#dac78c689f6499459c4321e5c15032c12307e7ea" + integrity sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ== "@esbuild/linux-riscv64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== -"@esbuild/linux-riscv64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz#2e3259440321a44e79ddf7535c325057da875cd6" - integrity sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w== +"@esbuild/linux-riscv64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz#050f7d3b355c3a98308e935bc4d6325da91b0027" + integrity sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ== "@esbuild/linux-s390x@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== -"@esbuild/linux-s390x@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz#17676cabbfe5928da5b2a0d6df5d58cd08db2663" - integrity sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg== +"@esbuild/linux-s390x@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz#d61f715ce61d43fe5844ad0d8f463f88cbe4fef6" + integrity sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw== "@esbuild/linux-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== -"@esbuild/linux-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz#0583775685ca82066d04c3507f09524d3cd7a306" - integrity sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw== +"@esbuild/linux-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz#ca8e1aa478fc8209257bf3ac8f79c4dc2982f32a" + integrity sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA== -"@esbuild/netbsd-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz#f04c4049cb2e252fe96b16fed90f70746b13f4a4" - integrity sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg== +"@esbuild/netbsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz#1650f2c1b948deeb3ef948f2fc30614723c09690" + integrity sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w== "@esbuild/netbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== -"@esbuild/netbsd-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz#77da0d0a0d826d7c921eea3d40292548b258a076" - integrity sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ== +"@esbuild/netbsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz#65772ab342c4b3319bf0705a211050aac1b6e320" + integrity sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw== -"@esbuild/openbsd-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz#6296f5867aedef28a81b22ab2009c786a952dccd" - integrity sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A== +"@esbuild/openbsd-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz#37ed7cfa66549d7955852fce37d0c3de4e715ea1" + integrity sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A== "@esbuild/openbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== -"@esbuild/openbsd-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz#f8d23303360e27b16cf065b23bbff43c14142679" - integrity sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw== +"@esbuild/openbsd-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz#01bf3d385855ef50cb33db7c4b52f957c34cd179" + integrity sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg== -"@esbuild/openharmony-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz#49e0b768744a3924be0d7fd97dd6ce9b2923d88d" - integrity sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg== +"@esbuild/openharmony-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz#6c1f94b34086599aabda4eac8f638294b9877410" + integrity sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw== "@esbuild/sunos-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== -"@esbuild/sunos-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz#a6ed7d6778d67e528c81fb165b23f4911b9b13d6" - integrity sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w== +"@esbuild/sunos-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz#4b0dd17ae0a6941d2d0fd35a906392517071a90d" + integrity sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA== "@esbuild/win32-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== -"@esbuild/win32-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz#9ac14c378e1b653af17d08e7d3ce34caef587323" - integrity sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg== +"@esbuild/win32-arm64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz#34193ab5565d6ff68ca928ac04be75102ccb2e77" + integrity sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA== "@esbuild/win32-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== -"@esbuild/win32-ia32@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz#918942dcbbb35cc14fca39afb91b5e6a3d127267" - integrity sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ== +"@esbuild/win32-ia32@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz#eb67f0e4482515d8c1894ede631c327a4da9fc4d" + integrity sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw== "@esbuild/win32-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== -"@esbuild/win32-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz#9bdad8176be7811ad148d1f8772359041f46c6c5" - integrity sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA== +"@esbuild/win32-x64@0.27.7": + version "0.27.7" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz#8fe30b3088b89b4873c3a6cc87597ae3920c0a8b" + integrity sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.9.1": version "4.9.1" @@ -2988,11 +2988,6 @@ resolved "https://registry.yarnpkg.com/@ls-lint/ls-lint/-/ls-lint-1.11.2.tgz#fa7e8c404b7c2f9f7fe3e92b7d69fe37a15c0e1c" integrity sha512-kX+CCjgNz+NHCaOcFyJLSBLRgAoyOxN18QFLpgucz5ILvbr60BGjwKaoPYTv/rBV/77L+Oz82lpP24mzJ2wGsQ== -"@mihkeleidast/storybook-addon-source@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@mihkeleidast/storybook-addon-source/-/storybook-addon-source-1.0.1.tgz#ec3dd70b6c550b39d2484d36bb236228d1240fac" - integrity sha512-/TRoq62doDiSmtp6pNiSgngZ9tjNAWMN117M8GBz2uvgYJOIU2Zk4WH8kaEUy4TYr+S35lvmuXzZKRa5KRJpng== - "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" @@ -3308,108 +3303,70 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@storybook/builder-webpack5@8.6.18": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-8.6.18.tgz#8b1733876afcea9bd902ecca805e8be4415928c7" - integrity sha512-rg73TpqIUzXc66c/AaQ4kuc8yiZ+tStvy5fb1OnFYZ9rAeYQejDD0OIIaI2rqtX5XYuxC+yQEGitMntlIMV0og== +"@storybook/builder-webpack5@10.3.4": + version "10.3.4" + resolved "https://registry.yarnpkg.com/@storybook/builder-webpack5/-/builder-webpack5-10.3.4.tgz#35cf95e492d54ed6a70cd185cd0f26184208aaaf" + integrity sha512-ZFGw0bqVkLH9vFMMQcWTFUcvJ4cADHGk6yXs2MgvHX4/3ZZXIiGssb3PgewuxfXo4xto0flZMhIoC2dhrwK40A== dependencies: - "@storybook/core-webpack" "8.6.18" - "@types/semver" "^7.3.4" - browser-assert "^1.2.1" + "@storybook/core-webpack" "10.3.4" case-sensitive-paths-webpack-plugin "^2.4.0" cjs-module-lexer "^1.2.3" - constants-browserify "^1.0.0" - css-loader "^6.7.1" + css-loader "^7.1.2" es-module-lexer "^1.5.0" - fork-ts-checker-webpack-plugin "^8.0.0" + fork-ts-checker-webpack-plugin "^9.1.0" html-webpack-plugin "^5.5.0" magic-string "^0.30.5" - path-browserify "^1.0.1" - process "^0.11.10" - semver "^7.3.7" - style-loader "^3.3.1" - terser-webpack-plugin "^5.3.1" + style-loader "^4.0.0" + terser-webpack-plugin "^5.3.14" ts-dedent "^2.0.0" - url "^0.11.0" - util "^0.12.4" - util-deprecate "^1.0.2" webpack "5" webpack-dev-middleware "^6.1.2" webpack-hot-middleware "^2.25.1" webpack-virtual-modules "^0.6.0" -"@storybook/components@8.6.18": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-8.6.18.tgz#0e5431f9d84cae29a8b8a406c9ad99406bf2ccb4" - integrity sha512-55yViiZzPS/cPBuOeW4QGxGqrusjXVyxuknmbYCIwDtFyyvI/CgbjXRHdxNBaIjz+IlftxvBmmSaOqFG5+/dkA== - -"@storybook/core-webpack@8.6.18": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-8.6.18.tgz#ac199de836e803bf3b2a1067c2830e43eb6e19b0" - integrity sha512-M+y/DFbiT3CJYQ90wJdXT4WxYImphof1f11StZSxJGo0u5PnCCdCze1qchXubApXRDO2T8HGxurXfhTEMqaGsA== +"@storybook/core-webpack@10.3.4": + version "10.3.4" + resolved "https://registry.yarnpkg.com/@storybook/core-webpack/-/core-webpack-10.3.4.tgz#69cf1677bca6ec0050980b19b836543813861393" + integrity sha512-y7TEIxd8melHWD6XvdoFWo2u0VUGIm2/LxOI2qWWfdT7hQL47WHsN52eKkOBaAEJ8HQYyT3ajRS9wGSnhu6KaQ== dependencies: ts-dedent "^2.0.0" -"@storybook/core@8.6.18": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/core/-/core-8.6.18.tgz#0ddbec8421715b372419ae5dfefef3df5848386c" - integrity sha512-dRBP2TnX6fGdS0T2mXBHjkS/3Nlu1ra1huovZVFuM67CYMzrhM/3hX/zru1vWSC5rqY93ZaAhjMciPW4pK5mMQ== - dependencies: - "@storybook/theming" "8.6.18" - better-opn "^3.0.2" - browser-assert "^1.2.1" - esbuild "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0" - esbuild-register "^3.5.0" - jsdoc-type-pratt-parser "^4.0.0" - process "^0.11.10" - recast "^0.23.5" - semver "^7.6.2" - util "^0.12.5" - ws "^8.2.3" - "@storybook/global@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== -"@storybook/manager-api@8.6.18": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/manager-api/-/manager-api-8.6.18.tgz#f87705d42c33abbc423356dde5ea3a727745065d" - integrity sha512-BjIp12gEMgzFkEsgKpDIbZdnSWTZpm2dlws8WiPJCpgJtG+HWSxZ0/Ms30Au9yfwzQEKRSbV/5zpsKMGc2SIJw== +"@storybook/icons@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@storybook/icons/-/icons-2.0.1.tgz#1bd351db1d33bfccbbafa7b64fb413168f1a6616" + integrity sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg== -"@storybook/preset-create-react-app@^8.3.6": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/preset-create-react-app/-/preset-create-react-app-8.6.18.tgz#dbd10ee3f6de9f5f95b0c3e70413ddac15471c20" - integrity sha512-9d470WlhG55o0GZzx5D/JveRp5mdT9y+gmx/6p6ZGSivQccjCRUfyNmOzwvLUR02K0BcP86WI2Sj6VpClTK44Q== +"@storybook/preset-create-react-app@^10.3.4": + version "10.3.4" + resolved "https://registry.yarnpkg.com/@storybook/preset-create-react-app/-/preset-create-react-app-10.3.4.tgz#aad9293af9ded05b8543a935d7d9c9d17b0c8703" + integrity sha512-quN70bnbr3ix3siX/IsxHIpx5BVdJRqabkX7WO+QdEsIN5EKcRuNI3PfiBhwUw2z6qc5M5SmmBicnCmxvsH3Zg== dependencies: "@pmmmwh/react-refresh-webpack-plugin" "^0.5.1" "@storybook/react-docgen-typescript-plugin" "1.0.6--canary.9.0c3f3b7.0" - "@types/semver" "^7.5.6" + "@types/semver" "^7.7.1" pnp-webpack-plugin "^1.7.0" - semver "^7.5.4" + semver "^7.7.3" -"@storybook/preset-react-webpack@8.6.18": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/preset-react-webpack/-/preset-react-webpack-8.6.18.tgz#22d5f30e8c57dad2b13cc20baaaabca6ea73e9f5" - integrity sha512-UkioZsLIyKGQTAdVB3EMx4NyqwIPDRyuDTIQyCwlMcLYCJCs9Ks2ILbM1x1554/iqRIxy8Yv2IBMapK+euCwgg== +"@storybook/preset-react-webpack@10.3.4": + version "10.3.4" + resolved "https://registry.yarnpkg.com/@storybook/preset-react-webpack/-/preset-react-webpack-10.3.4.tgz#f79cb984f6a3599d0c5654c25fabe9eda4897530" + integrity sha512-3EK/aJtE0AK5nZh/k8jxS3y/ZGmOir06RIYY2KqOq55zD2iqS0tCwnhiKiLp8wQVsPAc7DuTCwG96kEkTrdU7g== dependencies: - "@storybook/core-webpack" "8.6.18" - "@storybook/react" "8.6.18" + "@storybook/core-webpack" "10.3.4" "@storybook/react-docgen-typescript-plugin" "1.0.6--canary.9.0c3f3b7.0" - "@types/semver" "^7.3.4" - find-up "^5.0.0" + "@types/semver" "^7.7.1" magic-string "^0.30.5" - react-docgen "^7.0.0" + react-docgen "^7.1.1" resolve "^1.22.8" - semver "^7.3.7" + semver "^7.7.3" tsconfig-paths "^4.2.0" webpack "5" -"@storybook/preview-api@8.6.18": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/preview-api/-/preview-api-8.6.18.tgz#2f5eb75c7587035a07670457c09b67208aa16735" - integrity sha512-joXRXh3GdVvzhbfIgmix1xs90p8Q/nja7AhEAC2egn5Pl7SKsIYZUCYI6UdrQANb2myg9P552LKXfPect8llKg== - "@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0": version "1.0.6--canary.9.0c3f3b7.0" resolved "https://registry.yarnpkg.com/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz#7f10f3c641f32e4513a8b6ffb5036933e7059534" @@ -3423,36 +3380,29 @@ react-docgen-typescript "^2.2.2" tslib "^2.0.0" -"@storybook/react-dom-shim@8.6.18": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-8.6.18.tgz#34bdc010d3c3572fc74fa149f754d185df85044e" - integrity sha512-N4xULcAWZQTUv4jy1/d346Tyb4gufuC3UaLCuU/iVSZ1brYF4OW3ANr+096btbMxY8pR/65lmtoqr5CTGwnBvA== +"@storybook/react-dom-shim@10.3.4": + version "10.3.4" + resolved "https://registry.yarnpkg.com/@storybook/react-dom-shim/-/react-dom-shim-10.3.4.tgz#1e0362be30354bd4dc0dc20016c3b098531a6242" + integrity sha512-VIm9YzreGubnOtQOZ6iqEfj6KncHvAkrCR/IilqnJq7DidPWuykrFszyajTASRMiY+p+TElOW+O1PGpv55qNGw== -"@storybook/react-webpack5@^8.3.6": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/react-webpack5/-/react-webpack5-8.6.18.tgz#715be98aaf9e7a3db50f6679aa00e7450ea032ff" - integrity sha512-oh7V2//Nm6O+7J5b7v4l+BTxksMq7thCmy607diwSBZHYz6G2CxcW3GhxWwZzpHoUVX6vOR5Uc94u9+wBuPi7A== +"@storybook/react-webpack5@^10.3.4": + version "10.3.4" + resolved "https://registry.yarnpkg.com/@storybook/react-webpack5/-/react-webpack5-10.3.4.tgz#cdf8aeafd54fe8c4b1aa7acd18d63e25dec0dd65" + integrity sha512-Qf3weT1xGMBzJ10phyDVBOCva8kHnF6PQ8OvAdL9CUUoJivG5AmOb+EsLvHcSG9ypWCNhpd52tyX20yIohPZbg== dependencies: - "@storybook/builder-webpack5" "8.6.18" - "@storybook/preset-react-webpack" "8.6.18" - "@storybook/react" "8.6.18" + "@storybook/builder-webpack5" "10.3.4" + "@storybook/preset-react-webpack" "10.3.4" + "@storybook/react" "10.3.4" -"@storybook/react@8.6.18", "@storybook/react@^8.3.6": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/react/-/react-8.6.18.tgz#61dbe3b565ff2046d22c3666ea0841850bbe75d9" - integrity sha512-BuLpzMkKtF+UCQCbi+lYVX9cdcAMG86Lu2dDn7UFkPi5HRNFq/zHPSvlz1XDgL0OYMtcqB1aoVzFzcyzUBhhjw== +"@storybook/react@10.3.4": + version "10.3.4" + resolved "https://registry.yarnpkg.com/@storybook/react/-/react-10.3.4.tgz#907fe939f889a9b097bc173b1aff2447a94387af" + integrity sha512-I5ifYqjrqyuhOFjalpy47kMKMXX7QU/qmHj0h/547s9Bg6sEU7xRhJnneXx1RJsEJTySjC4SmGfEU+FJz4Foiw== dependencies: - "@storybook/components" "8.6.18" "@storybook/global" "^5.0.0" - "@storybook/manager-api" "8.6.18" - "@storybook/preview-api" "8.6.18" - "@storybook/react-dom-shim" "8.6.18" - "@storybook/theming" "8.6.18" - -"@storybook/theming@8.6.18": - version "8.6.18" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-8.6.18.tgz#18c66263868bfb00a419772b5460a5714c5e1181" - integrity sha512-n6OEjEtHupa2PdTwWzRepr7cO8NkDd4rgF6BKLitRbujOspLxzMBEqdphs+QLcuiCIgf33SqmEA64QWnbSMhPw== + "@storybook/react-dom-shim" "10.3.4" + react-docgen "^8.0.2" + react-docgen-typescript "^2.2.2" "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" @@ -3601,7 +3551,7 @@ picocolors "1.1.1" pretty-format "^27.0.2" -"@testing-library/jest-dom@^6.6.3": +"@testing-library/jest-dom@^6.6.3", "@testing-library/jest-dom@^6.9.1": version "6.9.1" resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz#7613a04e146dd2976d24ddf019730d57a89d56c2" integrity sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA== @@ -3661,7 +3611,7 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6", "@types/babel__traverse@^7.18.0": +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6", "@types/babel__traverse@^7.18.0", "@types/babel__traverse@^7.20.7": version "7.28.0" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== @@ -3683,6 +3633,14 @@ dependencies: "@types/node" "*" +"@types/chai@^5.2.2": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.3.tgz#8e9cd9e1c3581fa6b341a5aed5588eb285be0b4a" + integrity sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA== + dependencies: + "@types/deep-eql" "*" + assertion-error "^2.0.1" + "@types/connect-history-api-fallback@^1.3.5": version "1.5.4" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" @@ -3698,6 +3656,11 @@ dependencies: "@types/node" "*" +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + "@types/doctrine@^0.0.9": version "0.0.9" resolved "https://registry.yarnpkg.com/@types/doctrine/-/doctrine-0.0.9.tgz#d86a5f452a15e3e3113b99e39616a9baa0f9863f" @@ -3910,7 +3873,7 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/semver@^7.3.12", "@types/semver@^7.3.4", "@types/semver@^7.5.6": +"@types/semver@^7.3.12", "@types/semver@^7.7.1": version "7.7.1" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.7.1.tgz#3ce3af1a5524ef327d2da9e4fd8b6d95c8d70528" integrity sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA== @@ -4064,6 +4027,15 @@ "@typescript-eslint/types" "^8.57.1" debug "^4.4.3" +"@typescript-eslint/project-service@8.58.0": + version "8.58.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.58.0.tgz#66ceda0aabf7427aec3e2713fa43eb278dead2aa" + integrity sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.58.0" + "@typescript-eslint/types" "^8.58.0" + debug "^4.4.3" + "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" @@ -4080,11 +4052,24 @@ "@typescript-eslint/types" "8.57.1" "@typescript-eslint/visitor-keys" "8.57.1" +"@typescript-eslint/scope-manager@8.58.0": + version "8.58.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz#e304142775e49a1b7ac3c8bf2536714447c72cab" + integrity sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ== + dependencies: + "@typescript-eslint/types" "8.58.0" + "@typescript-eslint/visitor-keys" "8.58.0" + "@typescript-eslint/tsconfig-utils@8.57.1", "@typescript-eslint/tsconfig-utils@^8.57.1": version "8.57.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz#9233443ec716882a6f9e240fd900a73f0235f3d7" integrity sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg== +"@typescript-eslint/tsconfig-utils@8.58.0", "@typescript-eslint/tsconfig-utils@^8.58.0": + version "8.58.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz#c5a8edb21f31e0fdee565724e1b984171c559482" + integrity sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A== + "@typescript-eslint/type-utils@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" @@ -4116,6 +4101,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.57.1.tgz#54b27a8a25a7b45b4f978c3f8e00c4c78f11142c" integrity sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ== +"@typescript-eslint/types@8.58.0", "@typescript-eslint/types@^8.58.0": + version "8.58.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.58.0.tgz#e94ae7abdc1c6530e71183c1007b61fa93112a5a" + integrity sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -4144,6 +4134,21 @@ tinyglobby "^0.2.15" ts-api-utils "^2.4.0" +"@typescript-eslint/typescript-estree@8.58.0": + version "8.58.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz#ed233faa8e2f2a2e1357c3e7d553d6465a0ee59a" + integrity sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA== + dependencies: + "@typescript-eslint/project-service" "8.58.0" + "@typescript-eslint/tsconfig-utils" "8.58.0" + "@typescript-eslint/types" "8.58.0" + "@typescript-eslint/visitor-keys" "8.58.0" + debug "^4.4.3" + minimatch "^10.2.2" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.5.0" + "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" @@ -4168,6 +4173,16 @@ "@typescript-eslint/types" "8.57.1" "@typescript-eslint/typescript-estree" "8.57.1" +"@typescript-eslint/utils@^8.48.0": + version "8.58.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.58.0.tgz#21a74a7963b0d288b719a4121c7dd555adaab3c3" + integrity sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.58.0" + "@typescript-eslint/types" "8.58.0" + "@typescript-eslint/typescript-estree" "8.58.0" + "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -4184,6 +4199,14 @@ "@typescript-eslint/types" "8.57.1" eslint-visitor-keys "^5.0.0" +"@typescript-eslint/visitor-keys@8.58.0": + version "8.58.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz#2abd55a4be70fd55967aceaba4330b9ba9f45189" + integrity sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ== + dependencies: + "@typescript-eslint/types" "8.58.0" + eslint-visitor-keys "^5.0.0" + "@ungap/structured-clone@^1.2.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" @@ -4201,6 +4224,40 @@ "@types/babel__core" "^7.20.5" react-refresh "^0.17.0" +"@vitest/expect@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-3.2.4.tgz#8362124cd811a5ee11c5768207b9df53d34f2433" + integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== + dependencies: + "@types/chai" "^5.2.2" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" + chai "^5.2.0" + tinyrainbow "^2.0.0" + +"@vitest/pretty-format@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/pretty-format/-/pretty-format-3.2.4.tgz#3c102f79e82b204a26c7a5921bf47d534919d3b4" + integrity sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA== + dependencies: + tinyrainbow "^2.0.0" + +"@vitest/spy@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-3.2.4.tgz#cc18f26f40f3f028da6620046881f4e4518c2599" + integrity sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw== + dependencies: + tinyspy "^4.0.3" + +"@vitest/utils@3.2.4": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-3.2.4.tgz#c0813bc42d99527fb8c5b138c7a88516bca46fea" + integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== + dependencies: + "@vitest/pretty-format" "3.2.4" + loupe "^3.1.4" + tinyrainbow "^2.0.0" + "@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" @@ -4322,6 +4379,11 @@ "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" +"@webcontainer/env@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@webcontainer/env/-/env-1.1.1.tgz#23021b2bb24befeeef53dba8996d1886b7016515" + integrity sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -4789,6 +4851,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-2.0.1.tgz#f641a196b335690b1070bf00b6e7593fec190bf7" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + ast-types-flow@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" @@ -5123,13 +5190,6 @@ belter@^1.0.41: cross-domain-utils "^2" zalgo-promise "^1" -better-opn@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-3.0.2.tgz#f96f35deaaf8f34144a4102651babcf00d1d8817" - integrity sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ== - dependencies: - open "^8.0.4" - bfj@^7.0.2: version "7.1.0" resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" @@ -5230,11 +5290,6 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browser-assert@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/browser-assert/-/browser-assert-1.2.1.tgz#9aaa5a2a8c74685c2ae05bfe46efd606f068c200" - integrity sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ== - browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -5291,6 +5346,13 @@ builtin-modules@^3.1.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + bytes@3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -5408,6 +5470,17 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +chai@^5.2.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" + integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -5448,6 +5521,11 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +check-error@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.3.tgz#2427361117b70cca8dc89680ead32b157019caf5" + integrity sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA== + check-types@^11.2.3: version "11.2.3" resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" @@ -5468,6 +5546,13 @@ chokidar@^3.3.0, chokidar@^3.4.2, chokidar@^3.5.3, chokidar@^3.6.0: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + chownr@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -5756,11 +5841,6 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== - content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -5872,7 +5952,7 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: +cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== @@ -5883,6 +5963,16 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.2.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + cosmiconfig@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.1.tgz#df110631a8547b5d1a98915271986f06e3011379" @@ -5998,6 +6088,20 @@ css-loader@^6.5.1, css-loader@^6.7.1: postcss-value-parser "^4.2.0" semver "^7.5.4" +css-loader@^7.1.2: + version "7.1.4" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.4.tgz#8f6bf9f8fc8cbef7d2ef6e80acc6545eaefa90b1" + integrity sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.40" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.6.3" + css-minimizer-webpack-plugin@^3.2.0: version "3.4.1" resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" @@ -6285,6 +6389,11 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -6300,6 +6409,19 @@ deepmerge@^4.0.0, deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +default-browser-id@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.1.tgz#f7a7ccb8f5104bf8e0f71ba3b1ccfa5eafdb21e8" + integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== + +default-browser@^5.2.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976" + integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -6326,6 +6448,11 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + define-properties@^1.1.3, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" @@ -6851,44 +6978,37 @@ es-to-primitive@^1.3.0: is-date-object "^1.0.5" is-symbol "^1.0.4" -esbuild-register@^3.5.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d" - integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== - dependencies: - debug "^4.3.4" - -"esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0": - version "0.25.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.12.tgz#97a1d041f4ab00c2fce2f838d2b9969a2d2a97a5" - integrity sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg== +"esbuild@^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0": + version "0.27.7" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.7.tgz#bcadce22b2f3fd76f257e3a64f83a64986fea11f" + integrity sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w== optionalDependencies: - "@esbuild/aix-ppc64" "0.25.12" - "@esbuild/android-arm" "0.25.12" - "@esbuild/android-arm64" "0.25.12" - "@esbuild/android-x64" "0.25.12" - "@esbuild/darwin-arm64" "0.25.12" - "@esbuild/darwin-x64" "0.25.12" - "@esbuild/freebsd-arm64" "0.25.12" - "@esbuild/freebsd-x64" "0.25.12" - "@esbuild/linux-arm" "0.25.12" - "@esbuild/linux-arm64" "0.25.12" - "@esbuild/linux-ia32" "0.25.12" - "@esbuild/linux-loong64" "0.25.12" - "@esbuild/linux-mips64el" "0.25.12" - "@esbuild/linux-ppc64" "0.25.12" - "@esbuild/linux-riscv64" "0.25.12" - "@esbuild/linux-s390x" "0.25.12" - "@esbuild/linux-x64" "0.25.12" - "@esbuild/netbsd-arm64" "0.25.12" - "@esbuild/netbsd-x64" "0.25.12" - "@esbuild/openbsd-arm64" "0.25.12" - "@esbuild/openbsd-x64" "0.25.12" - "@esbuild/openharmony-arm64" "0.25.12" - "@esbuild/sunos-x64" "0.25.12" - "@esbuild/win32-arm64" "0.25.12" - "@esbuild/win32-ia32" "0.25.12" - "@esbuild/win32-x64" "0.25.12" + "@esbuild/aix-ppc64" "0.27.7" + "@esbuild/android-arm" "0.27.7" + "@esbuild/android-arm64" "0.27.7" + "@esbuild/android-x64" "0.27.7" + "@esbuild/darwin-arm64" "0.27.7" + "@esbuild/darwin-x64" "0.27.7" + "@esbuild/freebsd-arm64" "0.27.7" + "@esbuild/freebsd-x64" "0.27.7" + "@esbuild/linux-arm" "0.27.7" + "@esbuild/linux-arm64" "0.27.7" + "@esbuild/linux-ia32" "0.27.7" + "@esbuild/linux-loong64" "0.27.7" + "@esbuild/linux-mips64el" "0.27.7" + "@esbuild/linux-ppc64" "0.27.7" + "@esbuild/linux-riscv64" "0.27.7" + "@esbuild/linux-s390x" "0.27.7" + "@esbuild/linux-x64" "0.27.7" + "@esbuild/netbsd-arm64" "0.27.7" + "@esbuild/netbsd-x64" "0.27.7" + "@esbuild/openbsd-arm64" "0.27.7" + "@esbuild/openbsd-x64" "0.27.7" + "@esbuild/openharmony-arm64" "0.27.7" + "@esbuild/sunos-x64" "0.27.7" + "@esbuild/win32-arm64" "0.27.7" + "@esbuild/win32-ia32" "0.27.7" + "@esbuild/win32-x64" "0.27.7" esbuild@^0.21.3: version "0.21.5" @@ -7096,6 +7216,13 @@ eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.37.1: string.prototype.matchall "^4.0.12" string.prototype.repeat "^1.0.0" +eslint-plugin-storybook@10.3.4: + version "10.3.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-storybook/-/eslint-plugin-storybook-10.3.4.tgz#b5e08106833c3488f69886d811476a1080a85904" + integrity sha512-6jRb9ucYWKRkbuxpN+83YA3wAWuKn6rp+OVXivy0FPa82v8eciHG8OidbznmzrfcRJYkNWUb7GrPjG/rf4Vqaw== + dependencies: + "@typescript-eslint/utils" "^8.48.0" + eslint-plugin-testing-library@^5.0.1: version "5.11.1" resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz#5b46cdae96d4a78918711c0b4792f90088e62d20" @@ -7630,15 +7757,15 @@ fork-ts-checker-webpack-plugin@^6.5.0: semver "^7.3.2" tapable "^1.0.0" -fork-ts-checker-webpack-plugin@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz#dae45dfe7298aa5d553e2580096ced79b6179504" - integrity sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg== +fork-ts-checker-webpack-plugin@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz#433481c1c228c56af111172fcad7df79318c915a" + integrity sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q== dependencies: "@babel/code-frame" "^7.16.7" chalk "^4.1.2" - chokidar "^3.5.3" - cosmiconfig "^7.0.1" + chokidar "^4.0.1" + cosmiconfig "^8.2.0" deepmerge "^4.2.2" fs-extra "^10.0.0" memfs "^3.4.1" @@ -8568,14 +8695,6 @@ is-absolute@^1.0.0: is-relative "^1.0.0" is-windows "^1.0.1" -is-arguments@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" - integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" @@ -8669,6 +8788,11 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -8696,7 +8820,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.10, is-generator-function@^1.0.7: +is-generator-function@^1.0.10: version "1.1.2" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== @@ -8721,6 +8845,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -8889,7 +9020,7 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed-array@^1.1.3: +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: version "1.1.15" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== @@ -8950,6 +9081,13 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +is-wsl@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.1.tgz#327897b26832a3eb117da6c27492d04ca132594f" + integrity sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw== + dependencies: + is-inside-container "^1.0.0" + is-yarn-global@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" @@ -9581,11 +9719,6 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== -jsdoc-type-pratt-parser@^4.0.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz#f2a649747278cbf9f2957d15cf772a841b16f003" - integrity sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw== - jsdom@^16.6.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -9980,6 +10113,11 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^3.1.0, loupe@^3.1.4: + version "3.2.1" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-3.2.1.tgz#0095cf56dc5b7a9a7c08ff5b1a8796ec8ad17e76" + integrity sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -10655,7 +10793,17 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^8.0.4, open@^8.0.9, open@^8.4.0: +open@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" + integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + wsl-utils "^0.1.0" + +open@^8.0.9, open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== @@ -10825,11 +10973,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -10896,6 +11039,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathval@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" + integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -11548,7 +11696,7 @@ postcss@^7.0.35: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.4, postcss@^8.4.43, postcss@^8.4.47, postcss@^8.5.6: +postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.4, postcss@^8.4.40, postcss@^8.4.43, postcss@^8.4.47, postcss@^8.5.6: version "8.5.8" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.8.tgz#6230ecc8fb02e7a0f6982e53990937857e13f399" integrity sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg== @@ -11683,11 +11831,6 @@ pumpify@^1.3.5: inherits "^2.0.3" pump "^2.0.0" -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -11705,13 +11848,6 @@ qified@^0.9.0: dependencies: hookified "^2.1.0" -qs@^6.12.3: - version "6.15.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.0.tgz#db8fd5d1b1d2d6b5b33adaf87429805f1909e7b3" - integrity sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ== - dependencies: - side-channel "^1.1.0" - qs@~6.14.0: version "6.14.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.2.tgz#b5634cf9d9ad9898e31fba3504e866e8efb6798c" @@ -11844,7 +11980,7 @@ react-docgen-typescript@^2.2.2: resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz#033428b4a6a639d050ac8baf2a5195c596521713" integrity sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg== -react-docgen@^7.0.0: +react-docgen@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-7.1.1.tgz#a7a8e6b923a945acf0b7325a889ddd74fec74a63" integrity sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg== @@ -11860,6 +11996,22 @@ react-docgen@^7.0.0: resolve "^1.22.1" strip-indent "^4.0.0" +react-docgen@^8.0.2: + version "8.0.3" + resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-8.0.3.tgz#164e5b29f8115f23d69b09966ec835d92bcdc075" + integrity sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w== + dependencies: + "@babel/core" "^7.28.0" + "@babel/traverse" "^7.28.0" + "@babel/types" "^7.28.2" + "@types/babel__core" "^7.20.5" + "@types/babel__traverse" "^7.20.7" + "@types/doctrine" "^0.0.9" + "@types/resolve" "^1.20.2" + doctrine "^3.0.0" + resolve "^1.22.1" + strip-indent "^4.0.0" + react-dom@^18, react-dom@^18.3.1: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" @@ -12064,6 +12216,11 @@ readdir-glob@^1.1.2: dependencies: minimatch "^5.1.0" +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -12435,6 +12592,11 @@ rollup@^4.20.0: "@rollup/rollup-win32-x64-msvc" "4.60.0" fsevents "~2.3.2" +run-applescript@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" + integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -12613,7 +12775,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.2, semver@^7.7.3: +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.3: version "7.7.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== @@ -13016,12 +13178,24 @@ stop-iteration-iterator@^1.1.0: es-errors "^1.3.0" internal-slot "^1.1.0" -storybook@^8.3.6: - version "8.6.18" - resolved "https://registry.yarnpkg.com/storybook/-/storybook-8.6.18.tgz#2a635a4b0c99693f43ba21b8eb511c5cc513a807" - integrity sha512-p8seiSI6FiVY6P3V0pG+5v7c8pDMehMAFRWEhG5XqIBSQszzOjDnW2rNvm3odoLKfo3V3P6Cs6Hv9ILzymULyQ== +storybook@^10.3.4: + version "10.3.4" + resolved "https://registry.yarnpkg.com/storybook/-/storybook-10.3.4.tgz#9efa013affd6411b4ae1ba3a0d18613e0ff289a2" + integrity sha512-866YXZy9k59tLPl9SN3KZZOFeBC/swxkuBVtW8iQjJIzfCrvk7zXQd8RSQ4ignmCdArVvY4lGMCAT4yNaZSt1g== dependencies: - "@storybook/core" "8.6.18" + "@storybook/global" "^5.0.0" + "@storybook/icons" "^2.0.1" + "@testing-library/jest-dom" "^6.9.1" + "@testing-library/user-event" "^14.6.1" + "@vitest/expect" "3.2.4" + "@vitest/spy" "3.2.4" + "@webcontainer/env" "^1.1.1" + esbuild "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0" + open "^10.2.0" + recast "^0.23.5" + semver "^7.7.3" + use-sync-external-store "^1.5.0" + ws "^8.18.0" stream-shift@^1.0.0: version "1.0.3" @@ -13285,6 +13459,11 @@ style-loader@^3.3.1: resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== +style-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-4.0.0.tgz#0ea96e468f43c69600011e0589cb05c44f3b17a5" + integrity sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA== + styled-jsx@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-4.0.1.tgz#ae3f716eacc0792f7050389de88add6d5245b9e9" @@ -13578,7 +13757,7 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.17: +terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.14, terser-webpack-plugin@^5.3.17: version "5.4.0" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz#95fc4cf4437e587be11ecf37d08636089174d76b" integrity sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g== @@ -13694,6 +13873,16 @@ tinyglobby@^0.2.11, tinyglobby@^0.2.15: fdir "^6.5.0" picomatch "^4.0.3" +tinyrainbow@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tinyrainbow/-/tinyrainbow-2.0.0.tgz#9509b2162436315e80e3eee0fcce4474d2444294" + integrity sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw== + +tinyspy@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-4.0.4.tgz#d77a002fb53a88aa1429b419c1c92492e0c81f78" + integrity sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -13785,7 +13974,7 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-api-utils@^2.4.0: +ts-api-utils@^2.4.0, ts-api-utils@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== @@ -14143,15 +14332,7 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -url@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" - integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== - dependencies: - punycode "^1.4.1" - qs "^6.12.3" - -use-sync-external-store@^1.6.0: +use-sync-external-store@^1.5.0, use-sync-external-store@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d" integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w== @@ -14171,17 +14352,6 @@ util.promisify@~1.0.0: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.0" -util@^0.12.4, util@^0.12.5: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -14591,7 +14761,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.16, which-typed-array@^1.1.19, which-typed-array@^1.1.2: +which-typed-array@^1.1.16, which-typed-array@^1.1.19: version "1.1.20" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== @@ -15035,11 +15205,18 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.13.0, ws@^8.2.3: +ws@^8.13.0, ws@^8.18.0: version "8.20.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.20.0.tgz#4cd9532358eba60bc863aad1623dfb045a4d4af8" integrity sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA== +wsl-utils@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" + integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== + dependencies: + is-wsl "^3.1.0" + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" From a52afe1c53b13dde7fdfed43f0500f4bd06ba7a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 6 Apr 2026 15:17:02 +0200 Subject: [PATCH 05/13] chore: gitignore debug-storybook.log --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1b41c0a1e..335a79c9b 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ yarn-debug.log* yarn-error.log* package-lock.json bundle.stats.json +debug-storybook.log # DHIS2 Platform .d2 From e7130b6ee6968c25540ceefebbae75e050a3fd66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 6 Apr 2026 15:26:24 +0200 Subject: [PATCH 06/13] chore: format package.json --- package.json | 164 +++++++++++++++++++++++++-------------------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index 1ab6fb8a4..e547f0f77 100644 --- a/package.json +++ b/package.json @@ -1,83 +1,83 @@ { - "name": "@dhis2/analytics", - "version": "29.4.2", - "main": "./build/cjs/index.js", - "module": "./build/es/index.js", - "exports": { - "import": "./build/es/index.js", - "require": "./build/cjs/index.js" - }, - "sideEffects": [ - "./build/es/locales/index.js", - "./build/cjs/locales/index.js" - ], - "repository": "git@github.com:dhis2/analytics.git", - "author": "Jennifer Jones Arnesen ", - "license": "BSD-3-Clause", - "private": false, - "publishConfig": { - "access": "public" - }, - "scripts": { - "build": "d2-app-scripts build", - "build-storybook": "storybook build", - "start-storybook": "storybook dev --port 5000", - "start": "yarn start-storybook", - "test": "d2-app-scripts test", - "lint": "d2-style check", - "format": "d2-style apply", - "validate-commit": "d2-style check --staged", - "validate-push": "yarn test" - }, - "devDependencies": { - "@dhis2/app-runtime": "^3.14.1", - "@dhis2/cli-app-scripts": "^12.11.0", - "@dhis2/cli-style": "^10.7.9", - "@dhis2/d2-i18n": "^1.1.0", - "@dhis2/ui": "^10.12.7", - "@storybook/preset-create-react-app": "^10.3.4", - "@storybook/react-webpack5": "^10.3.4", - "@testing-library/dom": "^10.4.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "fs-extra": "^10.1.0", - "prop-types": "^15", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-scripts": "^5.0.1", - "storybook": "^10.3.4", - "styled-jsx": "^4.0.1", - "eslint-plugin-storybook": "10.3.4" - }, - "peerDependencies": { - "@dhis2/app-runtime": "^3", - "@dhis2/d2-i18n": "^1.1", - "@dhis2/ui": "^10", - "prop-types": "^15", - "react": "^16.3 || ^18", - "react-dom": "^16.3 || ^ 18", - "styled-jsx": "^4.0.1" - }, - "dependencies": { - "@dhis2/multi-calendar-dates": "^1.2.2", - "@dnd-kit/core": "^6.0.7", - "@dnd-kit/sortable": "^7.0.2", - "@dnd-kit/utilities": "^3.2.1", - "@react-hook/debounce": "^4.0.0", - "classnames": "^2.3.1", - "crypto-js": "^4.2.0", - "d2-utilizr": "^0.2.16", - "d3-color": "^1.2.3", - "highcharts": "^12.1.2", - "lodash": "^4.17.21", - "markdown-it": "^13.0.1", - "mathjs": "^9.4.2", - "react-beautiful-dnd": "^10.1.1", - "resize-observer-polyfill": "^1.5.1" - }, - "files": [ - "build" - ], - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" -} \ No newline at end of file + "name": "@dhis2/analytics", + "version": "29.4.2", + "main": "./build/cjs/index.js", + "module": "./build/es/index.js", + "exports": { + "import": "./build/es/index.js", + "require": "./build/cjs/index.js" + }, + "sideEffects": [ + "./build/es/locales/index.js", + "./build/cjs/locales/index.js" + ], + "repository": "git@github.com:dhis2/analytics.git", + "author": "Jennifer Jones Arnesen ", + "license": "BSD-3-Clause", + "private": false, + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "d2-app-scripts build", + "build-storybook": "storybook build", + "start-storybook": "storybook dev --port 5000", + "start": "yarn start-storybook", + "test": "d2-app-scripts test", + "lint": "d2-style check", + "format": "d2-style apply", + "validate-commit": "d2-style check --staged", + "validate-push": "yarn test" + }, + "devDependencies": { + "@dhis2/app-runtime": "^3.14.1", + "@dhis2/cli-app-scripts": "^12.11.0", + "@dhis2/cli-style": "^10.7.9", + "@dhis2/d2-i18n": "^1.1.0", + "@dhis2/ui": "^10.12.7", + "@storybook/preset-create-react-app": "^10.3.4", + "@storybook/react-webpack5": "^10.3.4", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "fs-extra": "^10.1.0", + "prop-types": "^15", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-scripts": "^5.0.1", + "storybook": "^10.3.4", + "styled-jsx": "^4.0.1", + "eslint-plugin-storybook": "10.3.4" + }, + "peerDependencies": { + "@dhis2/app-runtime": "^3", + "@dhis2/d2-i18n": "^1.1", + "@dhis2/ui": "^10", + "prop-types": "^15", + "react": "^16.3 || ^18", + "react-dom": "^16.3 || ^ 18", + "styled-jsx": "^4.0.1" + }, + "dependencies": { + "@dhis2/multi-calendar-dates": "^1.2.2", + "@dnd-kit/core": "^6.0.7", + "@dnd-kit/sortable": "^7.0.2", + "@dnd-kit/utilities": "^3.2.1", + "@react-hook/debounce": "^4.0.0", + "classnames": "^2.3.1", + "crypto-js": "^4.2.0", + "d2-utilizr": "^0.2.16", + "d3-color": "^1.2.3", + "highcharts": "^12.1.2", + "lodash": "^4.17.21", + "markdown-it": "^13.0.1", + "mathjs": "^9.4.2", + "react-beautiful-dnd": "^10.1.1", + "resize-observer-polyfill": "^1.5.1" + }, + "files": [ + "build" + ], + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" +} From 342659c70fba6792cc3c400b15667498e853a317 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 07/13] 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 edd0799e77cb2adc512f8ed0bd6f7dcef963c7be 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 08/13] 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 7c308d9702f21d84b4e6f146a4a04e4d38e5d734 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 09/13] 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 + } + }) +} From e2948fe8060fd5e33c32f8d2e08a15c65ccf36fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 2 Mar 2026 11:38:01 +0100 Subject: [PATCH 10/13] chore: linting --- src/__demo__/PivotTable.event.stories.js | 5 +-- src/modules/dimensions.js | 2 +- .../eventVisualization/eventVisualization.js | 26 ++++++------- .../response/event/__tests__/response.spec.js | 38 ++++++++++++++----- src/modules/response/event/default.js | 10 ++--- src/modules/response/event/response.js | 34 ++++++++--------- 6 files changed, 64 insertions(+), 51 deletions(-) diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 1c87c2386..71f4b3193 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -398,10 +398,7 @@ export const EventstatusNA = (_, { pivotTableOptions }) => { return (
- +
) } diff --git a/src/modules/dimensions.js b/src/modules/dimensions.js index 1a1dbc4f1..2819a8155 100644 --- a/src/modules/dimensions.js +++ b/src/modules/dimensions.js @@ -72,4 +72,4 @@ const EVENT_DIMENSIONS = [ ] export const getHeaderByVis = (vis) => - EVENT_DIMENSIONS.find((d) => d.vis === vis)?.header \ No newline at end of file + EVENT_DIMENSIONS.find((d) => d.vis === vis)?.header diff --git a/src/modules/eventVisualization/eventVisualization.js b/src/modules/eventVisualization/eventVisualization.js index 7b2dfe238..d7465b088 100644 --- a/src/modules/eventVisualization/eventVisualization.js +++ b/src/modules/eventVisualization/eventVisualization.js @@ -1,34 +1,32 @@ -import { getHeaderByVis } from "../dimensions" -import { layoutGetAllDimensions } from "../layout/layoutGetAllDimensions" +import { getHeaderByVis } from '../dimensions.js' +import { layoutGetAllDimensions } from '../layout/layoutGetAllDimensions.js' export const transformEventVisualization = (vis) => { // Do not modify the original visualization - let transformedVis = { + const transformedVis = { ...vis, columns: [ - ...vis.columns.map(col => ({ - ...col - })) + ...vis.columns.map((col) => ({ + ...col, + })), ], rows: [ - ...vis.rows.map(row => ({ - ...row - })) + ...vis.rows.map((row) => ({ + ...row, + })), ], } let headerName - layoutGetAllDimensions(vis).forEach(dim => { + layoutGetAllDimensions(vis).forEach((dim) => { headerName = getHeaderByVis(dim.dimension) if (dim.program?.id) { dim.dimension = `${dim.program.id}.${headerName}` - } - else if (dim.programStage?.id) { + } else if (dim.programStage?.id) { dim.dimension = `${dim.programStage.id}.${headerName}` - } - else { + } 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 dea5ecfd5..452391d05 100644 --- a/src/modules/response/event/__tests__/response.spec.js +++ b/src/modules/response/event/__tests__/response.spec.js @@ -33,17 +33,33 @@ import { VALUE_TYPE_PERCENTAGE, VALUE_TYPE_TRUE_ONLY, } from '../../../valueTypes.js' -import { getItemFormatterByHeaderName, 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') + 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') }) }) @@ -195,12 +211,16 @@ describe('response', () => { describe('eventstatus', () => { it('transforms response', () => { - expect(transformResponse(responseEventstatusOrg)).toEqual(responseEventstatus) + expect(transformResponse(responseEventstatusOrg)).toEqual( + responseEventstatus + ) }) it('transforms response and hides N/A data', () => { expect( - transformResponse(responseEventstatusOrg, { hideNaData: true }) + transformResponse(responseEventstatusOrg, { + hideNaData: true, + }) ).toEqual(responseEventstatusHideNa) }) }) diff --git a/src/modules/response/event/default.js b/src/modules/response/event/default.js index fc9f818ed..f98e71e67 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 499975d30..21c23fdf9 100644 --- a/src/modules/response/event/response.js +++ b/src/modules/response/event/response.js @@ -51,9 +51,9 @@ const STATUSES = { export const getItemFormatter = ({ name, valueType }) => getItemFormatterByHeaderName(name) || getItemFormatterByValueType(valueType) -export const getItemFormatterByHeaderName = name => { +export const getItemFormatterByHeaderName = (name) => { if (name.endsWith('eventstatus') || name.endsWith('programstatus')) { - return n => STATUSES[n] || n + return (n) => STATUSES[n] || n } return undefined @@ -77,17 +77,17 @@ 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') + (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 } = {}) => { @@ -113,15 +113,13 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { ...header, index, })) - .filter( - (header) => includeHeaderChecks.every(check => check(header)) - ) + .filter((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) + console.log('metaHeaders', metaHeaders) metaHeaders.forEach((header) => { if ( !( @@ -139,7 +137,7 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { transformedResponse, header.index, { - itemFormatter: getItemFormatter(header) + itemFormatter: getItemFormatter(header), } ) } From e21337f322a7d28722ea18a34310b240776cf36d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 9 Apr 2026 10:34:09 +0300 Subject: [PATCH 11/13] chore: comments --- src/modules/dimensions.js | 4 ++++ src/modules/eventVisualization/eventVisualization.js | 7 ++++++- src/modules/response/event/response.js | 6 +++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/modules/dimensions.js b/src/modules/dimensions.js index 2819a8155..96e237ce7 100644 --- a/src/modules/dimensions.js +++ b/src/modules/dimensions.js @@ -1,3 +1,7 @@ +// vis: 'dimension' in EventVisualization colums/rows/filters +// dim: tracker analytics api dimension/filter id +// header: tracker analytics api header name (query endpoints) + const EVENT_DIMENSIONS = [ { vis: 'ou', diff --git a/src/modules/eventVisualization/eventVisualization.js b/src/modules/eventVisualization/eventVisualization.js index d7465b088..b7872dac0 100644 --- a/src/modules/eventVisualization/eventVisualization.js +++ b/src/modules/eventVisualization/eventVisualization.js @@ -1,6 +1,9 @@ import { getHeaderByVis } from '../dimensions.js' import { layoutGetAllDimensions } from '../layout/layoutGetAllDimensions.js' +// Dimensions saved with program or program stage in an EventVisualization need +// transformation before we can pass them to the pivot table engine + export const transformEventVisualization = (vis) => { // Do not modify the original visualization const transformedVis = { @@ -19,7 +22,7 @@ export const transformEventVisualization = (vis) => { let headerName - layoutGetAllDimensions(vis).forEach((dim) => { + layoutGetAllDimensions(transformedVis).forEach((dim) => { headerName = getHeaderByVis(dim.dimension) if (dim.program?.id) { @@ -30,4 +33,6 @@ export const transformEventVisualization = (vis) => { dim.dimension = headerName } }) + + return transformedVis } diff --git a/src/modules/response/event/response.js b/src/modules/response/event/response.js index 21c23fdf9..85a09e612 100644 --- a/src/modules/response/event/response.js +++ b/src/modules/response/event/response.js @@ -20,6 +20,11 @@ import { import { applyDefaultHandler } from './default.js' import { applyOptionSetHandler } from './optionSet.js' +// Responses coming from these endpoints need transformation +// before we can pass it to the pivot table engine: +// - analytics/events/aggregate +// - analytics/enrollments/aggregate + export const PREFIX_SEPARATOR = '_' export const NA_VALUE = '' export const NA_VALUE_ITEM = { @@ -119,7 +124,6 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { // 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 ( !( From e5b96466e5b372e7d00cee5561280bf436ff01a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 9 Apr 2026 15:39:30 +0200 Subject: [PATCH 12/13] test: event orgunit story --- src/__demo__/PivotTable.event.stories.js | 21 +++ src/__demo__/data/event/eventou.data.json | 123 ++++++++++++++++ .../data/event/eventou.visualization.json | 139 ++++++++++++++++++ .../__tests__/eventVisualization.spec.js | 50 +++++++ .../eventVisualization/eventVisualization.js | 24 ++- 5 files changed, 352 insertions(+), 5 deletions(-) create mode 100644 src/__demo__/data/event/eventou.data.json create mode 100644 src/__demo__/data/event/eventou.visualization.json create mode 100644 src/modules/eventVisualization/__tests__/eventVisualization.spec.js diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 71f4b3193..91f7c969d 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -13,6 +13,8 @@ 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 eventouData from './data/event/eventou.data.json' +import eventouVisualization from './data/event/eventou.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' @@ -423,3 +425,22 @@ export const Eventstatus = (_, { pivotTableOptions }) => { } Eventstatus.storyName = 'Eventstatus' + +export const Eventou = (_, { pivotTableOptions }) => { + const visualization = { + ...eventouVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +Eventou.storyName = 'Event orgunit' \ No newline at end of file diff --git a/src/__demo__/data/event/eventou.data.json b/src/__demo__/data/event/eventou.data.json new file mode 100644 index 000000000..b91914b4e --- /dev/null +++ b/src/__demo__/data/event/eventou.data.json @@ -0,0 +1,123 @@ +{ + "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": "value", + "column": "Value", + "valueType": "NUMBER", + "type": "java.lang.Double", + "hidden": false, + "meta": false + } + ], + "metaData": { + "items": { + "202510": { + "name": "202510" + }, + "202511": { + "name": "202511" + }, + "202512": { + "name": "202512" + }, + "202601": { + "name": "202601" + }, + "202602": { + "name": "202602" + }, + "202603": { + "name": "202603" + }, + "IpHINAT79UW": { + "name": "Child Programme" + }, + "ZzYYXq4fJie": { + "name": "Baby Postnatal" + }, + "USER_ORGUNIT": { + "organisationUnits": [ + "ImspTQPwCqd" + ] + }, + "A03MvHHogjR.ou": { + "name": "Organisation unit" + }, + "ImspTQPwCqd": { + "name": "Sierra Leone" + }, + "A03MvHHogjR.eventdate": { + "name": "Report date" + }, + "A03MvHHogjR": { + "name": "Birth" + } + }, + "dimensions": { + "A03MvHHogjR.eventdate": [ + "202510", + "202511", + "202512", + "202601", + "202602", + "202603" + ], + "pe": [], + "A03MvHHogjR.ou": [ + "ImspTQPwCqd" + ] + } + }, + "rowContext": {}, + "width": 3, + "rows": [ + [ + "ImspTQPwCqd", + "202510", + "973" + ], + [ + "ImspTQPwCqd", + "202511", + "932" + ], + [ + "ImspTQPwCqd", + "202512", + "858" + ], + [ + "ImspTQPwCqd", + "202601", + "694" + ], + [ + "ImspTQPwCqd", + "202602", + "629" + ], + [ + "ImspTQPwCqd", + "202603", + "694" + ] + ], + "headerWidth": 3, + "height": 6 +} \ No newline at end of file diff --git a/src/__demo__/data/event/eventou.visualization.json b/src/__demo__/data/event/eventou.visualization.json new file mode 100644 index 000000000..b75aad7d6 --- /dev/null +++ b/src/__demo__/data/event/eventou.visualization.json @@ -0,0 +1,139 @@ +{ + "name": "Event orgunit", + "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" + } + } + ], + "rows": [ + { + "items": [ + { + "dimensionItemType": "PERIOD", + "id": "LAST_6_MONTHS" + } + ], + "dimension": "A03MvHHogjR.eventdate", + "programStage": { + "id": "A03MvHHogjR" + } + } + ], + "displayName": "Event orgunit", + "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": "Event orgunit", + "id": "xLPn5T11Vd4", + "attributeValues": [] +} \ No newline at end of file diff --git a/src/modules/eventVisualization/__tests__/eventVisualization.spec.js b/src/modules/eventVisualization/__tests__/eventVisualization.spec.js new file mode 100644 index 000000000..6af3ae135 --- /dev/null +++ b/src/modules/eventVisualization/__tests__/eventVisualization.spec.js @@ -0,0 +1,50 @@ +import { transformEventVisualization } from "../eventVisualization" + +const testDim1 = { + dimension: 'eventDate', + programStage: { + id: 'A03MvHHogjR' + } +} + +const testDim2 = { + dimension: 'enrollmentDate', + program: { + id: 'IpHINAT79UW' + } +} + +const testDim3 = { + dimension: 'created' +} + +const testAxis = [ + testDim1 +] + +const testVis = { + columns: testAxis, + rows: [testDim2], + filters: [testDim3], +} + +describe('eventVisualization', () => { + describe('transformEventVisualization', () => { + it('does not modify dimension, axis or vis', () => { + const newVis = transformEventVisualization(testVis) + expect(newVis === testVis).toBe(false) + expect(newVis.columns === testAxis).toBe(false) + expect(newVis.columns[0] === testDim1).toBe(false) + }) + + it('applies program stage to id', () => { + const newVis = transformEventVisualization(testVis) + expect(newVis.columns[0].dimension).toBe('A03MvHHogjR.eventdate') + }) + + it('applies program to id', () => { + const newVis = transformEventVisualization(testVis) + expect(newVis.rows[0].dimension).toBe('IpHINAT79UW.enrollmentdate') + }) + }) +}) \ No newline at end of file diff --git a/src/modules/eventVisualization/eventVisualization.js b/src/modules/eventVisualization/eventVisualization.js index b7872dac0..68029bae2 100644 --- a/src/modules/eventVisualization/eventVisualization.js +++ b/src/modules/eventVisualization/eventVisualization.js @@ -7,17 +7,31 @@ import { layoutGetAllDimensions } from '../layout/layoutGetAllDimensions.js' export const transformEventVisualization = (vis) => { // Do not modify the original visualization const transformedVis = { - ...vis, - columns: [ + ...vis + } + + if (vis.columns?.length) { + transformedVis.columns = [ ...vis.columns.map((col) => ({ ...col, })), - ], - rows: [ + ] + } + + if (vis.rows?.length) { + transformedVis.rows = [ ...vis.rows.map((row) => ({ ...row, })), - ], + ] + } + + if (vis.filters?.length) { + transformedVis.filters = [ + ...vis.filters.map((filter) => ({ + ...filter, + })), + ] } let headerName From 97736506b194685f05ed29301b69b6a245bc7686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 30 Apr 2026 14:24:57 +0200 Subject: [PATCH 13/13] refactor: clean up event visualization transformer - remove duplicate createdBy entry and fix typo in dimensions.js - simplify transformEventVisualization with helper and merge mutation branches - replace per-predicate filter array with name set + suffix list in transformResponse - extract status formatter helper - export transformEventVisualization from public index - tighten test assertions and import quotes --- src/__demo__/PivotTable.event.stories.js | 7 +-- .../data/event/integer.visualization.json | 2 +- src/index.js | 4 ++ src/modules/dimensions.js | 7 +-- .../__tests__/eventVisualization.spec.js | 24 +++++----- .../eventVisualization/eventVisualization.js | 44 ++++-------------- src/modules/response/event/default.js | 10 ++-- src/modules/response/event/response.js | 46 +++++++++++-------- 8 files changed, 59 insertions(+), 85 deletions(-) diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 91f7c969d..4ff446efb 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -435,12 +435,9 @@ export const Eventou = (_, { pivotTableOptions }) => { return (
- +
) } -Eventou.storyName = 'Event orgunit' \ No newline at end of file +Eventou.storyName = 'Event orgunit' diff --git a/src/__demo__/data/event/integer.visualization.json b/src/__demo__/data/event/integer.visualization.json index 4f4885cdf..3b127ab9f 100644 --- a/src/__demo__/data/event/integer.visualization.json +++ b/src/__demo__/data/event/integer.visualization.json @@ -162,4 +162,4 @@ "displayFormName": "Integer", "id": "kNl4fqsY9hJ", "attributeValues": [] -} \ No newline at end of file +} diff --git a/src/index.js b/src/index.js index 976210f68..eabb4c277 100644 --- a/src/index.js +++ b/src/index.js @@ -334,6 +334,10 @@ export { renderValue as formatValue } from './modules/renderValue.js' export { transformResponse as transformEventAggregateResponse } from './modules/response/event/response.js' +// Modules: eventVisualization + +export { transformEventVisualization } from './modules/eventVisualization/eventVisualization.js' + // Utils: colorSets export { COLOR_SET_DEFAULT, diff --git a/src/modules/dimensions.js b/src/modules/dimensions.js index 96e237ce7..71e62ce06 100644 --- a/src/modules/dimensions.js +++ b/src/modules/dimensions.js @@ -1,4 +1,4 @@ -// vis: 'dimension' in EventVisualization colums/rows/filters +// vis: 'dimension' in EventVisualization columns/rows/filters // dim: tracker analytics api dimension/filter id // header: tracker analytics api header name (query endpoints) @@ -68,11 +68,6 @@ const EVENT_DIMENSIONS = [ dim: '', header: 'lastupdatedbydisplayname', }, - { - vis: 'createdBy', - dim: '', - header: 'createdbydisplayname', - }, ] export const getHeaderByVis = (vis) => diff --git a/src/modules/eventVisualization/__tests__/eventVisualization.spec.js b/src/modules/eventVisualization/__tests__/eventVisualization.spec.js index 6af3ae135..8fb07d9d8 100644 --- a/src/modules/eventVisualization/__tests__/eventVisualization.spec.js +++ b/src/modules/eventVisualization/__tests__/eventVisualization.spec.js @@ -1,26 +1,24 @@ -import { transformEventVisualization } from "../eventVisualization" +import { transformEventVisualization } from '../eventVisualization.js' const testDim1 = { dimension: 'eventDate', programStage: { - id: 'A03MvHHogjR' - } + id: 'A03MvHHogjR', + }, } const testDim2 = { dimension: 'enrollmentDate', program: { - id: 'IpHINAT79UW' - } + id: 'IpHINAT79UW', + }, } const testDim3 = { - dimension: 'created' + dimension: 'created', } -const testAxis = [ - testDim1 -] +const testAxis = [testDim1] const testVis = { columns: testAxis, @@ -32,9 +30,9 @@ describe('eventVisualization', () => { describe('transformEventVisualization', () => { it('does not modify dimension, axis or vis', () => { const newVis = transformEventVisualization(testVis) - expect(newVis === testVis).toBe(false) - expect(newVis.columns === testAxis).toBe(false) - expect(newVis.columns[0] === testDim1).toBe(false) + expect(newVis).not.toBe(testVis) + expect(newVis.columns).not.toBe(testAxis) + expect(newVis.columns[0]).not.toBe(testDim1) }) it('applies program stage to id', () => { @@ -47,4 +45,4 @@ describe('eventVisualization', () => { expect(newVis.rows[0].dimension).toBe('IpHINAT79UW.enrollmentdate') }) }) -}) \ No newline at end of file +}) diff --git a/src/modules/eventVisualization/eventVisualization.js b/src/modules/eventVisualization/eventVisualization.js index 68029bae2..520fd3ba8 100644 --- a/src/modules/eventVisualization/eventVisualization.js +++ b/src/modules/eventVisualization/eventVisualization.js @@ -4,48 +4,22 @@ import { layoutGetAllDimensions } from '../layout/layoutGetAllDimensions.js' // Dimensions saved with program or program stage in an EventVisualization need // transformation before we can pass them to the pivot table engine +const cloneAxis = (axis) => axis?.map((dim) => ({ ...dim })) + export const transformEventVisualization = (vis) => { // Do not modify the original visualization const transformedVis = { - ...vis - } - - if (vis.columns?.length) { - transformedVis.columns = [ - ...vis.columns.map((col) => ({ - ...col, - })), - ] - } - - if (vis.rows?.length) { - transformedVis.rows = [ - ...vis.rows.map((row) => ({ - ...row, - })), - ] - } - - if (vis.filters?.length) { - transformedVis.filters = [ - ...vis.filters.map((filter) => ({ - ...filter, - })), - ] + ...vis, + columns: cloneAxis(vis.columns), + rows: cloneAxis(vis.rows), + filters: cloneAxis(vis.filters), } - let headerName - layoutGetAllDimensions(transformedVis).forEach((dim) => { - headerName = getHeaderByVis(dim.dimension) + const headerName = getHeaderByVis(dim.dimension) + const prefix = dim.program?.id ?? dim.programStage?.id - 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 - } + dim.dimension = prefix ? `${prefix}.${headerName}` : headerName }) return transformedVis diff --git a/src/modules/response/event/default.js b/src/modules/response/event/default.js index fc9f818ed..f98e71e67 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 85a09e612..35c62eeb3 100644 --- a/src/modules/response/event/response.js +++ b/src/modules/response/event/response.js @@ -53,16 +53,15 @@ const STATUSES = { CANCELLED: i18n.t('Cancelled'), } +const formatStatus = (value) => STATUSES[value] || value + 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 getItemFormatterByHeaderName = (name) => + name.endsWith('eventstatus') || name.endsWith('programstatus') + ? formatStatus + : undefined export const getItemFormatterByValueType = (valueType) => { switch (valueType) { @@ -81,20 +80,27 @@ 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'), +const EXCLUDED_HEADER_NAMES = new Set([ + DIMENSION_ID_PERIOD, + DIMENSION_ID_ORGUNIT, + 'lastupdated', + 'created', + 'completed', +]) + +const EXCLUDED_HEADER_SUFFIXES = [ + '.eventdate', + '.enrollmentdate', + '.scheduleddate', + '.incidentdate', + '.ou', ] +const isIncludedHeader = (header) => + Boolean(header.meta) && + !EXCLUDED_HEADER_NAMES.has(header.name) && + !EXCLUDED_HEADER_SUFFIXES.some((suffix) => header.name.endsWith(suffix)) + export const transformResponse = (response, { hideNaData = false } = {}) => { // Do not modify the original response // Rows is mapped by the handlers @@ -118,7 +124,7 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { ...header, index, })) - .filter((header) => includeHeaderChecks.every((check) => check(header))) + .filter(isIncludedHeader) // Legendsets use uids and do not need transformation // Skip unsupported value types