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 +}