diff --git a/.storybook/main.js b/.storybook/main.js
index 5ea7e965d..88bdccece 100644
--- a/.storybook/main.js
+++ b/.storybook/main.js
@@ -2,7 +2,7 @@ const makeBabelConfig = require('@dhis2/cli-app-scripts/config/makeBabelConfig.j
module.exports = {
addons: ['@storybook/preset-create-react-app'],
- stories: ['../src/**/*.stories.@(js)'],
+ stories: ['../src/__demo__/**/*.stories.@(js)'],
babel: async (config) => {
// currently styled-jsx is configured the same way for prod and
diff --git a/i18n/en.pot b/i18n/en.pot
index d10e00041..91b4d9657 100644
--- a/i18n/en.pot
+++ b/i18n/en.pot
@@ -5,8 +5,8 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-"POT-Creation-Date: 2025-07-22T14:10:58.033Z\n"
-"PO-Revision-Date: 2025-07-22T14:10:58.033Z\n"
+"POT-Creation-Date: 2025-09-05T07:32:59.321Z\n"
+"PO-Revision-Date: 2025-09-05T07:32:59.322Z\n"
msgid "view only"
msgstr "view only"
@@ -1284,6 +1284,9 @@ msgstr "Organisation unit"
msgid "Assigned Categories"
msgstr "Assigned Categories"
+msgid "No value"
+msgstr "No value"
+
msgid "Text"
msgstr "Text"
diff --git a/src/__demo__/PivotTable.stories.js b/src/__demo__/PivotTable.aggregate.stories.js
similarity index 91%
rename from src/__demo__/PivotTable.stories.js
rename to src/__demo__/PivotTable.aggregate.stories.js
index 3a1112557..d3b558eaf 100644
--- a/src/__demo__/PivotTable.stories.js
+++ b/src/__demo__/PivotTable.aggregate.stories.js
@@ -7,43 +7,43 @@ import {
NUMBER_TYPE_COLUMN_PERCENTAGE,
NUMBER_TYPE_ROW_PERCENTAGE,
} from '../modules/pivotTable/pivotTableConstants.js'
-import avgDataResponse from './data/avgTotalAggregationType.data.json'
-import avgMetadataResponse from './data/avgTotalAggregationType.metadata.json'
-import avgVisualization from './data/avgTotalAggregationType.visualization.json'
-import deepData from './data/deep.data.json'
-import deepVisualization from './data/deep.visualization.json'
-import deepWithFiltersData from './data/deepWithFilters.data.json'
-import deepWithFiltersVisualization from './data/deepWithFilters.visualization.json'
-import degsDataResponse from './data/degs.data.json'
-import degsMetadataResponse from './data/degs.metadata.json'
-import degsVisualization from './data/degs.visualization.json'
-import diseaseWeeksDataResponse from './data/diseaseWeeks.data.json'
-import diseaseWeeksMetadataResponse from './data/diseaseWeeks.metadata.json'
-import diseaseWeeksVisualization from './data/diseaseWeeks.visualization.json'
-import emptyColumnsDataResponse from './data/emptyColumns.data.json'
-import emptyColumnsMetadataResponse from './data/emptyColumns.metadata.json'
-import emptyColumnsVisualization from './data/emptyColumns.visualization.json'
-import emptyRowsData from './data/emptyRows.data.json'
-import emptyRowsVisualization from './data/emptyRows.visualization.json'
-import hierarchyDataResponse from './data/hierarchy.data.json'
-import hierarchyMetadataResponse from './data/hierarchy.metadata.json'
-import hierarchyVisualization from './data/hierarchy.visualization.json'
-import lastFiveYearsDataResponse from './data/lastFiveYears.data.json'
-import lastFiveYearsMetadataResponse from './data/lastFiveYears.metadata.json'
-import lastFiveYearsVisualization from './data/lastFiveYears.visualization.json'
-import narrativeDataResponse from './data/narrative.data.json'
-import narrativeMetadataResponse from './data/narrative.metadata.json'
-import narrativeVisualization from './data/narrative.visualization.json'
-import simpleDataResponse from './data/simple.data.json'
-import simpleMetadataResponse from './data/simple.metadata.json'
-import simpleVisualization from './data/simple.visualization.json'
-import targetDataResponse from './data/target-with-legend.data.json'
-import targetMetadataResponse from './data/target-with-legend.metadata.json'
-import targetVisualization from './data/target-with-legend.visualization.json'
-import underAbove100LegendSet from './data/under-above-100.legendSet.json'
-import weeklyColumnsDataResponse from './data/weeklyColumns.data.json'
-import weeklyColumnsMetadataResponse from './data/weeklyColumns.metadata.json'
-import weeklyColumnsVisualization from './data/weeklyColumns.visualization.json'
+import avgDataResponse from './data/aggregate/avgTotalAggregationType.data.json'
+import avgMetadataResponse from './data/aggregate/avgTotalAggregationType.metadata.json'
+import avgVisualization from './data/aggregate/avgTotalAggregationType.visualization.json'
+import deepData from './data/aggregate/deep.data.json'
+import deepVisualization from './data/aggregate/deep.visualization.json'
+import deepWithFiltersData from './data/aggregate/deepWithFilters.data.json'
+import deepWithFiltersVisualization from './data/aggregate/deepWithFilters.visualization.json'
+import degsDataResponse from './data/aggregate/degs.data.json'
+import degsMetadataResponse from './data/aggregate/degs.metadata.json'
+import degsVisualization from './data/aggregate/degs.visualization.json'
+import diseaseWeeksDataResponse from './data/aggregate/diseaseWeeks.data.json'
+import diseaseWeeksMetadataResponse from './data/aggregate/diseaseWeeks.metadata.json'
+import diseaseWeeksVisualization from './data/aggregate/diseaseWeeks.visualization.json'
+import emptyColumnsDataResponse from './data/aggregate/emptyColumns.data.json'
+import emptyColumnsMetadataResponse from './data/aggregate/emptyColumns.metadata.json'
+import emptyColumnsVisualization from './data/aggregate/emptyColumns.visualization.json'
+import emptyRowsData from './data/aggregate/emptyRows.data.json'
+import emptyRowsVisualization from './data/aggregate/emptyRows.visualization.json'
+import hierarchyDataResponse from './data/aggregate/hierarchy.data.json'
+import hierarchyMetadataResponse from './data/aggregate/hierarchy.metadata.json'
+import hierarchyVisualization from './data/aggregate/hierarchy.visualization.json'
+import lastFiveYearsDataResponse from './data/aggregate/lastFiveYears.data.json'
+import lastFiveYearsMetadataResponse from './data/aggregate/lastFiveYears.metadata.json'
+import lastFiveYearsVisualization from './data/aggregate/lastFiveYears.visualization.json'
+import narrativeDataResponse from './data/aggregate/narrative.data.json'
+import narrativeMetadataResponse from './data/aggregate/narrative.metadata.json'
+import narrativeVisualization from './data/aggregate/narrative.visualization.json'
+import simpleDataResponse from './data/aggregate/simple.data.json'
+import simpleMetadataResponse from './data/aggregate/simple.metadata.json'
+import simpleVisualization from './data/aggregate/simple.visualization.json'
+import targetDataResponse from './data/aggregate/target-with-legend.data.json'
+import targetMetadataResponse from './data/aggregate/target-with-legend.metadata.json'
+import targetVisualization from './data/aggregate/target-with-legend.visualization.json'
+import underAbove100LegendSet from './data/aggregate/under-above-100.legendSet.json'
+import weeklyColumnsDataResponse from './data/aggregate/weeklyColumns.data.json'
+import weeklyColumnsMetadataResponse from './data/aggregate/weeklyColumns.metadata.json'
+import weeklyColumnsVisualization from './data/aggregate/weeklyColumns.visualization.json'
const visualizationReset = {
colTotals: false,
@@ -135,7 +135,7 @@ const PivotTableOptionsWrapper = (story) => {
}
export default {
- title: 'PivotTable',
+ title: 'PivotTable (aggregate)',
decorators: [PivotTableOptionsWrapper],
}
diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js
new file mode 100644
index 000000000..e0fdd1e85
--- /dev/null
+++ b/src/__demo__/PivotTable.event.stories.js
@@ -0,0 +1,387 @@
+import { Checkbox, Divider } from '@dhis2/ui'
+import React, { useState } from 'react'
+import { PivotTable } from '../index.js'
+import booleanDataHideNa from './data/event/boolean.data.hidena.json'
+import booleanData from './data/event/boolean.data.json'
+import booleanVisualization from './data/event/boolean.visualization.json'
+import dateDataHideNa from './data/event/date.data.hidena.json'
+import dateData from './data/event/date.data.json'
+import dateVisualization from './data/event/date.visualization.json'
+import datetimeDataHideNa from './data/event/datetime.data.hidena.json'
+import datetimeData from './data/event/datetime.data.json'
+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 integerDataHideNa from './data/event/integer.data.hidena.json'
+import integerData from './data/event/integer.data.json'
+import integerVisualization from './data/event/integer.visualization.json'
+import legendsetDataHideNa from './data/event/legendset.data.hidena.json'
+import legendsetData from './data/event/legendset.data.json'
+import legendsetVisualization from './data/event/legendset.visualization.json'
+import optionsetDataHideNa from './data/event/optionset.data.hidena.json'
+import optionsetData from './data/event/optionset.data.json'
+import optionsetVisualization from './data/event/optionset.visualization.json'
+import timeDataHideNa from './data/event/time.data.hidena.json'
+import timeData from './data/event/time.data.json'
+import timeVisualization from './data/event/time.visualization.json'
+import yesonlyDataHideNa from './data/event/yesonly.data.hidena.json'
+import yesonlyData from './data/event/yesonly.data.json'
+import yesonlyVisualization from './data/event/yesonly.visualization.json'
+
+const visualizationReset = {
+ colTotals: false,
+ rowTotals: false,
+ colSubTotals: false,
+ rowSubTotals: false,
+ hideEmptyColumns: false,
+ hideEmptyRows: false,
+ hideNaData: false,
+}
+
+const PivotTableOptionsWrapper = (story) => {
+ const [pivotTableOptions, setPivotTableOptions] = useState({
+ fixColumnHeaders: false,
+ fixRowHeaders: false,
+ })
+
+ return (
+
+
+
+ setPivotTableOptions({
+ ...pivotTableOptions,
+ fixColumnHeaders: checked,
+ })
+ }
+ dense
+ />
+
+ setPivotTableOptions({
+ ...pivotTableOptions,
+ fixRowHeaders: checked,
+ })
+ }
+ dense
+ />
+
+
+ {story({ pivotTableOptions })}
+
+ )
+}
+
+export default {
+ title: 'PivotTable (event)',
+ decorators: [PivotTableOptionsWrapper],
+}
+
+export const TypeBooleanNA = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...booleanVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+TypeBooleanNA.storyName = 'Boolean N/A'
+
+export const TypeBoolean = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...booleanVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+TypeBoolean.storyName = 'Boolean'
+
+export const TypeDateNA = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...dateVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+TypeDateNA.storyName = 'Date N/A'
+
+export const TypeDate = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...dateVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+TypeDate.storyName = 'Date'
+
+export const TypeDatetimeNA = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...datetimeVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+TypeDatetimeNA.storyName = 'Datetime N/A'
+
+export const TypeDatetime = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...datetimeVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+TypeDatetime.storyName = 'Datetime'
+
+export const TypeLegendsetNA = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...legendsetVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+ return (
+
+ )
+}
+
+TypeLegendsetNA.storyName = 'Legendset N/A'
+
+export const TypeLegendset = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...legendsetVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+ return (
+
+ )
+}
+
+TypeLegendset.storyName = 'Legendset'
+
+export const TypeNumericNA = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...integerVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+TypeNumericNA.storyName = 'Numeric N/A'
+
+export const TypeNumeric = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...integerVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+TypeNumeric.storyName = 'Numeric'
+
+export const OptionsetNA = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...optionsetVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+OptionsetNA.storyName = 'Optionset N/A'
+
+export const Optionset = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...optionsetVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+Optionset.storyName = 'Optionset'
+
+export const TextNA = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...emailVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+TextNA.storyName = 'Text N/A'
+
+export const Text = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...emailVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+Text.storyName = 'Text'
+
+export const TimeNA = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...timeVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+TimeNA.storyName = 'Time N/A'
+
+export const Time = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...timeVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+Time.storyName = 'Time'
+
+export const YesonlyNA = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...yesonlyVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+YesonlyNA.storyName = 'Yesonly N/A'
+
+export const Yesonly = (_, { pivotTableOptions }) => {
+ const visualization = {
+ ...yesonlyVisualization,
+ ...visualizationReset,
+ ...pivotTableOptions,
+ }
+
+ return (
+
+ )
+}
+
+Yesonly.storyName = 'Yesonly'
diff --git a/src/__demo__/data/avgTotalAggregationType.data.json b/src/__demo__/data/aggregate/avgTotalAggregationType.data.json
similarity index 100%
rename from src/__demo__/data/avgTotalAggregationType.data.json
rename to src/__demo__/data/aggregate/avgTotalAggregationType.data.json
diff --git a/src/__demo__/data/avgTotalAggregationType.metadata.json b/src/__demo__/data/aggregate/avgTotalAggregationType.metadata.json
similarity index 100%
rename from src/__demo__/data/avgTotalAggregationType.metadata.json
rename to src/__demo__/data/aggregate/avgTotalAggregationType.metadata.json
diff --git a/src/__demo__/data/avgTotalAggregationType.visualization.json b/src/__demo__/data/aggregate/avgTotalAggregationType.visualization.json
similarity index 100%
rename from src/__demo__/data/avgTotalAggregationType.visualization.json
rename to src/__demo__/data/aggregate/avgTotalAggregationType.visualization.json
diff --git a/src/__demo__/data/deep.data.json b/src/__demo__/data/aggregate/deep.data.json
similarity index 100%
rename from src/__demo__/data/deep.data.json
rename to src/__demo__/data/aggregate/deep.data.json
diff --git a/src/__demo__/data/deep.visualization.json b/src/__demo__/data/aggregate/deep.visualization.json
similarity index 100%
rename from src/__demo__/data/deep.visualization.json
rename to src/__demo__/data/aggregate/deep.visualization.json
diff --git a/src/__demo__/data/deepWithFilters.data.json b/src/__demo__/data/aggregate/deepWithFilters.data.json
similarity index 100%
rename from src/__demo__/data/deepWithFilters.data.json
rename to src/__demo__/data/aggregate/deepWithFilters.data.json
diff --git a/src/__demo__/data/deepWithFilters.visualization.json b/src/__demo__/data/aggregate/deepWithFilters.visualization.json
similarity index 100%
rename from src/__demo__/data/deepWithFilters.visualization.json
rename to src/__demo__/data/aggregate/deepWithFilters.visualization.json
diff --git a/src/__demo__/data/degs.data.json b/src/__demo__/data/aggregate/degs.data.json
similarity index 100%
rename from src/__demo__/data/degs.data.json
rename to src/__demo__/data/aggregate/degs.data.json
diff --git a/src/__demo__/data/degs.metadata.json b/src/__demo__/data/aggregate/degs.metadata.json
similarity index 100%
rename from src/__demo__/data/degs.metadata.json
rename to src/__demo__/data/aggregate/degs.metadata.json
diff --git a/src/__demo__/data/degs.visualization.json b/src/__demo__/data/aggregate/degs.visualization.json
similarity index 100%
rename from src/__demo__/data/degs.visualization.json
rename to src/__demo__/data/aggregate/degs.visualization.json
diff --git a/src/__demo__/data/diseaseWeeks.data.json b/src/__demo__/data/aggregate/diseaseWeeks.data.json
similarity index 100%
rename from src/__demo__/data/diseaseWeeks.data.json
rename to src/__demo__/data/aggregate/diseaseWeeks.data.json
diff --git a/src/__demo__/data/diseaseWeeks.metadata.json b/src/__demo__/data/aggregate/diseaseWeeks.metadata.json
similarity index 100%
rename from src/__demo__/data/diseaseWeeks.metadata.json
rename to src/__demo__/data/aggregate/diseaseWeeks.metadata.json
diff --git a/src/__demo__/data/diseaseWeeks.visualization.json b/src/__demo__/data/aggregate/diseaseWeeks.visualization.json
similarity index 100%
rename from src/__demo__/data/diseaseWeeks.visualization.json
rename to src/__demo__/data/aggregate/diseaseWeeks.visualization.json
diff --git a/src/__demo__/data/emptyColumns.data.json b/src/__demo__/data/aggregate/emptyColumns.data.json
similarity index 100%
rename from src/__demo__/data/emptyColumns.data.json
rename to src/__demo__/data/aggregate/emptyColumns.data.json
diff --git a/src/__demo__/data/emptyColumns.metadata.json b/src/__demo__/data/aggregate/emptyColumns.metadata.json
similarity index 100%
rename from src/__demo__/data/emptyColumns.metadata.json
rename to src/__demo__/data/aggregate/emptyColumns.metadata.json
diff --git a/src/__demo__/data/emptyColumns.visualization.json b/src/__demo__/data/aggregate/emptyColumns.visualization.json
similarity index 100%
rename from src/__demo__/data/emptyColumns.visualization.json
rename to src/__demo__/data/aggregate/emptyColumns.visualization.json
diff --git a/src/__demo__/data/emptyRows.data.json b/src/__demo__/data/aggregate/emptyRows.data.json
similarity index 100%
rename from src/__demo__/data/emptyRows.data.json
rename to src/__demo__/data/aggregate/emptyRows.data.json
diff --git a/src/__demo__/data/emptyRows.visualization.json b/src/__demo__/data/aggregate/emptyRows.visualization.json
similarity index 100%
rename from src/__demo__/data/emptyRows.visualization.json
rename to src/__demo__/data/aggregate/emptyRows.visualization.json
diff --git a/src/__demo__/data/hierarchy.data.json b/src/__demo__/data/aggregate/hierarchy.data.json
similarity index 100%
rename from src/__demo__/data/hierarchy.data.json
rename to src/__demo__/data/aggregate/hierarchy.data.json
diff --git a/src/__demo__/data/hierarchy.metadata.json b/src/__demo__/data/aggregate/hierarchy.metadata.json
similarity index 100%
rename from src/__demo__/data/hierarchy.metadata.json
rename to src/__demo__/data/aggregate/hierarchy.metadata.json
diff --git a/src/__demo__/data/hierarchy.visualization.json b/src/__demo__/data/aggregate/hierarchy.visualization.json
similarity index 100%
rename from src/__demo__/data/hierarchy.visualization.json
rename to src/__demo__/data/aggregate/hierarchy.visualization.json
diff --git a/src/__demo__/data/lastFiveYears.data.json b/src/__demo__/data/aggregate/lastFiveYears.data.json
similarity index 100%
rename from src/__demo__/data/lastFiveYears.data.json
rename to src/__demo__/data/aggregate/lastFiveYears.data.json
diff --git a/src/__demo__/data/lastFiveYears.metadata.json b/src/__demo__/data/aggregate/lastFiveYears.metadata.json
similarity index 100%
rename from src/__demo__/data/lastFiveYears.metadata.json
rename to src/__demo__/data/aggregate/lastFiveYears.metadata.json
diff --git a/src/__demo__/data/lastFiveYears.visualization.json b/src/__demo__/data/aggregate/lastFiveYears.visualization.json
similarity index 100%
rename from src/__demo__/data/lastFiveYears.visualization.json
rename to src/__demo__/data/aggregate/lastFiveYears.visualization.json
diff --git a/src/__demo__/data/narrative.data.json b/src/__demo__/data/aggregate/narrative.data.json
similarity index 100%
rename from src/__demo__/data/narrative.data.json
rename to src/__demo__/data/aggregate/narrative.data.json
diff --git a/src/__demo__/data/narrative.metadata.json b/src/__demo__/data/aggregate/narrative.metadata.json
similarity index 100%
rename from src/__demo__/data/narrative.metadata.json
rename to src/__demo__/data/aggregate/narrative.metadata.json
diff --git a/src/__demo__/data/narrative.visualization.json b/src/__demo__/data/aggregate/narrative.visualization.json
similarity index 100%
rename from src/__demo__/data/narrative.visualization.json
rename to src/__demo__/data/aggregate/narrative.visualization.json
diff --git a/src/__demo__/data/simple.data.json b/src/__demo__/data/aggregate/simple.data.json
similarity index 100%
rename from src/__demo__/data/simple.data.json
rename to src/__demo__/data/aggregate/simple.data.json
diff --git a/src/__demo__/data/simple.metadata.json b/src/__demo__/data/aggregate/simple.metadata.json
similarity index 100%
rename from src/__demo__/data/simple.metadata.json
rename to src/__demo__/data/aggregate/simple.metadata.json
diff --git a/src/__demo__/data/simple.visualization.json b/src/__demo__/data/aggregate/simple.visualization.json
similarity index 100%
rename from src/__demo__/data/simple.visualization.json
rename to src/__demo__/data/aggregate/simple.visualization.json
diff --git a/src/__demo__/data/target-with-legend.data.json b/src/__demo__/data/aggregate/target-with-legend.data.json
similarity index 100%
rename from src/__demo__/data/target-with-legend.data.json
rename to src/__demo__/data/aggregate/target-with-legend.data.json
diff --git a/src/__demo__/data/target-with-legend.metadata.json b/src/__demo__/data/aggregate/target-with-legend.metadata.json
similarity index 100%
rename from src/__demo__/data/target-with-legend.metadata.json
rename to src/__demo__/data/aggregate/target-with-legend.metadata.json
diff --git a/src/__demo__/data/target-with-legend.visualization.json b/src/__demo__/data/aggregate/target-with-legend.visualization.json
similarity index 100%
rename from src/__demo__/data/target-with-legend.visualization.json
rename to src/__demo__/data/aggregate/target-with-legend.visualization.json
diff --git a/src/__demo__/data/under-above-100.legendSet.json b/src/__demo__/data/aggregate/under-above-100.legendSet.json
similarity index 100%
rename from src/__demo__/data/under-above-100.legendSet.json
rename to src/__demo__/data/aggregate/under-above-100.legendSet.json
diff --git a/src/__demo__/data/weeklyColumns.data.json b/src/__demo__/data/aggregate/weeklyColumns.data.json
similarity index 100%
rename from src/__demo__/data/weeklyColumns.data.json
rename to src/__demo__/data/aggregate/weeklyColumns.data.json
diff --git a/src/__demo__/data/weeklyColumns.metadata.json b/src/__demo__/data/aggregate/weeklyColumns.metadata.json
similarity index 100%
rename from src/__demo__/data/weeklyColumns.metadata.json
rename to src/__demo__/data/aggregate/weeklyColumns.metadata.json
diff --git a/src/__demo__/data/weeklyColumns.visualization.json b/src/__demo__/data/aggregate/weeklyColumns.visualization.json
similarity index 100%
rename from src/__demo__/data/weeklyColumns.visualization.json
rename to src/__demo__/data/aggregate/weeklyColumns.visualization.json
diff --git a/src/__demo__/data/event/boolean.data.hidena.json b/src/__demo__/data/event/boolean.data.hidena.json
new file mode 100644
index 000000000..3cb146c90
--- /dev/null
+++ b/src/__demo__/data/event/boolean.data.hidena.json
@@ -0,0 +1,115 @@
+{
+ "headers": [
+ {
+ "name": "A03MvHHogjR.bx6fsa0t90x",
+ "column": "MCH BCG dose",
+ "valueType": "BOOLEAN",
+ "type": "java.lang.Boolean",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "bx6fsa0t90x": {
+ "name": "MCH BCG dose"
+ },
+ "A03MvHHogjR.bx6fsa0t90x": {
+ "name": "MCH BCG dose"
+ },
+ "IpHINAT79UW": {
+ "name": "Child Programme"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "LAST_6_MONTHS": {
+ "name": "Last 6 months"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "A03MvHHogjR": {
+ "name": "Birth"
+ },
+ "A03MvHHogjR.bx6fsa0t90x_0": {
+ "name": "No"
+ },
+ "A03MvHHogjR.bx6fsa0t90x_1": {
+ "name": "Yes"
+ }
+ },
+ "dimensions": {
+ "pe": ["202501", "202502", "202503", "202504", "202505", "202506"],
+ "ou": ["ImspTQPwCqd"],
+ "A03MvHHogjR.bx6fsa0t90x": [
+ "A03MvHHogjR.bx6fsa0t90x_0",
+ "A03MvHHogjR.bx6fsa0t90x_1"
+ ]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202506", "319"],
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202501", "352"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202503", "337"],
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202503", "357"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202506", "293"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202501", "341"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202505", "344"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202504", "332"],
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202504", "326"],
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202505", "358"],
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202502", "318"],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202502", "311"]
+ ],
+ "height": 13,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/boolean.data.json b/src/__demo__/data/event/boolean.data.json
new file mode 100644
index 000000000..6d48278b1
--- /dev/null
+++ b/src/__demo__/data/event/boolean.data.json
@@ -0,0 +1,125 @@
+{
+ "headers": [
+ {
+ "name": "A03MvHHogjR.bx6fsa0t90x",
+ "column": "MCH BCG dose",
+ "valueType": "BOOLEAN",
+ "type": "java.lang.Boolean",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "bx6fsa0t90x": {
+ "name": "MCH BCG dose"
+ },
+ "A03MvHHogjR.bx6fsa0t90x": {
+ "name": "MCH BCG dose"
+ },
+ "IpHINAT79UW": {
+ "name": "Child Programme"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "LAST_6_MONTHS": {
+ "name": "Last 6 months"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "A03MvHHogjR": {
+ "name": "Birth"
+ },
+ "A03MvHHogjR.bx6fsa0t90x_0": {
+ "name": "No"
+ },
+ "A03MvHHogjR.bx6fsa0t90x_1": {
+ "name": "Yes"
+ },
+ "": {
+ "name": "No value",
+ "style": {
+ "fontStyle": "italic",
+ "color": "#6C7787",
+ "fontFamily": "monospace",
+ "letterSpacing": "-0.3px"
+ }
+ }
+ },
+ "dimensions": {
+ "pe": ["202501", "202502", "202503", "202504", "202505", "202506"],
+ "ou": ["ImspTQPwCqd"],
+ "A03MvHHogjR.bx6fsa0t90x": [
+ "A03MvHHogjR.bx6fsa0t90x_0",
+ "A03MvHHogjR.bx6fsa0t90x_1",
+ ""
+ ]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202506", "319"],
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202501", "352"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202503", "337"],
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202503", "357"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202506", "293"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202501", "341"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202505", "344"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202504", "332"],
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202504", "326"],
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202505", "358"],
+ ["A03MvHHogjR.bx6fsa0t90x_1", "ImspTQPwCqd", "202502", "318"],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202502", "311"]
+ ],
+ "height": 13,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/boolean.data.org.json b/src/__demo__/data/event/boolean.data.org.json
new file mode 100644
index 000000000..259b28aa8
--- /dev/null
+++ b/src/__demo__/data/event/boolean.data.org.json
@@ -0,0 +1,106 @@
+{
+ "headers": [
+ {
+ "name": "A03MvHHogjR.bx6fsa0t90x",
+ "column": "MCH BCG dose",
+ "valueType": "BOOLEAN",
+ "type": "java.lang.Boolean",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "bx6fsa0t90x": {
+ "name": "MCH BCG dose"
+ },
+ "A03MvHHogjR.bx6fsa0t90x": {
+ "name": "MCH BCG dose"
+ },
+ "IpHINAT79UW": {
+ "name": "Child Programme"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "LAST_6_MONTHS": {
+ "name": "Last 6 months"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "A03MvHHogjR": {
+ "name": "Birth"
+ }
+ },
+ "dimensions": {
+ "pe": ["202501", "202502", "202503", "202504", "202505", "202506"],
+ "ou": ["ImspTQPwCqd"],
+ "A03MvHHogjR.bx6fsa0t90x": []
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["1", "ImspTQPwCqd", "202506", "319"],
+ ["1", "ImspTQPwCqd", "202501", "352"],
+ ["0", "ImspTQPwCqd", "202503", "337"],
+ ["1", "ImspTQPwCqd", "202503", "357"],
+ ["0", "ImspTQPwCqd", "202506", "293"],
+ ["0", "ImspTQPwCqd", "202501", "341"],
+ ["0", "ImspTQPwCqd", "202505", "344"],
+ ["0", "ImspTQPwCqd", "202504", "332"],
+ ["1", "ImspTQPwCqd", "202504", "326"],
+ ["1", "ImspTQPwCqd", "202505", "358"],
+ ["1", "ImspTQPwCqd", "202502", "318"],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ ["0", "ImspTQPwCqd", "202502", "311"]
+ ],
+ "height": 13,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/boolean.visualization.json b/src/__demo__/data/event/boolean.visualization.json
new file mode 100644
index 000000000..f78b64d80
--- /dev/null
+++ b/src/__demo__/data/event/boolean.visualization.json
@@ -0,0 +1,160 @@
+{
+ "name": "Boolean",
+ "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": [],
+ "dataElementDimensions": [
+ {
+ "dataElement": {
+ "name": "MCH BCG dose",
+ "id": "bx6fsa0t90x"
+ }
+ }
+ ],
+ "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": "ou"
+ },
+ {
+ "items": [
+ {
+ "dimensionItemType": "PERIOD",
+ "id": "LAST_6_MONTHS",
+ "name": "LAST_6_MONTHS"
+ }
+ ],
+ "dimension": "pe"
+ }
+ ],
+ "rows": [
+ {
+ "items": [],
+ "programStage": {
+ "id": "A03MvHHogjR"
+ },
+ "dimension": "A03MvHHogjR.bx6fsa0t90x"
+ }
+ ],
+ "displayName": "Boolean",
+ "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,
+ "metaData": {
+ "ImspTQPwCqd": {
+ "uid": "ImspTQPwCqd",
+ "code": "OU_525",
+ "name": "Sierra Leone"
+ },
+ "bx6fsa0t90x": {
+ "uid": "bx6fsa0t90x",
+ "code": "DE_2006101",
+ "name": "MCH BCG dose"
+ }
+ },
+ "displayFormName": "Boolean",
+ "id": "xLPn5T11Vd4",
+ "attributeValues": []
+}
diff --git a/src/__demo__/data/event/date.data.hidena.json b/src/__demo__/data/event/date.data.hidena.json
new file mode 100644
index 000000000..e86f3fc07
--- /dev/null
+++ b/src/__demo__/data/event/date.data.hidena.json
@@ -0,0 +1,205 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.RldgRedJrco",
+ "column": "E2E - Date",
+ "valueType": "DATE",
+ "type": "java.time.LocalDate",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "RldgRedJrco": {
+ "name": "E2E - Date"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "jfuXZB3A1ko.RldgRedJrco": {
+ "name": "E2E - Date"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1992-05-04 00:00:00.0": {
+ "name": "1992-05-04"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0": {
+ "name": "1994-01-02"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1992-08-28 00:00:00.0": {
+ "name": "1992-08-28"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-01 00:00:00.0": {
+ "name": "1993-12-01"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1992-11-12 00:00:00.0": {
+ "name": "1992-11-12"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1992-03-20 00:00:00.0": {
+ "name": "1992-03-20"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-21 00:00:00.0": {
+ "name": "1993-05-21"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-20 00:00:00.0": {
+ "name": "1993-05-20"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0": {
+ "name": "1993-12-02"
+ }
+ },
+ "dimensions": {
+ "jfuXZB3A1ko.RldgRedJrco": [
+ "jfuXZB3A1ko.RldgRedJrco_1992-03-20 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1992-05-04 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1992-08-28 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1992-11-12 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-20 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-21 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-01 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0"
+ ],
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507"
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["", "ImspTQPwCqd", "202503", "1"],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1992-05-04 00:00:00.0",
+ "ImspTQPwCqd",
+ "202504",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0",
+ "ImspTQPwCqd",
+ "202501",
+ "2"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1992-08-28 00:00:00.0",
+ "ImspTQPwCqd",
+ "202503",
+ "1"
+ ],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-01 00:00:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1992-11-12 00:00:00.0",
+ "ImspTQPwCqd",
+ "202411",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1992-03-20 00:00:00.0",
+ "ImspTQPwCqd",
+ "202502",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-21 00:00:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-20 00:00:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ]
+ ],
+ "height": 11,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/date.data.json b/src/__demo__/data/event/date.data.json
new file mode 100644
index 000000000..2fa472a22
--- /dev/null
+++ b/src/__demo__/data/event/date.data.json
@@ -0,0 +1,215 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.RldgRedJrco",
+ "column": "E2E - Date",
+ "valueType": "DATE",
+ "type": "java.time.LocalDate",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "RldgRedJrco": {
+ "name": "E2E - Date"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "jfuXZB3A1ko.RldgRedJrco": {
+ "name": "E2E - Date"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1992-05-04 00:00:00.0": {
+ "name": "1992-05-04"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0": {
+ "name": "1994-01-02"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1992-08-28 00:00:00.0": {
+ "name": "1992-08-28"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-01 00:00:00.0": {
+ "name": "1993-12-01"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1992-11-12 00:00:00.0": {
+ "name": "1992-11-12"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1992-03-20 00:00:00.0": {
+ "name": "1992-03-20"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-21 00:00:00.0": {
+ "name": "1993-05-21"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-20 00:00:00.0": {
+ "name": "1993-05-20"
+ },
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0": {
+ "name": "1993-12-02"
+ },
+ "": {
+ "name": "No value",
+ "style": {
+ "fontStyle": "italic",
+ "color": "#6C7787",
+ "fontFamily": "monospace",
+ "letterSpacing": "-0.3px"
+ }
+ }
+ },
+ "dimensions": {
+ "jfuXZB3A1ko.RldgRedJrco": [
+ "jfuXZB3A1ko.RldgRedJrco_1992-03-20 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1992-05-04 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1992-08-28 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1992-11-12 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-20 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-21 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-01 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0",
+ "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0",
+ ""
+ ],
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507"
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["", "ImspTQPwCqd", "202503", "1"],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1992-05-04 00:00:00.0",
+ "ImspTQPwCqd",
+ "202504",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0",
+ "ImspTQPwCqd",
+ "202501",
+ "2"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1992-08-28 00:00:00.0",
+ "ImspTQPwCqd",
+ "202503",
+ "1"
+ ],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-01 00:00:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1992-11-12 00:00:00.0",
+ "ImspTQPwCqd",
+ "202411",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1992-03-20 00:00:00.0",
+ "ImspTQPwCqd",
+ "202502",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-21 00:00:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1993-05-20 00:00:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ]
+ ],
+ "height": 11,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/date.data.org.json b/src/__demo__/data/event/date.data.org.json
new file mode 100644
index 000000000..3855fd984
--- /dev/null
+++ b/src/__demo__/data/event/date.data.org.json
@@ -0,0 +1,123 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.RldgRedJrco",
+ "column": "E2E - Date",
+ "valueType": "DATE",
+ "type": "java.time.LocalDate",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "RldgRedJrco": {
+ "name": "E2E - Date"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "jfuXZB3A1ko.RldgRedJrco": {
+ "name": "E2E - Date"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ }
+ },
+ "dimensions": {
+ "jfuXZB3A1ko.RldgRedJrco": [],
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507"
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["", "ImspTQPwCqd", "202503", "1"],
+ ["1992-05-04 00:00:00.0", "ImspTQPwCqd", "202504", "1"],
+ ["1994-01-02 00:00:00.0", "ImspTQPwCqd", "202501", "2"],
+ ["1992-08-28 00:00:00.0", "ImspTQPwCqd", "202503", "1"],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ ["1993-12-01 00:00:00.0", "ImspTQPwCqd", "202412", "1"],
+ ["1992-11-12 00:00:00.0", "ImspTQPwCqd", "202411", "1"],
+ ["1992-03-20 00:00:00.0", "ImspTQPwCqd", "202502", "1"],
+ ["1993-05-21 00:00:00.0", "ImspTQPwCqd", "202412", "1"],
+ ["1993-05-20 00:00:00.0", "ImspTQPwCqd", "202412", "1"],
+ ["1993-12-02 00:00:00.0", "ImspTQPwCqd", "202412", "1"]
+ ],
+ "height": 11,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/date.visualization.json b/src/__demo__/data/event/date.visualization.json
new file mode 100644
index 000000000..938846c6d
--- /dev/null
+++ b/src/__demo__/data/event/date.visualization.json
@@ -0,0 +1,160 @@
+{
+ "name": "Date",
+ "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": [],
+ "dataElementDimensions": [
+ {
+ "dataElement": {
+ "name": "MCH BCG dose",
+ "id": "bx6fsa0t90x"
+ }
+ }
+ ],
+ "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": "ou"
+ },
+ {
+ "items": [
+ {
+ "dimensionItemType": "PERIOD",
+ "id": "LAST_6_MONTHS",
+ "name": "LAST_6_MONTHS"
+ }
+ ],
+ "dimension": "pe"
+ }
+ ],
+ "rows": [
+ {
+ "items": [],
+ "programStage": {
+ "id": "jfuXZB3A1ko"
+ },
+ "dimension": "jfuXZB3A1ko.RldgRedJrco"
+ }
+ ],
+ "displayName": "Date",
+ "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,
+ "metaData": {
+ "ImspTQPwCqd": {
+ "uid": "ImspTQPwCqd",
+ "code": "OU_525",
+ "name": "Sierra Leone"
+ },
+ "bx6fsa0t90x": {
+ "uid": "bx6fsa0t90x",
+ "code": "DE_2006101",
+ "name": "MCH BCG dose"
+ }
+ },
+ "displayFormName": "Date",
+ "id": "xLPn5T11Vd4",
+ "attributeValues": []
+}
diff --git a/src/__demo__/data/event/datetime.data.hidena.json b/src/__demo__/data/event/datetime.data.hidena.json
new file mode 100644
index 000000000..310ea9194
--- /dev/null
+++ b/src/__demo__/data/event/datetime.data.hidena.json
@@ -0,0 +1,215 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.KWzx2tY8dFi",
+ "column": "E2E - Date & Time",
+ "valueType": "DATETIME",
+ "type": "java.time.LocalDateTime",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1990-01-24 14:50:00.0": {
+ "name": "1990-01-24 14:50"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-20 14:45:00.0": {
+ "name": "1991-05-20 14:45"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-21 14:46:00.0": {
+ "name": "1991-05-21 14:46"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-09-01 10:20:00.0": {
+ "name": "1991-09-01 10:20"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-01 12:00:00.0": {
+ "name": "1991-12-01 12:00"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-02 12:01:00.0": {
+ "name": "1991-12-02 12:01"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-03 12:01:00.0": {
+ "name": "1992-01-03 12:01"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-04 12:50:00.0": {
+ "name": "1992-01-04 12:50"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1995-04-17 13:53:00.0": {
+ "name": "1995-04-17 13:53"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1998-02-28 11:20:00.0": {
+ "name": "1998-02-28 11:20"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "KWzx2tY8dFi": {
+ "name": "E2E - Date & Time"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi": {
+ "name": "E2E - Date & Time"
+ }
+ },
+ "dimensions": {
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507"
+ ],
+ "ou": ["ImspTQPwCqd"],
+ "jfuXZB3A1ko.KWzx2tY8dFi": [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1990-01-24 14:50:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-20 14:45:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-21 14:46:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-09-01 10:20:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-01 12:00:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-02 12:01:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-03 12:01:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-04 12:50:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1995-04-17 13:53:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1998-02-28 11:20:00.0"
+ ]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1995-04-17 13:53:00.0",
+ "ImspTQPwCqd",
+ "202503",
+ "1"
+ ],
+ ["", "ImspTQPwCqd", "202503", "1"],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-02 12:01:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-04 12:50:00.0",
+ "ImspTQPwCqd",
+ "202501",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-20 14:45:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1998-02-28 11:20:00.0",
+ "ImspTQPwCqd",
+ "202502",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-09-01 10:20:00.0",
+ "ImspTQPwCqd",
+ "202504",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-03 12:01:00.0",
+ "ImspTQPwCqd",
+ "202501",
+ "1"
+ ],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-01 12:00:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1990-01-24 14:50:00.0",
+ "ImspTQPwCqd",
+ "202411",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-21 14:46:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ]
+ ],
+ "height": 12,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/datetime.data.json b/src/__demo__/data/event/datetime.data.json
new file mode 100644
index 000000000..4e5d58827
--- /dev/null
+++ b/src/__demo__/data/event/datetime.data.json
@@ -0,0 +1,225 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.KWzx2tY8dFi",
+ "column": "E2E - Date & Time",
+ "valueType": "DATETIME",
+ "type": "java.time.LocalDateTime",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1990-01-24 14:50:00.0": {
+ "name": "1990-01-24 14:50"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-20 14:45:00.0": {
+ "name": "1991-05-20 14:45"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-21 14:46:00.0": {
+ "name": "1991-05-21 14:46"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-09-01 10:20:00.0": {
+ "name": "1991-09-01 10:20"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-01 12:00:00.0": {
+ "name": "1991-12-01 12:00"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-02 12:01:00.0": {
+ "name": "1991-12-02 12:01"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-03 12:01:00.0": {
+ "name": "1992-01-03 12:01"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-04 12:50:00.0": {
+ "name": "1992-01-04 12:50"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1995-04-17 13:53:00.0": {
+ "name": "1995-04-17 13:53"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi_1998-02-28 11:20:00.0": {
+ "name": "1998-02-28 11:20"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "KWzx2tY8dFi": {
+ "name": "E2E - Date & Time"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi": {
+ "name": "E2E - Date & Time"
+ },
+ "": {
+ "name": "No value",
+ "style": {
+ "fontStyle": "italic",
+ "color": "#6C7787",
+ "fontFamily": "monospace",
+ "letterSpacing": "-0.3px"
+ }
+ }
+ },
+ "dimensions": {
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507"
+ ],
+ "ou": ["ImspTQPwCqd"],
+ "jfuXZB3A1ko.KWzx2tY8dFi": [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1990-01-24 14:50:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-20 14:45:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-21 14:46:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-09-01 10:20:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-01 12:00:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-02 12:01:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-03 12:01:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-04 12:50:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1995-04-17 13:53:00.0",
+ "jfuXZB3A1ko.KWzx2tY8dFi_1998-02-28 11:20:00.0",
+ ""
+ ]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1995-04-17 13:53:00.0",
+ "ImspTQPwCqd",
+ "202503",
+ "1"
+ ],
+ ["", "ImspTQPwCqd", "202503", "1"],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-02 12:01:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-04 12:50:00.0",
+ "ImspTQPwCqd",
+ "202501",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-20 14:45:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1998-02-28 11:20:00.0",
+ "ImspTQPwCqd",
+ "202502",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-09-01 10:20:00.0",
+ "ImspTQPwCqd",
+ "202504",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-03 12:01:00.0",
+ "ImspTQPwCqd",
+ "202501",
+ "1"
+ ],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-01 12:00:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1990-01-24 14:50:00.0",
+ "ImspTQPwCqd",
+ "202411",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-21 14:46:00.0",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ]
+ ],
+ "height": 12,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/datetime.data.org.json b/src/__demo__/data/event/datetime.data.org.json
new file mode 100644
index 000000000..99427efb5
--- /dev/null
+++ b/src/__demo__/data/event/datetime.data.org.json
@@ -0,0 +1,124 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.KWzx2tY8dFi",
+ "column": "E2E - Date & Time",
+ "valueType": "DATETIME",
+ "type": "java.time.LocalDateTime",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "KWzx2tY8dFi": {
+ "name": "E2E - Date & Time"
+ },
+ "jfuXZB3A1ko.KWzx2tY8dFi": {
+ "name": "E2E - Date & Time"
+ }
+ },
+ "dimensions": {
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507"
+ ],
+ "ou": ["ImspTQPwCqd"],
+ "jfuXZB3A1ko.KWzx2tY8dFi": []
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["1995-04-17 13:53:00.0", "ImspTQPwCqd", "202503", "1"],
+ ["", "ImspTQPwCqd", "202503", "1"],
+ ["1991-12-02 12:01:00.0", "ImspTQPwCqd", "202412", "1"],
+ ["1992-01-04 12:50:00.0", "ImspTQPwCqd", "202501", "1"],
+ ["1991-05-20 14:45:00.0", "ImspTQPwCqd", "202412", "1"],
+ ["1998-02-28 11:20:00.0", "ImspTQPwCqd", "202502", "1"],
+ ["1991-09-01 10:20:00.0", "ImspTQPwCqd", "202504", "1"],
+ ["1992-01-03 12:01:00.0", "ImspTQPwCqd", "202501", "1"],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ ["1991-12-01 12:00:00.0", "ImspTQPwCqd", "202412", "1"],
+ ["1990-01-24 14:50:00.0", "ImspTQPwCqd", "202411", "1"],
+ ["1991-05-21 14:46:00.0", "ImspTQPwCqd", "202412", "1"]
+ ],
+ "height": 12,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/datetime.visualization.json b/src/__demo__/data/event/datetime.visualization.json
new file mode 100644
index 000000000..864a23122
--- /dev/null
+++ b/src/__demo__/data/event/datetime.visualization.json
@@ -0,0 +1,148 @@
+{
+ "name": "Datetime",
+ "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": [],
+ "dataElementDimensions": [
+ {
+ "dataElement": {
+ "name": "MCH BCG dose",
+ "id": "bx6fsa0t90x"
+ }
+ }
+ ],
+ "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": "ou"
+ },
+ {
+ "items": [
+ {
+ "dimensionItemType": "PERIOD",
+ "id": "LAST_6_MONTHS",
+ "name": "LAST_6_MONTHS"
+ }
+ ],
+ "dimension": "pe"
+ }
+ ],
+ "rows": [
+ {
+ "items": [],
+ "programStage": {
+ "id": "jfuXZB3A1ko"
+ },
+ "dimension": "jfuXZB3A1ko.KWzx2tY8dFi"
+ }
+ ],
+ "displayName": "Date",
+ "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": "Date",
+ "id": "xLPn5T11Vd4",
+ "attributeValues": []
+}
diff --git a/src/__demo__/data/event/email.data.hidena.json b/src/__demo__/data/event/email.data.hidena.json
new file mode 100644
index 000000000..11ea7f012
--- /dev/null
+++ b/src/__demo__/data/event/email.data.hidena.json
@@ -0,0 +1,192 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.RUZ2EBP6HQn",
+ "column": "E2E - Email",
+ "valueType": "EMAIL",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "RUZ2EBP6HQn": {
+ "name": "E2E - Email"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn": {
+ "name": "E2E - Email"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email@address.com": {
+ "name": "email@address.com"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email2@address.com": {
+ "name": "email2@address.com"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_mm@email.com": {
+ "name": "mm@email.com"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@dhis2.org": {
+ "name": "myemail@dhis2.org"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@emailaddress.org": {
+ "name": "myemail@emailaddress.org"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_name@namesson.com": {
+ "name": "name@namesson.com"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_test@pmail.com": {
+ "name": "test@pmail.com"
+ }
+ },
+ "dimensions": {
+ "jfuXZB3A1ko.RUZ2EBP6HQn": [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email@address.com",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email2@address.com",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_mm@email.com",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@dhis2.org",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@emailaddress.org",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_name@namesson.com",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_test@pmail.com"
+ ],
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507"
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_name@namesson.com",
+ "ImspTQPwCqd",
+ "202411",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@emailaddress.org",
+ "ImspTQPwCqd",
+ "202502",
+ "1"
+ ],
+ ["jfuXZB3A1ko.RUZ2EBP6HQn_mm@email.com", "ImspTQPwCqd", "202412", "2"],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email@address.com",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email@address.com",
+ "ImspTQPwCqd",
+ "202501",
+ "1"
+ ],
+ ["", "ImspTQPwCqd", "202503", "1"],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email2@address.com",
+ "ImspTQPwCqd",
+ "202501",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email2@address.com",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@dhis2.org",
+ "ImspTQPwCqd",
+ "202504",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_test@pmail.com",
+ "ImspTQPwCqd",
+ "202503",
+ "1"
+ ],
+ ["", "ImspTQPwCqd", "202501", "1"]
+ ],
+ "height": 11,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/email.data.json b/src/__demo__/data/event/email.data.json
new file mode 100644
index 000000000..660808d92
--- /dev/null
+++ b/src/__demo__/data/event/email.data.json
@@ -0,0 +1,202 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.RUZ2EBP6HQn",
+ "column": "E2E - Email",
+ "valueType": "EMAIL",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "RUZ2EBP6HQn": {
+ "name": "E2E - Email"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn": {
+ "name": "E2E - Email"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email@address.com": {
+ "name": "email@address.com"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email2@address.com": {
+ "name": "email2@address.com"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_mm@email.com": {
+ "name": "mm@email.com"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@dhis2.org": {
+ "name": "myemail@dhis2.org"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@emailaddress.org": {
+ "name": "myemail@emailaddress.org"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_name@namesson.com": {
+ "name": "name@namesson.com"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn_test@pmail.com": {
+ "name": "test@pmail.com"
+ },
+ "": {
+ "name": "No value",
+ "style": {
+ "fontStyle": "italic",
+ "color": "#6C7787",
+ "fontFamily": "monospace",
+ "letterSpacing": "-0.3px"
+ }
+ }
+ },
+ "dimensions": {
+ "jfuXZB3A1ko.RUZ2EBP6HQn": [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email@address.com",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email2@address.com",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_mm@email.com",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@dhis2.org",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@emailaddress.org",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_name@namesson.com",
+ "jfuXZB3A1ko.RUZ2EBP6HQn_test@pmail.com",
+ ""
+ ],
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507"
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_name@namesson.com",
+ "ImspTQPwCqd",
+ "202411",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@emailaddress.org",
+ "ImspTQPwCqd",
+ "202502",
+ "1"
+ ],
+ ["jfuXZB3A1ko.RUZ2EBP6HQn_mm@email.com", "ImspTQPwCqd", "202412", "2"],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email@address.com",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email@address.com",
+ "ImspTQPwCqd",
+ "202501",
+ "1"
+ ],
+ ["", "ImspTQPwCqd", "202503", "1"],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email2@address.com",
+ "ImspTQPwCqd",
+ "202501",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_email2@address.com",
+ "ImspTQPwCqd",
+ "202412",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@dhis2.org",
+ "ImspTQPwCqd",
+ "202504",
+ "1"
+ ],
+ [
+ "jfuXZB3A1ko.RUZ2EBP6HQn_test@pmail.com",
+ "ImspTQPwCqd",
+ "202503",
+ "1"
+ ],
+ ["", "ImspTQPwCqd", "202501", "1"]
+ ],
+ "height": 11,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/email.data.org.json b/src/__demo__/data/event/email.data.org.json
new file mode 100644
index 000000000..8b62c9f9e
--- /dev/null
+++ b/src/__demo__/data/event/email.data.org.json
@@ -0,0 +1,123 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.RUZ2EBP6HQn",
+ "column": "E2E - Email",
+ "valueType": "EMAIL",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "RUZ2EBP6HQn": {
+ "name": "E2E - Email"
+ },
+ "jfuXZB3A1ko.RUZ2EBP6HQn": {
+ "name": "E2E - Email"
+ }
+ },
+ "dimensions": {
+ "jfuXZB3A1ko.RUZ2EBP6HQn": [],
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507"
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["name@namesson.com", "ImspTQPwCqd", "202411", "1"],
+ ["myemail@emailaddress.org", "ImspTQPwCqd", "202502", "1"],
+ ["mm@email.com", "ImspTQPwCqd", "202412", "2"],
+ ["email@address.com", "ImspTQPwCqd", "202412", "1"],
+ ["email@address.com", "ImspTQPwCqd", "202501", "1"],
+ ["", "ImspTQPwCqd", "202503", "1"],
+ ["email2@address.com", "ImspTQPwCqd", "202501", "1"],
+ ["email2@address.com", "ImspTQPwCqd", "202412", "1"],
+ ["myemail@dhis2.org", "ImspTQPwCqd", "202504", "1"],
+ ["test@pmail.com", "ImspTQPwCqd", "202503", "1"],
+ ["", "ImspTQPwCqd", "202501", "1"]
+ ],
+ "height": 11,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/email.visualization.json b/src/__demo__/data/event/email.visualization.json
new file mode 100644
index 000000000..44c9c6183
--- /dev/null
+++ b/src/__demo__/data/event/email.visualization.json
@@ -0,0 +1,148 @@
+{
+ "name": "Email",
+ "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": [],
+ "dataElementDimensions": [
+ {
+ "dataElement": {
+ "name": "MCH BCG dose",
+ "id": "bx6fsa0t90x"
+ }
+ }
+ ],
+ "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": "ou"
+ },
+ {
+ "items": [
+ {
+ "dimensionItemType": "PERIOD",
+ "id": "LAST_6_MONTHS",
+ "name": "LAST_6_MONTHS"
+ }
+ ],
+ "dimension": "pe"
+ }
+ ],
+ "rows": [
+ {
+ "items": [],
+ "programStage": {
+ "id": "jfuXZB3A1ko"
+ },
+ "dimension": "jfuXZB3A1ko.RUZ2EBP6HQn"
+ }
+ ],
+ "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": []
+}
diff --git a/src/__demo__/data/event/integer.data.hidena.json b/src/__demo__/data/event/integer.data.hidena.json
new file mode 100644
index 000000000..a49a59de4
--- /dev/null
+++ b/src/__demo__/data/event/integer.data.hidena.json
@@ -0,0 +1,165 @@
+{
+ "headers": [
+ {
+ "name": "Zj7UnCAulEk.qrur9Dvnyt5",
+ "column": "Age in years",
+ "valueType": "INTEGER",
+ "type": "java.lang.Integer",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "eBAyeGv0exc": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "qrur9Dvnyt5": {
+ "name": "Age in years"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5": {
+ "name": "Age in years"
+ },
+ "LAST_3_MONTHS": {
+ "name": "Last 3 months"
+ },
+ "Zj7UnCAulEk": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_0": {
+ "name": "0"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_1": {
+ "name": "1"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_2": {
+ "name": "2"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_3": {
+ "name": "3"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_4": {
+ "name": "4"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_5": {
+ "name": "5"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_6": {
+ "name": "6"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_7": {
+ "name": "7"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_8": {
+ "name": "8"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_9": {
+ "name": "9"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_10": {
+ "name": "10"
+ }
+ },
+ "dimensions": {
+ "pe": ["202503", "202504", "202505"],
+ "Zj7UnCAulEk.qrur9Dvnyt5": [
+ "Zj7UnCAulEk.qrur9Dvnyt5_0",
+ "Zj7UnCAulEk.qrur9Dvnyt5_1",
+ "Zj7UnCAulEk.qrur9Dvnyt5_2",
+ "Zj7UnCAulEk.qrur9Dvnyt5_3",
+ "Zj7UnCAulEk.qrur9Dvnyt5_4",
+ "Zj7UnCAulEk.qrur9Dvnyt5_5",
+ "Zj7UnCAulEk.qrur9Dvnyt5_6",
+ "Zj7UnCAulEk.qrur9Dvnyt5_7",
+ "Zj7UnCAulEk.qrur9Dvnyt5_8",
+ "Zj7UnCAulEk.qrur9Dvnyt5_9",
+ "Zj7UnCAulEk.qrur9Dvnyt5_10"
+ ],
+ "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"]
+ ],
+ "height": 267,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/integer.data.json b/src/__demo__/data/event/integer.data.json
new file mode 100644
index 000000000..fc8d9f0e6
--- /dev/null
+++ b/src/__demo__/data/event/integer.data.json
@@ -0,0 +1,175 @@
+{
+ "headers": [
+ {
+ "name": "Zj7UnCAulEk.qrur9Dvnyt5",
+ "column": "Age in years",
+ "valueType": "INTEGER",
+ "type": "java.lang.Integer",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "eBAyeGv0exc": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "qrur9Dvnyt5": {
+ "name": "Age in years"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5": {
+ "name": "Age in years"
+ },
+ "LAST_3_MONTHS": {
+ "name": "Last 3 months"
+ },
+ "Zj7UnCAulEk": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_0": {
+ "name": "0"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_1": {
+ "name": "1"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_2": {
+ "name": "2"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_3": {
+ "name": "3"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_4": {
+ "name": "4"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_5": {
+ "name": "5"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_6": {
+ "name": "6"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_7": {
+ "name": "7"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_8": {
+ "name": "8"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_9": {
+ "name": "9"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5_10": {
+ "name": "10"
+ },
+ "": {
+ "name": "No value",
+ "style": {
+ "fontStyle": "italic",
+ "color": "#6C7787",
+ "fontFamily": "monospace",
+ "letterSpacing": "-0.3px"
+ }
+ }
+ },
+ "dimensions": {
+ "pe": ["202503", "202504", "202505"],
+ "Zj7UnCAulEk.qrur9Dvnyt5": [
+ "Zj7UnCAulEk.qrur9Dvnyt5_0",
+ "Zj7UnCAulEk.qrur9Dvnyt5_1",
+ "Zj7UnCAulEk.qrur9Dvnyt5_2",
+ "Zj7UnCAulEk.qrur9Dvnyt5_3",
+ "Zj7UnCAulEk.qrur9Dvnyt5_4",
+ "Zj7UnCAulEk.qrur9Dvnyt5_5",
+ "Zj7UnCAulEk.qrur9Dvnyt5_6",
+ "Zj7UnCAulEk.qrur9Dvnyt5_7",
+ "Zj7UnCAulEk.qrur9Dvnyt5_8",
+ "Zj7UnCAulEk.qrur9Dvnyt5_9",
+ "Zj7UnCAulEk.qrur9Dvnyt5_10",
+ ""
+ ],
+ "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"]
+ ],
+ "height": 267,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/integer.data.org.json b/src/__demo__/data/event/integer.data.org.json
new file mode 100644
index 000000000..806aeb642
--- /dev/null
+++ b/src/__demo__/data/event/integer.data.org.json
@@ -0,0 +1,120 @@
+{
+ "headers": [
+ {
+ "name": "Zj7UnCAulEk.qrur9Dvnyt5",
+ "column": "Age in years",
+ "valueType": "INTEGER",
+ "type": "java.lang.Integer",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "eBAyeGv0exc": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "qrur9Dvnyt5": {
+ "name": "Age in years"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5": {
+ "name": "Age in years"
+ },
+ "LAST_3_MONTHS": {
+ "name": "Last 3 months"
+ },
+ "Zj7UnCAulEk": {
+ "name": "Inpatient morbidity and mortality"
+ }
+ },
+ "dimensions": {
+ "pe": ["202503", "202504", "202505"],
+ "ou": ["ImspTQPwCqd"],
+ "Zj7UnCAulEk.qrur9Dvnyt5": []
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["8", "ImspTQPwCqd", "202503", "47"],
+ ["3", "ImspTQPwCqd", "202505", "67"],
+ ["0", "ImspTQPwCqd", "202503", "55"],
+ ["5", "ImspTQPwCqd", "202503", "70"],
+ ["10", "ImspTQPwCqd", "202505", "61"],
+ ["7", "ImspTQPwCqd", "202505", "52"],
+ ["9", "ImspTQPwCqd", "202504", "54"],
+ ["6", "ImspTQPwCqd", "202505", "65"],
+ ["9", "ImspTQPwCqd", "202505", "54"],
+ ["6", "ImspTQPwCqd", "202503", "53"],
+ ["2", "ImspTQPwCqd", "202504", "45"],
+ ["10", "ImspTQPwCqd", "202503", "51"],
+ ["2", "ImspTQPwCqd", "202505", "51"],
+ ["3", "ImspTQPwCqd", "202504", "38"],
+ ["2", "ImspTQPwCqd", "202503", "41"],
+ ["8", "ImspTQPwCqd", "202504", "44"],
+ ["7", "ImspTQPwCqd", "202504", "40"],
+ ["4", "ImspTQPwCqd", "202505", "41"],
+ ["4", "ImspTQPwCqd", "202504", "42"],
+ ["9", "ImspTQPwCqd", "202503", "52"],
+ ["0", "ImspTQPwCqd", "202504", "55"],
+ ["8", "ImspTQPwCqd", "202505", "43"],
+ ["5", "ImspTQPwCqd", "202504", "63"],
+ ["6", "ImspTQPwCqd", "202504", "53"],
+ ["4", "ImspTQPwCqd", "202503", "54"],
+ ["10", "ImspTQPwCqd", "202504", "46"],
+ ["1", "ImspTQPwCqd", "202503", "44"],
+ ["7", "ImspTQPwCqd", "202503", "47"],
+ ["5", "ImspTQPwCqd", "202505", "46"],
+ ["0", "ImspTQPwCqd", "202505", "50"],
+ ["1", "ImspTQPwCqd", "202504", "48"],
+ ["1", "ImspTQPwCqd", "202505", "53"],
+ ["3", "ImspTQPwCqd", "202503", "56"],
+ ["", "ImspTQPwCqd", "202505", "5"],
+ ["", "ImspTQPwCqd", "202504", "12"],
+ ["", "ImspTQPwCqd", "202503", "10"]
+ ],
+ "height": 267,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/integer.visualization.json b/src/__demo__/data/event/integer.visualization.json
new file mode 100644
index 000000000..9f2d66272
--- /dev/null
+++ b/src/__demo__/data/event/integer.visualization.json
@@ -0,0 +1,163 @@
+{
+ "name": "Integer",
+ "created": "2025-06-30T10:27:41.277",
+ "lastUpdated": "2025-06-30T10:27:41.277",
+ "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": [],
+ "dataElementDimensions": [
+ {
+ "dataElement": {
+ "name": "Age in years",
+ "id": "qrur9Dvnyt5"
+ },
+ "legendSet": {
+ "name": "Age 10y interval",
+ "id": "Yf6UHoPkdS6"
+ }
+ }
+ ],
+ "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": {
+ "incidentDateLabel": "Date of Discharge",
+ "id": "eBAyeGv0exc",
+ "name": "Inpatient morbidity and mortality"
+ },
+ "programStage": {
+ "executionDateLabel": "Report date",
+ "id": "Zj7UnCAulEk",
+ "name": "Inpatient morbidity and mortality"
+ },
+ "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": "ou"
+ },
+ {
+ "items": [
+ {
+ "dimensionItemType": "PERIOD",
+ "id": "LAST_3_MONTHS",
+ "name": "LAST_3_MONTHS"
+ }
+ ],
+ "dimension": "pe"
+ }
+ ],
+ "rows": [
+ {
+ "items": [],
+ "programStage": {
+ "id": "Zj7UnCAulEk"
+ },
+ "dimension": "Zj7UnCAulEk.qrur9Dvnyt5"
+ }
+ ],
+ "displayName": "Integer",
+ "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,
+ "metaData": {
+ "ImspTQPwCqd": {
+ "uid": "ImspTQPwCqd",
+ "code": "OU_525",
+ "name": "Sierra Leone"
+ },
+ "qrur9Dvnyt5": {
+ "uid": "qrur9Dvnyt5",
+ "code": "DE_3000003",
+ "name": "Age in years"
+ }
+ },
+ "displayFormName": "Integer",
+ "id": "kNl4fqsY9hJ",
+ "attributeValues": []
+}
diff --git a/src/__demo__/data/event/legendset.data.hidena.json b/src/__demo__/data/event/legendset.data.hidena.json
new file mode 100644
index 000000000..c94bc1537
--- /dev/null
+++ b/src/__demo__/data/event/legendset.data.hidena.json
@@ -0,0 +1,154 @@
+{
+ "headers": [
+ {
+ "name": "Zj7UnCAulEk.qrur9Dvnyt5",
+ "column": "Age in years",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true,
+ "legendSet": "Yf6UHoPkdS6"
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "CpP5yzbgfHo": {
+ "name": "40 - 50"
+ },
+ "OyVUzWsX8UF": {
+ "name": "10 - 20"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5": {
+ "name": "Age in years"
+ },
+ "pZzk1L4Blf1": {
+ "name": "0 - 10"
+ },
+ "Zj7UnCAulEk": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "b7MCpzqJaR2": {
+ "name": "70 - 80"
+ },
+ "scvmgP9F9rn": {
+ "name": "90 - 100"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "cbPqyIAFw9u": {
+ "name": "50 - 60"
+ },
+ "TvM2MQgD7Jd": {
+ "name": "20 - 30"
+ },
+ "Tq4NYCn9eNH": {
+ "name": "60 - 70"
+ },
+ "eBAyeGv0exc": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "puI3YpLJ3fC": {
+ "name": "80 - 90"
+ },
+ "ZUUGJnvX40X": {
+ "name": "30 - 40"
+ },
+ "LAST_3_MONTHS": {
+ "name": "Last 3 months"
+ }
+ },
+ "dimensions": {
+ "pe": ["202503", "202504", "202505"],
+ "Zj7UnCAulEk.qrur9Dvnyt5": [
+ "pZzk1L4Blf1",
+ "OyVUzWsX8UF",
+ "TvM2MQgD7Jd",
+ "ZUUGJnvX40X",
+ "CpP5yzbgfHo",
+ "cbPqyIAFw9u",
+ "Tq4NYCn9eNH",
+ "b7MCpzqJaR2",
+ "puI3YpLJ3fC",
+ "scvmgP9F9rn"
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["puI3YpLJ3fC", "ImspTQPwCqd", "202503", "479"],
+ ["ZUUGJnvX40X", "ImspTQPwCqd", "202505", "486"],
+ ["Tq4NYCn9eNH", "ImspTQPwCqd", "202505", "511"],
+ ["pZzk1L4Blf1", "ImspTQPwCqd", "202504", "482"],
+ ["OyVUzWsX8UF", "ImspTQPwCqd", "202504", "490"],
+ ["puI3YpLJ3fC", "ImspTQPwCqd", "202505", "430"],
+ ["TvM2MQgD7Jd", "ImspTQPwCqd", "202504", "501"],
+ ["Tq4NYCn9eNH", "ImspTQPwCqd", "202504", "438"],
+ ["TvM2MQgD7Jd", "ImspTQPwCqd", "202503", "515"],
+ ["pZzk1L4Blf1", "ImspTQPwCqd", "202505", "522"],
+ ["cbPqyIAFw9u", "ImspTQPwCqd", "202503", "508"],
+ ["TvM2MQgD7Jd", "ImspTQPwCqd", "202505", "520"],
+ ["cbPqyIAFw9u", "ImspTQPwCqd", "202505", "502"],
+ ["CpP5yzbgfHo", "ImspTQPwCqd", "202504", "495"],
+ ["Tq4NYCn9eNH", "ImspTQPwCqd", "202503", "516"],
+ ["b7MCpzqJaR2", "ImspTQPwCqd", "202504", "498"],
+ ["OyVUzWsX8UF", "ImspTQPwCqd", "202505", "495"],
+ ["ZUUGJnvX40X", "ImspTQPwCqd", "202504", "524"],
+ ["pZzk1L4Blf1", "ImspTQPwCqd", "202503", "519"],
+ ["CpP5yzbgfHo", "ImspTQPwCqd", "202505", "514"],
+ ["b7MCpzqJaR2", "ImspTQPwCqd", "202503", "475"],
+ ["cbPqyIAFw9u", "ImspTQPwCqd", "202504", "483"],
+ ["CpP5yzbgfHo", "ImspTQPwCqd", "202503", "526"],
+ ["b7MCpzqJaR2", "ImspTQPwCqd", "202505", "477"],
+ ["ZUUGJnvX40X", "ImspTQPwCqd", "202503", "519"],
+ ["OyVUzWsX8UF", "ImspTQPwCqd", "202503", "525"],
+ ["puI3YpLJ3fC", "ImspTQPwCqd", "202504", "443"],
+ ["scvmgP9F9rn", "ImspTQPwCqd", "202503", "398"],
+ ["scvmgP9F9rn", "ImspTQPwCqd", "202504", "487"],
+ ["scvmgP9F9rn", "ImspTQPwCqd", "202505", "401"],
+ ["", "ImspTQPwCqd", "202504", "14"]
+ ],
+ "height": 27,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/legendset.data.json b/src/__demo__/data/event/legendset.data.json
new file mode 100644
index 000000000..60c27d19e
--- /dev/null
+++ b/src/__demo__/data/event/legendset.data.json
@@ -0,0 +1,164 @@
+{
+ "headers": [
+ {
+ "name": "Zj7UnCAulEk.qrur9Dvnyt5",
+ "column": "Age in years",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true,
+ "legendSet": "Yf6UHoPkdS6"
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "CpP5yzbgfHo": {
+ "name": "40 - 50"
+ },
+ "OyVUzWsX8UF": {
+ "name": "10 - 20"
+ },
+ "Zj7UnCAulEk.qrur9Dvnyt5": {
+ "name": "Age in years"
+ },
+ "pZzk1L4Blf1": {
+ "name": "0 - 10"
+ },
+ "Zj7UnCAulEk": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "b7MCpzqJaR2": {
+ "name": "70 - 80"
+ },
+ "scvmgP9F9rn": {
+ "name": "90 - 100"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "cbPqyIAFw9u": {
+ "name": "50 - 60"
+ },
+ "TvM2MQgD7Jd": {
+ "name": "20 - 30"
+ },
+ "Tq4NYCn9eNH": {
+ "name": "60 - 70"
+ },
+ "eBAyeGv0exc": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "puI3YpLJ3fC": {
+ "name": "80 - 90"
+ },
+ "ZUUGJnvX40X": {
+ "name": "30 - 40"
+ },
+ "LAST_3_MONTHS": {
+ "name": "Last 3 months"
+ },
+ "": {
+ "name": "No value",
+ "style": {
+ "fontStyle": "italic",
+ "color": "#6C7787",
+ "fontFamily": "monospace",
+ "letterSpacing": "-0.3px"
+ }
+ }
+ },
+ "dimensions": {
+ "pe": ["202503", "202504", "202505"],
+ "Zj7UnCAulEk.qrur9Dvnyt5": [
+ "pZzk1L4Blf1",
+ "OyVUzWsX8UF",
+ "TvM2MQgD7Jd",
+ "ZUUGJnvX40X",
+ "CpP5yzbgfHo",
+ "cbPqyIAFw9u",
+ "Tq4NYCn9eNH",
+ "b7MCpzqJaR2",
+ "puI3YpLJ3fC",
+ "scvmgP9F9rn",
+ ""
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["puI3YpLJ3fC", "ImspTQPwCqd", "202503", "479"],
+ ["ZUUGJnvX40X", "ImspTQPwCqd", "202505", "486"],
+ ["Tq4NYCn9eNH", "ImspTQPwCqd", "202505", "511"],
+ ["pZzk1L4Blf1", "ImspTQPwCqd", "202504", "482"],
+ ["OyVUzWsX8UF", "ImspTQPwCqd", "202504", "490"],
+ ["puI3YpLJ3fC", "ImspTQPwCqd", "202505", "430"],
+ ["TvM2MQgD7Jd", "ImspTQPwCqd", "202504", "501"],
+ ["Tq4NYCn9eNH", "ImspTQPwCqd", "202504", "438"],
+ ["TvM2MQgD7Jd", "ImspTQPwCqd", "202503", "515"],
+ ["pZzk1L4Blf1", "ImspTQPwCqd", "202505", "522"],
+ ["cbPqyIAFw9u", "ImspTQPwCqd", "202503", "508"],
+ ["TvM2MQgD7Jd", "ImspTQPwCqd", "202505", "520"],
+ ["cbPqyIAFw9u", "ImspTQPwCqd", "202505", "502"],
+ ["CpP5yzbgfHo", "ImspTQPwCqd", "202504", "495"],
+ ["Tq4NYCn9eNH", "ImspTQPwCqd", "202503", "516"],
+ ["b7MCpzqJaR2", "ImspTQPwCqd", "202504", "498"],
+ ["OyVUzWsX8UF", "ImspTQPwCqd", "202505", "495"],
+ ["ZUUGJnvX40X", "ImspTQPwCqd", "202504", "524"],
+ ["pZzk1L4Blf1", "ImspTQPwCqd", "202503", "519"],
+ ["CpP5yzbgfHo", "ImspTQPwCqd", "202505", "514"],
+ ["b7MCpzqJaR2", "ImspTQPwCqd", "202503", "475"],
+ ["cbPqyIAFw9u", "ImspTQPwCqd", "202504", "483"],
+ ["CpP5yzbgfHo", "ImspTQPwCqd", "202503", "526"],
+ ["b7MCpzqJaR2", "ImspTQPwCqd", "202505", "477"],
+ ["ZUUGJnvX40X", "ImspTQPwCqd", "202503", "519"],
+ ["OyVUzWsX8UF", "ImspTQPwCqd", "202503", "525"],
+ ["puI3YpLJ3fC", "ImspTQPwCqd", "202504", "443"],
+ ["scvmgP9F9rn", "ImspTQPwCqd", "202503", "398"],
+ ["scvmgP9F9rn", "ImspTQPwCqd", "202504", "487"],
+ ["scvmgP9F9rn", "ImspTQPwCqd", "202505", "401"],
+ ["", "ImspTQPwCqd", "202504", "14"]
+ ],
+ "height": 27,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/legendset.visualization.json b/src/__demo__/data/event/legendset.visualization.json
new file mode 100644
index 000000000..3c063c1ef
--- /dev/null
+++ b/src/__demo__/data/event/legendset.visualization.json
@@ -0,0 +1,166 @@
+{
+ "name": "Numeric-legendset",
+ "created": "2025-06-30T10:27:41.277",
+ "lastUpdated": "2025-06-30T10:27:41.277",
+ "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": [],
+ "dataElementDimensions": [
+ {
+ "dataElement": {
+ "name": "Age in years",
+ "id": "qrur9Dvnyt5"
+ },
+ "legendSet": {
+ "name": "Age 10y interval",
+ "id": "Yf6UHoPkdS6"
+ }
+ }
+ ],
+ "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": {
+ "incidentDateLabel": "Date of Discharge",
+ "id": "eBAyeGv0exc",
+ "name": "Inpatient morbidity and mortality"
+ },
+ "programStage": {
+ "executionDateLabel": "Report date",
+ "id": "Zj7UnCAulEk",
+ "name": "Inpatient morbidity and mortality"
+ },
+ "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": "ou"
+ },
+ {
+ "items": [
+ {
+ "dimensionItemType": "PERIOD",
+ "id": "LAST_3_MONTHS",
+ "name": "LAST_3_MONTHS"
+ }
+ ],
+ "dimension": "pe"
+ }
+ ],
+ "rows": [
+ {
+ "items": [],
+ "legendSet": {
+ "id": "Yf6UHoPkdS6"
+ },
+ "programStage": {
+ "id": "Zj7UnCAulEk"
+ },
+ "dimension": "Zj7UnCAulEk.qrur9Dvnyt5"
+ }
+ ],
+ "displayName": "A1 numeric-legendset",
+ "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,
+ "metaData": {
+ "ImspTQPwCqd": {
+ "uid": "ImspTQPwCqd",
+ "code": "OU_525",
+ "name": "Sierra Leone"
+ },
+ "qrur9Dvnyt5": {
+ "uid": "qrur9Dvnyt5",
+ "code": "DE_3000003",
+ "name": "Age in years"
+ }
+ },
+ "displayFormName": "A1 numeric-legendset",
+ "id": "kNl4fqsY9hJ",
+ "attributeValues": []
+}
diff --git a/src/__demo__/data/event/optionset.data.hidena.json b/src/__demo__/data/event/optionset.data.hidena.json
new file mode 100644
index 000000000..88be1fad8
--- /dev/null
+++ b/src/__demo__/data/event/optionset.data.hidena.json
@@ -0,0 +1,125 @@
+{
+ "headers": [
+ {
+ "name": "stageA.element1",
+ "column": "Option set A",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true,
+ "optionSet": "optionset1"
+ },
+ {
+ "name": "stageB.element2",
+ "column": "Option set B with shared codes",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true,
+ "optionSet": "iDFPKpFTiVw"
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "optionId1": {
+ "code": "ONE",
+ "name": "One"
+ },
+ "optionId2": {
+ "code": "TWO",
+ "name": "Two"
+ },
+ "optionId3": {
+ "code": "ONE",
+ "name": "Single"
+ },
+ "optionId4": {
+ "code": "TWO",
+ "name": "Double"
+ },
+ "stageA.element1": {
+ "name": "Option set A"
+ },
+ "stageB.element2": {
+ "name": "Option set B with shared codes"
+ },
+ "Zj7UnCAulEk": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "eBAyeGv0exc": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "LAST_3_MONTHS": {
+ "name": "Last 3 months"
+ }
+ },
+ "dimensions": {
+ "pe": ["202505", "202506", "202507"],
+ "ou": ["ImspTQPwCqd"],
+ "stageA.element1": ["optionId1", "optionId2"],
+ "stageB.element2": ["optionId3", "optionId4"]
+ }
+ },
+ "rowContext": {},
+ "headerWidth": 4,
+ "width": 4,
+ "rows": [
+ ["optionId1", "optionId3", "ImspTQPwCqd", "202505", "327"],
+ ["optionId1", "optionId3", "ImspTQPwCqd", "202506", "594"],
+ ["optionId1", "optionId3", "ImspTQPwCqd", "202507", "261"],
+ ["optionId1", "optionId4", "ImspTQPwCqd", "202505", "448"],
+ ["optionId1", "optionId4", "ImspTQPwCqd", "202506", "519"],
+ ["optionId1", "optionId4", "ImspTQPwCqd", "202507", "583"],
+ ["optionId2", "optionId3", "ImspTQPwCqd", "202505", "379"],
+ ["optionId2", "optionId3", "ImspTQPwCqd", "202506", "239"],
+ ["optionId2", "optionId3", "ImspTQPwCqd", "202507", "420"],
+ ["optionId2", "optionId4", "ImspTQPwCqd", "202505", "411"],
+ ["optionId2", "optionId4", "ImspTQPwCqd", "202506", "531"],
+ ["optionId2", "optionId4", "ImspTQPwCqd", "202507", "317"],
+ ["", "optionId4", "ImspTQPwCqd", "202507", "23"],
+ ["optionId1", "", "ImspTQPwCqd", "202506", "45"]
+ ],
+ "height": 12
+}
diff --git a/src/__demo__/data/event/optionset.data.json b/src/__demo__/data/event/optionset.data.json
new file mode 100644
index 000000000..992025f8b
--- /dev/null
+++ b/src/__demo__/data/event/optionset.data.json
@@ -0,0 +1,134 @@
+{
+ "headers": [
+ {
+ "name": "stageA.element1",
+ "column": "Option set A",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true,
+ "optionSet": "optionset1"
+ },
+ {
+ "name": "stageB.element2",
+ "column": "Option set B with shared codes",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true,
+ "optionSet": "iDFPKpFTiVw"
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "optionId1": {
+ "code": "ONE",
+ "name": "One"
+ },
+ "optionId2": {
+ "code": "TWO",
+ "name": "Two"
+ },
+ "optionId3": {
+ "code": "ONE",
+ "name": "Single"
+ },
+ "optionId4": {
+ "code": "TWO",
+ "name": "Double"
+ },
+ "stageA.element1": {
+ "name": "Option set A"
+ },
+ "stageB.element2": {
+ "name": "Option set B with shared codes"
+ },
+ "Zj7UnCAulEk": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "eBAyeGv0exc": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "LAST_3_MONTHS": {
+ "name": "Last 3 months"
+ },
+ "": {
+ "name": "No value",
+ "style": {
+ "fontStyle": "italic",
+ "color": "#6C7787",
+ "fontFamily": "monospace",
+ "letterSpacing": "-0.3px"
+ }
+ }
+ },
+ "dimensions": {
+ "pe": ["202505", "202506", "202507"],
+ "ou": ["ImspTQPwCqd"],
+ "stageA.element1": ["optionId1", "optionId2", ""],
+ "stageB.element2": ["optionId3", "optionId4", ""]
+ }
+ },
+ "rowContext": {},
+ "headerWidth": 4,
+ "width": 4,
+ "rows": [
+ ["optionId1", "optionId3", "ImspTQPwCqd", "202505", "327"],
+ ["optionId1", "optionId3", "ImspTQPwCqd", "202506", "594"],
+ ["optionId1", "optionId3", "ImspTQPwCqd", "202507", "261"],
+ ["optionId1", "optionId4", "ImspTQPwCqd", "202505", "448"],
+ ["optionId1", "optionId4", "ImspTQPwCqd", "202506", "519"],
+ ["optionId1", "optionId4", "ImspTQPwCqd", "202507", "583"],
+ ["optionId2", "optionId3", "ImspTQPwCqd", "202505", "379"],
+ ["optionId2", "optionId3", "ImspTQPwCqd", "202506", "239"],
+ ["optionId2", "optionId3", "ImspTQPwCqd", "202507", "420"],
+ ["optionId2", "optionId4", "ImspTQPwCqd", "202505", "411"],
+ ["optionId2", "optionId4", "ImspTQPwCqd", "202506", "531"],
+ ["optionId2", "optionId4", "ImspTQPwCqd", "202507", "317"],
+ ["", "optionId4", "ImspTQPwCqd", "202507", "23"],
+ ["optionId1", "", "ImspTQPwCqd", "202506", "45"]
+ ],
+ "height": 12
+}
diff --git a/src/__demo__/data/event/optionset.data.org.json b/src/__demo__/data/event/optionset.data.org.json
new file mode 100644
index 000000000..0c89be891
--- /dev/null
+++ b/src/__demo__/data/event/optionset.data.org.json
@@ -0,0 +1,125 @@
+{
+ "headers": [
+ {
+ "name": "stageA.element1",
+ "column": "Option set A",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true,
+ "optionSet": "optionset1"
+ },
+ {
+ "name": "stageB.element2",
+ "column": "Option set B with shared codes",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true,
+ "optionSet": "iDFPKpFTiVw"
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "optionId1": {
+ "code": "ONE",
+ "name": "One"
+ },
+ "optionId2": {
+ "code": "TWO",
+ "name": "Two"
+ },
+ "optionId3": {
+ "code": "ONE",
+ "name": "Single"
+ },
+ "optionId4": {
+ "code": "TWO",
+ "name": "Double"
+ },
+ "stageA.element1": {
+ "name": "Option set A"
+ },
+ "stageB.element2": {
+ "name": "Option set B with shared codes"
+ },
+ "Zj7UnCAulEk": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "eBAyeGv0exc": {
+ "name": "Inpatient morbidity and mortality"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "LAST_3_MONTHS": {
+ "name": "Last 3 months"
+ }
+ },
+ "dimensions": {
+ "pe": ["202505", "202506", "202507"],
+ "ou": ["ImspTQPwCqd"],
+ "stageA.element1": ["optionId1", "optionId2"],
+ "stageB.element2": ["optionId3", "optionId4"]
+ }
+ },
+ "rowContext": {},
+ "headerWidth": 4,
+ "width": 4,
+ "rows": [
+ ["ONE", "ONE", "ImspTQPwCqd", "202505", "327"],
+ ["ONE", "ONE", "ImspTQPwCqd", "202506", "594"],
+ ["ONE", "ONE", "ImspTQPwCqd", "202507", "261"],
+ ["ONE", "TWO", "ImspTQPwCqd", "202505", "448"],
+ ["ONE", "TWO", "ImspTQPwCqd", "202506", "519"],
+ ["ONE", "TWO", "ImspTQPwCqd", "202507", "583"],
+ ["TWO", "ONE", "ImspTQPwCqd", "202505", "379"],
+ ["TWO", "ONE", "ImspTQPwCqd", "202506", "239"],
+ ["TWO", "ONE", "ImspTQPwCqd", "202507", "420"],
+ ["TWO", "TWO", "ImspTQPwCqd", "202505", "411"],
+ ["TWO", "TWO", "ImspTQPwCqd", "202506", "531"],
+ ["TWO", "TWO", "ImspTQPwCqd", "202507", "317"],
+ ["", "TWO", "ImspTQPwCqd", "202507", "23"],
+ ["ONE", "", "ImspTQPwCqd", "202506", "45"]
+ ],
+ "height": 12
+}
diff --git a/src/__demo__/data/event/optionset.visualization.json b/src/__demo__/data/event/optionset.visualization.json
new file mode 100644
index 000000000..38f6ccd33
--- /dev/null
+++ b/src/__demo__/data/event/optionset.visualization.json
@@ -0,0 +1,158 @@
+{
+ "name": "Two option sets with shared option codes",
+ "created": "2025-06-30T10:27:41.277",
+ "lastUpdated": "2025-06-30T10:27:41.277",
+ "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": {
+ "incidentDateLabel": "Date of Discharge",
+ "id": "eBAyeGv0exc",
+ "name": "Inpatient morbidity and mortality"
+ },
+ "programStage": {
+ "executionDateLabel": "Report date",
+ "id": "Zj7UnCAulEk",
+ "name": "Inpatient morbidity and mortality"
+ },
+ "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": "ou"
+ },
+ {
+ "items": [
+ {
+ "dimensionItemType": "PERIOD",
+ "id": "LAST_3_MONTHS",
+ "name": "LAST_3_MONTHS"
+ }
+ ],
+ "dimension": "pe"
+ }
+ ],
+ "rows": [
+ {
+ "items": [],
+ "programStage": {
+ "id": "stageA"
+ },
+ "dimension": "stageA.element1"
+ },
+ {
+ "items": [],
+ "programStage": {
+ "id": "stageB"
+ },
+ "dimension": "stageB.element2"
+ }
+ ],
+ "displayName": "Text with option set",
+ "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,
+ "metaData": {
+ "ImspTQPwCqd": {
+ "uid": "ImspTQPwCqd",
+ "code": "OU_525",
+ "name": "Sierra Leone"
+ },
+ "qrur9Dvnyt5": {
+ "uid": "qrur9Dvnyt5",
+ "code": "DE_3000003",
+ "name": "Age in years"
+ }
+ },
+ "displayFormName": "Text with option set",
+ "id": "kNl4fqsY9hJ",
+ "attributeValues": []
+}
diff --git a/src/__demo__/data/event/time.data.hidena.json b/src/__demo__/data/event/time.data.hidena.json
new file mode 100644
index 000000000..fdf9a273d
--- /dev/null
+++ b/src/__demo__/data/event/time.data.hidena.json
@@ -0,0 +1,165 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.BYmX7eQ71ku",
+ "column": "E2E - Time",
+ "valueType": "TIME",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "jfuXZB3A1ko.BYmX7eQ71ku_04:50": {
+ "name": "04:50"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_08:10": {
+ "name": "08:10"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_08:11": {
+ "name": "08:11"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_13:30": {
+ "name": "13:30"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_13:55": {
+ "name": "13:55"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_14:01": {
+ "name": "14:01"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_14:02": {
+ "name": "14:02"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_17:35": {
+ "name": "17:35"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_23:00": {
+ "name": "23:00"
+ },
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "202508": {
+ "name": "August 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "BYmX7eQ71ku": {
+ "name": "E2E - Time"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku": {
+ "name": "E2E - Time"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ }
+ },
+ "dimensions": {
+ "jfuXZB3A1ko.BYmX7eQ71ku": [
+ "jfuXZB3A1ko.BYmX7eQ71ku_04:50",
+ "jfuXZB3A1ko.BYmX7eQ71ku_08:10",
+ "jfuXZB3A1ko.BYmX7eQ71ku_08:11",
+ "jfuXZB3A1ko.BYmX7eQ71ku_13:30",
+ "jfuXZB3A1ko.BYmX7eQ71ku_13:55",
+ "jfuXZB3A1ko.BYmX7eQ71ku_14:01",
+ "jfuXZB3A1ko.BYmX7eQ71ku_14:02",
+ "jfuXZB3A1ko.BYmX7eQ71ku_17:35",
+ "jfuXZB3A1ko.BYmX7eQ71ku_23:00"
+ ],
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507",
+ "202508"
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["jfuXZB3A1ko.BYmX7eQ71ku_13:30", "ImspTQPwCqd", "202501", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_23:00", "ImspTQPwCqd", "202503", "1"],
+ ["", "ImspTQPwCqd", "202503", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_14:01", "ImspTQPwCqd", "202412", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_08:10", "ImspTQPwCqd", "202412", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_17:35", "ImspTQPwCqd", "202411", "1"],
+ ["", "ImspTQPwCqd", "202502", "1"],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_08:11", "ImspTQPwCqd", "202412", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_04:50", "ImspTQPwCqd", "202504", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_13:55", "ImspTQPwCqd", "202501", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_14:02", "ImspTQPwCqd", "202412", "1"]
+ ],
+ "height": 12,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/time.data.json b/src/__demo__/data/event/time.data.json
new file mode 100644
index 000000000..233b86f66
--- /dev/null
+++ b/src/__demo__/data/event/time.data.json
@@ -0,0 +1,175 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.BYmX7eQ71ku",
+ "column": "E2E - Time",
+ "valueType": "TIME",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "jfuXZB3A1ko.BYmX7eQ71ku_04:50": {
+ "name": "04:50"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_08:10": {
+ "name": "08:10"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_08:11": {
+ "name": "08:11"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_13:30": {
+ "name": "13:30"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_13:55": {
+ "name": "13:55"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_14:01": {
+ "name": "14:01"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_14:02": {
+ "name": "14:02"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_17:35": {
+ "name": "17:35"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku_23:00": {
+ "name": "23:00"
+ },
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "202508": {
+ "name": "August 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "BYmX7eQ71ku": {
+ "name": "E2E - Time"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku": {
+ "name": "E2E - Time"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "": {
+ "name": "No value",
+ "style": {
+ "fontStyle": "italic",
+ "color": "#6C7787",
+ "fontFamily": "monospace",
+ "letterSpacing": "-0.3px"
+ }
+ }
+ },
+ "dimensions": {
+ "jfuXZB3A1ko.BYmX7eQ71ku": [
+ "jfuXZB3A1ko.BYmX7eQ71ku_04:50",
+ "jfuXZB3A1ko.BYmX7eQ71ku_08:10",
+ "jfuXZB3A1ko.BYmX7eQ71ku_08:11",
+ "jfuXZB3A1ko.BYmX7eQ71ku_13:30",
+ "jfuXZB3A1ko.BYmX7eQ71ku_13:55",
+ "jfuXZB3A1ko.BYmX7eQ71ku_14:01",
+ "jfuXZB3A1ko.BYmX7eQ71ku_14:02",
+ "jfuXZB3A1ko.BYmX7eQ71ku_17:35",
+ "jfuXZB3A1ko.BYmX7eQ71ku_23:00",
+ ""
+ ],
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507",
+ "202508"
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["jfuXZB3A1ko.BYmX7eQ71ku_13:30", "ImspTQPwCqd", "202501", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_23:00", "ImspTQPwCqd", "202503", "1"],
+ ["", "ImspTQPwCqd", "202503", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_14:01", "ImspTQPwCqd", "202412", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_08:10", "ImspTQPwCqd", "202412", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_17:35", "ImspTQPwCqd", "202411", "1"],
+ ["", "ImspTQPwCqd", "202502", "1"],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_08:11", "ImspTQPwCqd", "202412", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_04:50", "ImspTQPwCqd", "202504", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_13:55", "ImspTQPwCqd", "202501", "1"],
+ ["jfuXZB3A1ko.BYmX7eQ71ku_14:02", "ImspTQPwCqd", "202412", "1"]
+ ],
+ "height": 12,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/time.data.org.json b/src/__demo__/data/event/time.data.org.json
new file mode 100644
index 000000000..65a4b0f64
--- /dev/null
+++ b/src/__demo__/data/event/time.data.org.json
@@ -0,0 +1,128 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.BYmX7eQ71ku",
+ "column": "E2E - Time",
+ "valueType": "TIME",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "202507": {
+ "name": "July 2025"
+ },
+ "202508": {
+ "name": "August 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "BYmX7eQ71ku": {
+ "name": "E2E - Time"
+ },
+ "jfuXZB3A1ko.BYmX7eQ71ku": {
+ "name": "E2E - Time"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ }
+ },
+ "dimensions": {
+ "jfuXZB3A1ko.BYmX7eQ71ku": [],
+ "pe": [
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506",
+ "202507",
+ "202508"
+ ],
+ "ou": ["ImspTQPwCqd"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["13:30", "ImspTQPwCqd", "202501", "1"],
+ ["23:00", "ImspTQPwCqd", "202503", "1"],
+ ["", "ImspTQPwCqd", "202503", "1"],
+ ["14:01", "ImspTQPwCqd", "202412", "1"],
+ ["08:10", "ImspTQPwCqd", "202412", "1"],
+ ["17:35", "ImspTQPwCqd", "202411", "1"],
+ ["", "ImspTQPwCqd", "202502", "1"],
+ ["", "ImspTQPwCqd", "202501", "1"],
+ ["08:11", "ImspTQPwCqd", "202412", "1"],
+ ["04:50", "ImspTQPwCqd", "202504", "1"],
+ ["13:55", "ImspTQPwCqd", "202501", "1"],
+ ["14:02", "ImspTQPwCqd", "202412", "1"]
+ ],
+ "height": 12,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/time.visualization.json b/src/__demo__/data/event/time.visualization.json
new file mode 100644
index 000000000..e58b2d988
--- /dev/null
+++ b/src/__demo__/data/event/time.visualization.json
@@ -0,0 +1,148 @@
+{
+ "name": "Time",
+ "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": [],
+ "dataElementDimensions": [
+ {
+ "dataElement": {
+ "name": "MCH BCG dose",
+ "id": "bx6fsa0t90x"
+ }
+ }
+ ],
+ "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": "ou"
+ },
+ {
+ "items": [
+ {
+ "dimensionItemType": "PERIOD",
+ "id": "LAST_6_MONTHS",
+ "name": "LAST_6_MONTHS"
+ }
+ ],
+ "dimension": "pe"
+ }
+ ],
+ "rows": [
+ {
+ "items": [],
+ "programStage": {
+ "id": "jfuXZB3A1ko"
+ },
+ "dimension": "jfuXZB3A1ko.BYmX7eQ71ku"
+ }
+ ],
+ "displayName": "Time",
+ "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": "Time",
+ "id": "xLPn5T11Vd4",
+ "attributeValues": []
+}
diff --git a/src/__demo__/data/event/yesonly.data.hidena.json b/src/__demo__/data/event/yesonly.data.hidena.json
new file mode 100644
index 000000000..c386b7191
--- /dev/null
+++ b/src/__demo__/data/event/yesonly.data.hidena.json
@@ -0,0 +1,127 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.hwG20Dyj6RK",
+ "column": "E2E - Yes only",
+ "valueType": "TRUE_ONLY",
+ "type": "java.lang.Boolean",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202410": {
+ "name": "October 2024"
+ },
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "hwG20Dyj6RK": {
+ "name": "E2E - Yes only"
+ },
+ "jfuXZB3A1ko.hwG20Dyj6RK": {
+ "name": "E2E - Yes only"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "jfuXZB3A1ko.hwG20Dyj6RK_1": {
+ "name": "Yes"
+ }
+ },
+ "dimensions": {
+ "pe": [
+ "202410",
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506"
+ ],
+ "ou": ["ImspTQPwCqd"],
+ "jfuXZB3A1ko.hwG20Dyj6RK": ["jfuXZB3A1ko.hwG20Dyj6RK_1"]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["", "ImspTQPwCqd", "202412", "1"],
+ ["", "ImspTQPwCqd", "202503", "2"],
+ ["", "ImspTQPwCqd", "202504", "1"],
+ ["", "ImspTQPwCqd", "202502", "1"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202501", "1"],
+ ["", "ImspTQPwCqd", "202501", "2"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202412", "3"],
+ ["", "ImspTQPwCqd", "202411", "1"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202411", "4"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202503", "2"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202504", "1"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202502", "1"]
+ ],
+ "height": 8,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/yesonly.data.json b/src/__demo__/data/event/yesonly.data.json
new file mode 100644
index 000000000..d781716f1
--- /dev/null
+++ b/src/__demo__/data/event/yesonly.data.json
@@ -0,0 +1,136 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.hwG20Dyj6RK",
+ "column": "E2E - Yes only",
+ "valueType": "TRUE_ONLY",
+ "type": "java.lang.Boolean",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202410": {
+ "name": "October 2024"
+ },
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "hwG20Dyj6RK": {
+ "name": "E2E - Yes only"
+ },
+ "jfuXZB3A1ko.hwG20Dyj6RK": {
+ "name": "E2E - Yes only"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ },
+ "jfuXZB3A1ko.hwG20Dyj6RK_1": {
+ "name": "Yes"
+ },
+ "": {
+ "name": "No value",
+ "style": {
+ "fontStyle": "italic",
+ "color": "#6C7787",
+ "fontFamily": "monospace",
+ "letterSpacing": "-0.3px"
+ }
+ }
+ },
+ "dimensions": {
+ "pe": [
+ "202410",
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506"
+ ],
+ "ou": ["ImspTQPwCqd"],
+ "jfuXZB3A1ko.hwG20Dyj6RK": ["jfuXZB3A1ko.hwG20Dyj6RK_1", ""]
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["", "ImspTQPwCqd", "202412", "1"],
+ ["", "ImspTQPwCqd", "202503", "2"],
+ ["", "ImspTQPwCqd", "202504", "1"],
+ ["", "ImspTQPwCqd", "202502", "1"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202501", "1"],
+ ["", "ImspTQPwCqd", "202501", "2"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202412", "3"],
+ ["", "ImspTQPwCqd", "202411", "1"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202411", "4"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202503", "2"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202504", "1"],
+ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202502", "1"]
+ ],
+ "height": 8,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/yesonly.data.org.json b/src/__demo__/data/event/yesonly.data.org.json
new file mode 100644
index 000000000..7af7032fa
--- /dev/null
+++ b/src/__demo__/data/event/yesonly.data.org.json
@@ -0,0 +1,124 @@
+{
+ "headers": [
+ {
+ "name": "jfuXZB3A1ko.hwG20Dyj6RK",
+ "column": "E2E - Yes only",
+ "valueType": "TRUE_ONLY",
+ "type": "java.lang.Boolean",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "ou",
+ "column": "Organisation unit",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "pe",
+ "column": "Period",
+ "valueType": "TEXT",
+ "type": "java.lang.String",
+ "hidden": false,
+ "meta": true
+ },
+ {
+ "name": "value",
+ "column": "Value",
+ "valueType": "NUMBER",
+ "type": "java.lang.Double",
+ "hidden": false,
+ "meta": false
+ }
+ ],
+ "metaData": {
+ "items": {
+ "202410": {
+ "name": "October 2024"
+ },
+ "202411": {
+ "name": "November 2024"
+ },
+ "202412": {
+ "name": "December 2024"
+ },
+ "202501": {
+ "name": "January 2025"
+ },
+ "202502": {
+ "name": "February 2025"
+ },
+ "202503": {
+ "name": "March 2025"
+ },
+ "202504": {
+ "name": "April 2025"
+ },
+ "202505": {
+ "name": "May 2025"
+ },
+ "202506": {
+ "name": "June 2025"
+ },
+ "jfuXZB3A1ko": {
+ "name": "Stage 1 - Repeatable"
+ },
+ "hwG20Dyj6RK": {
+ "name": "E2E - Yes only"
+ },
+ "jfuXZB3A1ko.hwG20Dyj6RK": {
+ "name": "E2E - Yes only"
+ },
+ "ou": {
+ "name": "Organisation unit"
+ },
+ "J1QQtmzqhJz": {
+ "name": "E2E program"
+ },
+ "LAST_12_MONTHS": {
+ "name": "Last 12 months"
+ },
+ "ImspTQPwCqd": {
+ "name": "Sierra Leone"
+ },
+ "pe": {
+ "name": "Period"
+ }
+ },
+ "dimensions": {
+ "pe": [
+ "202410",
+ "202411",
+ "202412",
+ "202501",
+ "202502",
+ "202503",
+ "202504",
+ "202505",
+ "202506"
+ ],
+ "ou": ["ImspTQPwCqd"],
+ "jfuXZB3A1ko.hwG20Dyj6RK": []
+ }
+ },
+ "rowContext": {},
+ "width": 4,
+ "rows": [
+ ["", "ImspTQPwCqd", "202412", "1"],
+ ["", "ImspTQPwCqd", "202503", "2"],
+ ["", "ImspTQPwCqd", "202504", "1"],
+ ["", "ImspTQPwCqd", "202502", "1"],
+ ["1", "ImspTQPwCqd", "202501", "1"],
+ ["", "ImspTQPwCqd", "202501", "2"],
+ ["1", "ImspTQPwCqd", "202412", "3"],
+ ["", "ImspTQPwCqd", "202411", "1"],
+ ["1", "ImspTQPwCqd", "202411", "4"],
+ ["1", "ImspTQPwCqd", "202503", "2"],
+ ["1", "ImspTQPwCqd", "202504", "1"],
+ ["1", "ImspTQPwCqd", "202502", "1"]
+ ],
+ "height": 8,
+ "headerWidth": 4
+}
diff --git a/src/__demo__/data/event/yesonly.visualization.json b/src/__demo__/data/event/yesonly.visualization.json
new file mode 100644
index 000000000..b8e74b0c5
--- /dev/null
+++ b/src/__demo__/data/event/yesonly.visualization.json
@@ -0,0 +1,161 @@
+{
+ "name": "Yesonly",
+ "created": "2025-07-02T10:36:16.893",
+ "lastUpdated": "2025-07-02T10:36:16.893",
+ "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": [],
+ "dataElementDimensions": [
+ {
+ "dataElement": {
+ "name": "E2E - Yes only",
+ "id": "hwG20Dyj6RK"
+ }
+ }
+ ],
+ "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": "Enrollment date (e2e)",
+ "incidentDateLabel": "Incident date (e2e)",
+ "id": "J1QQtmzqhJz",
+ "name": "E2E program"
+ },
+ "programStage": {
+ "executionDateLabel": "Event date (e2e)",
+ "id": "jfuXZB3A1ko",
+ "name": "Stage 1 - Repeatable"
+ },
+ "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": "ou"
+ },
+ {
+ "items": [
+ {
+ "dimensionItemType": "PERIOD",
+ "id": "LAST_12_MONTHS",
+ "name": "LAST_12_MONTHS"
+ }
+ ],
+ "dimension": "pe"
+ }
+ ],
+ "rows": [
+ {
+ "items": [],
+ "programStage": {
+ "id": "jfuXZB3A1ko"
+ },
+ "dimension": "jfuXZB3A1ko.hwG20Dyj6RK"
+ }
+ ],
+ "displayName": "Yesonly",
+ "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,
+ "metaData": {
+ "hwG20Dyj6RK": {
+ "uid": "hwG20Dyj6RK",
+ "name": "E2E - Yes only"
+ },
+ "ImspTQPwCqd": {
+ "uid": "ImspTQPwCqd",
+ "code": "OU_525",
+ "name": "Sierra Leone"
+ }
+ },
+ "displayFormName": "Yesonly",
+ "id": "qySyY2zmjrO",
+ "attributeValues": []
+}
\ No newline at end of file
diff --git a/src/components/DataDimension/ItemSelector/ItemSelector.js b/src/components/DataDimension/ItemSelector/ItemSelector.js
index 5b20b36b6..bf450c92b 100644
--- a/src/components/DataDimension/ItemSelector/ItemSelector.js
+++ b/src/components/DataDimension/ItemSelector/ItemSelector.js
@@ -418,33 +418,30 @@ const ItemSelector = ({
selectedEmptyComponent={}
rightHeader={}
rightFooter={rightFooter}
- renderOption={(props) => {
- // console.log('renderOption', props)
- return (
- (
+ onEditClick(props)}
+ onInfoClick={() =>
+ setInfoDataItem({
+ id: props.value,
type: props.type,
- expression: props.expression,
- })}
- dataTest={`${dataTest}-transfer-option`}
- itemsRef={itemsRef}
- onEditClick={() => onEditClick(props)}
- onInfoClick={() =>
- setInfoDataItem({
- id: props.value,
- type: props.type,
- })
- }
- /* eslint-enable react/prop-types */
- />
- )
- }}
+ })
+ }
+ /* eslint-enable react/prop-types */
+ />
+ )}
dataTest={`${dataTest}-transfer`}
/>
{currentCalculation && supportsEDI && (
diff --git a/src/components/PivotTable/PivotTableColumnHeaderCell.js b/src/components/PivotTable/PivotTableColumnHeaderCell.js
index c1987bb2c..85a357f11 100644
--- a/src/components/PivotTable/PivotTableColumnHeaderCell.js
+++ b/src/components/PivotTable/PivotTableColumnHeaderCell.js
@@ -77,6 +77,7 @@ export const PivotTableColumnHeaderCell = ({
{header.label}
diff --git a/src/components/PivotTable/PivotTableRowHeaderCell.js b/src/components/PivotTable/PivotTableRowHeaderCell.js
index 81701efcb..c519d3349 100644
--- a/src/components/PivotTable/PivotTableRowHeaderCell.js
+++ b/src/components/PivotTable/PivotTableRowHeaderCell.js
@@ -49,6 +49,7 @@ export const PivotTableRowHeaderCell = ({
.slice(0, rowLevel)
.reduce((width, acc) => (acc += width), 0)
: 0,
+ ...header.style,
}}
dataTest="visualization-row-header"
>
diff --git a/src/index.js b/src/index.js
index af77cdfdd..a3dad2311 100644
--- a/src/index.js
+++ b/src/index.js
@@ -324,6 +324,10 @@ export {
export { renderValue as formatValue } from './modules/renderValue.js'
+// Modules: response
+
+export { transformResponse as transformEventAggregateResponse } from './modules/response/event/response.js'
+
// Utils: colorSets
export {
COLOR_SET_DEFAULT,
diff --git a/src/modules/pivotTable/AdaptiveClippingController.js b/src/modules/pivotTable/AdaptiveClippingController.js
index 13c8c754d..1141170b8 100644
--- a/src/modules/pivotTable/AdaptiveClippingController.js
+++ b/src/modules/pivotTable/AdaptiveClippingController.js
@@ -92,6 +92,7 @@ export class AdaptiveClippingController {
axis.sizes[index]?.size || 0
)
: 0,
+ ...header.style,
})
this.addSize(
{ row: -headerStack.length + level, column: index },
diff --git a/src/modules/pivotTable/PivotTableEngine.js b/src/modules/pivotTable/PivotTableEngine.js
index 519e422ef..909058cf0 100644
--- a/src/modules/pivotTable/PivotTableEngine.js
+++ b/src/modules/pivotTable/PivotTableEngine.js
@@ -120,6 +120,7 @@ const buildDimensionLookup = (visualization, metadata, headers) => {
isDxDimension: isDxDimension(metadata.items[row.dimension]),
position: 'row',
}))
+
const columns = visualization.columns.map((column) => ({
dimension: column.dimension,
meta: metadata.items[column.dimension],
diff --git a/src/modules/pivotTable/getHeaderForDisplay.js b/src/modules/pivotTable/getHeaderForDisplay.js
index 0da7ded3b..ddc510db4 100644
--- a/src/modules/pivotTable/getHeaderForDisplay.js
+++ b/src/modules/pivotTable/getHeaderForDisplay.js
@@ -30,7 +30,6 @@ export const getHeaderForDisplay = ({
}
++span
}
-
const currentHeader = header[dimensionLevel]
const includesHierarchy = showHierarchy && currentHeader?.hierarchy
@@ -43,5 +42,6 @@ export const getHeaderForDisplay = ({
span,
label,
includesHierarchy,
+ ...(currentHeader.style ? { style: currentHeader.style } : {}),
}
}
diff --git a/src/modules/pivotTable/measureText.js b/src/modules/pivotTable/measureText.js
index 7dcc39776..3f4fc478a 100644
--- a/src/modules/pivotTable/measureText.js
+++ b/src/modules/pivotTable/measureText.js
@@ -6,19 +6,22 @@ import {
let canvas
-const getContext = (fontSize) => {
+const getContext = (
+ fontSize = 11,
+ fontFamily = 'Roboto, Arial, sans-serif'
+) => {
if (!canvas) {
canvas = document.createElement('canvas')
}
const ctx = canvas.getContext('2d')
- ctx.font = `${fontSize}px Roboto, Arial, sans-serif`
+ ctx.font = `${fontSize}px ${fontFamily}`
return ctx
}
-const measureText = (text, fontSize = 11) => {
- const ctx = getContext(fontSize)
+const measureText = (text, fontSize, fontFamily) => {
+ const ctx = getContext(fontSize, fontFamily)
const textMetrics = ctx.measureText(text)
return textMetrics.width
@@ -31,6 +34,7 @@ export const measureTextWithWrapping = (
maxWidth = CLIPPED_CELL_MAX_SIZE,
justifyBuffer = WRAPPED_TEXT_JUSTIFY_BUFFER,
lineHeight = WRAPPED_TEXT_LINE_HEIGHT,
+ fontFamily,
}
) => {
if (!text) {
@@ -48,7 +52,7 @@ export const measureTextWithWrapping = (
const words = paragraphs.shift().split(/\s+/)
while (words.length) {
const nextWord = (currentLineWidth === 0 ? '' : ' ') + words.shift()
- const nextWordWidth = measureText(nextWord, fontSize)
+ const nextWordWidth = measureText(nextWord, fontSize, fontFamily)
if (maxWidth && currentLineWidth + nextWordWidth > maxWidth) {
if (currentLineWidth <= maxWidth - justifyBuffer) {
// Wrapping this word would cause an unnaturally short line
diff --git a/src/modules/response/event/__tests__/default.spec.js b/src/modules/response/event/__tests__/default.spec.js
new file mode 100644
index 000000000..ea1be6b47
--- /dev/null
+++ b/src/modules/response/event/__tests__/default.spec.js
@@ -0,0 +1,134 @@
+import { VALUE_TYPE_NUMBER } from '../../../valueTypes.js'
+import {
+ getDimensions,
+ getItems,
+ getRows,
+ getPrefixedValue,
+ getUnique,
+ getValuesUniqueSortedAsc,
+} from '../default.js'
+import { PREFIX_SEPARATOR } from '../response.js'
+
+const testId = 'Zj7UnCAulEk.qrur9Dvnyt5'
+
+describe('default', () => {
+ // applyDefaultHandler is tested by response.spec.js
+
+ describe('getUnique', () => {
+ it('removes duplicate string numbers', () => {
+ const arr = ['2', '10', '2', '01', '1', '-1', '-1', '1', '10']
+ expect(getUnique(arr)).toEqual(['2', '10', '01', '1', '-1'])
+ })
+
+ it('treats "01" and "1" as different strings', () => {
+ const arr = ['01', '1', '01']
+ expect(getUnique(arr)).toEqual(['01', '1'])
+ })
+
+ it('handles empty array', () => {
+ expect(getUnique([])).toEqual([])
+ })
+
+ it('preserves order of first occurrence', () => {
+ const arr = ['2', '1', '2', '1']
+ expect(getUnique(arr)).toEqual(['2', '1'])
+ })
+ })
+
+ describe('getValuesUniqueSortedAsc', () => {
+ it('sorts string numbers numerically', () => {
+ expect(
+ getValuesUniqueSortedAsc(
+ ['1', '10', '-1', '5', '5', '3'],
+ VALUE_TYPE_NUMBER
+ )
+ ).toEqual(['-1', '1', '3', '5', '10'])
+ })
+
+ it('sorts non-numeric strings as strings', () => {
+ expect(
+ getValuesUniqueSortedAsc([
+ '1995-04-18 13:54:00.0',
+ '1991-12-03 12:02:00.0',
+ '1992-01-05 12:51:00.0',
+ '1991-05-21 14:46:00.0',
+ '1998-03-01 11:21:00.0',
+ '1991-09-02 10:21:00.0',
+ '1992-01-04 12:02:00.0',
+ '1991-12-02 12:01:00.0',
+ '1990-01-25 14:51:00.0',
+ '1991-05-22 14:47:00.0',
+ ])
+ ).toEqual([
+ '1990-01-25 14:51:00.0',
+ '1991-05-21 14:46:00.0',
+ '1991-05-22 14:47:00.0',
+ '1991-09-02 10:21:00.0',
+ '1991-12-02 12:01:00.0',
+ '1991-12-03 12:02:00.0',
+ '1992-01-04 12:02:00.0',
+ '1992-01-05 12:51:00.0',
+ '1995-04-18 13:54:00.0',
+ '1998-03-01 11:21:00.0',
+ ])
+ })
+ })
+
+ describe('getPrefixedValue', () => {
+ it('returns prefix and value separated by a colon', () => {
+ expect(getPrefixedValue('123', 'id')).toBe(
+ `id${PREFIX_SEPARATOR}123`
+ )
+ })
+ })
+
+ describe('getItems', () => {
+ it('returns an object with prefixed keys and correct names', () => {
+ expect(getItems(['1', '2'], testId)).toEqual({
+ [testId + `${PREFIX_SEPARATOR}1`]: { name: '1' },
+ [testId + `${PREFIX_SEPARATOR}2`]: { name: '2' },
+ })
+ })
+
+ it('uses the formatter if one is provided', () => {
+ expect(
+ getItems(['world'], 'hello', {
+ itemFormatter: (str) => str.toUpperCase(),
+ })
+ ).toEqual({
+ [`hello${PREFIX_SEPARATOR}world`]: {
+ name: 'WORLD',
+ },
+ })
+ })
+ })
+
+ describe('getDimensions', () => {
+ it('returns an object with dimensionId as key and correctly prefixed values', () => {
+ expect(getDimensions(['1', '2'], testId)).toEqual({
+ [testId]: [
+ testId + `${PREFIX_SEPARATOR}1`,
+ testId + `${PREFIX_SEPARATOR}2`,
+ ],
+ })
+ })
+ })
+
+ describe('getRows', () => {
+ it('prefixes value at headerIndex for each row', () => {
+ const rows = [
+ ['a', '1', 'x'],
+ ['b', '2', 'y'],
+ ]
+
+ expect(getRows(rows, 1, testId)).toEqual([
+ ['a', `${testId}${PREFIX_SEPARATOR}1`, 'x'],
+ ['b', `${testId}${PREFIX_SEPARATOR}2`, 'y'],
+ ])
+ })
+
+ it('handles empty rows array', () => {
+ expect(getRows([], 1, 'a')).toEqual([])
+ })
+ })
+})
diff --git a/src/modules/response/event/__tests__/optionSet.spec.js b/src/modules/response/event/__tests__/optionSet.spec.js
new file mode 100644
index 000000000..5de660762
--- /dev/null
+++ b/src/modules/response/event/__tests__/optionSet.spec.js
@@ -0,0 +1,48 @@
+import responseHideNa from '../../../../__demo__/data/event/optionset.data.hidena.json'
+import responseOrg from '../../../../__demo__/data/event/optionset.data.org.json'
+import { getOptionCodeIdMap, getOptionIdRows } from '../optionSet.js'
+
+const testOptionCodeIdMap1 = {
+ ONE: 'optionId1',
+ TWO: 'optionId2',
+}
+
+const testOptionCodeIdMap2 = {
+ ONE: 'optionId3',
+ TWO: 'optionId4',
+}
+
+describe('optionSet', () => {
+ // applyOptionSetHandler is tested by response.spec.js
+
+ describe('getOptionCodeIdMap', () => {
+ it('should create an option code:id object', () => {
+ const testId = responseHideNa.headers[0].name
+ const testOptionIds = responseHideNa.metaData.dimensions[testId]
+ const testOptionItems = responseHideNa.metaData.items
+
+ expect(getOptionCodeIdMap(testOptionIds, testOptionItems)).toEqual(
+ testOptionCodeIdMap1
+ )
+ })
+ })
+
+ // Test the solution for two option sets with shared option codes
+ describe('getOptionIdRows', () => {
+ it('should replace option codes with ids in the right index', () => {
+ const optionSet1Rows = getOptionIdRows(
+ responseOrg.rows,
+ testOptionCodeIdMap1,
+ 0
+ )
+
+ const optionSet1And2Rows = getOptionIdRows(
+ optionSet1Rows,
+ testOptionCodeIdMap2,
+ 1
+ )
+
+ expect(optionSet1And2Rows).toEqual(responseHideNa.rows)
+ })
+ })
+})
diff --git a/src/modules/response/event/__tests__/response.spec.js b/src/modules/response/event/__tests__/response.spec.js
new file mode 100644
index 000000000..8566ef653
--- /dev/null
+++ b/src/modules/response/event/__tests__/response.spec.js
@@ -0,0 +1,182 @@
+import responseBooleanHideNa from '../../../../__demo__/data/event/boolean.data.hidena.json'
+import responseBoolean from '../../../../__demo__/data/event/boolean.data.json'
+import responseBooleanOrg from '../../../../__demo__/data/event/boolean.data.org.json'
+import responseDateHideNa from '../../../../__demo__/data/event/date.data.hidena.json'
+import responseDate from '../../../../__demo__/data/event/date.data.json'
+import responseDateOrg from '../../../../__demo__/data/event/date.data.org.json'
+import responseDatetimeHideNa from '../../../../__demo__/data/event/datetime.data.hidena.json'
+import responseDatetime from '../../../../__demo__/data/event/datetime.data.json'
+import responseDatetimeOrg from '../../../../__demo__/data/event/datetime.data.org.json'
+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 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'
+import responseOptionSetHideNa from '../../../../__demo__/data/event/optionset.data.hidena.json'
+import responseOptionSet from '../../../../__demo__/data/event/optionset.data.json'
+import responseOptionSetOrg from '../../../../__demo__/data/event/optionset.data.org.json'
+import responseTimeHideNa from '../../../../__demo__/data/event/time.data.hidena.json'
+import responseTime from '../../../../__demo__/data/event/time.data.json'
+import responseTimeOrg from '../../../../__demo__/data/event/time.data.org.json'
+import responseYesOnlyHideNa from '../../../../__demo__/data/event/yesonly.data.hidena.json'
+import responseYesOnly from '../../../../__demo__/data/event/yesonly.data.json'
+import responseYesOnlyOrg from '../../../../__demo__/data/event/yesonly.data.org.json'
+import {
+ VALUE_TYPE_AGE,
+ VALUE_TYPE_BOOLEAN,
+ VALUE_TYPE_DATE,
+ VALUE_TYPE_DATETIME,
+ VALUE_TYPE_PERCENTAGE,
+ VALUE_TYPE_TRUE_ONLY,
+} from '../../../valueTypes.js'
+import { getItemFormatterByValueType, transformResponse } from '../response.js'
+
+describe('response', () => {
+ describe('getItemFormatterByValueType', () => {
+ it('should return the correct formatter and format correctly', () => {
+ expect(getItemFormatterByValueType(VALUE_TYPE_BOOLEAN)('1')).toBe(
+ 'Yes'
+ )
+ expect(getItemFormatterByValueType(VALUE_TYPE_BOOLEAN)('0')).toBe(
+ 'No'
+ )
+ expect(getItemFormatterByValueType(VALUE_TYPE_TRUE_ONLY)('1')).toBe(
+ 'Yes'
+ )
+ expect(
+ getItemFormatterByValueType(VALUE_TYPE_AGE)(
+ '1985-01-01 00:00:00.0'
+ )
+ ).toBe('1985-01-01')
+ expect(
+ getItemFormatterByValueType(VALUE_TYPE_DATE)(
+ '2023-01-01 00:00:00.0'
+ )
+ ).toBe('2023-01-01')
+ expect(
+ getItemFormatterByValueType(VALUE_TYPE_DATETIME)(
+ '2023-01-01 12:00:00.0'
+ )
+ ).toBe('2023-01-01 12:00')
+ expect(
+ getItemFormatterByValueType(VALUE_TYPE_PERCENTAGE)('50.0')
+ ).toBe('50')
+ expect(getItemFormatterByValueType('NOT_A_TYPE')).toBe(undefined)
+ })
+ })
+
+ describe('transformResponse', () => {
+ describe('boolean', () => {
+ it('transforms response', () => {
+ expect(transformResponse(responseBooleanOrg)).toEqual(
+ responseBoolean
+ )
+ })
+
+ it('transforms response and hides N/A data', () => {
+ expect(
+ transformResponse(responseBooleanOrg, {
+ hideNaData: true,
+ })
+ ).toEqual(responseBooleanHideNa)
+ })
+ })
+
+ describe('date', () => {
+ it('transforms response', () => {
+ expect(transformResponse(responseDateOrg)).toEqual(responseDate)
+ })
+
+ it('transforms response and hides N/A data', () => {
+ expect(
+ transformResponse(responseDateOrg, { hideNaData: true })
+ ).toEqual(responseDateHideNa)
+ })
+ })
+
+ describe('datetime', () => {
+ it('transforms response', () => {
+ expect(transformResponse(responseDatetimeOrg)).toEqual(
+ responseDatetime
+ )
+ })
+
+ it('transforms response and hides N/A data', () => {
+ expect(
+ transformResponse(responseDatetimeOrg, { hideNaData: true })
+ ).toEqual(responseDatetimeHideNa)
+ })
+ })
+
+ describe('numeric', () => {
+ it('transforms response', () => {
+ expect(transformResponse(responseNumericOrg)).toEqual(
+ responseNumeric
+ )
+ })
+
+ it('transforms response and hides N/A data', () => {
+ expect(
+ transformResponse(responseNumericOrg, { hideNaData: true })
+ ).toEqual(responseNumericHideNa)
+ })
+ })
+
+ describe('option set', () => {
+ it('transforms response with non-unique codes across two option sets', () => {
+ expect(transformResponse(responseOptionSetOrg)).toEqual(
+ responseOptionSet
+ )
+ })
+
+ it('transforms response with non-unique codes across two option sets and hides N/A data', () => {
+ expect(
+ transformResponse(responseOptionSetOrg, {
+ hideNaData: true,
+ })
+ ).toEqual(responseOptionSetHideNa)
+ })
+ })
+
+ describe('text', () => {
+ it('transforms response', () => {
+ expect(transformResponse(responseTextOrg)).toEqual(responseText)
+ })
+
+ it('transforms response and hides N/A data', () => {
+ expect(
+ transformResponse(responseTextOrg, { hideNaData: true })
+ ).toEqual(responseTextHideNa)
+ })
+ })
+
+ describe('time', () => {
+ it('transforms response', () => {
+ expect(transformResponse(responseTimeOrg)).toEqual(responseTime)
+ })
+
+ it('transforms response and hides N/A data', () => {
+ expect(
+ transformResponse(responseTimeOrg, { hideNaData: true })
+ ).toEqual(responseTimeHideNa)
+ })
+ })
+
+ describe('yes only', () => {
+ it('transforms response', () => {
+ expect(transformResponse(responseYesOnlyOrg)).toEqual(
+ responseYesOnly
+ )
+ })
+
+ it('transforms response and hides N/A data', () => {
+ expect(
+ transformResponse(responseYesOnlyOrg, {
+ hideNaData: true,
+ })
+ ).toEqual(responseYesOnlyHideNa)
+ })
+ })
+ })
+})
diff --git a/src/modules/response/event/default.js b/src/modules/response/event/default.js
new file mode 100644
index 000000000..f98e71e67
--- /dev/null
+++ b/src/modules/response/event/default.js
@@ -0,0 +1,82 @@
+import {
+ isBooleanValueType,
+ isNumericValueType,
+ VALUE_TYPE_TEXT,
+} from '../../valueTypes.js'
+import { NA_VALUE, PREFIX_SEPARATOR } from './response.js'
+
+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])
+ : getUnique(values)
+ .slice()
+ .sort((a, b) => a.localeCompare(b))
+
+export const getPrefixedValue = (value, prefix) =>
+ `${prefix}${PREFIX_SEPARATOR}${value}`
+
+export const getItems = (values, dimensionId, { itemFormatter } = {}) =>
+ values.reduce((items, value) => {
+ items[getPrefixedValue(value, dimensionId)] = {
+ name: itemFormatter ? itemFormatter(value) : value,
+ }
+ return items
+ }, {})
+
+export const getDimensions = (values, dimensionId) => ({
+ [dimensionId]: values.map((value) => getPrefixedValue(value, dimensionId)),
+})
+
+export const getRows = (rows, headerIndex, dimensionId) => {
+ let row
+ let value
+
+ return rows.map((r) => {
+ value = r[headerIndex]
+
+ if (value !== NA_VALUE) {
+ row = [...r]
+ row[headerIndex] = getPrefixedValue(row[headerIndex], dimensionId)
+ return row
+ }
+
+ return r
+ })
+}
+
+export const applyDefaultHandler = (
+ response,
+ headerIndex,
+ { itemFormatter } = {}
+) => {
+ const header = response.headers[headerIndex]
+ const uniqueSortedValuesAsc = getValuesUniqueSortedAsc(
+ response.rows
+ .map((row) => row[headerIndex])
+ .filter((value) => value !== NA_VALUE),
+ header.valueType
+ )
+
+ return {
+ ...response,
+ metaData: {
+ ...response.metaData,
+ items: {
+ ...response.metaData.items,
+ ...getItems(uniqueSortedValuesAsc, header.name, {
+ itemFormatter,
+ }),
+ },
+ dimensions: {
+ ...response.metaData.dimensions,
+ ...getDimensions(uniqueSortedValuesAsc, header.name),
+ },
+ },
+ rows: [...getRows(response.rows, headerIndex, header.name)],
+ }
+}
diff --git a/src/modules/response/event/optionSet.js b/src/modules/response/event/optionSet.js
new file mode 100644
index 000000000..34d635d55
--- /dev/null
+++ b/src/modules/response/event/optionSet.js
@@ -0,0 +1,38 @@
+import { NA_VALUE } from './response.js'
+
+export const getOptionCodeIdMap = (optionIds, items) =>
+ optionIds.reduce((map, optionId) => {
+ map[items[optionId].code] = optionId
+ return map
+ }, {})
+
+export const getOptionIdRows = (rows, optionCodeIdMap, headerIndex) => {
+ let value
+ let row
+
+ return rows.map((r) => {
+ value = r[headerIndex]
+
+ if (value !== NA_VALUE) {
+ row = [...r]
+ row[headerIndex] = optionCodeIdMap[value]
+ return row
+ }
+
+ return r
+ })
+}
+
+export const applyOptionSetHandler = (response, headerIndex) => {
+ const header = response.headers[headerIndex]
+ const optionIds = response.metaData.dimensions[header.name]
+ const optionCodeIdMap = getOptionCodeIdMap(
+ optionIds,
+ response.metaData.items
+ )
+
+ return {
+ ...response,
+ rows: getOptionIdRows(response.rows, optionCodeIdMap, headerIndex),
+ }
+}
diff --git a/src/modules/response/event/response.js b/src/modules/response/event/response.js
new file mode 100644
index 000000000..b25f8ad7b
--- /dev/null
+++ b/src/modules/response/event/response.js
@@ -0,0 +1,140 @@
+import i18n from '@dhis2/d2-i18n'
+import {
+ DIMENSION_ID_ORGUNIT,
+ DIMENSION_ID_PERIOD,
+} from '../../predefinedDimensions.js'
+import {
+ VALUE_TYPE_AGE,
+ VALUE_TYPE_BOOLEAN,
+ VALUE_TYPE_COORDINATE,
+ VALUE_TYPE_DATE,
+ VALUE_TYPE_DATETIME,
+ VALUE_TYPE_FILE_RESOURCE,
+ VALUE_TYPE_GEOJSON,
+ VALUE_TYPE_IMAGE,
+ VALUE_TYPE_MULTI_TEXT,
+ VALUE_TYPE_PERCENTAGE,
+ VALUE_TYPE_REFERENCE,
+ VALUE_TYPE_TRUE_ONLY,
+} from '../../valueTypes.js'
+import { applyDefaultHandler } from './default.js'
+import { applyOptionSetHandler } from './optionSet.js'
+
+export const PREFIX_SEPARATOR = '_'
+export const NA_VALUE = ''
+export const NA_VALUE_ITEM = {
+ name: i18n.t('No value'),
+ style: {
+ fontStyle: 'italic',
+ color: '#6C7787',
+ fontFamily: 'monospace',
+ letterSpacing: '-0.3px',
+ },
+}
+
+export const UNSUPPORTED_VALUE_TYPES = [
+ VALUE_TYPE_COORDINATE,
+ VALUE_TYPE_GEOJSON,
+ VALUE_TYPE_FILE_RESOURCE,
+ VALUE_TYPE_IMAGE,
+ VALUE_TYPE_MULTI_TEXT,
+ VALUE_TYPE_REFERENCE,
+]
+
+export const getItemFormatterByValueType = (valueType) => {
+ switch (valueType) {
+ case VALUE_TYPE_AGE:
+ case VALUE_TYPE_DATE:
+ return (name) => name.replace(/ 00:00:00\.0$/, '')
+ case VALUE_TYPE_BOOLEAN:
+ case VALUE_TYPE_TRUE_ONLY:
+ return (name) => (name === '1' ? i18n.t('Yes') : i18n.t('No'))
+ case VALUE_TYPE_DATETIME:
+ return (name) => name.replace(/:00\.0$/, '')
+ case VALUE_TYPE_PERCENTAGE:
+ return (name) => (name.endsWith('.0') ? name.slice(0, -2) : name)
+ default:
+ return undefined
+ }
+}
+
+export const transformResponse = (response, { hideNaData = false } = {}) => {
+ // Do not modify the original response
+ // Rows is mapped by the handlers
+ let transformedResponse = {
+ ...response,
+ metaData: {
+ ...response.metaData,
+ items: {
+ ...response.metaData.items,
+ },
+ dimensions: {
+ ...response.metaData.dimensions,
+ },
+ },
+ }
+
+ // Add index to all headers
+ // Include only headers that are "meta" and skip "pe" and "ou"
+ const metaHeaders = response.headers
+ .map((header, index) => ({
+ ...header,
+ index,
+ }))
+ .filter(
+ (header) =>
+ Boolean(header.meta) &&
+ ![DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT].includes(
+ header.name
+ )
+ )
+
+ // 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
+ metaHeaders.forEach((header) => {
+ if (
+ !(
+ header.legendSet ||
+ UNSUPPORTED_VALUE_TYPES.includes(header.valueType)
+ )
+ ) {
+ if (header.optionSet) {
+ transformedResponse = applyOptionSetHandler(
+ transformedResponse,
+ header.index
+ )
+ } else {
+ transformedResponse = applyDefaultHandler(
+ transformedResponse,
+ header.index,
+ {
+ itemFormatter: getItemFormatterByValueType(
+ header.valueType
+ ),
+ }
+ )
+ }
+ }
+ })
+
+ // Add "No value" dimension item if "Hide NA data" option is disabled
+ // Only add if there is at least one empty value
+ if (!hideNaData) {
+ metaHeaders.forEach((header) => {
+ if (
+ response.rows.map((row) => row[header.index]).includes(NA_VALUE)
+ ) {
+ transformedResponse.metaData.dimensions[header.name] = [
+ ...transformedResponse.metaData.dimensions[header.name],
+ NA_VALUE,
+ ]
+
+ transformedResponse.metaData.items[NA_VALUE] = NA_VALUE_ITEM
+ }
+ })
+ }
+
+ return transformedResponse
+}