From 0c44c6360a9ced89110944071b6ac8c0aeceadb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 30 Jun 2025 20:51:44 +0200 Subject: [PATCH 01/50] chore: restructure pivot stories --- .storybook/main.js | 2 +- ...ies.js => PivotTable.aggregate.stories.js} | 76 +- src/__demo__/PivotTable.event.stories.js | 125 ++ .../avgTotalAggregationType.data.json | 0 .../avgTotalAggregationType.metadata.json | 0 ...avgTotalAggregationType.visualization.json | 0 .../data/{ => aggregate}/deep.data.json | 0 .../{ => aggregate}/deep.visualization.json | 0 .../{ => aggregate}/deepWithFilters.data.json | 0 .../deepWithFilters.visualization.json | 0 .../data/{ => aggregate}/degs.data.json | 0 .../data/{ => aggregate}/degs.metadata.json | 0 .../{ => aggregate}/degs.visualization.json | 0 .../{ => aggregate}/diseaseWeeks.data.json | 0 .../diseaseWeeks.metadata.json | 0 .../diseaseWeeks.visualization.json | 0 .../{ => aggregate}/emptyColumns.data.json | 0 .../emptyColumns.metadata.json | 0 .../emptyColumns.visualization.json | 0 .../data/{ => aggregate}/emptyRows.data.json | 0 .../emptyRows.visualization.json | 0 .../data/{ => aggregate}/hierarchy.data.json | 0 .../{ => aggregate}/hierarchy.metadata.json | 0 .../hierarchy.visualization.json | 0 .../{ => aggregate}/lastFiveYears.data.json | 0 .../lastFiveYears.metadata.json | 0 .../lastFiveYears.visualization.json | 0 .../data/{ => aggregate}/narrative.data.json | 0 .../{ => aggregate}/narrative.metadata.json | 0 .../narrative.visualization.json | 0 .../data/{ => aggregate}/simple.data.json | 0 .../data/{ => aggregate}/simple.metadata.json | 0 .../{ => aggregate}/simple.visualization.json | 0 .../target-with-legend.data.json | 0 .../target-with-legend.metadata.json | 0 .../target-with-legend.visualization.json | 0 .../under-above-100.legendSet.json | 0 .../{ => aggregate}/weeklyColumns.data.json | 0 .../weeklyColumns.metadata.json | 0 .../weeklyColumns.visualization.json | 0 .../data/event/numeric-legendset.data.json | 291 +++ .../numeric-legendset.visualization.json | 168 ++ src/__demo__/data/event/numeric.data.json | 1692 +++++++++++++++++ .../data/event/numeric.visualization.json | 165 ++ 44 files changed, 2480 insertions(+), 39 deletions(-) rename src/__demo__/{PivotTable.stories.js => PivotTable.aggregate.stories.js} (91%) create mode 100644 src/__demo__/PivotTable.event.stories.js rename src/__demo__/data/{ => aggregate}/avgTotalAggregationType.data.json (100%) rename src/__demo__/data/{ => aggregate}/avgTotalAggregationType.metadata.json (100%) rename src/__demo__/data/{ => aggregate}/avgTotalAggregationType.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/deep.data.json (100%) rename src/__demo__/data/{ => aggregate}/deep.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/deepWithFilters.data.json (100%) rename src/__demo__/data/{ => aggregate}/deepWithFilters.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/degs.data.json (100%) rename src/__demo__/data/{ => aggregate}/degs.metadata.json (100%) rename src/__demo__/data/{ => aggregate}/degs.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/diseaseWeeks.data.json (100%) rename src/__demo__/data/{ => aggregate}/diseaseWeeks.metadata.json (100%) rename src/__demo__/data/{ => aggregate}/diseaseWeeks.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/emptyColumns.data.json (100%) rename src/__demo__/data/{ => aggregate}/emptyColumns.metadata.json (100%) rename src/__demo__/data/{ => aggregate}/emptyColumns.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/emptyRows.data.json (100%) rename src/__demo__/data/{ => aggregate}/emptyRows.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/hierarchy.data.json (100%) rename src/__demo__/data/{ => aggregate}/hierarchy.metadata.json (100%) rename src/__demo__/data/{ => aggregate}/hierarchy.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/lastFiveYears.data.json (100%) rename src/__demo__/data/{ => aggregate}/lastFiveYears.metadata.json (100%) rename src/__demo__/data/{ => aggregate}/lastFiveYears.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/narrative.data.json (100%) rename src/__demo__/data/{ => aggregate}/narrative.metadata.json (100%) rename src/__demo__/data/{ => aggregate}/narrative.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/simple.data.json (100%) rename src/__demo__/data/{ => aggregate}/simple.metadata.json (100%) rename src/__demo__/data/{ => aggregate}/simple.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/target-with-legend.data.json (100%) rename src/__demo__/data/{ => aggregate}/target-with-legend.metadata.json (100%) rename src/__demo__/data/{ => aggregate}/target-with-legend.visualization.json (100%) rename src/__demo__/data/{ => aggregate}/under-above-100.legendSet.json (100%) rename src/__demo__/data/{ => aggregate}/weeklyColumns.data.json (100%) rename src/__demo__/data/{ => aggregate}/weeklyColumns.metadata.json (100%) rename src/__demo__/data/{ => aggregate}/weeklyColumns.visualization.json (100%) create mode 100644 src/__demo__/data/event/numeric-legendset.data.json create mode 100644 src/__demo__/data/event/numeric-legendset.visualization.json create mode 100644 src/__demo__/data/event/numeric.data.json create mode 100644 src/__demo__/data/event/numeric.visualization.json 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/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..2b4a35ad3 --- /dev/null +++ b/src/__demo__/PivotTable.event.stories.js @@ -0,0 +1,125 @@ +import { Checkbox, Divider } from '@dhis2/ui' +import React, { useState } from 'react' +import { PivotTable } from '../index.js' +import numericLegendsetData from './data/event/numeric-legendset.data.json' +import numericLegendsetVisualization from './data/event/numeric-legendset.visualization.json' +import numericData from './data/event/numeric.data.json' +import numericVisualization from './data/event/numeric.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 enrollment)', + decorators: [PivotTableOptionsWrapper], +} + + +const getNumericItems = (rows, index) => [...new Set(rows.map(r => r[index]))].sort((a, b) => Number(a) - Number(b)); + +const getItemMetadata = items => items.reduce((md, item) => { + md[item] = { + name: item + } + return md +}, {}) + +const collectAndAddMetadata = (data, index) => { + const modifiedData = { + ...data + } + + const headerId = data.headers[index].name + + // collect values and use as items + const numericItems = getNumericItems(modifiedData.rows, index) + modifiedData.metaData.dimensions[headerId] = numericItems + + // add metadata for numeric items + modifiedData.metaData.items = { + ...modifiedData.metaData.items, + ...getItemMetadata(numericItems) + } + + return modifiedData +} + +export const NumericLegendset = (_, { pivotTableOptions }) => { + const visualization = { + ...numericLegendsetVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + return ( +
+ +
+ ) +} + +NumericLegendset.story = { + name: 'Numeric with legendset', +} + +export const Numeric = (_, { pivotTableOptions }) => { + const visualization = { + ...numericVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +NumericLegendset.story = { + name: 'Numeric with legendset', +} \ No newline at end of file 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/numeric-legendset.data.json b/src/__demo__/data/event/numeric-legendset.data.json new file mode 100644 index 000000000..080769a24 --- /dev/null +++ b/src/__demo__/data/event/numeric-legendset.data.json @@ -0,0 +1,291 @@ +{ + "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" + ] + ], + "height": 27, + "headerWidth": 4 +} \ No newline at end of file diff --git a/src/__demo__/data/event/numeric-legendset.visualization.json b/src/__demo__/data/event/numeric-legendset.visualization.json new file mode 100644 index 000000000..a761711a7 --- /dev/null +++ b/src/__demo__/data/event/numeric-legendset.visualization.json @@ -0,0 +1,168 @@ +{ + "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": [] +} \ No newline at end of file diff --git a/src/__demo__/data/event/numeric.data.json b/src/__demo__/data/event/numeric.data.json new file mode 100644 index 000000000..a614a49e2 --- /dev/null +++ b/src/__demo__/data/event/numeric.data.json @@ -0,0 +1,1692 @@ +{ + "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" + ], + "Zj7UnCAulEk.qrur9Dvnyt5": [], + "ou": [ + "ImspTQPwCqd" + ] + } + }, + "rowContext": {}, + "width": 4, + "rows": [ + [ + "26", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "84", + "ImspTQPwCqd", + "202503", + "70" + ], + [ + "25", + "ImspTQPwCqd", + "202504", + "46" + ], + [ + "81", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "13", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "57", + "ImspTQPwCqd", + "202503", + "48" + ], + [ + "24", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "8", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "80", + "ImspTQPwCqd", + "202504", + "47" + ], + [ + "3", + "ImspTQPwCqd", + "202505", + "67" + ], + [ + "14", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "67", + "ImspTQPwCqd", + "202504", + "45" + ], + [ + "74", + "ImspTQPwCqd", + "202503", + "48" + ], + [ + "83", + "ImspTQPwCqd", + "202504", + "42" + ], + [ + "0", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "5", + "ImspTQPwCqd", + "202503", + "70" + ], + [ + "52", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "54", + "ImspTQPwCqd", + "202503", + "57" + ], + [ + "44", + "ImspTQPwCqd", + "202504", + "43" + ], + [ + "10", + "ImspTQPwCqd", + "202505", + "61" + ], + [ + "42", + "ImspTQPwCqd", + "202503", + "46" + ], + [ + "15", + "ImspTQPwCqd", + "202504", + "64" + ], + [ + "26", + "ImspTQPwCqd", + "202505", + "45" + ], + [ + "62", + "ImspTQPwCqd", + "202503", + "57" + ], + [ + "78", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "80", + "ImspTQPwCqd", + "202503", + "62" + ], + [ + "7", + "ImspTQPwCqd", + "202505", + "52" + ], + [ + "39", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "71", + "ImspTQPwCqd", + "202505", + "44" + ], + [ + "71", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "44", + "ImspTQPwCqd", + "202503", + "57" + ], + [ + "34", + "ImspTQPwCqd", + "202503", + "40" + ], + [ + "88", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "56", + "ImspTQPwCqd", + "202503", + "44" + ], + [ + "41", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "59", + "ImspTQPwCqd", + "202505", + "48" + ], + [ + "61", + "ImspTQPwCqd", + "202504", + "52" + ], + [ + "28", + "ImspTQPwCqd", + "202505", + "52" + ], + [ + "9", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "16", + "ImspTQPwCqd", + "202505", + "46" + ], + [ + "80", + "ImspTQPwCqd", + "202505", + "37" + ], + [ + "67", + "ImspTQPwCqd", + "202503", + "35" + ], + [ + "63", + "ImspTQPwCqd", + "202504", + "35" + ], + [ + "6", + "ImspTQPwCqd", + "202505", + "65" + ], + [ + "28", + "ImspTQPwCqd", + "202503", + "44" + ], + [ + "68", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "72", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "47", + "ImspTQPwCqd", + "202503", + "45" + ], + [ + "13", + "ImspTQPwCqd", + "202504", + "51" + ], + [ + "56", + "ImspTQPwCqd", + "202505", + "51" + ], + [ + "66", + "ImspTQPwCqd", + "202504", + "43" + ], + [ + "75", + "ImspTQPwCqd", + "202505", + "51" + ], + [ + "82", + "ImspTQPwCqd", + "202505", + "49" + ], + [ + "16", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "56", + "ImspTQPwCqd", + "202504", + "30" + ], + [ + "31", + "ImspTQPwCqd", + "202504", + "50" + ], + [ + "52", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "34", + "ImspTQPwCqd", + "202504", + "50" + ], + [ + "30", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "20", + "ImspTQPwCqd", + "202503", + "49" + ], + [ + "76", + "ImspTQPwCqd", + "202503", + "49" + ], + [ + "63", + "ImspTQPwCqd", + "202503", + "49" + ], + [ + "29", + "ImspTQPwCqd", + "202505", + "53" + ], + [ + "20", + "ImspTQPwCqd", + "202505", + "43" + ], + [ + "12", + "ImspTQPwCqd", + "202505", + "48" + ], + [ + "63", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "42", + "ImspTQPwCqd", + "202504", + "42" + ], + [ + "64", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "9", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "12", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "19", + "ImspTQPwCqd", + "202504", + "50" + ], + [ + "76", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "17", + "ImspTQPwCqd", + "202505", + "42" + ], + [ + "21", + "ImspTQPwCqd", + "202504", + "51" + ], + [ + "50", + "ImspTQPwCqd", + "202504", + "63" + ], + [ + "6", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "83", + "ImspTQPwCqd", + "202505", + "56" + ], + [ + "31", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "88", + "ImspTQPwCqd", + "202503", + "45" + ], + [ + "36", + "ImspTQPwCqd", + "202505", + "52" + ], + [ + "61", + "ImspTQPwCqd", + "202503", + "45" + ], + [ + "51", + "ImspTQPwCqd", + "202505", + "62" + ], + [ + "76", + "ImspTQPwCqd", + "202505", + "42" + ], + [ + "2", + "ImspTQPwCqd", + "202504", + "45" + ], + [ + "53", + "ImspTQPwCqd", + "202504", + "41" + ], + [ + "43", + "ImspTQPwCqd", + "202504", + "41" + ], + [ + "10", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "2", + "ImspTQPwCqd", + "202505", + "51" + ], + [ + "70", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "46", + "ImspTQPwCqd", + "202505", + "51" + ], + [ + "36", + "ImspTQPwCqd", + "202503", + "54" + ], + [ + "86", + "ImspTQPwCqd", + "202503", + "61" + ], + [ + "19", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "23", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "35", + "ImspTQPwCqd", + "202503", + "65" + ], + [ + "70", + "ImspTQPwCqd", + "202505", + "38" + ], + [ + "3", + "ImspTQPwCqd", + "202504", + "38" + ], + [ + "79", + "ImspTQPwCqd", + "202504", + "52" + ], + [ + "33", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "43", + "ImspTQPwCqd", + "202503", + "46" + ], + [ + "19", + "ImspTQPwCqd", + "202505", + "37" + ], + [ + "35", + "ImspTQPwCqd", + "202504", + "46" + ], + [ + "2", + "ImspTQPwCqd", + "202503", + "41" + ], + [ + "54", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "51", + "ImspTQPwCqd", + "202504", + "56" + ], + [ + "50", + "ImspTQPwCqd", + "202505", + "57" + ], + [ + "22", + "ImspTQPwCqd", + "202503", + "60" + ], + [ + "46", + "ImspTQPwCqd", + "202504", + "61" + ], + [ + "8", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "61", + "ImspTQPwCqd", + "202505", + "60" + ], + [ + "39", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "48", + "ImspTQPwCqd", + "202505", + "44" + ], + [ + "64", + "ImspTQPwCqd", + "202503", + "58" + ], + [ + "65", + "ImspTQPwCqd", + "202504", + "47" + ], + [ + "7", + "ImspTQPwCqd", + "202504", + "40" + ], + [ + "60", + "ImspTQPwCqd", + "202504", + "38" + ], + [ + "38", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "33", + "ImspTQPwCqd", + "202504", + "41" + ], + [ + "52", + "ImspTQPwCqd", + "202505", + "48" + ], + [ + "29", + "ImspTQPwCqd", + "202504", + "42" + ], + [ + "11", + "ImspTQPwCqd", + "202504", + "45" + ], + [ + "72", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "29", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "32", + "ImspTQPwCqd", + "202504", + "64" + ], + [ + "15", + "ImspTQPwCqd", + "202503", + "54" + ], + [ + "55", + "ImspTQPwCqd", + "202504", + "63" + ], + [ + "21", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "60", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "86", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "30", + "ImspTQPwCqd", + "202504", + "64" + ], + [ + "48", + "ImspTQPwCqd", + "202503", + "58" + ], + [ + "26", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "33", + "ImspTQPwCqd", + "202505", + "43" + ], + [ + "60", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "69", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "34", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "15", + "ImspTQPwCqd", + "202505", + "44" + ], + [ + "71", + "ImspTQPwCqd", + "202503", + "48" + ], + [ + "66", + "ImspTQPwCqd", + "202503", + "57" + ], + [ + "72", + "ImspTQPwCqd", + "202505", + "47" + ], + [ + "24", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "77", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "40", + "ImspTQPwCqd", + "202503", + "56" + ], + [ + "38", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "44", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "67", + "ImspTQPwCqd", + "202505", + "49" + ], + [ + "83", + "ImspTQPwCqd", + "202503", + "39" + ], + [ + "69", + "ImspTQPwCqd", + "202504", + "36" + ], + [ + "49", + "ImspTQPwCqd", + "202503", + "46" + ], + [ + "37", + "ImspTQPwCqd", + "202503", + "60" + ], + [ + "87", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "45", + "ImspTQPwCqd", + "202504", + "58" + ], + [ + "4", + "ImspTQPwCqd", + "202505", + "41" + ], + [ + "4", + "ImspTQPwCqd", + "202504", + "42" + ], + [ + "81", + "ImspTQPwCqd", + "202504", + "51" + ], + [ + "82", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "40", + "ImspTQPwCqd", + "202504", + "51" + ], + [ + "85", + "ImspTQPwCqd", + "202503", + "43" + ], + [ + "16", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "9", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "17", + "ImspTQPwCqd", + "202503", + "45" + ], + [ + "45", + "ImspTQPwCqd", + "202505", + "45" + ], + [ + "55", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "57", + "ImspTQPwCqd", + "202505", + "45" + ], + [ + "73", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "0", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "58", + "ImspTQPwCqd", + "202503", + "56" + ], + [ + "49", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "11", + "ImspTQPwCqd", + "202505", + "57" + ], + [ + "54", + "ImspTQPwCqd", + "202504", + "34" + ], + [ + "53", + "ImspTQPwCqd", + "202505", + "38" + ], + [ + "53", + "ImspTQPwCqd", + "202503", + "41" + ], + [ + "84", + "ImspTQPwCqd", + "202505", + "47" + ], + [ + "57", + "ImspTQPwCqd", + "202504", + "35" + ], + [ + "17", + "ImspTQPwCqd", + "202504", + "51" + ], + [ + "59", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "18", + "ImspTQPwCqd", + "202504", + "52" + ], + [ + "68", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "74", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "65", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "59", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "62", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "78", + "ImspTQPwCqd", + "202503", + "41" + ], + [ + "84", + "ImspTQPwCqd", + "202504", + "62" + ], + [ + "47", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "11", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "65", + "ImspTQPwCqd", + "202503", + "60" + ], + [ + "46", + "ImspTQPwCqd", + "202503", + "59" + ], + [ + "25", + "ImspTQPwCqd", + "202503", + "56" + ], + [ + "87", + "ImspTQPwCqd", + "202505", + "49" + ], + [ + "38", + "ImspTQPwCqd", + "202504", + "52" + ], + [ + "8", + "ImspTQPwCqd", + "202505", + "43" + ], + [ + "14", + "ImspTQPwCqd", + "202505", + "58" + ], + [ + "18", + "ImspTQPwCqd", + "202505", + "47" + ], + [ + "31", + "ImspTQPwCqd", + "202505", + "46" + ], + [ + "41", + "ImspTQPwCqd", + "202505", + "45" + ], + [ + "70", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "22", + "ImspTQPwCqd", + "202504", + "40" + ], + [ + "87", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "5", + "ImspTQPwCqd", + "202504", + "63" + ], + [ + "6", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "30", + "ImspTQPwCqd", + "202503", + "36" + ], + [ + "23", + "ImspTQPwCqd", + "202505", + "44" + ], + [ + "45", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "27", + "ImspTQPwCqd", + "202505", + "61" + ], + [ + "4", + "ImspTQPwCqd", + "202503", + "54" + ], + [ + "25", + "ImspTQPwCqd", + "202505", + "62" + ], + [ + "66", + "ImspTQPwCqd", + "202505", + "41" + ], + [ + "55", + "ImspTQPwCqd", + "202503", + "46" + ], + [ + "64", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "28", + "ImspTQPwCqd", + "202504", + "62" + ], + [ + "68", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "37", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "21", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "75", + "ImspTQPwCqd", + "202504", + "45" + ], + [ + "39", + "ImspTQPwCqd", + "202505", + "53" + ], + [ + "40", + "ImspTQPwCqd", + "202505", + "60" + ], + [ + "10", + "ImspTQPwCqd", + "202504", + "46" + ], + [ + "85", + "ImspTQPwCqd", + "202505", + "58" + ], + [ + "1", + "ImspTQPwCqd", + "202503", + "44" + ], + [ + "79", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "7", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "5", + "ImspTQPwCqd", + "202505", + "46" + ], + [ + "75", + "ImspTQPwCqd", + "202503", + "36" + ], + [ + "51", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "81", + "ImspTQPwCqd", + "202505", + "37" + ], + [ + "18", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "24", + "ImspTQPwCqd", + "202505", + "47" + ], + [ + "32", + "ImspTQPwCqd", + "202505", + "61" + ], + [ + "78", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "62", + "ImspTQPwCqd", + "202505", + "53" + ], + [ + "42", + "ImspTQPwCqd", + "202505", + "59" + ], + [ + "77", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "49", + "ImspTQPwCqd", + "202505", + "45" + ], + [ + "0", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "20", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "37", + "ImspTQPwCqd", + "202505", + "31" + ], + [ + "79", + "ImspTQPwCqd", + "202505", + "46" + ], + [ + "22", + "ImspTQPwCqd", + "202505", + "59" + ], + [ + "58", + "ImspTQPwCqd", + "202504", + "63" + ], + [ + "74", + "ImspTQPwCqd", + "202504", + "40" + ], + [ + "82", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "41", + "ImspTQPwCqd", + "202503", + "62" + ], + [ + "32", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "85", + "ImspTQPwCqd", + "202504", + "32" + ], + [ + "50", + "ImspTQPwCqd", + "202503", + "63" + ], + [ + "35", + "ImspTQPwCqd", + "202505", + "40" + ], + [ + "27", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "69", + "ImspTQPwCqd", + "202505", + "49" + ], + [ + "88", + "ImspTQPwCqd", + "202504", + "52" + ], + [ + "23", + "ImspTQPwCqd", + "202503", + "48" + ], + [ + "73", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "1", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "1", + "ImspTQPwCqd", + "202505", + "53" + ], + [ + "86", + "ImspTQPwCqd", + "202505", + "43" + ], + [ + "47", + "ImspTQPwCqd", + "202505", + "66" + ], + [ + "14", + "ImspTQPwCqd", + "202504", + "38" + ], + [ + "73", + "ImspTQPwCqd", + "202504", + "59" + ], + [ + "43", + "ImspTQPwCqd", + "202505", + "49" + ], + [ + "77", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "13", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "12", + "ImspTQPwCqd", + "202503", + "63" + ], + [ + "48", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "3", + "ImspTQPwCqd", + "202503", + "56" + ], + [ + "36", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "27", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "58", + "ImspTQPwCqd", + "202505", + "48" + ] + ], + "height": 267, + "headerWidth": 4 +} \ No newline at end of file diff --git a/src/__demo__/data/event/numeric.visualization.json b/src/__demo__/data/event/numeric.visualization.json new file mode 100644 index 000000000..23fb1a27c --- /dev/null +++ b/src/__demo__/data/event/numeric.visualization.json @@ -0,0 +1,165 @@ +{ + "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": [], + "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": [] +} \ No newline at end of file From bb8d99ac2169937d9641819469a51ce816c61bbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 2 Jul 2025 12:20:53 +0200 Subject: [PATCH 02/50] chore: add numeric story --- src/__demo__/PivotTable.event.stories.js | 32 +- src/__demo__/data/event/numeric.data.json | 893 +++++++++++++++------- 2 files changed, 626 insertions(+), 299 deletions(-) diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 2b4a35ad3..3efc2b23b 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -59,36 +59,6 @@ export default { decorators: [PivotTableOptionsWrapper], } - -const getNumericItems = (rows, index) => [...new Set(rows.map(r => r[index]))].sort((a, b) => Number(a) - Number(b)); - -const getItemMetadata = items => items.reduce((md, item) => { - md[item] = { - name: item - } - return md -}, {}) - -const collectAndAddMetadata = (data, index) => { - const modifiedData = { - ...data - } - - const headerId = data.headers[index].name - - // collect values and use as items - const numericItems = getNumericItems(modifiedData.rows, index) - modifiedData.metaData.dimensions[headerId] = numericItems - - // add metadata for numeric items - modifiedData.metaData.items = { - ...modifiedData.metaData.items, - ...getItemMetadata(numericItems) - } - - return modifiedData -} - export const NumericLegendset = (_, { pivotTableOptions }) => { const visualization = { ...numericLegendsetVisualization, @@ -115,7 +85,7 @@ export const Numeric = (_, { pivotTableOptions }) => { return (
- +
) } diff --git a/src/__demo__/data/event/numeric.data.json b/src/__demo__/data/event/numeric.data.json index a614a49e2..bccd57a77 100644 --- a/src/__demo__/data/event/numeric.data.json +++ b/src/__demo__/data/event/numeric.data.json @@ -67,6 +67,273 @@ }, "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" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:11": { + "name": "11" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:12": { + "name": "12" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:13": { + "name": "13" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:14": { + "name": "14" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:15": { + "name": "15" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:16": { + "name": "16" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:17": { + "name": "17" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:18": { + "name": "18" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:19": { + "name": "19" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:20": { + "name": "20" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:21": { + "name": "21" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:22": { + "name": "22" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:23": { + "name": "23" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:24": { + "name": "24" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:25": { + "name": "25" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:26": { + "name": "26" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:27": { + "name": "27" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:28": { + "name": "28" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:29": { + "name": "29" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:30": { + "name": "30" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:31": { + "name": "31" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:32": { + "name": "32" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:33": { + "name": "33" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:34": { + "name": "34" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:35": { + "name": "35" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:36": { + "name": "36" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:37": { + "name": "37" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:38": { + "name": "38" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:39": { + "name": "39" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:40": { + "name": "40" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:41": { + "name": "41" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:42": { + "name": "42" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:43": { + "name": "43" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:44": { + "name": "44" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:45": { + "name": "45" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:46": { + "name": "46" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:47": { + "name": "47" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:48": { + "name": "48" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:49": { + "name": "49" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:50": { + "name": "50" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:51": { + "name": "51" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:52": { + "name": "52" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:53": { + "name": "53" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:54": { + "name": "54" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:55": { + "name": "55" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:56": { + "name": "56" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:57": { + "name": "57" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:58": { + "name": "58" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:59": { + "name": "59" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:60": { + "name": "60" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:61": { + "name": "61" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:62": { + "name": "62" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:63": { + "name": "63" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:64": { + "name": "64" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:65": { + "name": "65" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:66": { + "name": "66" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:67": { + "name": "67" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:68": { + "name": "68" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:69": { + "name": "69" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:70": { + "name": "70" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:71": { + "name": "71" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:72": { + "name": "72" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:73": { + "name": "73" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:74": { + "name": "74" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:75": { + "name": "75" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:76": { + "name": "76" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:77": { + "name": "77" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:78": { + "name": "78" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:79": { + "name": "79" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:80": { + "name": "80" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:81": { + "name": "81" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:82": { + "name": "82" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:83": { + "name": "83" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:84": { + "name": "84" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:85": { + "name": "85" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:86": { + "name": "86" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:87": { + "name": "87" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:88": { + "name": "88" } }, "dimensions": { @@ -75,7 +342,97 @@ "202504", "202505" ], - "Zj7UnCAulEk.qrur9Dvnyt5": [], + "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", + "Zj7UnCAulEk.qrur9Dvnyt5:11", + "Zj7UnCAulEk.qrur9Dvnyt5:12", + "Zj7UnCAulEk.qrur9Dvnyt5:13", + "Zj7UnCAulEk.qrur9Dvnyt5:14", + "Zj7UnCAulEk.qrur9Dvnyt5:15", + "Zj7UnCAulEk.qrur9Dvnyt5:16", + "Zj7UnCAulEk.qrur9Dvnyt5:17", + "Zj7UnCAulEk.qrur9Dvnyt5:18", + "Zj7UnCAulEk.qrur9Dvnyt5:19", + "Zj7UnCAulEk.qrur9Dvnyt5:20", + "Zj7UnCAulEk.qrur9Dvnyt5:21", + "Zj7UnCAulEk.qrur9Dvnyt5:22", + "Zj7UnCAulEk.qrur9Dvnyt5:23", + "Zj7UnCAulEk.qrur9Dvnyt5:24", + "Zj7UnCAulEk.qrur9Dvnyt5:25", + "Zj7UnCAulEk.qrur9Dvnyt5:26", + "Zj7UnCAulEk.qrur9Dvnyt5:27", + "Zj7UnCAulEk.qrur9Dvnyt5:28", + "Zj7UnCAulEk.qrur9Dvnyt5:29", + "Zj7UnCAulEk.qrur9Dvnyt5:30", + "Zj7UnCAulEk.qrur9Dvnyt5:31", + "Zj7UnCAulEk.qrur9Dvnyt5:32", + "Zj7UnCAulEk.qrur9Dvnyt5:33", + "Zj7UnCAulEk.qrur9Dvnyt5:34", + "Zj7UnCAulEk.qrur9Dvnyt5:35", + "Zj7UnCAulEk.qrur9Dvnyt5:36", + "Zj7UnCAulEk.qrur9Dvnyt5:37", + "Zj7UnCAulEk.qrur9Dvnyt5:38", + "Zj7UnCAulEk.qrur9Dvnyt5:39", + "Zj7UnCAulEk.qrur9Dvnyt5:40", + "Zj7UnCAulEk.qrur9Dvnyt5:41", + "Zj7UnCAulEk.qrur9Dvnyt5:42", + "Zj7UnCAulEk.qrur9Dvnyt5:43", + "Zj7UnCAulEk.qrur9Dvnyt5:44", + "Zj7UnCAulEk.qrur9Dvnyt5:45", + "Zj7UnCAulEk.qrur9Dvnyt5:46", + "Zj7UnCAulEk.qrur9Dvnyt5:47", + "Zj7UnCAulEk.qrur9Dvnyt5:48", + "Zj7UnCAulEk.qrur9Dvnyt5:49", + "Zj7UnCAulEk.qrur9Dvnyt5:50", + "Zj7UnCAulEk.qrur9Dvnyt5:51", + "Zj7UnCAulEk.qrur9Dvnyt5:52", + "Zj7UnCAulEk.qrur9Dvnyt5:53", + "Zj7UnCAulEk.qrur9Dvnyt5:54", + "Zj7UnCAulEk.qrur9Dvnyt5:55", + "Zj7UnCAulEk.qrur9Dvnyt5:56", + "Zj7UnCAulEk.qrur9Dvnyt5:57", + "Zj7UnCAulEk.qrur9Dvnyt5:58", + "Zj7UnCAulEk.qrur9Dvnyt5:59", + "Zj7UnCAulEk.qrur9Dvnyt5:60", + "Zj7UnCAulEk.qrur9Dvnyt5:61", + "Zj7UnCAulEk.qrur9Dvnyt5:62", + "Zj7UnCAulEk.qrur9Dvnyt5:63", + "Zj7UnCAulEk.qrur9Dvnyt5:64", + "Zj7UnCAulEk.qrur9Dvnyt5:65", + "Zj7UnCAulEk.qrur9Dvnyt5:66", + "Zj7UnCAulEk.qrur9Dvnyt5:67", + "Zj7UnCAulEk.qrur9Dvnyt5:68", + "Zj7UnCAulEk.qrur9Dvnyt5:69", + "Zj7UnCAulEk.qrur9Dvnyt5:70", + "Zj7UnCAulEk.qrur9Dvnyt5:71", + "Zj7UnCAulEk.qrur9Dvnyt5:72", + "Zj7UnCAulEk.qrur9Dvnyt5:73", + "Zj7UnCAulEk.qrur9Dvnyt5:74", + "Zj7UnCAulEk.qrur9Dvnyt5:75", + "Zj7UnCAulEk.qrur9Dvnyt5:76", + "Zj7UnCAulEk.qrur9Dvnyt5:77", + "Zj7UnCAulEk.qrur9Dvnyt5:78", + "Zj7UnCAulEk.qrur9Dvnyt5:79", + "Zj7UnCAulEk.qrur9Dvnyt5:80", + "Zj7UnCAulEk.qrur9Dvnyt5:81", + "Zj7UnCAulEk.qrur9Dvnyt5:82", + "Zj7UnCAulEk.qrur9Dvnyt5:83", + "Zj7UnCAulEk.qrur9Dvnyt5:84", + "Zj7UnCAulEk.qrur9Dvnyt5:85", + "Zj7UnCAulEk.qrur9Dvnyt5:86", + "Zj7UnCAulEk.qrur9Dvnyt5:87", + "Zj7UnCAulEk.qrur9Dvnyt5:88" + ], "ou": [ "ImspTQPwCqd" ] @@ -85,1603 +442,1603 @@ "width": 4, "rows": [ [ - "26", + "Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202503", "51" ], [ - "84", + "Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202503", "70" ], [ - "25", + "Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202504", "46" ], [ - "81", + "Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202503", "53" ], [ - "13", + "Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202505", "55" ], [ - "57", + "Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202503", "48" ], [ - "24", + "Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202504", "48" ], [ - "8", + "Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202503", "47" ], [ - "80", + "Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202504", "47" ], [ - "3", + "Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202505", "67" ], [ - "14", + "Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202503", "55" ], [ - "67", + "Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202504", "45" ], [ - "74", + "Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202503", "48" ], [ - "83", + "Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202504", "42" ], [ - "0", + "Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202503", "55" ], [ - "5", + "Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202503", "70" ], [ - "52", + "Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202503", "53" ], [ - "54", + "Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202503", "57" ], [ - "44", + "Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202504", "43" ], [ - "10", + "Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202505", "61" ], [ - "42", + "Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202503", "46" ], [ - "15", + "Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202504", "64" ], [ - "26", + "Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202505", "45" ], [ - "62", + "Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202503", "57" ], [ - "78", + "Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202505", "54" ], [ - "80", + "Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202503", "62" ], [ - "7", + "Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202505", "52" ], [ - "39", + "Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202504", "53" ], [ - "71", + "Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202505", "44" ], [ - "71", + "Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202504", "53" ], [ - "44", + "Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202503", "57" ], [ - "34", + "Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202503", "40" ], [ - "88", + "Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202505", "54" ], [ - "56", + "Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202503", "44" ], [ - "41", + "Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202504", "53" ], [ - "59", + "Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202505", "48" ], [ - "61", + "Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202504", "52" ], [ - "28", + "Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202505", "52" ], [ - "9", + "Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202504", "54" ], [ - "16", + "Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202505", "46" ], [ - "80", + "Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202505", "37" ], [ - "67", + "Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202503", "35" ], [ - "63", + "Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202504", "35" ], [ - "6", + "Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202505", "65" ], [ - "28", + "Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202503", "44" ], [ - "68", + "Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202505", "50" ], [ - "72", + "Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202503", "47" ], [ - "47", + "Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202503", "45" ], [ - "13", + "Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202504", "51" ], [ - "56", + "Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202505", "51" ], [ - "66", + "Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202504", "43" ], [ - "75", + "Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202505", "51" ], [ - "82", + "Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202505", "49" ], [ - "16", + "Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202504", "44" ], [ - "56", + "Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202504", "30" ], [ - "31", + "Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202504", "50" ], [ - "52", + "Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202504", "54" ], [ - "34", + "Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202504", "50" ], [ - "30", + "Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202505", "55" ], [ - "20", + "Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202503", "49" ], [ - "76", + "Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202503", "49" ], [ - "63", + "Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202503", "49" ], [ - "29", + "Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202505", "53" ], [ - "20", + "Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202505", "43" ], [ - "12", + "Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202505", "48" ], [ - "63", + "Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202505", "55" ], [ - "42", + "Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202504", "42" ], [ - "64", + "Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202505", "54" ], [ - "9", + "Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202505", "54" ], [ - "12", + "Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202504", "49" ], [ - "19", + "Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202504", "50" ], [ - "76", + "Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202504", "48" ], [ - "17", + "Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202505", "42" ], [ - "21", + "Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202504", "51" ], [ - "50", + "Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202504", "63" ], [ - "6", + "Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202503", "53" ], [ - "83", + "Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202505", "56" ], [ - "31", + "Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202503", "55" ], [ - "88", + "Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202503", "45" ], [ - "36", + "Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202505", "52" ], [ - "61", + "Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202503", "45" ], [ - "51", + "Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202505", "62" ], [ - "76", + "Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202505", "42" ], [ - "2", + "Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202504", "45" ], [ - "53", + "Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202504", "41" ], [ - "43", + "Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202504", "41" ], [ - "10", + "Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202503", "51" ], [ - "2", + "Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202505", "51" ], [ - "70", + "Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202503", "50" ], [ - "46", + "Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202505", "51" ], [ - "36", + "Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202503", "54" ], [ - "86", + "Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202503", "61" ], [ - "19", + "Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202503", "51" ], [ - "23", + "Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202504", "55" ], [ - "35", + "Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202503", "65" ], [ - "70", + "Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202505", "38" ], [ - "3", + "Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202504", "38" ], [ - "79", + "Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202504", "52" ], [ - "33", + "Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202503", "55" ], [ - "43", + "Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202503", "46" ], [ - "19", + "Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202505", "37" ], [ - "35", + "Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202504", "46" ], [ - "2", + "Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202503", "41" ], [ - "54", + "Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202505", "55" ], [ - "51", + "Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202504", "56" ], [ - "50", + "Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202505", "57" ], [ - "22", + "Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202503", "60" ], [ - "46", + "Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202504", "61" ], [ - "8", + "Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202504", "44" ], [ - "61", + "Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202505", "60" ], [ - "39", + "Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202503", "52" ], [ - "48", + "Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202505", "44" ], [ - "64", + "Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202503", "58" ], [ - "65", + "Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202504", "47" ], [ - "7", + "Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202504", "40" ], [ - "60", + "Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202504", "38" ], [ - "38", + "Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202503", "50" ], [ - "33", + "Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202504", "41" ], [ - "52", + "Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202505", "48" ], [ - "29", + "Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202504", "42" ], [ - "11", + "Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202504", "45" ], [ - "72", + "Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202504", "44" ], [ - "29", + "Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202503", "52" ], [ - "32", + "Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202504", "64" ], [ - "15", + "Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202503", "54" ], [ - "55", + "Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202504", "63" ], [ - "21", + "Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202505", "54" ], [ - "60", + "Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202505", "50" ], [ - "86", + "Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202504", "55" ], [ - "30", + "Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202504", "64" ], [ - "48", + "Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202503", "58" ], [ - "26", + "Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202504", "54" ], [ - "33", + "Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202505", "43" ], [ - "60", + "Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202503", "47" ], [ - "69", + "Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202503", "53" ], [ - "34", + "Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202505", "50" ], [ - "15", + "Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202505", "44" ], [ - "71", + "Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202503", "48" ], [ - "66", + "Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202503", "57" ], [ - "72", + "Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202505", "47" ], [ - "24", + "Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202503", "52" ], [ - "77", + "Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202504", "53" ], [ - "40", + "Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202503", "56" ], [ - "38", + "Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202505", "55" ], [ - "44", + "Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202505", "50" ], [ - "67", + "Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202505", "49" ], [ - "83", + "Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202503", "39" ], [ - "69", + "Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202504", "36" ], [ - "49", + "Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202503", "46" ], [ - "37", + "Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202503", "60" ], [ - "87", + "Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202503", "51" ], [ - "45", + "Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202504", "58" ], [ - "4", + "Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202505", "41" ], [ - "4", + "Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202504", "42" ], [ - "81", + "Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202504", "51" ], [ - "82", + "Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202504", "54" ], [ - "40", + "Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202504", "51" ], [ - "85", + "Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202503", "43" ], [ - "16", + "Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202503", "51" ], [ - "9", + "Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202503", "52" ], [ - "17", + "Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202503", "45" ], [ - "45", + "Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202505", "45" ], [ - "55", + "Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202505", "50" ], [ - "57", + "Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202505", "45" ], [ - "73", + "Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202503", "51" ], [ - "0", + "Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202504", "55" ], [ - "58", + "Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202503", "56" ], [ - "49", + "Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202504", "48" ], [ - "11", + "Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202505", "57" ], [ - "54", + "Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202504", "34" ], [ - "53", + "Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202505", "38" ], [ - "53", + "Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202503", "41" ], [ - "84", + "Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202505", "47" ], [ - "57", + "Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202504", "35" ], [ - "17", + "Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202504", "51" ], [ - "59", + "Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202504", "44" ], [ - "18", + "Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202504", "52" ], [ - "68", + "Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202503", "55" ], [ - "74", + "Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202505", "55" ], [ - "65", + "Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202505", "50" ], [ - "59", + "Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202503", "50" ], [ - "62", + "Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202504", "49" ], [ - "78", + "Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202503", "41" ], [ - "84", + "Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202504", "62" ], [ - "47", + "Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202504", "54" ], [ - "11", + "Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202503", "53" ], [ - "65", + "Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202503", "60" ], [ - "46", + "Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202503", "59" ], [ - "25", + "Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202503", "56" ], [ - "87", + "Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202505", "49" ], [ - "38", + "Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202504", "52" ], [ - "8", + "Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202505", "43" ], [ - "14", + "Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202505", "58" ], [ - "18", + "Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202505", "47" ], [ - "31", + "Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202505", "46" ], [ - "41", + "Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202505", "45" ], [ - "70", + "Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202504", "49" ], [ - "22", + "Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202504", "40" ], [ - "87", + "Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202504", "48" ], [ - "5", + "Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202504", "63" ], [ - "6", + "Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202504", "53" ], [ - "30", + "Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202503", "36" ], [ - "23", + "Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202505", "44" ], [ - "45", + "Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202503", "51" ], [ - "27", + "Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202505", "61" ], [ - "4", + "Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202503", "54" ], [ - "25", + "Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202505", "62" ], [ - "66", + "Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202505", "41" ], [ - "55", + "Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202503", "46" ], [ - "64", + "Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202504", "44" ], [ - "28", + "Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202504", "62" ], [ - "68", + "Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202504", "49" ], [ - "37", + "Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202504", "55" ], [ - "21", + "Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202503", "53" ], [ - "75", + "Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202504", "45" ], [ - "39", + "Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202505", "53" ], [ - "40", + "Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202505", "60" ], [ - "10", + "Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202504", "46" ], [ - "85", + "Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202505", "58" ], [ - "1", + "Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202503", "44" ], [ - "79", + "Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202503", "50" ], [ - "7", + "Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202503", "47" ], [ - "5", + "Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202505", "46" ], [ - "75", + "Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202503", "36" ], [ - "51", + "Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202503", "50" ], [ - "81", + "Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202505", "37" ], [ - "18", + "Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202503", "55" ], [ - "24", + "Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202505", "47" ], [ - "32", + "Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202505", "61" ], [ - "78", + "Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202504", "55" ], [ - "62", + "Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202505", "53" ], [ - "42", + "Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202505", "59" ], [ - "77", + "Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202505", "50" ], [ - "49", + "Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202505", "45" ], [ - "0", + "Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202505", "50" ], [ - "20", + "Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202504", "54" ], [ - "37", + "Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202505", "31" ], [ - "79", + "Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202505", "46" ], [ - "22", + "Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202505", "59" ], [ - "58", + "Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202504", "63" ], [ - "74", + "Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202504", "40" ], [ - "82", + "Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202503", "55" ], [ - "41", + "Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202503", "62" ], [ - "32", + "Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202503", "52" ], [ - "85", + "Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202504", "32" ], [ - "50", + "Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202503", "63" ], [ - "35", + "Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202505", "40" ], [ - "27", + "Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202503", "50" ], [ - "69", + "Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202505", "49" ], [ - "88", + "Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202504", "52" ], [ - "23", + "Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202503", "48" ], [ - "73", + "Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202505", "50" ], [ - "1", + "Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202504", "48" ], [ - "1", + "Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202505", "53" ], [ - "86", + "Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202505", "43" ], [ - "47", + "Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202505", "66" ], [ - "14", + "Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202504", "38" ], [ - "73", + "Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202504", "59" ], [ - "43", + "Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202505", "49" ], [ - "77", + "Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202503", "55" ], [ - "13", + "Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202503", "47" ], [ - "12", + "Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202503", "63" ], [ - "48", + "Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202504", "44" ], [ - "3", + "Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202503", "56" ], [ - "36", + "Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202504", "49" ], [ - "27", + "Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202504", "49" ], [ - "58", + "Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202505", "48" From db9a29670a18e5589a97d1caf67367604a1b9a45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 2 Jul 2025 12:31:40 +0200 Subject: [PATCH 03/50] chore: add boolean story --- src/__demo__/PivotTable.event.stories.js | 22 +- src/__demo__/data/event/boolean.data.json | 193 ++++++++++++++++++ .../data/event/boolean.visualization.json | 162 +++++++++++++++ .../data/event/numeric.visualization.json | 2 +- 4 files changed, 377 insertions(+), 2 deletions(-) create mode 100644 src/__demo__/data/event/boolean.data.json create mode 100644 src/__demo__/data/event/boolean.visualization.json diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 3efc2b23b..746f0e59b 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -1,6 +1,8 @@ import { Checkbox, Divider } from '@dhis2/ui' import React, { useState } from 'react' import { PivotTable } from '../index.js' +import booleanData from './data/event/boolean.data.json' +import booleanVisualization from './data/event/boolean.visualization.json' import numericLegendsetData from './data/event/numeric-legendset.data.json' import numericLegendsetVisualization from './data/event/numeric-legendset.visualization.json' import numericData from './data/event/numeric.data.json' @@ -91,5 +93,23 @@ export const Numeric = (_, { pivotTableOptions }) => { } NumericLegendset.story = { - name: 'Numeric with legendset', + name: 'Numeric', +} + +export const Boolean = (_, { pivotTableOptions }) => { + const visualization = { + ...booleanVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +Boolean.story = { + name: 'Boolean', } \ No newline at end of file diff --git a/src/__demo__/data/event/boolean.data.json b/src/__demo__/data/event/boolean.data.json new file mode 100644 index 000000000..73b80f2df --- /dev/null +++ b/src/__demo__/data/event/boolean.data.json @@ -0,0 +1,193 @@ +{ + "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": "Yes" + }, + "A03MvHHogjR.bx6fsa0t90x:1": { + "name": "No" + }, + "A03MvHHogjR.bx6fsa0t90x:": { + "name": "N/A" + } + }, + "dimensions": { + "pe": [ + "202501", + "202502", + "202503", + "202504", + "202505", + "202506" + ], + "ou": [ + "ImspTQPwCqd" + ], + "A03MvHHogjR.bx6fsa0t90x": [ + "A03MvHHogjR.bx6fsa0t90x:0", + "A03MvHHogjR.bx6fsa0t90x:1", + "A03MvHHogjR.bx6fsa0t90x:" + ] + } + }, + "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" + ], + [ + "A03MvHHogjR.bx6fsa0t90x:", + "ImspTQPwCqd", + "202501", + "1" + ], + [ + "A03MvHHogjR.bx6fsa0t90x:0", + "ImspTQPwCqd", + "202502", + "311" + ] + ], + "height": 13, + "headerWidth": 4 +} \ No newline at end of file diff --git a/src/__demo__/data/event/boolean.visualization.json b/src/__demo__/data/event/boolean.visualization.json new file mode 100644 index 000000000..47cde8706 --- /dev/null +++ b/src/__demo__/data/event/boolean.visualization.json @@ -0,0 +1,162 @@ +{ + "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": [] +} \ No newline at end of file diff --git a/src/__demo__/data/event/numeric.visualization.json b/src/__demo__/data/event/numeric.visualization.json index 23fb1a27c..1160edb3c 100644 --- a/src/__demo__/data/event/numeric.visualization.json +++ b/src/__demo__/data/event/numeric.visualization.json @@ -1,5 +1,5 @@ { - "name": "Numeric-legendset", + "name": "Numeric", "created": "2025-06-30T10:27:41.277", "lastUpdated": "2025-06-30T10:27:41.277", "translations": [], From bbac5da534cabb7347493a788012715c15473009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 2 Jul 2025 12:32:58 +0200 Subject: [PATCH 04/50] chore: reorder stories --- src/__demo__/PivotTable.event.stories.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 746f0e59b..fe530f1e1 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -61,39 +61,39 @@ export default { decorators: [PivotTableOptionsWrapper], } -export const NumericLegendset = (_, { pivotTableOptions }) => { +export const Numeric = (_, { pivotTableOptions }) => { const visualization = { - ...numericLegendsetVisualization, + ...numericVisualization, ...visualizationReset, ...pivotTableOptions, } + return (
- +
) } -NumericLegendset.story = { - name: 'Numeric with legendset', +Numeric.story = { + name: 'Numeric', } -export const Numeric = (_, { pivotTableOptions }) => { +export const NumericLegendset = (_, { pivotTableOptions }) => { const visualization = { - ...numericVisualization, + ...numericLegendsetVisualization, ...visualizationReset, ...pivotTableOptions, } - return (
- +
) } NumericLegendset.story = { - name: 'Numeric', + name: 'Numeric with legendset', } export const Boolean = (_, { pivotTableOptions }) => { From 98dce1d5e85d31121f00c427573cf4b106c8348f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 2 Jul 2025 12:46:12 +0200 Subject: [PATCH 05/50] chore: add yesonly story --- src/__demo__/PivotTable.event.stories.js | 20 ++ src/__demo__/data/event/yesonly.data.json | 179 ++++++++++++++++++ .../data/event/yesonly.visualization.json | 161 ++++++++++++++++ 3 files changed, 360 insertions(+) create mode 100644 src/__demo__/data/event/yesonly.data.json create mode 100644 src/__demo__/data/event/yesonly.visualization.json diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index fe530f1e1..4cb9cac12 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -7,6 +7,8 @@ import numericLegendsetData from './data/event/numeric-legendset.data.json' import numericLegendsetVisualization from './data/event/numeric-legendset.visualization.json' import numericData from './data/event/numeric.data.json' import numericVisualization from './data/event/numeric.visualization.json' +import yesonlyData from './data/event/yesonly.data.json' +import yesonlyVisualization from './data/event/yesonly.visualization.json' const visualizationReset = { colTotals: false, @@ -112,4 +114,22 @@ export const Boolean = (_, { pivotTableOptions }) => { Boolean.story = { name: 'Boolean', +} + +export const Yesonly = (_, { pivotTableOptions }) => { + const visualization = { + ...yesonlyVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +Yesonly.story = { + name: 'Boolean', } \ No newline at end of file diff --git a/src/__demo__/data/event/yesonly.data.json b/src/__demo__/data/event/yesonly.data.json new file mode 100644 index 000000000..5430e78be --- /dev/null +++ b/src/__demo__/data/event/yesonly.data.json @@ -0,0 +1,179 @@ +{ + "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": { + "202407": { + "name": "July 2024" + }, + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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": [ + "202407", + "202408", + "202409", + "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" + ] + ], + "height": 8, + "headerWidth": 4 +} \ No newline at end of file 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 From 4793492faf832c087d8d133fd85f628d9dfdebf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 30 Jul 2025 16:09:31 +0200 Subject: [PATCH 06/50] chore: add optionset story WIP --- src/__demo__/PivotTable.event.stories.js | 20 ++ src/__demo__/data/event/optionset.data.json | 307 ++++++++++++++++++ .../data/event/optionset.data.org.json | 301 +++++++++++++++++ .../data/event/optionset.visualization.json | 172 ++++++++++ 4 files changed, 800 insertions(+) create mode 100644 src/__demo__/data/event/optionset.data.json create mode 100644 src/__demo__/data/event/optionset.data.org.json create mode 100644 src/__demo__/data/event/optionset.visualization.json diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 4cb9cac12..ebf7cf590 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -7,6 +7,8 @@ import numericLegendsetData from './data/event/numeric-legendset.data.json' import numericLegendsetVisualization from './data/event/numeric-legendset.visualization.json' import numericData from './data/event/numeric.data.json' import numericVisualization from './data/event/numeric.visualization.json' +import optionsetData from './data/event/optionset.data.json' +import optionsetVisualization from './data/event/optionset.visualization.json' import yesonlyData from './data/event/yesonly.data.json' import yesonlyVisualization from './data/event/yesonly.visualization.json' @@ -98,6 +100,24 @@ NumericLegendset.story = { name: 'Numeric with legendset', } +export const Optionset = (_, { pivotTableOptions }) => { + const visualization = { + ...optionsetVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +Optionset.story = { + name: 'Optionset', +} + export const Boolean = (_, { pivotTableOptions }) => { const visualization = { ...booleanVisualization, diff --git a/src/__demo__/data/event/optionset.data.json b/src/__demo__/data/event/optionset.data.json new file mode 100644 index 000000000..32704c4c6 --- /dev/null +++ b/src/__demo__/data/event/optionset.data.json @@ -0,0 +1,307 @@ +{ + "headers": [ + { + "name": "Zj7UnCAulEk.fWIAEtYVEGk", + "column": "Mode of Discharge", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true, + "optionSet": "iDFPKpFTiVw" + }, + { + "name": "Zj7UnCAulEk.oZg33kd9taw", + "column": "Gender", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true, + "optionSet": "pC3N9N77UmT" + }, + { + "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": { + "202504": { + "name": "April 2025" + }, + "202505": { + "name": "May 2025" + }, + "202506": { + "name": "June 2025" + }, + "Mnp3oXrpAbK": { + "code": "Female", + "name": "Female" + }, + "rBvjJYbMCVx": { + "code": "Male", + "name": "Male" + }, + "ou": { + "name": "Organisation unit" + }, + "Fhbf4aKpZmZ": { + "code": "MODABSC", + "name": "Absconded" + }, + "fWIAEtYVEGk": { + "name": "Mode of Discharge" + }, + "Zj7UnCAulEk.fWIAEtYVEGk": { + "name": "Mode of Discharge" + }, + "gj2fKKyp8OH": { + "code": "MODDIED", + "name": "Died" + }, + "Zj7UnCAulEk": { + "name": "Inpatient morbidity and mortality" + }, + "ImspTQPwCqd": { + "name": "Sierra Leone" + }, + "eBAyeGv0exc": { + "name": "Inpatient morbidity and mortality" + }, + "pe": { + "name": "Period" + }, + "oZg33kd9taw": { + "name": "Gender" + }, + "Zj7UnCAulEk.oZg33kd9taw": { + "name": "Gender" + }, + "LAST_3_MONTHS": { + "name": "Last 3 months" + }, + "fShHdgT7XGb": { + "code": "MODTRANS", + "name": "Transferred" + }, + "yeod5tOXpkP": { + "code": "MODDISCH", + "name": "Discharged" + } + }, + "dimensions": { + "pe": [ + "202504", + "202505", + "202506" + ], + "ou": [ + "ImspTQPwCqd" + ], + "Zj7UnCAulEk.fWIAEtYVEGk": [ + "yeod5tOXpkP", + "gj2fKKyp8OH", + "fShHdgT7XGb", + "Fhbf4aKpZmZ" + ], + "Zj7UnCAulEk.oZg33kd9taw": [ + "rBvjJYbMCVx", + "Mnp3oXrpAbK" + ] + } + }, + "rowContext": {}, + "headerWidth": 5, + "width": 5, + "rows": [ + [ + "yeod5tOXpkP", + "rBvjJYbMCVx", + "ImspTQPwCqd", + "202505", + "495" + ], + [ + "fShHdgT7XGb", + "FerBvjJYbMCVx", + "ImspTQPwCqd", + "202504", + "545" + ], + [ + "Fhbf4aKpZmZ", + "gj2fKKyp8OH", + "ImspTQPwCqd", + "202505", + "571" + ], + [ + "yeod5tOXpkP", + "gj2fKKyp8OH", + "ImspTQPwCqd", + "202506", + "560" + ], + [ + "gj2fKKyp8OH", + "Fegj2fKKyp8OH", + "ImspTQPwCqd", + "202504", + "632" + ], + [ + "yeod5tOXpkP", + "rBvjJYbMCVx", + "ImspTQPwCqd", + "202504", + "527" + ], + [ + "Fhbf4aKpZmZ", + "Mnp3oXrpAbK", + "ImspTQPwCqd", + "202504", + "552" + ], + [ + "gj2fKKyp8OH", + "rBvjJYbMCVx", + "ImspTQPwCqd", + "202504", + "524" + ], + [ + "fShHdgT7XGb", + "rBvjJYbMCVx", + "ImspTQPwCqd", + "202506", + "533" + ], + [ + "yeod5tOXpkP", + "Mnp3oXrpAbK", + "ImspTQPwCqd", + "202504", + "555" + ], + [ + "Fhbf4aKpZmZ", + "rBvjJYbMCVx", + "ImspTQPwCqd", + "202506", + "564" + ], + [ + "fShHdgT7XGb", + "rBvjJYbMCVx", + "ImspTQPwCqd", + "202504", + "515" + ], + [ + "gj2fKKyp8OH", + "Mnp3oXrpAbK", + "ImspTQPwCqd", + "202506", + "585" + ], + [ + "Fhbf4aKpZmZ", + "rBvjJYbMCVx", + "ImspTQPwCqd", + "202504", + "504" + ], + [ + "gj2fKKyp8OH", + "Mnp3oXrpAbK", + "ImspTQPwCqd", + "202505", + "581" + ], + [ + "fShHdgT7XGb", + "Mnp3oXrpAbK", + "ImspTQPwCqd", + "202506", + "609" + ], + [ + "Fhbf4aKpZmZ", + "Mnp3oXrpAbK", + "ImspTQPwCqd", + "202505", + "574" + ], + [ + "yeod5tOXpkP", + "Mnp3oXrpAbK", + "ImspTQPwCqd", + "202505", + "586" + ], + [ + "Fhbf4aKpZmZ", + "Mnp3oXrpAbK", + "ImspTQPwCqd", + "202506", + "574" + ], + [ + "gj2fKKyp8OH", + "rBvjJYbMCVx", + "ImspTQPwCqd", + "202505", + "565" + ], + [ + "gj2fKKyp8OH", + "rBvjJYbMCVx", + "ImspTQPwCqd", + "202506", + "545" + ], + [ + "yeod5tOXpkP", + "Mnp3oXrpAbK", + "ImspTQPwCqd", + "202506", + "597" + ], + [ + "fShHdgT7XGb", + "rBvjJYbMCVx", + "ImspTQPwCqd", + "202505", + "524" + ], + [ + "fShHdgT7XGb", + "Mnp3oXrpAbK", + "ImspTQPwCqd", + "202505", + "561" + ] + ], + "height": 24 +} \ No newline at end of file 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..4a43d7b02 --- /dev/null +++ b/src/__demo__/data/event/optionset.data.org.json @@ -0,0 +1,301 @@ +{ + "headers": [ + { + "name": "fWIAEtYVEGk", + "column": "Mode of Discharge", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true, + "optionSet": "iDFPKpFTiVw" + }, + { + "name": "oZg33kd9taw", + "column": "Gender", + "valueType": "TEXT", + "type": "java.lang.String", + "hidden": false, + "meta": true, + "optionSet": "pC3N9N77UmT" + }, + { + "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": { + "202504": { + "name": "April 2025" + }, + "202505": { + "name": "May 2025" + }, + "202506": { + "name": "June 2025" + }, + "Mnp3oXrpAbK": { + "code": "Female", + "name": "Female" + }, + "rBvjJYbMCVx": { + "code": "Male", + "name": "Male" + }, + "ou": { + "name": "Organisation unit" + }, + "Fhbf4aKpZmZ": { + "code": "MODABSC", + "name": "Absconded" + }, + "fWIAEtYVEGk": { + "name": "Mode of Discharge" + }, + "gj2fKKyp8OH": { + "code": "MODDIED", + "name": "Died" + }, + "Zj7UnCAulEk": { + "name": "Inpatient morbidity and mortality" + }, + "ImspTQPwCqd": { + "name": "Sierra Leone" + }, + "eBAyeGv0exc": { + "name": "Inpatient morbidity and mortality" + }, + "pe": { + "name": "Period" + }, + "oZg33kd9taw": { + "name": "Gender" + }, + "LAST_3_MONTHS": { + "name": "Last 3 months" + }, + "fShHdgT7XGb": { + "code": "MODTRANS", + "name": "Transferred" + }, + "yeod5tOXpkP": { + "code": "MODDISCH", + "name": "Discharged" + } + }, + "dimensions": { + "pe": [ + "202504", + "202505", + "202506" + ], + "ou": [ + "ImspTQPwCqd" + ], + "fWIAEtYVEGk": [ + "yeod5tOXpkP", + "gj2fKKyp8OH", + "fShHdgT7XGb", + "Fhbf4aKpZmZ" + ], + "oZg33kd9taw": [ + "rBvjJYbMCVx", + "Mnp3oXrpAbK" + ] + } + }, + "rowContext": {}, + "headerWidth": 5, + "width": 5, + "rows": [ + [ + "MODDISCH", + "Male", + "ImspTQPwCqd", + "202505", + "495" + ], + [ + "MODTRANS", + "Female", + "ImspTQPwCqd", + "202504", + "545" + ], + [ + "MODABSC", + "Male", + "ImspTQPwCqd", + "202505", + "571" + ], + [ + "MODDISCH", + "Male", + "ImspTQPwCqd", + "202506", + "560" + ], + [ + "MODDIED", + "Female", + "ImspTQPwCqd", + "202504", + "632" + ], + [ + "MODDISCH", + "Male", + "ImspTQPwCqd", + "202504", + "527" + ], + [ + "MODABSC", + "Female", + "ImspTQPwCqd", + "202504", + "552" + ], + [ + "MODDIED", + "Male", + "ImspTQPwCqd", + "202504", + "524" + ], + [ + "MODTRANS", + "Male", + "ImspTQPwCqd", + "202506", + "533" + ], + [ + "MODDISCH", + "Female", + "ImspTQPwCqd", + "202504", + "555" + ], + [ + "MODABSC", + "Male", + "ImspTQPwCqd", + "202506", + "564" + ], + [ + "MODTRANS", + "Male", + "ImspTQPwCqd", + "202504", + "515" + ], + [ + "MODDIED", + "Female", + "ImspTQPwCqd", + "202506", + "585" + ], + [ + "MODABSC", + "Male", + "ImspTQPwCqd", + "202504", + "504" + ], + [ + "MODDIED", + "Female", + "ImspTQPwCqd", + "202505", + "581" + ], + [ + "MODTRANS", + "Female", + "ImspTQPwCqd", + "202506", + "609" + ], + [ + "MODABSC", + "Female", + "ImspTQPwCqd", + "202505", + "574" + ], + [ + "MODDISCH", + "Female", + "ImspTQPwCqd", + "202505", + "586" + ], + [ + "MODABSC", + "Female", + "ImspTQPwCqd", + "202506", + "574" + ], + [ + "MODDIED", + "Male", + "ImspTQPwCqd", + "202505", + "565" + ], + [ + "MODDIED", + "Male", + "ImspTQPwCqd", + "202506", + "545" + ], + [ + "MODDISCH", + "Female", + "ImspTQPwCqd", + "202506", + "597" + ], + [ + "MODTRANS", + "Male", + "ImspTQPwCqd", + "202505", + "524" + ], + [ + "MODTRANS", + "Female", + "ImspTQPwCqd", + "202505", + "561" + ] + ], + "height": 24 +} \ No newline at end of file diff --git a/src/__demo__/data/event/optionset.visualization.json b/src/__demo__/data/event/optionset.visualization.json new file mode 100644 index 000000000..772768163 --- /dev/null +++ b/src/__demo__/data/event/optionset.visualization.json @@ -0,0 +1,172 @@ +{ + "name": "Numeric", + "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.fWIAEtYVEGk" + }, + { + "items": [], + "programStage": { + "id": "Zj7UnCAulEk" + }, + "dimension": "Zj7UnCAulEk.oZg33kd9taw" + } + ], + "displayName": "A1 numeric-optionset", + "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 text-optionset", + "id": "kNl4fqsY9hJ", + "attributeValues": [] +} \ No newline at end of file From aafc7dff061fcf2b7485c1200b9c03948c8953cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Fri, 1 Aug 2025 12:16:37 +0200 Subject: [PATCH 07/50] chore: fns and tests for option set --- src/__demo__/data/event/optionset.data.json | 58 +------------------ .../data/event/optionset.data.org.json | 58 ++----------------- .../data/event/optionset.visualization.json | 7 --- .../response/__tests__/optionSet.spec.js | 36 ++++++++++++ src/modules/response/optionSet.js | 24 ++++++++ 5 files changed, 67 insertions(+), 116 deletions(-) create mode 100644 src/modules/response/__tests__/optionSet.spec.js create mode 100644 src/modules/response/optionSet.js diff --git a/src/__demo__/data/event/optionset.data.json b/src/__demo__/data/event/optionset.data.json index 32704c4c6..bce6b1aab 100644 --- a/src/__demo__/data/event/optionset.data.json +++ b/src/__demo__/data/event/optionset.data.json @@ -9,15 +9,6 @@ "meta": true, "optionSet": "iDFPKpFTiVw" }, - { - "name": "Zj7UnCAulEk.oZg33kd9taw", - "column": "Gender", - "valueType": "TEXT", - "type": "java.lang.String", - "hidden": false, - "meta": true, - "optionSet": "pC3N9N77UmT" - }, { "name": "ou", "column": "Organisation unit", @@ -54,14 +45,6 @@ "202506": { "name": "June 2025" }, - "Mnp3oXrpAbK": { - "code": "Female", - "name": "Female" - }, - "rBvjJYbMCVx": { - "code": "Male", - "name": "Male" - }, "ou": { "name": "Organisation unit" }, @@ -69,9 +52,6 @@ "code": "MODABSC", "name": "Absconded" }, - "fWIAEtYVEGk": { - "name": "Mode of Discharge" - }, "Zj7UnCAulEk.fWIAEtYVEGk": { "name": "Mode of Discharge" }, @@ -91,12 +71,6 @@ "pe": { "name": "Period" }, - "oZg33kd9taw": { - "name": "Gender" - }, - "Zj7UnCAulEk.oZg33kd9taw": { - "name": "Gender" - }, "LAST_3_MONTHS": { "name": "Last 3 months" }, @@ -123,181 +97,153 @@ "gj2fKKyp8OH", "fShHdgT7XGb", "Fhbf4aKpZmZ" - ], - "Zj7UnCAulEk.oZg33kd9taw": [ - "rBvjJYbMCVx", - "Mnp3oXrpAbK" ] } }, "rowContext": {}, - "headerWidth": 5, - "width": 5, + "headerWidth": 4, + "width": 4, "rows": [ [ "yeod5tOXpkP", - "rBvjJYbMCVx", "ImspTQPwCqd", "202505", "495" ], [ "fShHdgT7XGb", - "FerBvjJYbMCVx", "ImspTQPwCqd", "202504", "545" ], [ "Fhbf4aKpZmZ", - "gj2fKKyp8OH", "ImspTQPwCqd", "202505", "571" ], [ "yeod5tOXpkP", - "gj2fKKyp8OH", "ImspTQPwCqd", "202506", "560" ], [ "gj2fKKyp8OH", - "Fegj2fKKyp8OH", "ImspTQPwCqd", "202504", "632" ], [ "yeod5tOXpkP", - "rBvjJYbMCVx", "ImspTQPwCqd", "202504", "527" ], [ "Fhbf4aKpZmZ", - "Mnp3oXrpAbK", "ImspTQPwCqd", "202504", "552" ], [ "gj2fKKyp8OH", - "rBvjJYbMCVx", "ImspTQPwCqd", "202504", "524" ], [ "fShHdgT7XGb", - "rBvjJYbMCVx", "ImspTQPwCqd", "202506", "533" ], [ "yeod5tOXpkP", - "Mnp3oXrpAbK", "ImspTQPwCqd", "202504", "555" ], [ "Fhbf4aKpZmZ", - "rBvjJYbMCVx", "ImspTQPwCqd", "202506", "564" ], [ "fShHdgT7XGb", - "rBvjJYbMCVx", "ImspTQPwCqd", "202504", "515" ], [ "gj2fKKyp8OH", - "Mnp3oXrpAbK", "ImspTQPwCqd", "202506", "585" ], [ "Fhbf4aKpZmZ", - "rBvjJYbMCVx", "ImspTQPwCqd", "202504", "504" ], [ "gj2fKKyp8OH", - "Mnp3oXrpAbK", "ImspTQPwCqd", "202505", "581" ], [ "fShHdgT7XGb", - "Mnp3oXrpAbK", "ImspTQPwCqd", "202506", "609" ], [ "Fhbf4aKpZmZ", - "Mnp3oXrpAbK", "ImspTQPwCqd", "202505", "574" ], [ "yeod5tOXpkP", - "Mnp3oXrpAbK", "ImspTQPwCqd", "202505", "586" ], [ "Fhbf4aKpZmZ", - "Mnp3oXrpAbK", "ImspTQPwCqd", "202506", "574" ], [ "gj2fKKyp8OH", - "rBvjJYbMCVx", "ImspTQPwCqd", "202505", "565" ], [ "gj2fKKyp8OH", - "rBvjJYbMCVx", "ImspTQPwCqd", "202506", "545" ], [ "yeod5tOXpkP", - "Mnp3oXrpAbK", "ImspTQPwCqd", "202506", "597" ], [ "fShHdgT7XGb", - "rBvjJYbMCVx", "ImspTQPwCqd", "202505", "524" ], [ "fShHdgT7XGb", - "Mnp3oXrpAbK", "ImspTQPwCqd", "202505", "561" diff --git a/src/__demo__/data/event/optionset.data.org.json b/src/__demo__/data/event/optionset.data.org.json index 4a43d7b02..78e37c513 100644 --- a/src/__demo__/data/event/optionset.data.org.json +++ b/src/__demo__/data/event/optionset.data.org.json @@ -1,7 +1,7 @@ { "headers": [ { - "name": "fWIAEtYVEGk", + "name": "Zj7UnCAulEk.fWIAEtYVEGk", "column": "Mode of Discharge", "valueType": "TEXT", "type": "java.lang.String", @@ -9,15 +9,6 @@ "meta": true, "optionSet": "iDFPKpFTiVw" }, - { - "name": "oZg33kd9taw", - "column": "Gender", - "valueType": "TEXT", - "type": "java.lang.String", - "hidden": false, - "meta": true, - "optionSet": "pC3N9N77UmT" - }, { "name": "ou", "column": "Organisation unit", @@ -54,14 +45,6 @@ "202506": { "name": "June 2025" }, - "Mnp3oXrpAbK": { - "code": "Female", - "name": "Female" - }, - "rBvjJYbMCVx": { - "code": "Male", - "name": "Male" - }, "ou": { "name": "Organisation unit" }, @@ -69,7 +52,7 @@ "code": "MODABSC", "name": "Absconded" }, - "fWIAEtYVEGk": { + "Zj7UnCAulEk.fWIAEtYVEGk": { "name": "Mode of Discharge" }, "gj2fKKyp8OH": { @@ -88,9 +71,6 @@ "pe": { "name": "Period" }, - "oZg33kd9taw": { - "name": "Gender" - }, "LAST_3_MONTHS": { "name": "Last 3 months" }, @@ -112,186 +92,158 @@ "ou": [ "ImspTQPwCqd" ], - "fWIAEtYVEGk": [ + "Zj7UnCAulEk.fWIAEtYVEGk": [ "yeod5tOXpkP", "gj2fKKyp8OH", "fShHdgT7XGb", "Fhbf4aKpZmZ" - ], - "oZg33kd9taw": [ - "rBvjJYbMCVx", - "Mnp3oXrpAbK" ] } }, "rowContext": {}, - "headerWidth": 5, - "width": 5, + "headerWidth": 4, + "width": 4, "rows": [ [ "MODDISCH", - "Male", "ImspTQPwCqd", "202505", "495" ], [ "MODTRANS", - "Female", "ImspTQPwCqd", "202504", "545" ], [ "MODABSC", - "Male", "ImspTQPwCqd", "202505", "571" ], [ "MODDISCH", - "Male", "ImspTQPwCqd", "202506", "560" ], [ "MODDIED", - "Female", "ImspTQPwCqd", "202504", "632" ], [ "MODDISCH", - "Male", "ImspTQPwCqd", "202504", "527" ], [ "MODABSC", - "Female", "ImspTQPwCqd", "202504", "552" ], [ "MODDIED", - "Male", "ImspTQPwCqd", "202504", "524" ], [ "MODTRANS", - "Male", "ImspTQPwCqd", "202506", "533" ], [ "MODDISCH", - "Female", "ImspTQPwCqd", "202504", "555" ], [ "MODABSC", - "Male", "ImspTQPwCqd", "202506", "564" ], [ "MODTRANS", - "Male", "ImspTQPwCqd", "202504", "515" ], [ "MODDIED", - "Female", "ImspTQPwCqd", "202506", "585" ], [ "MODABSC", - "Male", "ImspTQPwCqd", "202504", "504" ], [ "MODDIED", - "Female", "ImspTQPwCqd", "202505", "581" ], [ "MODTRANS", - "Female", "ImspTQPwCqd", "202506", "609" ], [ "MODABSC", - "Female", "ImspTQPwCqd", "202505", "574" ], [ "MODDISCH", - "Female", "ImspTQPwCqd", "202505", "586" ], [ "MODABSC", - "Female", "ImspTQPwCqd", "202506", "574" ], [ "MODDIED", - "Male", "ImspTQPwCqd", "202505", "565" ], [ "MODDIED", - "Male", "ImspTQPwCqd", "202506", "545" ], [ "MODDISCH", - "Female", "ImspTQPwCqd", "202506", "597" ], [ "MODTRANS", - "Male", "ImspTQPwCqd", "202505", "524" ], [ "MODTRANS", - "Female", "ImspTQPwCqd", "202505", "561" diff --git a/src/__demo__/data/event/optionset.visualization.json b/src/__demo__/data/event/optionset.visualization.json index 772768163..488668353 100644 --- a/src/__demo__/data/event/optionset.visualization.json +++ b/src/__demo__/data/event/optionset.visualization.json @@ -127,13 +127,6 @@ "id": "Zj7UnCAulEk" }, "dimension": "Zj7UnCAulEk.fWIAEtYVEGk" - }, - { - "items": [], - "programStage": { - "id": "Zj7UnCAulEk" - }, - "dimension": "Zj7UnCAulEk.oZg33kd9taw" } ], "displayName": "A1 numeric-optionset", diff --git a/src/modules/response/__tests__/optionSet.spec.js b/src/modules/response/__tests__/optionSet.spec.js new file mode 100644 index 000000000..b73364635 --- /dev/null +++ b/src/modules/response/__tests__/optionSet.spec.js @@ -0,0 +1,36 @@ +import response from '../../../__demo__/data/event/optionset.data.json' +import responseOrg from '../../../__demo__/data/event/optionset.data.org.json' +import { getOptionCodeIdMap, getOptionIdRows, applyOptionSetHandler } from "../optionSet.js" + +const modeOfDischargeId = 'Zj7UnCAulEk.fWIAEtYVEGk' +const headerIndex = 0 + +const testOptionCodeIdMap = { + "MODABSC": "Fhbf4aKpZmZ", + "MODDIED": "gj2fKKyp8OH", + "MODTRANS": "fShHdgT7XGb", + "MODDISCH": "yeod5tOXpkP", +} + +describe('optionSet', () => { + describe('getOptionCodeIdMap', () => { + it('should create an option code:id object', () => { + const testOptionIds = response.metaData.dimensions[modeOfDischargeId] + const testOptionItems = response.metaData.items + + expect(getOptionCodeIdMap(testOptionIds, testOptionItems)).toEqual(testOptionCodeIdMap) + }) + }) + + describe('getOptionIdRows', () => { + it('should replace option codes with ids in the right index', () => { + expect(getOptionIdRows(responseOrg.rows, testOptionCodeIdMap, headerIndex)).toEqual(response.rows) + }) + }) + + describe('applyOptionSetHandler', () => { + it('should return the transformed response', () => { + expect(applyOptionSetHandler(responseOrg, headerIndex)).toEqual(response) + }) + }) +}) \ No newline at end of file diff --git a/src/modules/response/optionSet.js b/src/modules/response/optionSet.js new file mode 100644 index 000000000..fda8390cd --- /dev/null +++ b/src/modules/response/optionSet.js @@ -0,0 +1,24 @@ +export const getOptionCodeIdMap = (optionIds, metaDataItems) => optionIds.reduce((map, optionId) => { + map[metaDataItems[optionId].code] = optionId + return map +}, {}) + +export const getOptionIdRows = (rows, optionCodeIdMap, headerIndex) => { + let row + return rows.map(r => { + row = [...r] + row[headerIndex] = optionCodeIdMap[row[headerIndex]] + return row + }) +} + +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) + } +} \ No newline at end of file From d476f59bb49c1a570deeef6ba841f842f60bd188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Fri, 1 Aug 2025 14:06:47 +0200 Subject: [PATCH 08/50] chore: add handler and tests for numeric --- src/__demo__/data/event/numeric.data.json | 1881 +++-------------- src/__demo__/data/event/numeric.data.org.json | 1691 +++++++++++++++ .../data/event/optionset.visualization.json | 6 +- .../response/__tests__/numeric.spec.js | 238 +++ .../response/__tests__/optionSet.spec.js | 36 +- src/modules/response/numeric.js | 58 + src/modules/response/optionSet.js | 33 +- 7 files changed, 2307 insertions(+), 1636 deletions(-) create mode 100644 src/__demo__/data/event/numeric.data.org.json create mode 100644 src/modules/response/__tests__/numeric.spec.js create mode 100644 src/modules/response/numeric.js diff --git a/src/__demo__/data/event/numeric.data.json b/src/__demo__/data/event/numeric.data.json index bccd57a77..779f82191 100644 --- a/src/__demo__/data/event/numeric.data.json +++ b/src/__demo__/data/event/numeric.data.json @@ -337,11 +337,7 @@ } }, "dimensions": { - "pe": [ - "202503", - "202504", - "202505" - ], + "pe": ["202503", "202504", "202505"], "Zj7UnCAulEk.qrur9Dvnyt5": [ "Zj7UnCAulEk.qrur9Dvnyt5:0", "Zj7UnCAulEk.qrur9Dvnyt5:1", @@ -433,1617 +429,280 @@ "Zj7UnCAulEk.qrur9Dvnyt5:87", "Zj7UnCAulEk.qrur9Dvnyt5:88" ], - "ou": [ - "ImspTQPwCqd" - ] + "ou": ["ImspTQPwCqd"] } }, "rowContext": {}, "width": 4, "rows": [ - [ - "Zj7UnCAulEk.qrur9Dvnyt5:26", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:84", - "ImspTQPwCqd", - "202503", - "70" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:25", - "ImspTQPwCqd", - "202504", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:81", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:13", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:57", - "ImspTQPwCqd", - "202503", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:24", - "ImspTQPwCqd", - "202504", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:8", - "ImspTQPwCqd", - "202503", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:80", - "ImspTQPwCqd", - "202504", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:3", - "ImspTQPwCqd", - "202505", - "67" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:14", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:67", - "ImspTQPwCqd", - "202504", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:74", - "ImspTQPwCqd", - "202503", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:83", - "ImspTQPwCqd", - "202504", - "42" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:0", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:5", - "ImspTQPwCqd", - "202503", - "70" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:52", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:54", - "ImspTQPwCqd", - "202503", - "57" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:44", - "ImspTQPwCqd", - "202504", - "43" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:10", - "ImspTQPwCqd", - "202505", - "61" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:42", - "ImspTQPwCqd", - "202503", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:15", - "ImspTQPwCqd", - "202504", - "64" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:26", - "ImspTQPwCqd", - "202505", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:62", - "ImspTQPwCqd", - "202503", - "57" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:78", - "ImspTQPwCqd", - "202505", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:80", - "ImspTQPwCqd", - "202503", - "62" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:7", - "ImspTQPwCqd", - "202505", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:39", - "ImspTQPwCqd", - "202504", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:71", - "ImspTQPwCqd", - "202505", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:71", - "ImspTQPwCqd", - "202504", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:44", - "ImspTQPwCqd", - "202503", - "57" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:34", - "ImspTQPwCqd", - "202503", - "40" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:88", - "ImspTQPwCqd", - "202505", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:56", - "ImspTQPwCqd", - "202503", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:41", - "ImspTQPwCqd", - "202504", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:59", - "ImspTQPwCqd", - "202505", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:61", - "ImspTQPwCqd", - "202504", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:28", - "ImspTQPwCqd", - "202505", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:9", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:16", - "ImspTQPwCqd", - "202505", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:80", - "ImspTQPwCqd", - "202505", - "37" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:67", - "ImspTQPwCqd", - "202503", - "35" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:63", - "ImspTQPwCqd", - "202504", - "35" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:6", - "ImspTQPwCqd", - "202505", - "65" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:28", - "ImspTQPwCqd", - "202503", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:68", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:72", - "ImspTQPwCqd", - "202503", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:47", - "ImspTQPwCqd", - "202503", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:13", - "ImspTQPwCqd", - "202504", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:56", - "ImspTQPwCqd", - "202505", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:66", - "ImspTQPwCqd", - "202504", - "43" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:75", - "ImspTQPwCqd", - "202505", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:82", - "ImspTQPwCqd", - "202505", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:16", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:56", - "ImspTQPwCqd", - "202504", - "30" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:31", - "ImspTQPwCqd", - "202504", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:52", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:34", - "ImspTQPwCqd", - "202504", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:30", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:20", - "ImspTQPwCqd", - "202503", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:76", - "ImspTQPwCqd", - "202503", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:63", - "ImspTQPwCqd", - "202503", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:29", - "ImspTQPwCqd", - "202505", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:20", - "ImspTQPwCqd", - "202505", - "43" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:12", - "ImspTQPwCqd", - "202505", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:63", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:42", - "ImspTQPwCqd", - "202504", - "42" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:64", - "ImspTQPwCqd", - "202505", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:9", - "ImspTQPwCqd", - "202505", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:12", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:19", - "ImspTQPwCqd", - "202504", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:76", - "ImspTQPwCqd", - "202504", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:17", - "ImspTQPwCqd", - "202505", - "42" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:21", - "ImspTQPwCqd", - "202504", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:50", - "ImspTQPwCqd", - "202504", - "63" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:6", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:83", - "ImspTQPwCqd", - "202505", - "56" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:31", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:88", - "ImspTQPwCqd", - "202503", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:36", - "ImspTQPwCqd", - "202505", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:61", - "ImspTQPwCqd", - "202503", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:51", - "ImspTQPwCqd", - "202505", - "62" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:76", - "ImspTQPwCqd", - "202505", - "42" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:2", - "ImspTQPwCqd", - "202504", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:53", - "ImspTQPwCqd", - "202504", - "41" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:43", - "ImspTQPwCqd", - "202504", - "41" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:10", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:2", - "ImspTQPwCqd", - "202505", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:70", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:46", - "ImspTQPwCqd", - "202505", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:36", - "ImspTQPwCqd", - "202503", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:86", - "ImspTQPwCqd", - "202503", - "61" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:19", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:23", - "ImspTQPwCqd", - "202504", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:35", - "ImspTQPwCqd", - "202503", - "65" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:70", - "ImspTQPwCqd", - "202505", - "38" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:3", - "ImspTQPwCqd", - "202504", - "38" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:79", - "ImspTQPwCqd", - "202504", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:33", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:43", - "ImspTQPwCqd", - "202503", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:19", - "ImspTQPwCqd", - "202505", - "37" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:35", - "ImspTQPwCqd", - "202504", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:2", - "ImspTQPwCqd", - "202503", - "41" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:54", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:51", - "ImspTQPwCqd", - "202504", - "56" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:50", - "ImspTQPwCqd", - "202505", - "57" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:22", - "ImspTQPwCqd", - "202503", - "60" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:46", - "ImspTQPwCqd", - "202504", - "61" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:8", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:61", - "ImspTQPwCqd", - "202505", - "60" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:39", - "ImspTQPwCqd", - "202503", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:48", - "ImspTQPwCqd", - "202505", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:64", - "ImspTQPwCqd", - "202503", - "58" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:65", - "ImspTQPwCqd", - "202504", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:7", - "ImspTQPwCqd", - "202504", - "40" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:60", - "ImspTQPwCqd", - "202504", - "38" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:38", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:33", - "ImspTQPwCqd", - "202504", - "41" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:52", - "ImspTQPwCqd", - "202505", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:29", - "ImspTQPwCqd", - "202504", - "42" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:11", - "ImspTQPwCqd", - "202504", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:72", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:29", - "ImspTQPwCqd", - "202503", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:32", - "ImspTQPwCqd", - "202504", - "64" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:15", - "ImspTQPwCqd", - "202503", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:55", - "ImspTQPwCqd", - "202504", - "63" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:21", - "ImspTQPwCqd", - "202505", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:60", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:86", - "ImspTQPwCqd", - "202504", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:30", - "ImspTQPwCqd", - "202504", - "64" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:48", - "ImspTQPwCqd", - "202503", - "58" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:26", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:33", - "ImspTQPwCqd", - "202505", - "43" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:60", - "ImspTQPwCqd", - "202503", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:69", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:34", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:15", - "ImspTQPwCqd", - "202505", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:71", - "ImspTQPwCqd", - "202503", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:66", - "ImspTQPwCqd", - "202503", - "57" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:72", - "ImspTQPwCqd", - "202505", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:24", - "ImspTQPwCqd", - "202503", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:77", - "ImspTQPwCqd", - "202504", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:40", - "ImspTQPwCqd", - "202503", - "56" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:38", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:44", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:67", - "ImspTQPwCqd", - "202505", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:83", - "ImspTQPwCqd", - "202503", - "39" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:69", - "ImspTQPwCqd", - "202504", - "36" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:49", - "ImspTQPwCqd", - "202503", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:37", - "ImspTQPwCqd", - "202503", - "60" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:87", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:45", - "ImspTQPwCqd", - "202504", - "58" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:4", - "ImspTQPwCqd", - "202505", - "41" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:4", - "ImspTQPwCqd", - "202504", - "42" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:81", - "ImspTQPwCqd", - "202504", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:82", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:40", - "ImspTQPwCqd", - "202504", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:85", - "ImspTQPwCqd", - "202503", - "43" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:16", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:9", - "ImspTQPwCqd", - "202503", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:17", - "ImspTQPwCqd", - "202503", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:45", - "ImspTQPwCqd", - "202505", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:55", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:57", - "ImspTQPwCqd", - "202505", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:73", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:0", - "ImspTQPwCqd", - "202504", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:58", - "ImspTQPwCqd", - "202503", - "56" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:49", - "ImspTQPwCqd", - "202504", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:11", - "ImspTQPwCqd", - "202505", - "57" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:54", - "ImspTQPwCqd", - "202504", - "34" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:53", - "ImspTQPwCqd", - "202505", - "38" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:53", - "ImspTQPwCqd", - "202503", - "41" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:84", - "ImspTQPwCqd", - "202505", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:57", - "ImspTQPwCqd", - "202504", - "35" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:17", - "ImspTQPwCqd", - "202504", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:59", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:18", - "ImspTQPwCqd", - "202504", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:68", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:74", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:65", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:59", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:62", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:78", - "ImspTQPwCqd", - "202503", - "41" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:84", - "ImspTQPwCqd", - "202504", - "62" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:47", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:11", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:65", - "ImspTQPwCqd", - "202503", - "60" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:46", - "ImspTQPwCqd", - "202503", - "59" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:25", - "ImspTQPwCqd", - "202503", - "56" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:87", - "ImspTQPwCqd", - "202505", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:38", - "ImspTQPwCqd", - "202504", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:8", - "ImspTQPwCqd", - "202505", - "43" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:14", - "ImspTQPwCqd", - "202505", - "58" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:18", - "ImspTQPwCqd", - "202505", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:31", - "ImspTQPwCqd", - "202505", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:41", - "ImspTQPwCqd", - "202505", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:70", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:22", - "ImspTQPwCqd", - "202504", - "40" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:87", - "ImspTQPwCqd", - "202504", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:5", - "ImspTQPwCqd", - "202504", - "63" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:6", - "ImspTQPwCqd", - "202504", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:30", - "ImspTQPwCqd", - "202503", - "36" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:23", - "ImspTQPwCqd", - "202505", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:45", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:27", - "ImspTQPwCqd", - "202505", - "61" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:4", - "ImspTQPwCqd", - "202503", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:25", - "ImspTQPwCqd", - "202505", - "62" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:66", - "ImspTQPwCqd", - "202505", - "41" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:55", - "ImspTQPwCqd", - "202503", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:64", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:28", - "ImspTQPwCqd", - "202504", - "62" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:68", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:37", - "ImspTQPwCqd", - "202504", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:21", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:75", - "ImspTQPwCqd", - "202504", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:39", - "ImspTQPwCqd", - "202505", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:40", - "ImspTQPwCqd", - "202505", - "60" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:10", - "ImspTQPwCqd", - "202504", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:85", - "ImspTQPwCqd", - "202505", - "58" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:1", - "ImspTQPwCqd", - "202503", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:79", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:7", - "ImspTQPwCqd", - "202503", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:5", - "ImspTQPwCqd", - "202505", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:75", - "ImspTQPwCqd", - "202503", - "36" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:51", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:81", - "ImspTQPwCqd", - "202505", - "37" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:18", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:24", - "ImspTQPwCqd", - "202505", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:32", - "ImspTQPwCqd", - "202505", - "61" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:78", - "ImspTQPwCqd", - "202504", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:62", - "ImspTQPwCqd", - "202505", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:42", - "ImspTQPwCqd", - "202505", - "59" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:77", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:49", - "ImspTQPwCqd", - "202505", - "45" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:0", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:20", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:37", - "ImspTQPwCqd", - "202505", - "31" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:79", - "ImspTQPwCqd", - "202505", - "46" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:22", - "ImspTQPwCqd", - "202505", - "59" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:58", - "ImspTQPwCqd", - "202504", - "63" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:74", - "ImspTQPwCqd", - "202504", - "40" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:82", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:41", - "ImspTQPwCqd", - "202503", - "62" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:32", - "ImspTQPwCqd", - "202503", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:85", - "ImspTQPwCqd", - "202504", - "32" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:50", - "ImspTQPwCqd", - "202503", - "63" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:35", - "ImspTQPwCqd", - "202505", - "40" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:27", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:69", - "ImspTQPwCqd", - "202505", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:88", - "ImspTQPwCqd", - "202504", - "52" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:23", - "ImspTQPwCqd", - "202503", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:73", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:1", - "ImspTQPwCqd", - "202504", - "48" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:1", - "ImspTQPwCqd", - "202505", - "53" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:86", - "ImspTQPwCqd", - "202505", - "43" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:47", - "ImspTQPwCqd", - "202505", - "66" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:14", - "ImspTQPwCqd", - "202504", - "38" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:73", - "ImspTQPwCqd", - "202504", - "59" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:43", - "ImspTQPwCqd", - "202505", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:77", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:13", - "ImspTQPwCqd", - "202503", - "47" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:12", - "ImspTQPwCqd", - "202503", - "63" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:48", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:3", - "ImspTQPwCqd", - "202503", - "56" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:36", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:27", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "Zj7UnCAulEk.qrur9Dvnyt5:58", - "ImspTQPwCqd", - "202505", - "48" - ] + ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202503", "70"], + ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202504", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202505", "67"], + ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202503", "70"], + ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202504", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202503", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202503", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202503", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202504", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202505", "65"], + ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202504", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202504", "30"], + ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202505", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202505", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202505", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202505", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202503", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202503", "65"], + ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202505", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202504", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202505", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202504", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202505", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202503", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202504", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202503", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202503", "39"], + ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202504", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202504", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202505", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202503", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202505", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202504", "34"], + ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202505", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202504", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202504", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202503", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202505", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202503", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202505", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202505", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202504", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202505", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202505", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202503", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202505", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202505", "31"], + ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202505", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202503", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202504", "32"], + ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202503", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202505", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202505", "66"], + ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202504", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202503", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202505", "48"] ], "height": 267, "headerWidth": 4 -} \ No newline at end of file +} diff --git a/src/__demo__/data/event/numeric.data.org.json b/src/__demo__/data/event/numeric.data.org.json new file mode 100644 index 000000000..1f6d1d713 --- /dev/null +++ b/src/__demo__/data/event/numeric.data.org.json @@ -0,0 +1,1691 @@ +{ + "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" + ] + } + }, + "rowContext": {}, + "width": 4, + "rows": [ + [ + "26", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "84", + "ImspTQPwCqd", + "202503", + "70" + ], + [ + "25", + "ImspTQPwCqd", + "202504", + "46" + ], + [ + "81", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "13", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "57", + "ImspTQPwCqd", + "202503", + "48" + ], + [ + "24", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "8", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "80", + "ImspTQPwCqd", + "202504", + "47" + ], + [ + "3", + "ImspTQPwCqd", + "202505", + "67" + ], + [ + "14", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "67", + "ImspTQPwCqd", + "202504", + "45" + ], + [ + "74", + "ImspTQPwCqd", + "202503", + "48" + ], + [ + "83", + "ImspTQPwCqd", + "202504", + "42" + ], + [ + "0", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "5", + "ImspTQPwCqd", + "202503", + "70" + ], + [ + "52", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "54", + "ImspTQPwCqd", + "202503", + "57" + ], + [ + "44", + "ImspTQPwCqd", + "202504", + "43" + ], + [ + "10", + "ImspTQPwCqd", + "202505", + "61" + ], + [ + "42", + "ImspTQPwCqd", + "202503", + "46" + ], + [ + "15", + "ImspTQPwCqd", + "202504", + "64" + ], + [ + "26", + "ImspTQPwCqd", + "202505", + "45" + ], + [ + "62", + "ImspTQPwCqd", + "202503", + "57" + ], + [ + "78", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "80", + "ImspTQPwCqd", + "202503", + "62" + ], + [ + "7", + "ImspTQPwCqd", + "202505", + "52" + ], + [ + "39", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "71", + "ImspTQPwCqd", + "202505", + "44" + ], + [ + "71", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "44", + "ImspTQPwCqd", + "202503", + "57" + ], + [ + "34", + "ImspTQPwCqd", + "202503", + "40" + ], + [ + "88", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "56", + "ImspTQPwCqd", + "202503", + "44" + ], + [ + "41", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "59", + "ImspTQPwCqd", + "202505", + "48" + ], + [ + "61", + "ImspTQPwCqd", + "202504", + "52" + ], + [ + "28", + "ImspTQPwCqd", + "202505", + "52" + ], + [ + "9", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "16", + "ImspTQPwCqd", + "202505", + "46" + ], + [ + "80", + "ImspTQPwCqd", + "202505", + "37" + ], + [ + "67", + "ImspTQPwCqd", + "202503", + "35" + ], + [ + "63", + "ImspTQPwCqd", + "202504", + "35" + ], + [ + "6", + "ImspTQPwCqd", + "202505", + "65" + ], + [ + "28", + "ImspTQPwCqd", + "202503", + "44" + ], + [ + "68", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "72", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "47", + "ImspTQPwCqd", + "202503", + "45" + ], + [ + "13", + "ImspTQPwCqd", + "202504", + "51" + ], + [ + "56", + "ImspTQPwCqd", + "202505", + "51" + ], + [ + "66", + "ImspTQPwCqd", + "202504", + "43" + ], + [ + "75", + "ImspTQPwCqd", + "202505", + "51" + ], + [ + "82", + "ImspTQPwCqd", + "202505", + "49" + ], + [ + "16", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "56", + "ImspTQPwCqd", + "202504", + "30" + ], + [ + "31", + "ImspTQPwCqd", + "202504", + "50" + ], + [ + "52", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "34", + "ImspTQPwCqd", + "202504", + "50" + ], + [ + "30", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "20", + "ImspTQPwCqd", + "202503", + "49" + ], + [ + "76", + "ImspTQPwCqd", + "202503", + "49" + ], + [ + "63", + "ImspTQPwCqd", + "202503", + "49" + ], + [ + "29", + "ImspTQPwCqd", + "202505", + "53" + ], + [ + "20", + "ImspTQPwCqd", + "202505", + "43" + ], + [ + "12", + "ImspTQPwCqd", + "202505", + "48" + ], + [ + "63", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "42", + "ImspTQPwCqd", + "202504", + "42" + ], + [ + "64", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "9", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "12", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "19", + "ImspTQPwCqd", + "202504", + "50" + ], + [ + "76", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "17", + "ImspTQPwCqd", + "202505", + "42" + ], + [ + "21", + "ImspTQPwCqd", + "202504", + "51" + ], + [ + "50", + "ImspTQPwCqd", + "202504", + "63" + ], + [ + "6", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "83", + "ImspTQPwCqd", + "202505", + "56" + ], + [ + "31", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "88", + "ImspTQPwCqd", + "202503", + "45" + ], + [ + "36", + "ImspTQPwCqd", + "202505", + "52" + ], + [ + "61", + "ImspTQPwCqd", + "202503", + "45" + ], + [ + "51", + "ImspTQPwCqd", + "202505", + "62" + ], + [ + "76", + "ImspTQPwCqd", + "202505", + "42" + ], + [ + "2", + "ImspTQPwCqd", + "202504", + "45" + ], + [ + "53", + "ImspTQPwCqd", + "202504", + "41" + ], + [ + "43", + "ImspTQPwCqd", + "202504", + "41" + ], + [ + "10", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "2", + "ImspTQPwCqd", + "202505", + "51" + ], + [ + "70", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "46", + "ImspTQPwCqd", + "202505", + "51" + ], + [ + "36", + "ImspTQPwCqd", + "202503", + "54" + ], + [ + "86", + "ImspTQPwCqd", + "202503", + "61" + ], + [ + "19", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "23", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "35", + "ImspTQPwCqd", + "202503", + "65" + ], + [ + "70", + "ImspTQPwCqd", + "202505", + "38" + ], + [ + "3", + "ImspTQPwCqd", + "202504", + "38" + ], + [ + "79", + "ImspTQPwCqd", + "202504", + "52" + ], + [ + "33", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "43", + "ImspTQPwCqd", + "202503", + "46" + ], + [ + "19", + "ImspTQPwCqd", + "202505", + "37" + ], + [ + "35", + "ImspTQPwCqd", + "202504", + "46" + ], + [ + "2", + "ImspTQPwCqd", + "202503", + "41" + ], + [ + "54", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "51", + "ImspTQPwCqd", + "202504", + "56" + ], + [ + "50", + "ImspTQPwCqd", + "202505", + "57" + ], + [ + "22", + "ImspTQPwCqd", + "202503", + "60" + ], + [ + "46", + "ImspTQPwCqd", + "202504", + "61" + ], + [ + "8", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "61", + "ImspTQPwCqd", + "202505", + "60" + ], + [ + "39", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "48", + "ImspTQPwCqd", + "202505", + "44" + ], + [ + "64", + "ImspTQPwCqd", + "202503", + "58" + ], + [ + "65", + "ImspTQPwCqd", + "202504", + "47" + ], + [ + "7", + "ImspTQPwCqd", + "202504", + "40" + ], + [ + "60", + "ImspTQPwCqd", + "202504", + "38" + ], + [ + "38", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "33", + "ImspTQPwCqd", + "202504", + "41" + ], + [ + "52", + "ImspTQPwCqd", + "202505", + "48" + ], + [ + "29", + "ImspTQPwCqd", + "202504", + "42" + ], + [ + "11", + "ImspTQPwCqd", + "202504", + "45" + ], + [ + "72", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "29", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "32", + "ImspTQPwCqd", + "202504", + "64" + ], + [ + "15", + "ImspTQPwCqd", + "202503", + "54" + ], + [ + "55", + "ImspTQPwCqd", + "202504", + "63" + ], + [ + "21", + "ImspTQPwCqd", + "202505", + "54" + ], + [ + "60", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "86", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "30", + "ImspTQPwCqd", + "202504", + "64" + ], + [ + "48", + "ImspTQPwCqd", + "202503", + "58" + ], + [ + "26", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "33", + "ImspTQPwCqd", + "202505", + "43" + ], + [ + "60", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "69", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "34", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "15", + "ImspTQPwCqd", + "202505", + "44" + ], + [ + "71", + "ImspTQPwCqd", + "202503", + "48" + ], + [ + "66", + "ImspTQPwCqd", + "202503", + "57" + ], + [ + "72", + "ImspTQPwCqd", + "202505", + "47" + ], + [ + "24", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "77", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "40", + "ImspTQPwCqd", + "202503", + "56" + ], + [ + "38", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "44", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "67", + "ImspTQPwCqd", + "202505", + "49" + ], + [ + "83", + "ImspTQPwCqd", + "202503", + "39" + ], + [ + "69", + "ImspTQPwCqd", + "202504", + "36" + ], + [ + "49", + "ImspTQPwCqd", + "202503", + "46" + ], + [ + "37", + "ImspTQPwCqd", + "202503", + "60" + ], + [ + "87", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "45", + "ImspTQPwCqd", + "202504", + "58" + ], + [ + "4", + "ImspTQPwCqd", + "202505", + "41" + ], + [ + "4", + "ImspTQPwCqd", + "202504", + "42" + ], + [ + "81", + "ImspTQPwCqd", + "202504", + "51" + ], + [ + "82", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "40", + "ImspTQPwCqd", + "202504", + "51" + ], + [ + "85", + "ImspTQPwCqd", + "202503", + "43" + ], + [ + "16", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "9", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "17", + "ImspTQPwCqd", + "202503", + "45" + ], + [ + "45", + "ImspTQPwCqd", + "202505", + "45" + ], + [ + "55", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "57", + "ImspTQPwCqd", + "202505", + "45" + ], + [ + "73", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "0", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "58", + "ImspTQPwCqd", + "202503", + "56" + ], + [ + "49", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "11", + "ImspTQPwCqd", + "202505", + "57" + ], + [ + "54", + "ImspTQPwCqd", + "202504", + "34" + ], + [ + "53", + "ImspTQPwCqd", + "202505", + "38" + ], + [ + "53", + "ImspTQPwCqd", + "202503", + "41" + ], + [ + "84", + "ImspTQPwCqd", + "202505", + "47" + ], + [ + "57", + "ImspTQPwCqd", + "202504", + "35" + ], + [ + "17", + "ImspTQPwCqd", + "202504", + "51" + ], + [ + "59", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "18", + "ImspTQPwCqd", + "202504", + "52" + ], + [ + "68", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "74", + "ImspTQPwCqd", + "202505", + "55" + ], + [ + "65", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "59", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "62", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "78", + "ImspTQPwCqd", + "202503", + "41" + ], + [ + "84", + "ImspTQPwCqd", + "202504", + "62" + ], + [ + "47", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "11", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "65", + "ImspTQPwCqd", + "202503", + "60" + ], + [ + "46", + "ImspTQPwCqd", + "202503", + "59" + ], + [ + "25", + "ImspTQPwCqd", + "202503", + "56" + ], + [ + "87", + "ImspTQPwCqd", + "202505", + "49" + ], + [ + "38", + "ImspTQPwCqd", + "202504", + "52" + ], + [ + "8", + "ImspTQPwCqd", + "202505", + "43" + ], + [ + "14", + "ImspTQPwCqd", + "202505", + "58" + ], + [ + "18", + "ImspTQPwCqd", + "202505", + "47" + ], + [ + "31", + "ImspTQPwCqd", + "202505", + "46" + ], + [ + "41", + "ImspTQPwCqd", + "202505", + "45" + ], + [ + "70", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "22", + "ImspTQPwCqd", + "202504", + "40" + ], + [ + "87", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "5", + "ImspTQPwCqd", + "202504", + "63" + ], + [ + "6", + "ImspTQPwCqd", + "202504", + "53" + ], + [ + "30", + "ImspTQPwCqd", + "202503", + "36" + ], + [ + "23", + "ImspTQPwCqd", + "202505", + "44" + ], + [ + "45", + "ImspTQPwCqd", + "202503", + "51" + ], + [ + "27", + "ImspTQPwCqd", + "202505", + "61" + ], + [ + "4", + "ImspTQPwCqd", + "202503", + "54" + ], + [ + "25", + "ImspTQPwCqd", + "202505", + "62" + ], + [ + "66", + "ImspTQPwCqd", + "202505", + "41" + ], + [ + "55", + "ImspTQPwCqd", + "202503", + "46" + ], + [ + "64", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "28", + "ImspTQPwCqd", + "202504", + "62" + ], + [ + "68", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "37", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "21", + "ImspTQPwCqd", + "202503", + "53" + ], + [ + "75", + "ImspTQPwCqd", + "202504", + "45" + ], + [ + "39", + "ImspTQPwCqd", + "202505", + "53" + ], + [ + "40", + "ImspTQPwCqd", + "202505", + "60" + ], + [ + "10", + "ImspTQPwCqd", + "202504", + "46" + ], + [ + "85", + "ImspTQPwCqd", + "202505", + "58" + ], + [ + "1", + "ImspTQPwCqd", + "202503", + "44" + ], + [ + "79", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "7", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "5", + "ImspTQPwCqd", + "202505", + "46" + ], + [ + "75", + "ImspTQPwCqd", + "202503", + "36" + ], + [ + "51", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "81", + "ImspTQPwCqd", + "202505", + "37" + ], + [ + "18", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "24", + "ImspTQPwCqd", + "202505", + "47" + ], + [ + "32", + "ImspTQPwCqd", + "202505", + "61" + ], + [ + "78", + "ImspTQPwCqd", + "202504", + "55" + ], + [ + "62", + "ImspTQPwCqd", + "202505", + "53" + ], + [ + "42", + "ImspTQPwCqd", + "202505", + "59" + ], + [ + "77", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "49", + "ImspTQPwCqd", + "202505", + "45" + ], + [ + "0", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "20", + "ImspTQPwCqd", + "202504", + "54" + ], + [ + "37", + "ImspTQPwCqd", + "202505", + "31" + ], + [ + "79", + "ImspTQPwCqd", + "202505", + "46" + ], + [ + "22", + "ImspTQPwCqd", + "202505", + "59" + ], + [ + "58", + "ImspTQPwCqd", + "202504", + "63" + ], + [ + "74", + "ImspTQPwCqd", + "202504", + "40" + ], + [ + "82", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "41", + "ImspTQPwCqd", + "202503", + "62" + ], + [ + "32", + "ImspTQPwCqd", + "202503", + "52" + ], + [ + "85", + "ImspTQPwCqd", + "202504", + "32" + ], + [ + "50", + "ImspTQPwCqd", + "202503", + "63" + ], + [ + "35", + "ImspTQPwCqd", + "202505", + "40" + ], + [ + "27", + "ImspTQPwCqd", + "202503", + "50" + ], + [ + "69", + "ImspTQPwCqd", + "202505", + "49" + ], + [ + "88", + "ImspTQPwCqd", + "202504", + "52" + ], + [ + "23", + "ImspTQPwCqd", + "202503", + "48" + ], + [ + "73", + "ImspTQPwCqd", + "202505", + "50" + ], + [ + "1", + "ImspTQPwCqd", + "202504", + "48" + ], + [ + "1", + "ImspTQPwCqd", + "202505", + "53" + ], + [ + "86", + "ImspTQPwCqd", + "202505", + "43" + ], + [ + "47", + "ImspTQPwCqd", + "202505", + "66" + ], + [ + "14", + "ImspTQPwCqd", + "202504", + "38" + ], + [ + "73", + "ImspTQPwCqd", + "202504", + "59" + ], + [ + "43", + "ImspTQPwCqd", + "202505", + "49" + ], + [ + "77", + "ImspTQPwCqd", + "202503", + "55" + ], + [ + "13", + "ImspTQPwCqd", + "202503", + "47" + ], + [ + "12", + "ImspTQPwCqd", + "202503", + "63" + ], + [ + "48", + "ImspTQPwCqd", + "202504", + "44" + ], + [ + "3", + "ImspTQPwCqd", + "202503", + "56" + ], + [ + "36", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "27", + "ImspTQPwCqd", + "202504", + "49" + ], + [ + "58", + "ImspTQPwCqd", + "202505", + "48" + ] + ], + "height": 267, + "headerWidth": 4 +} \ No newline at end of file diff --git a/src/__demo__/data/event/optionset.visualization.json b/src/__demo__/data/event/optionset.visualization.json index 488668353..473016c59 100644 --- a/src/__demo__/data/event/optionset.visualization.json +++ b/src/__demo__/data/event/optionset.visualization.json @@ -1,5 +1,5 @@ { - "name": "Numeric", + "name": "Text with option set", "created": "2025-06-30T10:27:41.277", "lastUpdated": "2025-06-30T10:27:41.277", "translations": [], @@ -129,7 +129,7 @@ "dimension": "Zj7UnCAulEk.fWIAEtYVEGk" } ], - "displayName": "A1 numeric-optionset", + "displayName": "Text with option set", "access": { "manage": true, "externalize": true, @@ -159,7 +159,7 @@ "name": "Age in years" } }, - "displayFormName": "A1 text-optionset", + "displayFormName": "Text with option set", "id": "kNl4fqsY9hJ", "attributeValues": [] } \ No newline at end of file diff --git a/src/modules/response/__tests__/numeric.spec.js b/src/modules/response/__tests__/numeric.spec.js new file mode 100644 index 000000000..89c504eeb --- /dev/null +++ b/src/modules/response/__tests__/numeric.spec.js @@ -0,0 +1,238 @@ +import response from '../../../__demo__/data/event/numeric.data.json' +import responseOrg from '../../../__demo__/data/event/numeric.data.org.json' +import { + applyNumericHandler, + getNumericDimension, + getNumericItems, + getNumericRows, + getPrefixedValue, + getUnique, + sortStringsAsNumbersAsc, +} from '../numeric.js' + +const dimensionId = 'Zj7UnCAulEk.fWIAEtYVEGk' +const headerIndex = 0 + +describe('numeric', () => { + describe('getUnique', () => { + it('removes duplicate string numbers and preserves first occurrence', () => { + 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('returns an empty array when given an empty array', () => { + expect(getUnique([])).toEqual([]) + }) + + it('handles array with only one item', () => { + expect(getUnique(['42'])).toEqual(['42']) + }) + + it('preserves order of first occurrence', () => { + const arr = ['2', '1', '2', '1'] + expect(getUnique(arr)).toEqual(['2', '1']) + }) + }) + + describe('sortStringsAsNumbersAsc', () => { + it('sorts array of number strings numerically ascending', () => { + const arr = ['10', '2', '1'] + expect(sortStringsAsNumbersAsc(arr)).toEqual(['1', '2', '10']) + }) + + it('handles negative numbers and zeros as strings', () => { + const arr = ['0', '-2', '5', '-10'] + expect(sortStringsAsNumbersAsc(arr)).toEqual([ + '-10', + '-2', + '0', + '5', + ]) + }) + + it('sorts strings with leading zeros numerically', () => { + const arr = ['01', '1', '002', '2'] + expect(sortStringsAsNumbersAsc(arr)).toEqual([ + '01', + '1', + '002', + '2', + ]) + }) + + it('returns empty array when given empty array', () => { + expect(sortStringsAsNumbersAsc([])).toEqual([]) + }) + + it('handles array with one item', () => { + expect(sortStringsAsNumbersAsc(['7'])).toEqual(['7']) + }) + }) + + describe('getPrefixedValue', () => { + it('returns prefix and value separated by a colon', () => { + expect(getPrefixedValue('123', 'id')).toBe('id:123') + }) + + it('works with empty string prefix', () => { + expect(getPrefixedValue('abc', '')).toBe(':abc') + }) + + it('works with empty string value', () => { + expect(getPrefixedValue('', 'test')).toBe('test:') + }) + + it('works with both prefix and value empty', () => { + expect(getPrefixedValue('', '')).toBe(':') + }) + it('works with numbers as value', () => { + expect(getPrefixedValue(42, 'num')).toBe('num:42') + }) + + it('works with numbers as prefix', () => { + expect(getPrefixedValue('data', 99)).toBe('99:data') + }) + + it('works with non-string types as both prefix and value', () => { + expect(getPrefixedValue(null, undefined)).toBe('undefined:null') + expect(getPrefixedValue(true, false)).toBe('false:true') + }) + }) + + describe('getNumericItems', () => { + it('returns an object with prefixed keys and correct names', () => { + const values = ['1', '2', '10'] + + expect(getNumericItems(values, dimensionId)).toEqual({ + 'Zj7UnCAulEk.fWIAEtYVEGk:1': { name: '1' }, + 'Zj7UnCAulEk.fWIAEtYVEGk:2': { name: '2' }, + 'Zj7UnCAulEk.fWIAEtYVEGk:10': { name: '10' }, + }) + }) + + it('handles empty values array', () => { + expect(getNumericItems([], 'prefix')).toEqual({}) + }) + + it('handles empty dimensionId', () => { + const values = ['a', 'b'] + expect(getNumericItems(values, '')).toEqual({ + ':a': { name: 'a' }, + ':b': { name: 'b' }, + }) + }) + + it('works with non-string values', () => { + const values = [1, 2, null, undefined] + expect(getNumericItems(values, 'num')).toEqual({ + 'num:1': { name: 1 }, + 'num:2': { name: 2 }, + 'num:null': { name: null }, + 'num:undefined': { name: undefined }, + }) + }) + + it('handles duplicate values, last one wins', () => { + const values = ['1', '2', '1'] + expect(getNumericItems(values, 'x')).toEqual({ + 'x:1': { name: '1' }, // Last occurrence + 'x:2': { name: '2' }, + }) + }) + + it('handles numbers as dimensionId', () => { + const values = ['42'] + expect(getNumericItems(values, 7)).toEqual({ + '7:42': { name: '42' }, + }) + }) + }) + + describe('getNumericDimension', () => { + it('returns object with dimensionId as key and correctly prefixed values', () => { + const values = ['1', '2', '10'] + expect(getNumericDimension(values, dimensionId)).toEqual({ + 'Zj7UnCAulEk.fWIAEtYVEGk': [ + 'Zj7UnCAulEk.fWIAEtYVEGk:1', + 'Zj7UnCAulEk.fWIAEtYVEGk:2', + 'Zj7UnCAulEk.fWIAEtYVEGk:10', + ], + }) + }) + + it('handles empty values array', () => { + expect(getNumericDimension([], 'prefix')).toEqual({ + prefix: [], + }) + }) + + it('handles empty string as dimensionId', () => { + const values = ['1', '2', '10'] + expect(getNumericDimension(values, '')).toEqual({ + '': [':1', ':2', ':10'], + }) + }) + }) + + describe('getNumericRows', () => { + it('prefixes value at headerIndex for each row', () => { + const rows = [ + ['a', '1', 'x'], + ['b', '2', 'y'], + ['c', '10', 'z'], + ] + const headerIndex = 1 + + expect(getNumericRows(rows, headerIndex, dimensionId)).toEqual([ + ['a', 'Zj7UnCAulEk.fWIAEtYVEGk:1', 'x'], + ['b', 'Zj7UnCAulEk.fWIAEtYVEGk:2', 'y'], + ['c', 'Zj7UnCAulEk.fWIAEtYVEGk:10', 'z'], + ]) + }) + + it('does not modify rows where the value at headerIndex is an empty string', () => { + const rows = [ + ['a', '', 'x'], + ['b', '2', 'y'], + ] + const headerIndex = 1 + + expect(getNumericRows(rows, headerIndex, dimensionId)).toEqual([ + ['a', '', 'x'], + ['b', 'Zj7UnCAulEk.fWIAEtYVEGk:2', 'y'], + ]) + }) + + it('returns new array and does not mutate original rows', () => { + const rows = [ + ['x', '5'], + ['y', '6'], + ] + const result = getNumericRows(rows, 1, 'id') + expect(result).not.toBe(rows) + expect(result[0]).not.toBe(rows[0]) + + expect(rows).toEqual([ + ['x', '5'], + ['y', '6'], + ]) + }) + + it('handles empty rows array', () => { + expect(getNumericRows([], 1, 'a')).toEqual([]) + }) + }) + + describe('applyNumericHandler', () => { + it('should return the transformed response', () => { + expect(applyNumericHandler(responseOrg, headerIndex)).toEqual( + response + ) + }) + }) +}) diff --git a/src/modules/response/__tests__/optionSet.spec.js b/src/modules/response/__tests__/optionSet.spec.js index b73364635..51eb659d7 100644 --- a/src/modules/response/__tests__/optionSet.spec.js +++ b/src/modules/response/__tests__/optionSet.spec.js @@ -1,36 +1,50 @@ import response from '../../../__demo__/data/event/optionset.data.json' import responseOrg from '../../../__demo__/data/event/optionset.data.org.json' -import { getOptionCodeIdMap, getOptionIdRows, applyOptionSetHandler } from "../optionSet.js" +import { + getOptionCodeIdMap, + getOptionIdRows, + applyOptionSetHandler, +} from '../optionSet.js' -const modeOfDischargeId = 'Zj7UnCAulEk.fWIAEtYVEGk' +const dimensionId = 'Zj7UnCAulEk.fWIAEtYVEGk' const headerIndex = 0 const testOptionCodeIdMap = { - "MODABSC": "Fhbf4aKpZmZ", - "MODDIED": "gj2fKKyp8OH", - "MODTRANS": "fShHdgT7XGb", - "MODDISCH": "yeod5tOXpkP", + MODABSC: 'Fhbf4aKpZmZ', + MODDIED: 'gj2fKKyp8OH', + MODTRANS: 'fShHdgT7XGb', + MODDISCH: 'yeod5tOXpkP', } describe('optionSet', () => { describe('getOptionCodeIdMap', () => { it('should create an option code:id object', () => { - const testOptionIds = response.metaData.dimensions[modeOfDischargeId] + const testOptionIds = response.metaData.dimensions[dimensionId] const testOptionItems = response.metaData.items - expect(getOptionCodeIdMap(testOptionIds, testOptionItems)).toEqual(testOptionCodeIdMap) + expect(getOptionCodeIdMap(testOptionIds, testOptionItems)).toEqual( + testOptionCodeIdMap + ) }) }) describe('getOptionIdRows', () => { it('should replace option codes with ids in the right index', () => { - expect(getOptionIdRows(responseOrg.rows, testOptionCodeIdMap, headerIndex)).toEqual(response.rows) + expect( + getOptionIdRows( + responseOrg.rows, + testOptionCodeIdMap, + headerIndex + ) + ).toEqual(response.rows) }) }) describe('applyOptionSetHandler', () => { it('should return the transformed response', () => { - expect(applyOptionSetHandler(responseOrg, headerIndex)).toEqual(response) + expect(applyOptionSetHandler(responseOrg, headerIndex)).toEqual( + response + ) }) }) -}) \ No newline at end of file +}) diff --git a/src/modules/response/numeric.js b/src/modules/response/numeric.js new file mode 100644 index 000000000..0dc0ee7db --- /dev/null +++ b/src/modules/response/numeric.js @@ -0,0 +1,58 @@ +export const getUnique = (array) => [...new Set(array)] + +export const sortStringsAsNumbersAsc = (arr) => { + return arr.slice().sort((a, b) => Number(a) - Number(b)) +} + +export const getPrefixedValue = (value, prefix) => `${prefix}:${value}` + +export const getNumericItems = (values, dimensionId) => + values.reduce((items, value) => { + items[getPrefixedValue(value, dimensionId)] = { + name: value, + } + return items + }, {}) + +export const getNumericDimension = (values, dimensionId) => ({ + [dimensionId]: values.map((value) => getPrefixedValue(value, dimensionId)), +}) + +export const getNumericRows = (rows, headerIndex, dimensionId) => { + let row + let value + return rows.map((r) => { + value = r[headerIndex] + + if (value !== '') { + row = [...r] + row[headerIndex] = getPrefixedValue(value, dimensionId) + return row + } + + return r + }) +} + +export const applyNumericHandler = (response, headerIndex) => { + const uniqueSortedValues = sortStringsAsNumbersAsc( + getUnique(response.rows.map((r) => r[headerIndex])) + ) + + const dimensionId = response.headers[headerIndex].name + + return { + ...response, + metaData: { + items: { + ...response.metaData.items, + ...getNumericItems(uniqueSortedValues, dimensionId), + }, + dimensions: { + ...response.metaData.dimensions, + ...getNumericDimension(uniqueSortedValues, dimensionId), + }, + }, + rows: [...getNumericRows(response.rows, headerIndex, dimensionId)], + } +} diff --git a/src/modules/response/optionSet.js b/src/modules/response/optionSet.js index fda8390cd..8bcd79045 100644 --- a/src/modules/response/optionSet.js +++ b/src/modules/response/optionSet.js @@ -1,24 +1,35 @@ -export const getOptionCodeIdMap = (optionIds, metaDataItems) => optionIds.reduce((map, optionId) => { - map[metaDataItems[optionId].code] = optionId - return map -}, {}) +export const getOptionCodeIdMap = (optionIds, metaDataItems) => + optionIds.reduce((map, optionId) => { + map[metaDataItems[optionId].code] = optionId + return map + }, {}) export const getOptionIdRows = (rows, optionCodeIdMap, headerIndex) => { let row - return rows.map(r => { - row = [...r] - row[headerIndex] = optionCodeIdMap[row[headerIndex]] - return row + let value + return rows.map((r) => { + value = r[headerIndex] + + if (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) + const optionCodeIdMap = getOptionCodeIdMap( + optionIds, + response.metaData.items + ) return { ...response, - rows: getOptionIdRows(response.rows, optionCodeIdMap, headerIndex) + rows: getOptionIdRows(response.rows, optionCodeIdMap, headerIndex), } -} \ No newline at end of file +} From 2f74e24791d6d81cc205e9b682448d81740095e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Fri, 1 Aug 2025 16:25:56 +0200 Subject: [PATCH 09/50] chore: add handlers and tests for all types --- src/__demo__/data/event/boolean.data.json | 110 +++------------ src/__demo__/data/event/boolean.data.org.json | 106 ++++++++++++++ src/__demo__/data/event/yesonly.data.json | 71 +++------- src/__demo__/data/event/yesonly.data.org.json | 132 ++++++++++++++++++ .../response/__tests__/boolean.spec.js | 16 +++ .../response/__tests__/numeric.spec.js | 28 ---- .../response/__tests__/response.spec.js | 37 +++++ src/modules/response/boolean.js | 26 ++++ src/modules/response/numeric.js | 27 ++-- src/modules/response/optionSet.js | 12 +- src/modules/response/response.js | 36 +++++ 11 files changed, 410 insertions(+), 191 deletions(-) create mode 100644 src/__demo__/data/event/boolean.data.org.json create mode 100644 src/__demo__/data/event/yesonly.data.org.json create mode 100644 src/modules/response/__tests__/boolean.spec.js create mode 100644 src/modules/response/__tests__/response.spec.js create mode 100644 src/modules/response/boolean.js create mode 100644 src/modules/response/response.js diff --git a/src/__demo__/data/event/boolean.data.json b/src/__demo__/data/event/boolean.data.json index 73b80f2df..d30a3d1e1 100644 --- a/src/__demo__/data/event/boolean.data.json +++ b/src/__demo__/data/event/boolean.data.json @@ -78,27 +78,18 @@ "name": "Birth" }, "A03MvHHogjR.bx6fsa0t90x:0": { - "name": "Yes" + "name": "No" }, "A03MvHHogjR.bx6fsa0t90x:1": { - "name": "No" + "name": "Yes" }, "A03MvHHogjR.bx6fsa0t90x:": { "name": "N/A" } }, "dimensions": { - "pe": [ - "202501", - "202502", - "202503", - "202504", - "202505", - "202506" - ], - "ou": [ - "ImspTQPwCqd" - ], + "pe": ["202501", "202502", "202503", "202504", "202505", "202506"], + "ou": ["ImspTQPwCqd"], "A03MvHHogjR.bx6fsa0t90x": [ "A03MvHHogjR.bx6fsa0t90x:0", "A03MvHHogjR.bx6fsa0t90x:1", @@ -109,85 +100,20 @@ "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" - ], - [ - "A03MvHHogjR.bx6fsa0t90x:", - "ImspTQPwCqd", - "202501", - "1" - ], - [ - "A03MvHHogjR.bx6fsa0t90x:0", - "ImspTQPwCqd", - "202502", - "311" - ] + ["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"], + ["A03MvHHogjR.bx6fsa0t90x:", "ImspTQPwCqd", "202501", "1"], + ["A03MvHHogjR.bx6fsa0t90x:0", "ImspTQPwCqd", "202502", "311"] ], "height": 13, "headerWidth": 4 -} \ No newline at end of file +} 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/yesonly.data.json b/src/__demo__/data/event/yesonly.data.json index 5430e78be..dc27f02ee 100644 --- a/src/__demo__/data/event/yesonly.data.json +++ b/src/__demo__/data/event/yesonly.data.json @@ -95,8 +95,14 @@ "pe": { "name": "Period" }, + "jfuXZB3A1ko.hwG20Dyj6RK:0": { + "name": "No" + }, "jfuXZB3A1ko.hwG20Dyj6RK:1": { "name": "Yes" + }, + "jfuXZB3A1ko.hwG20Dyj6RK:": { + "name": "N/A" } }, "dimensions": { @@ -114,66 +120,25 @@ "202505", "202506" ], - "ou": [ - "ImspTQPwCqd" - ], + "ou": ["ImspTQPwCqd"], "jfuXZB3A1ko.hwG20Dyj6RK": [ - "jfuXZB3A1ko.hwG20Dyj6RK:1" + "jfuXZB3A1ko.hwG20Dyj6RK:1", + "jfuXZB3A1ko.hwG20Dyj6RK:" ] } }, "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:", "ImspTQPwCqd", "202412", "1"], + ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202503", "2"], + ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202504", "1"], + ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202502", "1"], + ["jfuXZB3A1ko.hwG20Dyj6RK:1", "ImspTQPwCqd", "202501", "1"], + ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202501", "2"], + ["jfuXZB3A1ko.hwG20Dyj6RK:1", "ImspTQPwCqd", "202412", "3"], + ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202411", "1"] ], "height": 8, "headerWidth": 4 -} \ No newline at end of file +} 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..b3d238775 --- /dev/null +++ b/src/__demo__/data/event/yesonly.data.org.json @@ -0,0 +1,132 @@ +{ + "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": { + "202407": { + "name": "July 2024" + }, + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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": [ + "202407", + "202408", + "202409", + "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"] + ], + "height": 8, + "headerWidth": 4 +} diff --git a/src/modules/response/__tests__/boolean.spec.js b/src/modules/response/__tests__/boolean.spec.js new file mode 100644 index 000000000..796a5a343 --- /dev/null +++ b/src/modules/response/__tests__/boolean.spec.js @@ -0,0 +1,16 @@ +import response from '../../../__demo__/data/event/boolean.data.json' +import responseOrg from '../../../__demo__/data/event/boolean.data.org.json' +import { applyBooleanHandler } from '../boolean.js' + +const dimensionId = 'Zj7UnCAulEk.fWIAEtYVEGk' +const headerIndex = 0 + +describe('boolean', () => { + describe('applyBooleanHandler', () => { + it('should return the transformed response', () => { + expect(applyBooleanHandler(responseOrg, headerIndex)).toEqual( + response + ) + }) + }) +}) diff --git a/src/modules/response/__tests__/numeric.spec.js b/src/modules/response/__tests__/numeric.spec.js index 89c504eeb..278e7bacb 100644 --- a/src/modules/response/__tests__/numeric.spec.js +++ b/src/modules/response/__tests__/numeric.spec.js @@ -195,34 +195,6 @@ describe('numeric', () => { ]) }) - it('does not modify rows where the value at headerIndex is an empty string', () => { - const rows = [ - ['a', '', 'x'], - ['b', '2', 'y'], - ] - const headerIndex = 1 - - expect(getNumericRows(rows, headerIndex, dimensionId)).toEqual([ - ['a', '', 'x'], - ['b', 'Zj7UnCAulEk.fWIAEtYVEGk:2', 'y'], - ]) - }) - - it('returns new array and does not mutate original rows', () => { - const rows = [ - ['x', '5'], - ['y', '6'], - ] - const result = getNumericRows(rows, 1, 'id') - expect(result).not.toBe(rows) - expect(result[0]).not.toBe(rows[0]) - - expect(rows).toEqual([ - ['x', '5'], - ['y', '6'], - ]) - }) - it('handles empty rows array', () => { expect(getNumericRows([], 1, 'a')).toEqual([]) }) diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js new file mode 100644 index 000000000..10e3478b5 --- /dev/null +++ b/src/modules/response/__tests__/response.spec.js @@ -0,0 +1,37 @@ +import responseBoolean from '../../../__demo__/data/event/boolean.data.json' +import responseBooleanOrg from '../../../__demo__/data/event/boolean.data.org.json' +import responseNumeric from '../../../__demo__/data/event/numeric.data.json' +import responseNumericOrg from '../../../__demo__/data/event/numeric.data.org.json' +import responseOptionSet from '../../../__demo__/data/event/optionset.data.json' +import responseOptionSetOrg from '../../../__demo__/data/event/optionset.data.org.json' +import responseYesOnly from '../../../__demo__/data/event/yesonly.data.json' +import responseYesOnlyOrg from '../../../__demo__/data/event/yesonly.data.org.json' +import { transformResponse } from '../response.js' + +describe('response', () => { + describe('transformResponse', () => { + it('transforms boolean response', () => { + expect(transformResponse(responseBooleanOrg)).toEqual( + responseBoolean + ) + }) + + it('transforms yes only response', () => { + expect(transformResponse(responseYesOnlyOrg)).toEqual( + responseYesOnly + ) + }) + + it('transforms option set response', () => { + expect(transformResponse(responseOptionSetOrg)).toEqual( + responseOptionSet + ) + }) + + it('transforms numeric response', () => { + expect(transformResponse(responseNumericOrg)).toEqual( + responseNumeric + ) + }) + }) +}) diff --git a/src/modules/response/boolean.js b/src/modules/response/boolean.js new file mode 100644 index 000000000..dfbd79a17 --- /dev/null +++ b/src/modules/response/boolean.js @@ -0,0 +1,26 @@ +import i18n from '@dhis2/d2-i18n' +import { applyNumericHandler, getPrefixedValue } from './numeric.js' + +export const applyBooleanHandler = (response, headerIndex) => { + const dimensionId = response.headers[headerIndex].name + const numericResponse = applyNumericHandler(response, headerIndex) + + return { + ...numericResponse, + metaData: { + ...numericResponse.metaData, + items: { + ...numericResponse.metaData.items, + [getPrefixedValue('0', dimensionId)]: { + name: i18n.t('No'), + }, + [getPrefixedValue('1', dimensionId)]: { + name: i18n.t('Yes'), + }, + [getPrefixedValue('', dimensionId)]: { + name: i18n.t('N/A'), + }, + }, + }, + } +} diff --git a/src/modules/response/numeric.js b/src/modules/response/numeric.js index 0dc0ee7db..487df8049 100644 --- a/src/modules/response/numeric.js +++ b/src/modules/response/numeric.js @@ -1,7 +1,18 @@ export const getUnique = (array) => [...new Set(array)] -export const sortStringsAsNumbersAsc = (arr) => { - return arr.slice().sort((a, b) => Number(a) - Number(b)) +const sortStringsAsNumbersAsc = (arr) => { + return arr.slice().sort((a, b) => { + if (a === '' && b === '') { + return 0 + } + if (a === '') { + return 1 + } + if (b === '') { + return -1 + } + return Number(a) - Number(b) + }) } export const getPrefixedValue = (value, prefix) => `${prefix}:${value}` @@ -21,16 +32,12 @@ export const getNumericDimension = (values, dimensionId) => ({ export const getNumericRows = (rows, headerIndex, dimensionId) => { let row let value + return rows.map((r) => { value = r[headerIndex] - - if (value !== '') { - row = [...r] - row[headerIndex] = getPrefixedValue(value, dimensionId) - return row - } - - return r + row = [...r] + row[headerIndex] = getPrefixedValue(value, dimensionId) + return row }) } diff --git a/src/modules/response/optionSet.js b/src/modules/response/optionSet.js index 8bcd79045..9380ef3bb 100644 --- a/src/modules/response/optionSet.js +++ b/src/modules/response/optionSet.js @@ -7,16 +7,12 @@ export const getOptionCodeIdMap = (optionIds, metaDataItems) => export const getOptionIdRows = (rows, optionCodeIdMap, headerIndex) => { let row let value + return rows.map((r) => { value = r[headerIndex] - - if (value !== '') { - row = [...r] - row[headerIndex] = optionCodeIdMap[value] - return row - } - - return r + row = [...r] + row[headerIndex] = optionCodeIdMap[value] + return row }) } diff --git a/src/modules/response/response.js b/src/modules/response/response.js new file mode 100644 index 000000000..9633ce553 --- /dev/null +++ b/src/modules/response/response.js @@ -0,0 +1,36 @@ +import { isBooleanValueType, isNumericValueType } from '../valueTypes.js' +import { applyBooleanHandler } from './boolean.js' +import { applyNumericHandler } from './numeric.js' +import { applyOptionSetHandler } from './optionSet.js' + +export const transformResponse = (response) => { + let transformedResponse = { + ...response, + } + + response.headers.forEach((header, index) => { + if (header.meta) { + if (header.optionSet) { + transformedResponse = applyOptionSetHandler( + transformedResponse, + index + ) + } else if ( + isNumericValueType(header.valueType) && + !header.legendSet + ) { + transformedResponse = applyNumericHandler( + transformedResponse, + index + ) + } else if (isBooleanValueType(header.valueType)) { + transformedResponse = applyBooleanHandler( + transformedResponse, + index + ) + } + } + }) + + return transformedResponse +} From edb5a4fc2aee611b6f00a38ceb54367dfe7161f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 4 Aug 2025 14:43:13 +0200 Subject: [PATCH 10/50] chore: add data and tests for multiple option sets with shared codes --- src/__demo__/PivotTable.event.stories.js | 27 ++- src/__demo__/data/event/optionsets.data.json | 123 ++++++++++++++ .../data/event/optionsets.data.org.json | 123 ++++++++++++++ .../data/event/optionsets.visualization.json | 158 ++++++++++++++++++ .../response/__tests__/response.spec.js | 32 ++-- src/modules/response/numeric.js | 2 +- 6 files changed, 450 insertions(+), 15 deletions(-) create mode 100644 src/__demo__/data/event/optionsets.data.json create mode 100644 src/__demo__/data/event/optionsets.data.org.json create mode 100644 src/__demo__/data/event/optionsets.visualization.json diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index ebf7cf590..d41b53498 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -9,6 +9,8 @@ import numericData from './data/event/numeric.data.json' import numericVisualization from './data/event/numeric.visualization.json' import optionsetData from './data/event/optionset.data.json' import optionsetVisualization from './data/event/optionset.visualization.json' +import optionsetsData from './data/event/optionsets.data.json' +import optionsetsVisualization from './data/event/optionsets.visualization.json' import yesonlyData from './data/event/yesonly.data.json' import yesonlyVisualization from './data/event/yesonly.visualization.json' @@ -91,7 +93,10 @@ export const NumericLegendset = (_, { pivotTableOptions }) => { } return (
- +
) } @@ -118,6 +123,24 @@ Optionset.story = { name: 'Optionset', } +export const Optionsets = (_, { pivotTableOptions }) => { + const visualization = { + ...optionsetsVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +Optionset.story = { + name: 'Optionset', +} + export const Boolean = (_, { pivotTableOptions }) => { const visualization = { ...booleanVisualization, @@ -152,4 +175,4 @@ export const Yesonly = (_, { pivotTableOptions }) => { Yesonly.story = { name: 'Boolean', -} \ No newline at end of file +} diff --git a/src/__demo__/data/event/optionsets.data.json b/src/__demo__/data/event/optionsets.data.json new file mode 100644 index 000000000..89ecd84f7 --- /dev/null +++ b/src/__demo__/data/event/optionsets.data.json @@ -0,0 +1,123 @@ +{ + "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"] + ], + "height": 12 +} diff --git a/src/__demo__/data/event/optionsets.data.org.json b/src/__demo__/data/event/optionsets.data.org.json new file mode 100644 index 000000000..669abd3a0 --- /dev/null +++ b/src/__demo__/data/event/optionsets.data.org.json @@ -0,0 +1,123 @@ +{ + "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"] + ], + "height": 12 +} diff --git a/src/__demo__/data/event/optionsets.visualization.json b/src/__demo__/data/event/optionsets.visualization.json new file mode 100644 index 000000000..38f6ccd33 --- /dev/null +++ b/src/__demo__/data/event/optionsets.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/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index 10e3478b5..0f1d4f3dc 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -4,21 +4,17 @@ import responseNumeric from '../../../__demo__/data/event/numeric.data.json' import responseNumericOrg from '../../../__demo__/data/event/numeric.data.org.json' import responseOptionSet from '../../../__demo__/data/event/optionset.data.json' import responseOptionSetOrg from '../../../__demo__/data/event/optionset.data.org.json' +import responseOptionSets from '../../../__demo__/data/event/optionsets.data.json' +import responseOptionSetsOrg from '../../../__demo__/data/event/optionsets.data.org.json' import responseYesOnly from '../../../__demo__/data/event/yesonly.data.json' import responseYesOnlyOrg from '../../../__demo__/data/event/yesonly.data.org.json' import { transformResponse } from '../response.js' describe('response', () => { describe('transformResponse', () => { - it('transforms boolean response', () => { - expect(transformResponse(responseBooleanOrg)).toEqual( - responseBoolean - ) - }) - - it('transforms yes only response', () => { - expect(transformResponse(responseYesOnlyOrg)).toEqual( - responseYesOnly + it('transforms numeric response', () => { + expect(transformResponse(responseNumericOrg)).toEqual( + responseNumeric ) }) @@ -28,9 +24,21 @@ describe('response', () => { ) }) - it('transforms numeric response', () => { - expect(transformResponse(responseNumericOrg)).toEqual( - responseNumeric + it('transforms option set response with non-unique codes across two option sets', () => { + expect(transformResponse(responseOptionSetsOrg)).toEqual( + responseOptionSets + ) + }) + + it('transforms boolean response', () => { + expect(transformResponse(responseBooleanOrg)).toEqual( + responseBoolean + ) + }) + + it('transforms yes only response', () => { + expect(transformResponse(responseYesOnlyOrg)).toEqual( + responseYesOnly ) }) }) diff --git a/src/modules/response/numeric.js b/src/modules/response/numeric.js index 487df8049..f82e5b320 100644 --- a/src/modules/response/numeric.js +++ b/src/modules/response/numeric.js @@ -1,6 +1,6 @@ export const getUnique = (array) => [...new Set(array)] -const sortStringsAsNumbersAsc = (arr) => { +export const sortStringsAsNumbersAsc = (arr) => { return arr.slice().sort((a, b) => { if (a === '' && b === '') { return 0 From c6706c19beedcdd1e18dcd3d9be6b86e2ca3df76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 4 Aug 2025 14:54:11 +0200 Subject: [PATCH 11/50] chore: naming --- src/__demo__/PivotTable.event.stories.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index d41b53498..3ae443565 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -123,7 +123,7 @@ Optionset.story = { name: 'Optionset', } -export const Optionsets = (_, { pivotTableOptions }) => { +export const OptionsetsNonUniqueCodes = (_, { pivotTableOptions }) => { const visualization = { ...optionsetsVisualization, ...visualizationReset, @@ -137,8 +137,8 @@ export const Optionsets = (_, { pivotTableOptions }) => { ) } -Optionset.story = { - name: 'Optionset', +OptionsetsNonUniqueCodes.story = { + name: 'Optionset, non-unique codes', } export const Boolean = (_, { pivotTableOptions }) => { From 1b4c67d815efa960aec9cae6baec83d31b1be932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 4 Aug 2025 16:08:35 +0200 Subject: [PATCH 12/50] chore: clean up option set data --- src/__demo__/data/event/optionset.data.json | 168 ++---------------- .../data/event/optionset.data.org.json | 168 ++---------------- 2 files changed, 30 insertions(+), 306 deletions(-) diff --git a/src/__demo__/data/event/optionset.data.json b/src/__demo__/data/event/optionset.data.json index bce6b1aab..addfec7fd 100644 --- a/src/__demo__/data/event/optionset.data.json +++ b/src/__demo__/data/event/optionset.data.json @@ -84,14 +84,8 @@ } }, "dimensions": { - "pe": [ - "202504", - "202505", - "202506" - ], - "ou": [ - "ImspTQPwCqd" - ], + "pe": ["202504", "202505", "202506"], + "ou": ["ImspTQPwCqd"], "Zj7UnCAulEk.fWIAEtYVEGk": [ "yeod5tOXpkP", "gj2fKKyp8OH", @@ -104,150 +98,18 @@ "headerWidth": 4, "width": 4, "rows": [ - [ - "yeod5tOXpkP", - "ImspTQPwCqd", - "202505", - "495" - ], - [ - "fShHdgT7XGb", - "ImspTQPwCqd", - "202504", - "545" - ], - [ - "Fhbf4aKpZmZ", - "ImspTQPwCqd", - "202505", - "571" - ], - [ - "yeod5tOXpkP", - "ImspTQPwCqd", - "202506", - "560" - ], - [ - "gj2fKKyp8OH", - "ImspTQPwCqd", - "202504", - "632" - ], - [ - "yeod5tOXpkP", - "ImspTQPwCqd", - "202504", - "527" - ], - [ - "Fhbf4aKpZmZ", - "ImspTQPwCqd", - "202504", - "552" - ], - [ - "gj2fKKyp8OH", - "ImspTQPwCqd", - "202504", - "524" - ], - [ - "fShHdgT7XGb", - "ImspTQPwCqd", - "202506", - "533" - ], - [ - "yeod5tOXpkP", - "ImspTQPwCqd", - "202504", - "555" - ], - [ - "Fhbf4aKpZmZ", - "ImspTQPwCqd", - "202506", - "564" - ], - [ - "fShHdgT7XGb", - "ImspTQPwCqd", - "202504", - "515" - ], - [ - "gj2fKKyp8OH", - "ImspTQPwCqd", - "202506", - "585" - ], - [ - "Fhbf4aKpZmZ", - "ImspTQPwCqd", - "202504", - "504" - ], - [ - "gj2fKKyp8OH", - "ImspTQPwCqd", - "202505", - "581" - ], - [ - "fShHdgT7XGb", - "ImspTQPwCqd", - "202506", - "609" - ], - [ - "Fhbf4aKpZmZ", - "ImspTQPwCqd", - "202505", - "574" - ], - [ - "yeod5tOXpkP", - "ImspTQPwCqd", - "202505", - "586" - ], - [ - "Fhbf4aKpZmZ", - "ImspTQPwCqd", - "202506", - "574" - ], - [ - "gj2fKKyp8OH", - "ImspTQPwCqd", - "202505", - "565" - ], - [ - "gj2fKKyp8OH", - "ImspTQPwCqd", - "202506", - "545" - ], - [ - "yeod5tOXpkP", - "ImspTQPwCqd", - "202506", - "597" - ], - [ - "fShHdgT7XGb", - "ImspTQPwCqd", - "202505", - "524" - ], - [ - "fShHdgT7XGb", - "ImspTQPwCqd", - "202505", - "561" - ] + ["gj2fKKyp8OH", "ImspTQPwCqd", "202504", "524"], + ["yeod5tOXpkP", "ImspTQPwCqd", "202504", "555"], + ["fShHdgT7XGb", "ImspTQPwCqd", "202504", "515"], + ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202504", "504"], + ["fShHdgT7XGb", "ImspTQPwCqd", "202506", "609"], + ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202505", "574"], + ["yeod5tOXpkP", "ImspTQPwCqd", "202505", "586"], + ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202506", "574"], + ["gj2fKKyp8OH", "ImspTQPwCqd", "202505", "565"], + ["gj2fKKyp8OH", "ImspTQPwCqd", "202506", "545"], + ["yeod5tOXpkP", "ImspTQPwCqd", "202506", "597"], + ["fShHdgT7XGb", "ImspTQPwCqd", "202505", "561"] ], "height": 24 -} \ No newline at end of file +} diff --git a/src/__demo__/data/event/optionset.data.org.json b/src/__demo__/data/event/optionset.data.org.json index 78e37c513..f30908c81 100644 --- a/src/__demo__/data/event/optionset.data.org.json +++ b/src/__demo__/data/event/optionset.data.org.json @@ -84,14 +84,8 @@ } }, "dimensions": { - "pe": [ - "202504", - "202505", - "202506" - ], - "ou": [ - "ImspTQPwCqd" - ], + "pe": ["202504", "202505", "202506"], + "ou": ["ImspTQPwCqd"], "Zj7UnCAulEk.fWIAEtYVEGk": [ "yeod5tOXpkP", "gj2fKKyp8OH", @@ -104,150 +98,18 @@ "headerWidth": 4, "width": 4, "rows": [ - [ - "MODDISCH", - "ImspTQPwCqd", - "202505", - "495" - ], - [ - "MODTRANS", - "ImspTQPwCqd", - "202504", - "545" - ], - [ - "MODABSC", - "ImspTQPwCqd", - "202505", - "571" - ], - [ - "MODDISCH", - "ImspTQPwCqd", - "202506", - "560" - ], - [ - "MODDIED", - "ImspTQPwCqd", - "202504", - "632" - ], - [ - "MODDISCH", - "ImspTQPwCqd", - "202504", - "527" - ], - [ - "MODABSC", - "ImspTQPwCqd", - "202504", - "552" - ], - [ - "MODDIED", - "ImspTQPwCqd", - "202504", - "524" - ], - [ - "MODTRANS", - "ImspTQPwCqd", - "202506", - "533" - ], - [ - "MODDISCH", - "ImspTQPwCqd", - "202504", - "555" - ], - [ - "MODABSC", - "ImspTQPwCqd", - "202506", - "564" - ], - [ - "MODTRANS", - "ImspTQPwCqd", - "202504", - "515" - ], - [ - "MODDIED", - "ImspTQPwCqd", - "202506", - "585" - ], - [ - "MODABSC", - "ImspTQPwCqd", - "202504", - "504" - ], - [ - "MODDIED", - "ImspTQPwCqd", - "202505", - "581" - ], - [ - "MODTRANS", - "ImspTQPwCqd", - "202506", - "609" - ], - [ - "MODABSC", - "ImspTQPwCqd", - "202505", - "574" - ], - [ - "MODDISCH", - "ImspTQPwCqd", - "202505", - "586" - ], - [ - "MODABSC", - "ImspTQPwCqd", - "202506", - "574" - ], - [ - "MODDIED", - "ImspTQPwCqd", - "202505", - "565" - ], - [ - "MODDIED", - "ImspTQPwCqd", - "202506", - "545" - ], - [ - "MODDISCH", - "ImspTQPwCqd", - "202506", - "597" - ], - [ - "MODTRANS", - "ImspTQPwCqd", - "202505", - "524" - ], - [ - "MODTRANS", - "ImspTQPwCqd", - "202505", - "561" - ] + ["MODDIED", "ImspTQPwCqd", "202504", "524"], + ["MODDISCH", "ImspTQPwCqd", "202504", "555"], + ["MODTRANS", "ImspTQPwCqd", "202504", "515"], + ["MODABSC", "ImspTQPwCqd", "202504", "504"], + ["MODTRANS", "ImspTQPwCqd", "202506", "609"], + ["MODABSC", "ImspTQPwCqd", "202505", "574"], + ["MODDISCH", "ImspTQPwCqd", "202505", "586"], + ["MODABSC", "ImspTQPwCqd", "202506", "574"], + ["MODDIED", "ImspTQPwCqd", "202505", "565"], + ["MODDIED", "ImspTQPwCqd", "202506", "545"], + ["MODDISCH", "ImspTQPwCqd", "202506", "597"], + ["MODTRANS", "ImspTQPwCqd", "202505", "561"] ], "height": 24 -} \ No newline at end of file +} From f0b9842b0601d5c565ee84df5342e838a71d83c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Tue, 5 Aug 2025 14:59:21 +0200 Subject: [PATCH 13/50] chore: support hide na data --- src/__demo__/data/event/boolean.data.json | 6 +- src/__demo__/data/event/numeric.data.json | 10 +- src/__demo__/data/event/numeric.data.org.json | 1883 +++-------------- src/__demo__/data/event/optionset.data.json | 3 +- .../data/event/optionset.data.org.json | 3 +- src/__demo__/data/event/optionsets.data.json | 4 +- .../data/event/optionsets.data.org.json | 4 +- src/__demo__/data/event/yesonly.data.json | 19 +- .../response/__tests__/boolean.spec.js | 1 - .../response/__tests__/numeric.spec.js | 88 +- .../response/__tests__/optionSet.spec.js | 4 +- .../response/__tests__/response.spec.js | 38 +- src/modules/response/boolean.js | 2 +- src/modules/response/numeric.js | 11 +- src/modules/response/optionSet.js | 11 +- src/modules/response/response.js | 17 +- 16 files changed, 373 insertions(+), 1731 deletions(-) diff --git a/src/__demo__/data/event/boolean.data.json b/src/__demo__/data/event/boolean.data.json index d30a3d1e1..a168fe107 100644 --- a/src/__demo__/data/event/boolean.data.json +++ b/src/__demo__/data/event/boolean.data.json @@ -83,7 +83,7 @@ "A03MvHHogjR.bx6fsa0t90x:1": { "name": "Yes" }, - "A03MvHHogjR.bx6fsa0t90x:": { + "": { "name": "N/A" } }, @@ -93,7 +93,7 @@ "A03MvHHogjR.bx6fsa0t90x": [ "A03MvHHogjR.bx6fsa0t90x:0", "A03MvHHogjR.bx6fsa0t90x:1", - "A03MvHHogjR.bx6fsa0t90x:" + "" ] } }, @@ -111,7 +111,7 @@ ["A03MvHHogjR.bx6fsa0t90x:1", "ImspTQPwCqd", "202504", "326"], ["A03MvHHogjR.bx6fsa0t90x:1", "ImspTQPwCqd", "202505", "358"], ["A03MvHHogjR.bx6fsa0t90x:1", "ImspTQPwCqd", "202502", "318"], - ["A03MvHHogjR.bx6fsa0t90x:", "ImspTQPwCqd", "202501", "1"], + ["", "ImspTQPwCqd", "202501", "1"], ["A03MvHHogjR.bx6fsa0t90x:0", "ImspTQPwCqd", "202502", "311"] ], "height": 13, diff --git a/src/__demo__/data/event/numeric.data.json b/src/__demo__/data/event/numeric.data.json index 779f82191..cc4af747a 100644 --- a/src/__demo__/data/event/numeric.data.json +++ b/src/__demo__/data/event/numeric.data.json @@ -334,6 +334,9 @@ }, "Zj7UnCAulEk.qrur9Dvnyt5:88": { "name": "88" + }, + "": { + "name": "N/A" } }, "dimensions": { @@ -427,7 +430,8 @@ "Zj7UnCAulEk.qrur9Dvnyt5:85", "Zj7UnCAulEk.qrur9Dvnyt5:86", "Zj7UnCAulEk.qrur9Dvnyt5:87", - "Zj7UnCAulEk.qrur9Dvnyt5:88" + "Zj7UnCAulEk.qrur9Dvnyt5:88", + "" ], "ou": ["ImspTQPwCqd"] } @@ -701,7 +705,9 @@ ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202503", "56"], ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202504", "49"], ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202505", "48"] + ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202505", "48"], + ["", "ImspTQPwCqd", "202505", "5"], + ["", "ImspTQPwCqd", "202506", "12"] ], "height": 267, "headerWidth": 4 diff --git a/src/__demo__/data/event/numeric.data.org.json b/src/__demo__/data/event/numeric.data.org.json index 1f6d1d713..07b109113 100644 --- a/src/__demo__/data/event/numeric.data.org.json +++ b/src/__demo__/data/event/numeric.data.org.json @@ -70,1622 +70,283 @@ } }, "dimensions": { - "pe": [ - "202503", - "202504", - "202505" - ], - "ou": [ - "ImspTQPwCqd" - ] + "pe": ["202503", "202504", "202505"], + "ou": ["ImspTQPwCqd"] } }, "rowContext": {}, "width": 4, "rows": [ - [ - "26", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "84", - "ImspTQPwCqd", - "202503", - "70" - ], - [ - "25", - "ImspTQPwCqd", - "202504", - "46" - ], - [ - "81", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "13", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "57", - "ImspTQPwCqd", - "202503", - "48" - ], - [ - "24", - "ImspTQPwCqd", - "202504", - "48" - ], - [ - "8", - "ImspTQPwCqd", - "202503", - "47" - ], - [ - "80", - "ImspTQPwCqd", - "202504", - "47" - ], - [ - "3", - "ImspTQPwCqd", - "202505", - "67" - ], - [ - "14", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "67", - "ImspTQPwCqd", - "202504", - "45" - ], - [ - "74", - "ImspTQPwCqd", - "202503", - "48" - ], - [ - "83", - "ImspTQPwCqd", - "202504", - "42" - ], - [ - "0", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "5", - "ImspTQPwCqd", - "202503", - "70" - ], - [ - "52", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "54", - "ImspTQPwCqd", - "202503", - "57" - ], - [ - "44", - "ImspTQPwCqd", - "202504", - "43" - ], - [ - "10", - "ImspTQPwCqd", - "202505", - "61" - ], - [ - "42", - "ImspTQPwCqd", - "202503", - "46" - ], - [ - "15", - "ImspTQPwCqd", - "202504", - "64" - ], - [ - "26", - "ImspTQPwCqd", - "202505", - "45" - ], - [ - "62", - "ImspTQPwCqd", - "202503", - "57" - ], - [ - "78", - "ImspTQPwCqd", - "202505", - "54" - ], - [ - "80", - "ImspTQPwCqd", - "202503", - "62" - ], - [ - "7", - "ImspTQPwCqd", - "202505", - "52" - ], - [ - "39", - "ImspTQPwCqd", - "202504", - "53" - ], - [ - "71", - "ImspTQPwCqd", - "202505", - "44" - ], - [ - "71", - "ImspTQPwCqd", - "202504", - "53" - ], - [ - "44", - "ImspTQPwCqd", - "202503", - "57" - ], - [ - "34", - "ImspTQPwCqd", - "202503", - "40" - ], - [ - "88", - "ImspTQPwCqd", - "202505", - "54" - ], - [ - "56", - "ImspTQPwCqd", - "202503", - "44" - ], - [ - "41", - "ImspTQPwCqd", - "202504", - "53" - ], - [ - "59", - "ImspTQPwCqd", - "202505", - "48" - ], - [ - "61", - "ImspTQPwCqd", - "202504", - "52" - ], - [ - "28", - "ImspTQPwCqd", - "202505", - "52" - ], - [ - "9", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "16", - "ImspTQPwCqd", - "202505", - "46" - ], - [ - "80", - "ImspTQPwCqd", - "202505", - "37" - ], - [ - "67", - "ImspTQPwCqd", - "202503", - "35" - ], - [ - "63", - "ImspTQPwCqd", - "202504", - "35" - ], - [ - "6", - "ImspTQPwCqd", - "202505", - "65" - ], - [ - "28", - "ImspTQPwCqd", - "202503", - "44" - ], - [ - "68", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "72", - "ImspTQPwCqd", - "202503", - "47" - ], - [ - "47", - "ImspTQPwCqd", - "202503", - "45" - ], - [ - "13", - "ImspTQPwCqd", - "202504", - "51" - ], - [ - "56", - "ImspTQPwCqd", - "202505", - "51" - ], - [ - "66", - "ImspTQPwCqd", - "202504", - "43" - ], - [ - "75", - "ImspTQPwCqd", - "202505", - "51" - ], - [ - "82", - "ImspTQPwCqd", - "202505", - "49" - ], - [ - "16", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "56", - "ImspTQPwCqd", - "202504", - "30" - ], - [ - "31", - "ImspTQPwCqd", - "202504", - "50" - ], - [ - "52", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "34", - "ImspTQPwCqd", - "202504", - "50" - ], - [ - "30", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "20", - "ImspTQPwCqd", - "202503", - "49" - ], - [ - "76", - "ImspTQPwCqd", - "202503", - "49" - ], - [ - "63", - "ImspTQPwCqd", - "202503", - "49" - ], - [ - "29", - "ImspTQPwCqd", - "202505", - "53" - ], - [ - "20", - "ImspTQPwCqd", - "202505", - "43" - ], - [ - "12", - "ImspTQPwCqd", - "202505", - "48" - ], - [ - "63", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "42", - "ImspTQPwCqd", - "202504", - "42" - ], - [ - "64", - "ImspTQPwCqd", - "202505", - "54" - ], - [ - "9", - "ImspTQPwCqd", - "202505", - "54" - ], - [ - "12", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "19", - "ImspTQPwCqd", - "202504", - "50" - ], - [ - "76", - "ImspTQPwCqd", - "202504", - "48" - ], - [ - "17", - "ImspTQPwCqd", - "202505", - "42" - ], - [ - "21", - "ImspTQPwCqd", - "202504", - "51" - ], - [ - "50", - "ImspTQPwCqd", - "202504", - "63" - ], - [ - "6", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "83", - "ImspTQPwCqd", - "202505", - "56" - ], - [ - "31", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "88", - "ImspTQPwCqd", - "202503", - "45" - ], - [ - "36", - "ImspTQPwCqd", - "202505", - "52" - ], - [ - "61", - "ImspTQPwCqd", - "202503", - "45" - ], - [ - "51", - "ImspTQPwCqd", - "202505", - "62" - ], - [ - "76", - "ImspTQPwCqd", - "202505", - "42" - ], - [ - "2", - "ImspTQPwCqd", - "202504", - "45" - ], - [ - "53", - "ImspTQPwCqd", - "202504", - "41" - ], - [ - "43", - "ImspTQPwCqd", - "202504", - "41" - ], - [ - "10", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "2", - "ImspTQPwCqd", - "202505", - "51" - ], - [ - "70", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "46", - "ImspTQPwCqd", - "202505", - "51" - ], - [ - "36", - "ImspTQPwCqd", - "202503", - "54" - ], - [ - "86", - "ImspTQPwCqd", - "202503", - "61" - ], - [ - "19", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "23", - "ImspTQPwCqd", - "202504", - "55" - ], - [ - "35", - "ImspTQPwCqd", - "202503", - "65" - ], - [ - "70", - "ImspTQPwCqd", - "202505", - "38" - ], - [ - "3", - "ImspTQPwCqd", - "202504", - "38" - ], - [ - "79", - "ImspTQPwCqd", - "202504", - "52" - ], - [ - "33", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "43", - "ImspTQPwCqd", - "202503", - "46" - ], - [ - "19", - "ImspTQPwCqd", - "202505", - "37" - ], - [ - "35", - "ImspTQPwCqd", - "202504", - "46" - ], - [ - "2", - "ImspTQPwCqd", - "202503", - "41" - ], - [ - "54", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "51", - "ImspTQPwCqd", - "202504", - "56" - ], - [ - "50", - "ImspTQPwCqd", - "202505", - "57" - ], - [ - "22", - "ImspTQPwCqd", - "202503", - "60" - ], - [ - "46", - "ImspTQPwCqd", - "202504", - "61" - ], - [ - "8", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "61", - "ImspTQPwCqd", - "202505", - "60" - ], - [ - "39", - "ImspTQPwCqd", - "202503", - "52" - ], - [ - "48", - "ImspTQPwCqd", - "202505", - "44" - ], - [ - "64", - "ImspTQPwCqd", - "202503", - "58" - ], - [ - "65", - "ImspTQPwCqd", - "202504", - "47" - ], - [ - "7", - "ImspTQPwCqd", - "202504", - "40" - ], - [ - "60", - "ImspTQPwCqd", - "202504", - "38" - ], - [ - "38", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "33", - "ImspTQPwCqd", - "202504", - "41" - ], - [ - "52", - "ImspTQPwCqd", - "202505", - "48" - ], - [ - "29", - "ImspTQPwCqd", - "202504", - "42" - ], - [ - "11", - "ImspTQPwCqd", - "202504", - "45" - ], - [ - "72", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "29", - "ImspTQPwCqd", - "202503", - "52" - ], - [ - "32", - "ImspTQPwCqd", - "202504", - "64" - ], - [ - "15", - "ImspTQPwCqd", - "202503", - "54" - ], - [ - "55", - "ImspTQPwCqd", - "202504", - "63" - ], - [ - "21", - "ImspTQPwCqd", - "202505", - "54" - ], - [ - "60", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "86", - "ImspTQPwCqd", - "202504", - "55" - ], - [ - "30", - "ImspTQPwCqd", - "202504", - "64" - ], - [ - "48", - "ImspTQPwCqd", - "202503", - "58" - ], - [ - "26", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "33", - "ImspTQPwCqd", - "202505", - "43" - ], - [ - "60", - "ImspTQPwCqd", - "202503", - "47" - ], - [ - "69", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "34", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "15", - "ImspTQPwCqd", - "202505", - "44" - ], - [ - "71", - "ImspTQPwCqd", - "202503", - "48" - ], - [ - "66", - "ImspTQPwCqd", - "202503", - "57" - ], - [ - "72", - "ImspTQPwCqd", - "202505", - "47" - ], - [ - "24", - "ImspTQPwCqd", - "202503", - "52" - ], - [ - "77", - "ImspTQPwCqd", - "202504", - "53" - ], - [ - "40", - "ImspTQPwCqd", - "202503", - "56" - ], - [ - "38", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "44", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "67", - "ImspTQPwCqd", - "202505", - "49" - ], - [ - "83", - "ImspTQPwCqd", - "202503", - "39" - ], - [ - "69", - "ImspTQPwCqd", - "202504", - "36" - ], - [ - "49", - "ImspTQPwCqd", - "202503", - "46" - ], - [ - "37", - "ImspTQPwCqd", - "202503", - "60" - ], - [ - "87", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "45", - "ImspTQPwCqd", - "202504", - "58" - ], - [ - "4", - "ImspTQPwCqd", - "202505", - "41" - ], - [ - "4", - "ImspTQPwCqd", - "202504", - "42" - ], - [ - "81", - "ImspTQPwCqd", - "202504", - "51" - ], - [ - "82", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "40", - "ImspTQPwCqd", - "202504", - "51" - ], - [ - "85", - "ImspTQPwCqd", - "202503", - "43" - ], - [ - "16", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "9", - "ImspTQPwCqd", - "202503", - "52" - ], - [ - "17", - "ImspTQPwCqd", - "202503", - "45" - ], - [ - "45", - "ImspTQPwCqd", - "202505", - "45" - ], - [ - "55", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "57", - "ImspTQPwCqd", - "202505", - "45" - ], - [ - "73", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "0", - "ImspTQPwCqd", - "202504", - "55" - ], - [ - "58", - "ImspTQPwCqd", - "202503", - "56" - ], - [ - "49", - "ImspTQPwCqd", - "202504", - "48" - ], - [ - "11", - "ImspTQPwCqd", - "202505", - "57" - ], - [ - "54", - "ImspTQPwCqd", - "202504", - "34" - ], - [ - "53", - "ImspTQPwCqd", - "202505", - "38" - ], - [ - "53", - "ImspTQPwCqd", - "202503", - "41" - ], - [ - "84", - "ImspTQPwCqd", - "202505", - "47" - ], - [ - "57", - "ImspTQPwCqd", - "202504", - "35" - ], - [ - "17", - "ImspTQPwCqd", - "202504", - "51" - ], - [ - "59", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "18", - "ImspTQPwCqd", - "202504", - "52" - ], - [ - "68", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "74", - "ImspTQPwCqd", - "202505", - "55" - ], - [ - "65", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "59", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "62", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "78", - "ImspTQPwCqd", - "202503", - "41" - ], - [ - "84", - "ImspTQPwCqd", - "202504", - "62" - ], - [ - "47", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "11", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "65", - "ImspTQPwCqd", - "202503", - "60" - ], - [ - "46", - "ImspTQPwCqd", - "202503", - "59" - ], - [ - "25", - "ImspTQPwCqd", - "202503", - "56" - ], - [ - "87", - "ImspTQPwCqd", - "202505", - "49" - ], - [ - "38", - "ImspTQPwCqd", - "202504", - "52" - ], - [ - "8", - "ImspTQPwCqd", - "202505", - "43" - ], - [ - "14", - "ImspTQPwCqd", - "202505", - "58" - ], - [ - "18", - "ImspTQPwCqd", - "202505", - "47" - ], - [ - "31", - "ImspTQPwCqd", - "202505", - "46" - ], - [ - "41", - "ImspTQPwCqd", - "202505", - "45" - ], - [ - "70", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "22", - "ImspTQPwCqd", - "202504", - "40" - ], - [ - "87", - "ImspTQPwCqd", - "202504", - "48" - ], - [ - "5", - "ImspTQPwCqd", - "202504", - "63" - ], - [ - "6", - "ImspTQPwCqd", - "202504", - "53" - ], - [ - "30", - "ImspTQPwCqd", - "202503", - "36" - ], - [ - "23", - "ImspTQPwCqd", - "202505", - "44" - ], - [ - "45", - "ImspTQPwCqd", - "202503", - "51" - ], - [ - "27", - "ImspTQPwCqd", - "202505", - "61" - ], - [ - "4", - "ImspTQPwCqd", - "202503", - "54" - ], - [ - "25", - "ImspTQPwCqd", - "202505", - "62" - ], - [ - "66", - "ImspTQPwCqd", - "202505", - "41" - ], - [ - "55", - "ImspTQPwCqd", - "202503", - "46" - ], - [ - "64", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "28", - "ImspTQPwCqd", - "202504", - "62" - ], - [ - "68", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "37", - "ImspTQPwCqd", - "202504", - "55" - ], - [ - "21", - "ImspTQPwCqd", - "202503", - "53" - ], - [ - "75", - "ImspTQPwCqd", - "202504", - "45" - ], - [ - "39", - "ImspTQPwCqd", - "202505", - "53" - ], - [ - "40", - "ImspTQPwCqd", - "202505", - "60" - ], - [ - "10", - "ImspTQPwCqd", - "202504", - "46" - ], - [ - "85", - "ImspTQPwCqd", - "202505", - "58" - ], - [ - "1", - "ImspTQPwCqd", - "202503", - "44" - ], - [ - "79", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "7", - "ImspTQPwCqd", - "202503", - "47" - ], - [ - "5", - "ImspTQPwCqd", - "202505", - "46" - ], - [ - "75", - "ImspTQPwCqd", - "202503", - "36" - ], - [ - "51", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "81", - "ImspTQPwCqd", - "202505", - "37" - ], - [ - "18", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "24", - "ImspTQPwCqd", - "202505", - "47" - ], - [ - "32", - "ImspTQPwCqd", - "202505", - "61" - ], - [ - "78", - "ImspTQPwCqd", - "202504", - "55" - ], - [ - "62", - "ImspTQPwCqd", - "202505", - "53" - ], - [ - "42", - "ImspTQPwCqd", - "202505", - "59" - ], - [ - "77", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "49", - "ImspTQPwCqd", - "202505", - "45" - ], - [ - "0", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "20", - "ImspTQPwCqd", - "202504", - "54" - ], - [ - "37", - "ImspTQPwCqd", - "202505", - "31" - ], - [ - "79", - "ImspTQPwCqd", - "202505", - "46" - ], - [ - "22", - "ImspTQPwCqd", - "202505", - "59" - ], - [ - "58", - "ImspTQPwCqd", - "202504", - "63" - ], - [ - "74", - "ImspTQPwCqd", - "202504", - "40" - ], - [ - "82", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "41", - "ImspTQPwCqd", - "202503", - "62" - ], - [ - "32", - "ImspTQPwCqd", - "202503", - "52" - ], - [ - "85", - "ImspTQPwCqd", - "202504", - "32" - ], - [ - "50", - "ImspTQPwCqd", - "202503", - "63" - ], - [ - "35", - "ImspTQPwCqd", - "202505", - "40" - ], - [ - "27", - "ImspTQPwCqd", - "202503", - "50" - ], - [ - "69", - "ImspTQPwCqd", - "202505", - "49" - ], - [ - "88", - "ImspTQPwCqd", - "202504", - "52" - ], - [ - "23", - "ImspTQPwCqd", - "202503", - "48" - ], - [ - "73", - "ImspTQPwCqd", - "202505", - "50" - ], - [ - "1", - "ImspTQPwCqd", - "202504", - "48" - ], - [ - "1", - "ImspTQPwCqd", - "202505", - "53" - ], - [ - "86", - "ImspTQPwCqd", - "202505", - "43" - ], - [ - "47", - "ImspTQPwCqd", - "202505", - "66" - ], - [ - "14", - "ImspTQPwCqd", - "202504", - "38" - ], - [ - "73", - "ImspTQPwCqd", - "202504", - "59" - ], - [ - "43", - "ImspTQPwCqd", - "202505", - "49" - ], - [ - "77", - "ImspTQPwCqd", - "202503", - "55" - ], - [ - "13", - "ImspTQPwCqd", - "202503", - "47" - ], - [ - "12", - "ImspTQPwCqd", - "202503", - "63" - ], - [ - "48", - "ImspTQPwCqd", - "202504", - "44" - ], - [ - "3", - "ImspTQPwCqd", - "202503", - "56" - ], - [ - "36", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "27", - "ImspTQPwCqd", - "202504", - "49" - ], - [ - "58", - "ImspTQPwCqd", - "202505", - "48" - ] + ["26", "ImspTQPwCqd", "202503", "51"], + ["84", "ImspTQPwCqd", "202503", "70"], + ["25", "ImspTQPwCqd", "202504", "46"], + ["81", "ImspTQPwCqd", "202503", "53"], + ["13", "ImspTQPwCqd", "202505", "55"], + ["57", "ImspTQPwCqd", "202503", "48"], + ["24", "ImspTQPwCqd", "202504", "48"], + ["8", "ImspTQPwCqd", "202503", "47"], + ["80", "ImspTQPwCqd", "202504", "47"], + ["3", "ImspTQPwCqd", "202505", "67"], + ["14", "ImspTQPwCqd", "202503", "55"], + ["67", "ImspTQPwCqd", "202504", "45"], + ["74", "ImspTQPwCqd", "202503", "48"], + ["83", "ImspTQPwCqd", "202504", "42"], + ["0", "ImspTQPwCqd", "202503", "55"], + ["5", "ImspTQPwCqd", "202503", "70"], + ["52", "ImspTQPwCqd", "202503", "53"], + ["54", "ImspTQPwCqd", "202503", "57"], + ["44", "ImspTQPwCqd", "202504", "43"], + ["10", "ImspTQPwCqd", "202505", "61"], + ["42", "ImspTQPwCqd", "202503", "46"], + ["15", "ImspTQPwCqd", "202504", "64"], + ["26", "ImspTQPwCqd", "202505", "45"], + ["62", "ImspTQPwCqd", "202503", "57"], + ["78", "ImspTQPwCqd", "202505", "54"], + ["80", "ImspTQPwCqd", "202503", "62"], + ["7", "ImspTQPwCqd", "202505", "52"], + ["39", "ImspTQPwCqd", "202504", "53"], + ["71", "ImspTQPwCqd", "202505", "44"], + ["71", "ImspTQPwCqd", "202504", "53"], + ["44", "ImspTQPwCqd", "202503", "57"], + ["34", "ImspTQPwCqd", "202503", "40"], + ["88", "ImspTQPwCqd", "202505", "54"], + ["56", "ImspTQPwCqd", "202503", "44"], + ["41", "ImspTQPwCqd", "202504", "53"], + ["59", "ImspTQPwCqd", "202505", "48"], + ["61", "ImspTQPwCqd", "202504", "52"], + ["28", "ImspTQPwCqd", "202505", "52"], + ["9", "ImspTQPwCqd", "202504", "54"], + ["16", "ImspTQPwCqd", "202505", "46"], + ["80", "ImspTQPwCqd", "202505", "37"], + ["67", "ImspTQPwCqd", "202503", "35"], + ["63", "ImspTQPwCqd", "202504", "35"], + ["6", "ImspTQPwCqd", "202505", "65"], + ["28", "ImspTQPwCqd", "202503", "44"], + ["68", "ImspTQPwCqd", "202505", "50"], + ["72", "ImspTQPwCqd", "202503", "47"], + ["47", "ImspTQPwCqd", "202503", "45"], + ["13", "ImspTQPwCqd", "202504", "51"], + ["56", "ImspTQPwCqd", "202505", "51"], + ["66", "ImspTQPwCqd", "202504", "43"], + ["75", "ImspTQPwCqd", "202505", "51"], + ["82", "ImspTQPwCqd", "202505", "49"], + ["16", "ImspTQPwCqd", "202504", "44"], + ["56", "ImspTQPwCqd", "202504", "30"], + ["31", "ImspTQPwCqd", "202504", "50"], + ["52", "ImspTQPwCqd", "202504", "54"], + ["34", "ImspTQPwCqd", "202504", "50"], + ["30", "ImspTQPwCqd", "202505", "55"], + ["20", "ImspTQPwCqd", "202503", "49"], + ["76", "ImspTQPwCqd", "202503", "49"], + ["63", "ImspTQPwCqd", "202503", "49"], + ["29", "ImspTQPwCqd", "202505", "53"], + ["20", "ImspTQPwCqd", "202505", "43"], + ["12", "ImspTQPwCqd", "202505", "48"], + ["63", "ImspTQPwCqd", "202505", "55"], + ["42", "ImspTQPwCqd", "202504", "42"], + ["64", "ImspTQPwCqd", "202505", "54"], + ["9", "ImspTQPwCqd", "202505", "54"], + ["12", "ImspTQPwCqd", "202504", "49"], + ["19", "ImspTQPwCqd", "202504", "50"], + ["76", "ImspTQPwCqd", "202504", "48"], + ["17", "ImspTQPwCqd", "202505", "42"], + ["21", "ImspTQPwCqd", "202504", "51"], + ["50", "ImspTQPwCqd", "202504", "63"], + ["6", "ImspTQPwCqd", "202503", "53"], + ["83", "ImspTQPwCqd", "202505", "56"], + ["31", "ImspTQPwCqd", "202503", "55"], + ["88", "ImspTQPwCqd", "202503", "45"], + ["36", "ImspTQPwCqd", "202505", "52"], + ["61", "ImspTQPwCqd", "202503", "45"], + ["51", "ImspTQPwCqd", "202505", "62"], + ["76", "ImspTQPwCqd", "202505", "42"], + ["2", "ImspTQPwCqd", "202504", "45"], + ["53", "ImspTQPwCqd", "202504", "41"], + ["43", "ImspTQPwCqd", "202504", "41"], + ["10", "ImspTQPwCqd", "202503", "51"], + ["2", "ImspTQPwCqd", "202505", "51"], + ["70", "ImspTQPwCqd", "202503", "50"], + ["46", "ImspTQPwCqd", "202505", "51"], + ["36", "ImspTQPwCqd", "202503", "54"], + ["86", "ImspTQPwCqd", "202503", "61"], + ["19", "ImspTQPwCqd", "202503", "51"], + ["23", "ImspTQPwCqd", "202504", "55"], + ["35", "ImspTQPwCqd", "202503", "65"], + ["70", "ImspTQPwCqd", "202505", "38"], + ["3", "ImspTQPwCqd", "202504", "38"], + ["79", "ImspTQPwCqd", "202504", "52"], + ["33", "ImspTQPwCqd", "202503", "55"], + ["43", "ImspTQPwCqd", "202503", "46"], + ["19", "ImspTQPwCqd", "202505", "37"], + ["35", "ImspTQPwCqd", "202504", "46"], + ["2", "ImspTQPwCqd", "202503", "41"], + ["54", "ImspTQPwCqd", "202505", "55"], + ["51", "ImspTQPwCqd", "202504", "56"], + ["50", "ImspTQPwCqd", "202505", "57"], + ["22", "ImspTQPwCqd", "202503", "60"], + ["46", "ImspTQPwCqd", "202504", "61"], + ["8", "ImspTQPwCqd", "202504", "44"], + ["61", "ImspTQPwCqd", "202505", "60"], + ["39", "ImspTQPwCqd", "202503", "52"], + ["48", "ImspTQPwCqd", "202505", "44"], + ["64", "ImspTQPwCqd", "202503", "58"], + ["65", "ImspTQPwCqd", "202504", "47"], + ["7", "ImspTQPwCqd", "202504", "40"], + ["60", "ImspTQPwCqd", "202504", "38"], + ["38", "ImspTQPwCqd", "202503", "50"], + ["33", "ImspTQPwCqd", "202504", "41"], + ["52", "ImspTQPwCqd", "202505", "48"], + ["29", "ImspTQPwCqd", "202504", "42"], + ["11", "ImspTQPwCqd", "202504", "45"], + ["72", "ImspTQPwCqd", "202504", "44"], + ["29", "ImspTQPwCqd", "202503", "52"], + ["32", "ImspTQPwCqd", "202504", "64"], + ["15", "ImspTQPwCqd", "202503", "54"], + ["55", "ImspTQPwCqd", "202504", "63"], + ["21", "ImspTQPwCqd", "202505", "54"], + ["60", "ImspTQPwCqd", "202505", "50"], + ["86", "ImspTQPwCqd", "202504", "55"], + ["30", "ImspTQPwCqd", "202504", "64"], + ["48", "ImspTQPwCqd", "202503", "58"], + ["26", "ImspTQPwCqd", "202504", "54"], + ["33", "ImspTQPwCqd", "202505", "43"], + ["60", "ImspTQPwCqd", "202503", "47"], + ["69", "ImspTQPwCqd", "202503", "53"], + ["34", "ImspTQPwCqd", "202505", "50"], + ["15", "ImspTQPwCqd", "202505", "44"], + ["71", "ImspTQPwCqd", "202503", "48"], + ["66", "ImspTQPwCqd", "202503", "57"], + ["72", "ImspTQPwCqd", "202505", "47"], + ["24", "ImspTQPwCqd", "202503", "52"], + ["77", "ImspTQPwCqd", "202504", "53"], + ["40", "ImspTQPwCqd", "202503", "56"], + ["38", "ImspTQPwCqd", "202505", "55"], + ["44", "ImspTQPwCqd", "202505", "50"], + ["67", "ImspTQPwCqd", "202505", "49"], + ["83", "ImspTQPwCqd", "202503", "39"], + ["69", "ImspTQPwCqd", "202504", "36"], + ["49", "ImspTQPwCqd", "202503", "46"], + ["37", "ImspTQPwCqd", "202503", "60"], + ["87", "ImspTQPwCqd", "202503", "51"], + ["45", "ImspTQPwCqd", "202504", "58"], + ["4", "ImspTQPwCqd", "202505", "41"], + ["4", "ImspTQPwCqd", "202504", "42"], + ["81", "ImspTQPwCqd", "202504", "51"], + ["82", "ImspTQPwCqd", "202504", "54"], + ["40", "ImspTQPwCqd", "202504", "51"], + ["85", "ImspTQPwCqd", "202503", "43"], + ["16", "ImspTQPwCqd", "202503", "51"], + ["9", "ImspTQPwCqd", "202503", "52"], + ["17", "ImspTQPwCqd", "202503", "45"], + ["45", "ImspTQPwCqd", "202505", "45"], + ["55", "ImspTQPwCqd", "202505", "50"], + ["57", "ImspTQPwCqd", "202505", "45"], + ["73", "ImspTQPwCqd", "202503", "51"], + ["0", "ImspTQPwCqd", "202504", "55"], + ["58", "ImspTQPwCqd", "202503", "56"], + ["49", "ImspTQPwCqd", "202504", "48"], + ["11", "ImspTQPwCqd", "202505", "57"], + ["54", "ImspTQPwCqd", "202504", "34"], + ["53", "ImspTQPwCqd", "202505", "38"], + ["53", "ImspTQPwCqd", "202503", "41"], + ["84", "ImspTQPwCqd", "202505", "47"], + ["57", "ImspTQPwCqd", "202504", "35"], + ["17", "ImspTQPwCqd", "202504", "51"], + ["59", "ImspTQPwCqd", "202504", "44"], + ["18", "ImspTQPwCqd", "202504", "52"], + ["68", "ImspTQPwCqd", "202503", "55"], + ["74", "ImspTQPwCqd", "202505", "55"], + ["65", "ImspTQPwCqd", "202505", "50"], + ["59", "ImspTQPwCqd", "202503", "50"], + ["62", "ImspTQPwCqd", "202504", "49"], + ["78", "ImspTQPwCqd", "202503", "41"], + ["84", "ImspTQPwCqd", "202504", "62"], + ["47", "ImspTQPwCqd", "202504", "54"], + ["11", "ImspTQPwCqd", "202503", "53"], + ["65", "ImspTQPwCqd", "202503", "60"], + ["46", "ImspTQPwCqd", "202503", "59"], + ["25", "ImspTQPwCqd", "202503", "56"], + ["87", "ImspTQPwCqd", "202505", "49"], + ["38", "ImspTQPwCqd", "202504", "52"], + ["8", "ImspTQPwCqd", "202505", "43"], + ["14", "ImspTQPwCqd", "202505", "58"], + ["18", "ImspTQPwCqd", "202505", "47"], + ["31", "ImspTQPwCqd", "202505", "46"], + ["41", "ImspTQPwCqd", "202505", "45"], + ["70", "ImspTQPwCqd", "202504", "49"], + ["22", "ImspTQPwCqd", "202504", "40"], + ["87", "ImspTQPwCqd", "202504", "48"], + ["5", "ImspTQPwCqd", "202504", "63"], + ["6", "ImspTQPwCqd", "202504", "53"], + ["30", "ImspTQPwCqd", "202503", "36"], + ["23", "ImspTQPwCqd", "202505", "44"], + ["45", "ImspTQPwCqd", "202503", "51"], + ["27", "ImspTQPwCqd", "202505", "61"], + ["4", "ImspTQPwCqd", "202503", "54"], + ["25", "ImspTQPwCqd", "202505", "62"], + ["66", "ImspTQPwCqd", "202505", "41"], + ["55", "ImspTQPwCqd", "202503", "46"], + ["64", "ImspTQPwCqd", "202504", "44"], + ["28", "ImspTQPwCqd", "202504", "62"], + ["68", "ImspTQPwCqd", "202504", "49"], + ["37", "ImspTQPwCqd", "202504", "55"], + ["21", "ImspTQPwCqd", "202503", "53"], + ["75", "ImspTQPwCqd", "202504", "45"], + ["39", "ImspTQPwCqd", "202505", "53"], + ["40", "ImspTQPwCqd", "202505", "60"], + ["10", "ImspTQPwCqd", "202504", "46"], + ["85", "ImspTQPwCqd", "202505", "58"], + ["1", "ImspTQPwCqd", "202503", "44"], + ["79", "ImspTQPwCqd", "202503", "50"], + ["7", "ImspTQPwCqd", "202503", "47"], + ["5", "ImspTQPwCqd", "202505", "46"], + ["75", "ImspTQPwCqd", "202503", "36"], + ["51", "ImspTQPwCqd", "202503", "50"], + ["81", "ImspTQPwCqd", "202505", "37"], + ["18", "ImspTQPwCqd", "202503", "55"], + ["24", "ImspTQPwCqd", "202505", "47"], + ["32", "ImspTQPwCqd", "202505", "61"], + ["78", "ImspTQPwCqd", "202504", "55"], + ["62", "ImspTQPwCqd", "202505", "53"], + ["42", "ImspTQPwCqd", "202505", "59"], + ["77", "ImspTQPwCqd", "202505", "50"], + ["49", "ImspTQPwCqd", "202505", "45"], + ["0", "ImspTQPwCqd", "202505", "50"], + ["20", "ImspTQPwCqd", "202504", "54"], + ["37", "ImspTQPwCqd", "202505", "31"], + ["79", "ImspTQPwCqd", "202505", "46"], + ["22", "ImspTQPwCqd", "202505", "59"], + ["58", "ImspTQPwCqd", "202504", "63"], + ["74", "ImspTQPwCqd", "202504", "40"], + ["82", "ImspTQPwCqd", "202503", "55"], + ["41", "ImspTQPwCqd", "202503", "62"], + ["32", "ImspTQPwCqd", "202503", "52"], + ["85", "ImspTQPwCqd", "202504", "32"], + ["50", "ImspTQPwCqd", "202503", "63"], + ["35", "ImspTQPwCqd", "202505", "40"], + ["27", "ImspTQPwCqd", "202503", "50"], + ["69", "ImspTQPwCqd", "202505", "49"], + ["88", "ImspTQPwCqd", "202504", "52"], + ["23", "ImspTQPwCqd", "202503", "48"], + ["73", "ImspTQPwCqd", "202505", "50"], + ["1", "ImspTQPwCqd", "202504", "48"], + ["1", "ImspTQPwCqd", "202505", "53"], + ["86", "ImspTQPwCqd", "202505", "43"], + ["47", "ImspTQPwCqd", "202505", "66"], + ["14", "ImspTQPwCqd", "202504", "38"], + ["73", "ImspTQPwCqd", "202504", "59"], + ["43", "ImspTQPwCqd", "202505", "49"], + ["77", "ImspTQPwCqd", "202503", "55"], + ["13", "ImspTQPwCqd", "202503", "47"], + ["12", "ImspTQPwCqd", "202503", "63"], + ["48", "ImspTQPwCqd", "202504", "44"], + ["3", "ImspTQPwCqd", "202503", "56"], + ["36", "ImspTQPwCqd", "202504", "49"], + ["27", "ImspTQPwCqd", "202504", "49"], + ["58", "ImspTQPwCqd", "202505", "48"], + ["", "ImspTQPwCqd", "202505", "5"], + ["", "ImspTQPwCqd", "202506", "12"] ], "height": 267, "headerWidth": 4 -} \ No newline at end of file +} diff --git a/src/__demo__/data/event/optionset.data.json b/src/__demo__/data/event/optionset.data.json index addfec7fd..958379757 100644 --- a/src/__demo__/data/event/optionset.data.json +++ b/src/__demo__/data/event/optionset.data.json @@ -109,7 +109,8 @@ ["gj2fKKyp8OH", "ImspTQPwCqd", "202505", "565"], ["gj2fKKyp8OH", "ImspTQPwCqd", "202506", "545"], ["yeod5tOXpkP", "ImspTQPwCqd", "202506", "597"], - ["fShHdgT7XGb", "ImspTQPwCqd", "202505", "561"] + ["fShHdgT7XGb", "ImspTQPwCqd", "202505", "561"], + ["", "ImspTQPwCqd", "202505", "49"] ], "height": 24 } diff --git a/src/__demo__/data/event/optionset.data.org.json b/src/__demo__/data/event/optionset.data.org.json index f30908c81..de953743a 100644 --- a/src/__demo__/data/event/optionset.data.org.json +++ b/src/__demo__/data/event/optionset.data.org.json @@ -109,7 +109,8 @@ ["MODDIED", "ImspTQPwCqd", "202505", "565"], ["MODDIED", "ImspTQPwCqd", "202506", "545"], ["MODDISCH", "ImspTQPwCqd", "202506", "597"], - ["MODTRANS", "ImspTQPwCqd", "202505", "561"] + ["MODTRANS", "ImspTQPwCqd", "202505", "561"], + ["", "ImspTQPwCqd", "202505", "49"] ], "height": 24 } diff --git a/src/__demo__/data/event/optionsets.data.json b/src/__demo__/data/event/optionsets.data.json index 89ecd84f7..88be1fad8 100644 --- a/src/__demo__/data/event/optionsets.data.json +++ b/src/__demo__/data/event/optionsets.data.json @@ -117,7 +117,9 @@ ["optionId2", "optionId3", "ImspTQPwCqd", "202507", "420"], ["optionId2", "optionId4", "ImspTQPwCqd", "202505", "411"], ["optionId2", "optionId4", "ImspTQPwCqd", "202506", "531"], - ["optionId2", "optionId4", "ImspTQPwCqd", "202507", "317"] + ["optionId2", "optionId4", "ImspTQPwCqd", "202507", "317"], + ["", "optionId4", "ImspTQPwCqd", "202507", "23"], + ["optionId1", "", "ImspTQPwCqd", "202506", "45"] ], "height": 12 } diff --git a/src/__demo__/data/event/optionsets.data.org.json b/src/__demo__/data/event/optionsets.data.org.json index 669abd3a0..0c89be891 100644 --- a/src/__demo__/data/event/optionsets.data.org.json +++ b/src/__demo__/data/event/optionsets.data.org.json @@ -117,7 +117,9 @@ ["TWO", "ONE", "ImspTQPwCqd", "202507", "420"], ["TWO", "TWO", "ImspTQPwCqd", "202505", "411"], ["TWO", "TWO", "ImspTQPwCqd", "202506", "531"], - ["TWO", "TWO", "ImspTQPwCqd", "202507", "317"] + ["TWO", "TWO", "ImspTQPwCqd", "202507", "317"], + ["", "TWO", "ImspTQPwCqd", "202507", "23"], + ["ONE", "", "ImspTQPwCqd", "202506", "45"] ], "height": 12 } diff --git a/src/__demo__/data/event/yesonly.data.json b/src/__demo__/data/event/yesonly.data.json index dc27f02ee..2c74ccae4 100644 --- a/src/__demo__/data/event/yesonly.data.json +++ b/src/__demo__/data/event/yesonly.data.json @@ -101,7 +101,7 @@ "jfuXZB3A1ko.hwG20Dyj6RK:1": { "name": "Yes" }, - "jfuXZB3A1ko.hwG20Dyj6RK:": { + "": { "name": "N/A" } }, @@ -121,23 +121,20 @@ "202506" ], "ou": ["ImspTQPwCqd"], - "jfuXZB3A1ko.hwG20Dyj6RK": [ - "jfuXZB3A1ko.hwG20Dyj6RK:1", - "jfuXZB3A1ko.hwG20Dyj6RK:" - ] + "jfuXZB3A1ko.hwG20Dyj6RK": ["jfuXZB3A1ko.hwG20Dyj6RK:1", ""] } }, "rowContext": {}, "width": 4, "rows": [ - ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202412", "1"], - ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202503", "2"], - ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202504", "1"], - ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202502", "1"], + ["", "ImspTQPwCqd", "202412", "1"], + ["", "ImspTQPwCqd", "202503", "2"], + ["", "ImspTQPwCqd", "202504", "1"], + ["", "ImspTQPwCqd", "202502", "1"], ["jfuXZB3A1ko.hwG20Dyj6RK:1", "ImspTQPwCqd", "202501", "1"], - ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202501", "2"], + ["", "ImspTQPwCqd", "202501", "2"], ["jfuXZB3A1ko.hwG20Dyj6RK:1", "ImspTQPwCqd", "202412", "3"], - ["jfuXZB3A1ko.hwG20Dyj6RK:", "ImspTQPwCqd", "202411", "1"] + ["", "ImspTQPwCqd", "202411", "1"] ], "height": 8, "headerWidth": 4 diff --git a/src/modules/response/__tests__/boolean.spec.js b/src/modules/response/__tests__/boolean.spec.js index 796a5a343..8e014a1d3 100644 --- a/src/modules/response/__tests__/boolean.spec.js +++ b/src/modules/response/__tests__/boolean.spec.js @@ -2,7 +2,6 @@ import response from '../../../__demo__/data/event/boolean.data.json' import responseOrg from '../../../__demo__/data/event/boolean.data.org.json' import { applyBooleanHandler } from '../boolean.js' -const dimensionId = 'Zj7UnCAulEk.fWIAEtYVEGk' const headerIndex = 0 describe('boolean', () => { diff --git a/src/modules/response/__tests__/numeric.spec.js b/src/modules/response/__tests__/numeric.spec.js index 278e7bacb..dd929db6a 100644 --- a/src/modules/response/__tests__/numeric.spec.js +++ b/src/modules/response/__tests__/numeric.spec.js @@ -10,7 +10,7 @@ import { sortStringsAsNumbersAsc, } from '../numeric.js' -const dimensionId = 'Zj7UnCAulEk.fWIAEtYVEGk' +const testId = 'Zj7UnCAulEk.qrur9Dvnyt5' const headerIndex = 0 describe('numeric', () => { @@ -84,84 +84,35 @@ describe('numeric', () => { }) it('works with empty string value', () => { - expect(getPrefixedValue('', 'test')).toBe('test:') + expect(getPrefixedValue('', 'test')).toBe('') }) it('works with both prefix and value empty', () => { - expect(getPrefixedValue('', '')).toBe(':') - }) - it('works with numbers as value', () => { - expect(getPrefixedValue(42, 'num')).toBe('num:42') - }) - - it('works with numbers as prefix', () => { - expect(getPrefixedValue('data', 99)).toBe('99:data') - }) - - it('works with non-string types as both prefix and value', () => { - expect(getPrefixedValue(null, undefined)).toBe('undefined:null') - expect(getPrefixedValue(true, false)).toBe('false:true') + expect(getPrefixedValue('', '')).toBe('') }) }) describe('getNumericItems', () => { it('returns an object with prefixed keys and correct names', () => { - const values = ['1', '2', '10'] + const values = ['1', '2', ''] - expect(getNumericItems(values, dimensionId)).toEqual({ - 'Zj7UnCAulEk.fWIAEtYVEGk:1': { name: '1' }, - 'Zj7UnCAulEk.fWIAEtYVEGk:2': { name: '2' }, - 'Zj7UnCAulEk.fWIAEtYVEGk:10': { name: '10' }, + expect(getNumericItems(values, testId)).toEqual({ + [testId + ':1']: { name: '1' }, + [testId + ':2']: { name: '2' }, + '': { name: 'N/A' }, }) }) it('handles empty values array', () => { expect(getNumericItems([], 'prefix')).toEqual({}) }) - - it('handles empty dimensionId', () => { - const values = ['a', 'b'] - expect(getNumericItems(values, '')).toEqual({ - ':a': { name: 'a' }, - ':b': { name: 'b' }, - }) - }) - - it('works with non-string values', () => { - const values = [1, 2, null, undefined] - expect(getNumericItems(values, 'num')).toEqual({ - 'num:1': { name: 1 }, - 'num:2': { name: 2 }, - 'num:null': { name: null }, - 'num:undefined': { name: undefined }, - }) - }) - - it('handles duplicate values, last one wins', () => { - const values = ['1', '2', '1'] - expect(getNumericItems(values, 'x')).toEqual({ - 'x:1': { name: '1' }, // Last occurrence - 'x:2': { name: '2' }, - }) - }) - - it('handles numbers as dimensionId', () => { - const values = ['42'] - expect(getNumericItems(values, 7)).toEqual({ - '7:42': { name: '42' }, - }) - }) }) describe('getNumericDimension', () => { it('returns object with dimensionId as key and correctly prefixed values', () => { - const values = ['1', '2', '10'] - expect(getNumericDimension(values, dimensionId)).toEqual({ - 'Zj7UnCAulEk.fWIAEtYVEGk': [ - 'Zj7UnCAulEk.fWIAEtYVEGk:1', - 'Zj7UnCAulEk.fWIAEtYVEGk:2', - 'Zj7UnCAulEk.fWIAEtYVEGk:10', - ], + const values = ['1', '2', ''] + expect(getNumericDimension(values, testId)).toEqual({ + [testId]: [testId + ':1', testId + ':2', ''], }) }) @@ -170,13 +121,6 @@ describe('numeric', () => { prefix: [], }) }) - - it('handles empty string as dimensionId', () => { - const values = ['1', '2', '10'] - expect(getNumericDimension(values, '')).toEqual({ - '': [':1', ':2', ':10'], - }) - }) }) describe('getNumericRows', () => { @@ -184,14 +128,14 @@ describe('numeric', () => { const rows = [ ['a', '1', 'x'], ['b', '2', 'y'], - ['c', '10', 'z'], + ['c', '', 'z'], ] const headerIndex = 1 - expect(getNumericRows(rows, headerIndex, dimensionId)).toEqual([ - ['a', 'Zj7UnCAulEk.fWIAEtYVEGk:1', 'x'], - ['b', 'Zj7UnCAulEk.fWIAEtYVEGk:2', 'y'], - ['c', 'Zj7UnCAulEk.fWIAEtYVEGk:10', 'z'], + expect(getNumericRows(rows, headerIndex, testId)).toEqual([ + ['a', testId + ':1', 'x'], + ['b', testId + ':2', 'y'], + ['c', '', 'z'], ]) }) diff --git a/src/modules/response/__tests__/optionSet.spec.js b/src/modules/response/__tests__/optionSet.spec.js index 51eb659d7..93cea550f 100644 --- a/src/modules/response/__tests__/optionSet.spec.js +++ b/src/modules/response/__tests__/optionSet.spec.js @@ -6,8 +6,8 @@ import { applyOptionSetHandler, } from '../optionSet.js' -const dimensionId = 'Zj7UnCAulEk.fWIAEtYVEGk' const headerIndex = 0 +const testId = response.headers[headerIndex].name const testOptionCodeIdMap = { MODABSC: 'Fhbf4aKpZmZ', @@ -19,7 +19,7 @@ const testOptionCodeIdMap = { describe('optionSet', () => { describe('getOptionCodeIdMap', () => { it('should create an option code:id object', () => { - const testOptionIds = response.metaData.dimensions[dimensionId] + const testOptionIds = response.metaData.dimensions[testId] const testOptionItems = response.metaData.items expect(getOptionCodeIdMap(testOptionIds, testOptionItems)).toEqual( diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index 0f1d4f3dc..21c3b3da8 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -13,33 +13,41 @@ import { transformResponse } from '../response.js' describe('response', () => { describe('transformResponse', () => { it('transforms numeric response', () => { - expect(transformResponse(responseNumericOrg)).toEqual( - responseNumeric - ) + expect( + transformResponse(responseNumericOrg, { hideNaData: false }) + ).toEqual(responseNumeric) + }) + + it('transforms numeric response and N/A is not a dimension', () => { + expect( + transformResponse(responseNumericOrg, { + hideNaData: true, + }).metaData.dimensions['Zj7UnCAulEk.qrur9Dvnyt5'].includes('') + ).toEqual(false) }) it('transforms option set response', () => { - expect(transformResponse(responseOptionSetOrg)).toEqual( - responseOptionSet - ) + expect( + transformResponse(responseOptionSetOrg, { hideNaData: false }) + ).toEqual(responseOptionSet) }) it('transforms option set response with non-unique codes across two option sets', () => { - expect(transformResponse(responseOptionSetsOrg)).toEqual( - responseOptionSets - ) + expect( + transformResponse(responseOptionSetsOrg, { hideNaData: false }) + ).toEqual(responseOptionSets) }) it('transforms boolean response', () => { - expect(transformResponse(responseBooleanOrg)).toEqual( - responseBoolean - ) + expect( + transformResponse(responseBooleanOrg, { hideNaData: false }) + ).toEqual(responseBoolean) }) it('transforms yes only response', () => { - expect(transformResponse(responseYesOnlyOrg)).toEqual( - responseYesOnly - ) + expect( + transformResponse(responseYesOnlyOrg, { hideNaData: false }) + ).toEqual(responseYesOnly) }) }) }) diff --git a/src/modules/response/boolean.js b/src/modules/response/boolean.js index dfbd79a17..6a183af35 100644 --- a/src/modules/response/boolean.js +++ b/src/modules/response/boolean.js @@ -17,7 +17,7 @@ export const applyBooleanHandler = (response, headerIndex) => { [getPrefixedValue('1', dimensionId)]: { name: i18n.t('Yes'), }, - [getPrefixedValue('', dimensionId)]: { + '': { name: i18n.t('N/A'), }, }, diff --git a/src/modules/response/numeric.js b/src/modules/response/numeric.js index f82e5b320..dfe9fb14a 100644 --- a/src/modules/response/numeric.js +++ b/src/modules/response/numeric.js @@ -1,3 +1,5 @@ +import i18n from '@dhis2/d2-i18n' + export const getUnique = (array) => [...new Set(array)] export const sortStringsAsNumbersAsc = (arr) => { @@ -15,12 +17,13 @@ export const sortStringsAsNumbersAsc = (arr) => { }) } -export const getPrefixedValue = (value, prefix) => `${prefix}:${value}` +export const getPrefixedValue = (value, prefix) => + value !== '' ? `${prefix}:${value}` : value export const getNumericItems = (values, dimensionId) => values.reduce((items, value) => { items[getPrefixedValue(value, dimensionId)] = { - name: value, + name: value || i18n.t('N/A'), } return items }, {}) @@ -31,12 +34,10 @@ export const getNumericDimension = (values, dimensionId) => ({ export const getNumericRows = (rows, headerIndex, dimensionId) => { let row - let value return rows.map((r) => { - value = r[headerIndex] row = [...r] - row[headerIndex] = getPrefixedValue(value, dimensionId) + row[headerIndex] = getPrefixedValue(row[headerIndex], dimensionId) return row }) } diff --git a/src/modules/response/optionSet.js b/src/modules/response/optionSet.js index 9380ef3bb..de485f0dc 100644 --- a/src/modules/response/optionSet.js +++ b/src/modules/response/optionSet.js @@ -10,9 +10,14 @@ export const getOptionIdRows = (rows, optionCodeIdMap, headerIndex) => { return rows.map((r) => { value = r[headerIndex] - row = [...r] - row[headerIndex] = optionCodeIdMap[value] - return row + + if (value !== '') { + row = [...r] + row[headerIndex] = optionCodeIdMap[value] + return row + } + + return r }) } diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 9633ce553..3470f62c3 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -3,7 +3,16 @@ import { applyBooleanHandler } from './boolean.js' import { applyNumericHandler } from './numeric.js' import { applyOptionSetHandler } from './optionSet.js' -export const transformResponse = (response) => { +const removeNaDimensions = (obj) => + Object.keys(obj).reduce((acc, key) => { + const value = obj[key] + acc[key] = Array.isArray(value) + ? value.filter((str) => str !== '') + : value + return acc + }, {}) + +export const transformResponse = (response, { hideNaData }) => { let transformedResponse = { ...response, } @@ -32,5 +41,11 @@ export const transformResponse = (response) => { } }) + if (hideNaData) { + transformedResponse.metaData.dimensions = removeNaDimensions( + transformedResponse.metaData.dimensions + ) + } + return transformedResponse } From ec1b2a8a5bdb1f83391745cca893687a683718e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Tue, 5 Aug 2025 15:09:39 +0200 Subject: [PATCH 14/50] chore: update response tests --- .../response/__tests__/response.spec.js | 98 +++++++++++++------ src/modules/response/response.js | 2 +- 2 files changed, 71 insertions(+), 29 deletions(-) diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index 21c3b3da8..53eeab5f0 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -12,42 +12,84 @@ import { transformResponse } from '../response.js' describe('response', () => { describe('transformResponse', () => { - it('transforms numeric response', () => { - expect( - transformResponse(responseNumericOrg, { hideNaData: false }) - ).toEqual(responseNumeric) - }) + describe('numeric', () => { + it('transforms response', () => { + expect(transformResponse(responseNumericOrg)).toEqual( + responseNumeric + ) + }) - it('transforms numeric response and N/A is not a dimension', () => { - expect( - transformResponse(responseNumericOrg, { - hideNaData: true, - }).metaData.dimensions['Zj7UnCAulEk.qrur9Dvnyt5'].includes('') - ).toEqual(false) + it('transforms response and hides N/A', () => { + expect( + transformResponse(responseNumericOrg, { + hideNaData: true, + }).metaData.dimensions['Zj7UnCAulEk.qrur9Dvnyt5'].includes( + '' + ) + ).toEqual(false) + }) }) - it('transforms option set response', () => { - expect( - transformResponse(responseOptionSetOrg, { hideNaData: false }) - ).toEqual(responseOptionSet) - }) + describe('option set', () => { + it('transforms response', () => { + expect( + transformResponse(responseOptionSetOrg, { + hideNaData: false, + }) + ).toEqual(responseOptionSet) + }) + + it('transforms response and hides N/A', () => { + expect( + transformResponse(responseOptionSetOrg, { + hideNaData: true, + }).metaData.dimensions['Zj7UnCAulEk.fWIAEtYVEGk'].includes( + '' + ) + ).toBe(false) + }) - it('transforms option set response with non-unique codes across two option sets', () => { - expect( - transformResponse(responseOptionSetsOrg, { hideNaData: false }) - ).toEqual(responseOptionSets) + it('transforms response with non-unique codes across two option sets', () => { + expect(transformResponse(responseOptionSetsOrg)).toEqual( + responseOptionSets + ) + }) }) - it('transforms boolean response', () => { - expect( - transformResponse(responseBooleanOrg, { hideNaData: false }) - ).toEqual(responseBoolean) + describe('boolean', () => { + it('transforms response', () => { + expect(transformResponse(responseBooleanOrg)).toEqual( + responseBoolean + ) + }) + + it('transforms response and hides N/A', () => { + expect( + transformResponse(responseBooleanOrg, { + hideNaData: true, + }).metaData.dimensions['A03MvHHogjR.bx6fsa0t90x'].includes( + '' + ) + ).toBe(false) + }) }) - it('transforms yes only response', () => { - expect( - transformResponse(responseYesOnlyOrg, { hideNaData: false }) - ).toEqual(responseYesOnly) + describe('yes only', () => { + it('transforms response', () => { + expect(transformResponse(responseYesOnlyOrg)).toEqual( + responseYesOnly + ) + }) + + it('transforms response and hides N/A', () => { + expect( + transformResponse(responseYesOnlyOrg, { + hideNaData: true, + }).metaData.dimensions['jfuXZB3A1ko.hwG20Dyj6RK'].includes( + '' + ) + ).toBe(false) + }) }) }) }) diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 3470f62c3..513369ff4 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -12,7 +12,7 @@ const removeNaDimensions = (obj) => return acc }, {}) -export const transformResponse = (response, { hideNaData }) => { +export const transformResponse = (response, { hideNaData } = {}) => { let transformedResponse = { ...response, } From 1b576698fd4fc26ccbab4a02fcea2f6c38347878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Tue, 5 Aug 2025 15:15:58 +0200 Subject: [PATCH 15/50] chore: add yes only test --- .../response/__tests__/boolean.spec.js | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/modules/response/__tests__/boolean.spec.js b/src/modules/response/__tests__/boolean.spec.js index 8e014a1d3..dffe631cc 100644 --- a/src/modules/response/__tests__/boolean.spec.js +++ b/src/modules/response/__tests__/boolean.spec.js @@ -1,15 +1,27 @@ -import response from '../../../__demo__/data/event/boolean.data.json' -import responseOrg from '../../../__demo__/data/event/boolean.data.org.json' +import booleanResponse from '../../../__demo__/data/event/boolean.data.json' +import booleanResponseOrg from '../../../__demo__/data/event/boolean.data.org.json' +import yesOnlyResponse from '../../../__demo__/data/event/yesonly.data.json' +import yesOnlyResponseOrg from '../../../__demo__/data/event/yesonly.data.org.json' import { applyBooleanHandler } from '../boolean.js' const headerIndex = 0 describe('boolean', () => { describe('applyBooleanHandler', () => { - it('should return the transformed response', () => { - expect(applyBooleanHandler(responseOrg, headerIndex)).toEqual( - response - ) + describe('boolean', () => { + it('should return the transformed response', () => { + expect( + applyBooleanHandler(booleanResponseOrg, headerIndex) + ).toEqual(booleanResponse) + }) + }) + + describe('yes only', () => { + it('should return the transformed response', () => { + expect( + applyBooleanHandler(yesOnlyResponseOrg, headerIndex) + ).toEqual(yesOnlyResponse) + }) }) }) }) From 5647eb5fd5ca1b30d38694b9ad3497e192de9112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 7 Aug 2025 10:32:02 +0200 Subject: [PATCH 16/50] chore: add tests for removeNaDimensionItems --- .../response/__tests__/response.spec.js | 20 ++++++++++++++++++- src/modules/response/response.js | 4 ++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index 53eeab5f0..bf60a212f 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -8,9 +8,27 @@ import responseOptionSets from '../../../__demo__/data/event/optionsets.data.jso import responseOptionSetsOrg from '../../../__demo__/data/event/optionsets.data.org.json' import responseYesOnly from '../../../__demo__/data/event/yesonly.data.json' import responseYesOnlyOrg from '../../../__demo__/data/event/yesonly.data.org.json' -import { transformResponse } from '../response.js' +import { removeNaDimensionItems, transformResponse } from '../response.js' describe('response', () => { + describe('removeNaDimensionItems', () => { + it('removes empty strings from array values', () => { + const input = { dim1: ['a', '', 'b'], dim2: [''] } + const expected = { dim1: ['a', 'b'], dim2: [] } + expect(removeNaDimensionItems(input)).toEqual(expected) + }) + + it('leaves non-array values unchanged', () => { + const input = { dim1: 'abc', dim2: 123, dim3: null } + const expected = { dim1: 'abc', dim2: 123, dim3: null } + expect(removeNaDimensionItems(input)).toEqual(expected) + }) + + it('returns an empty object when given an empty object', () => { + expect(removeNaDimensionItems({})).toEqual({}) + }) + }) + describe('transformResponse', () => { describe('numeric', () => { it('transforms response', () => { diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 513369ff4..84a702c51 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -3,7 +3,7 @@ import { applyBooleanHandler } from './boolean.js' import { applyNumericHandler } from './numeric.js' import { applyOptionSetHandler } from './optionSet.js' -const removeNaDimensions = (obj) => +export const removeNaDimensionItems = (obj) => Object.keys(obj).reduce((acc, key) => { const value = obj[key] acc[key] = Array.isArray(value) @@ -42,7 +42,7 @@ export const transformResponse = (response, { hideNaData } = {}) => { }) if (hideNaData) { - transformedResponse.metaData.dimensions = removeNaDimensions( + transformedResponse.metaData.dimensions = removeNaDimensionItems( transformedResponse.metaData.dimensions ) } From 36f8b18cc21e3ca0bd401be039370fbcdd1aa99f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 11 Aug 2025 17:10:14 +0200 Subject: [PATCH 17/50] chore: refactor hide na (WIP) --- .../data/event/boolean.data.hidena.json | 115 +++ .../event/numeric-legendset.data.hidena.json | 154 ++++ .../data/event/numeric-legendset.data.json | 211 +----- .../data/event/numeric.data.hidena.json | 710 ++++++++++++++++++ .../data/event/optionset.data.hidena.json | 116 +++ src/__demo__/data/event/optionset.data.json | 6 +- .../data/event/optionsets.data.hidena.json | 125 +++ src/__demo__/data/event/optionsets.data.json | 7 +- .../data/event/yesonly.data.hidena.json | 138 ++++ .../response/__tests__/numeric.spec.js | 51 +- .../response/__tests__/response.spec.js | 75 +- src/modules/response/boolean.js | 3 - src/modules/response/numeric.js | 39 +- src/modules/response/optionSet.js | 6 +- src/modules/response/response.js | 72 +- 15 files changed, 1527 insertions(+), 301 deletions(-) create mode 100644 src/__demo__/data/event/boolean.data.hidena.json create mode 100644 src/__demo__/data/event/numeric-legendset.data.hidena.json create mode 100644 src/__demo__/data/event/numeric.data.hidena.json create mode 100644 src/__demo__/data/event/optionset.data.hidena.json create mode 100644 src/__demo__/data/event/optionsets.data.hidena.json create mode 100644 src/__demo__/data/event/yesonly.data.hidena.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..a5491b66b --- /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/numeric-legendset.data.hidena.json b/src/__demo__/data/event/numeric-legendset.data.hidena.json new file mode 100644 index 000000000..c94bc1537 --- /dev/null +++ b/src/__demo__/data/event/numeric-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/numeric-legendset.data.json b/src/__demo__/data/event/numeric-legendset.data.json index 080769a24..28798e4fd 100644 --- a/src/__demo__/data/event/numeric-legendset.data.json +++ b/src/__demo__/data/event/numeric-legendset.data.json @@ -95,14 +95,13 @@ }, "LAST_3_MONTHS": { "name": "Last 3 months" + }, + "": { + "name": "N/A" } }, "dimensions": { - "pe": [ - "202503", - "202504", - "202505" - ], + "pe": ["202503", "202504", "202505"], "Zj7UnCAulEk.qrur9Dvnyt5": [ "pZzk1L4Blf1", "OyVUzWsX8UF", @@ -113,179 +112,47 @@ "Tq4NYCn9eNH", "b7MCpzqJaR2", "puI3YpLJ3fC", - "scvmgP9F9rn" + "scvmgP9F9rn", + "" ], - "ou": [ - "ImspTQPwCqd" - ] + "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" - ] + ["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 -} \ No newline at end of file +} diff --git a/src/__demo__/data/event/numeric.data.hidena.json b/src/__demo__/data/event/numeric.data.hidena.json new file mode 100644 index 000000000..e72cd76c9 --- /dev/null +++ b/src/__demo__/data/event/numeric.data.hidena.json @@ -0,0 +1,710 @@ +{ + "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" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:11": { + "name": "11" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:12": { + "name": "12" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:13": { + "name": "13" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:14": { + "name": "14" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:15": { + "name": "15" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:16": { + "name": "16" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:17": { + "name": "17" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:18": { + "name": "18" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:19": { + "name": "19" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:20": { + "name": "20" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:21": { + "name": "21" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:22": { + "name": "22" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:23": { + "name": "23" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:24": { + "name": "24" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:25": { + "name": "25" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:26": { + "name": "26" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:27": { + "name": "27" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:28": { + "name": "28" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:29": { + "name": "29" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:30": { + "name": "30" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:31": { + "name": "31" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:32": { + "name": "32" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:33": { + "name": "33" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:34": { + "name": "34" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:35": { + "name": "35" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:36": { + "name": "36" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:37": { + "name": "37" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:38": { + "name": "38" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:39": { + "name": "39" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:40": { + "name": "40" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:41": { + "name": "41" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:42": { + "name": "42" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:43": { + "name": "43" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:44": { + "name": "44" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:45": { + "name": "45" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:46": { + "name": "46" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:47": { + "name": "47" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:48": { + "name": "48" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:49": { + "name": "49" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:50": { + "name": "50" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:51": { + "name": "51" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:52": { + "name": "52" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:53": { + "name": "53" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:54": { + "name": "54" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:55": { + "name": "55" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:56": { + "name": "56" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:57": { + "name": "57" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:58": { + "name": "58" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:59": { + "name": "59" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:60": { + "name": "60" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:61": { + "name": "61" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:62": { + "name": "62" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:63": { + "name": "63" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:64": { + "name": "64" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:65": { + "name": "65" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:66": { + "name": "66" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:67": { + "name": "67" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:68": { + "name": "68" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:69": { + "name": "69" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:70": { + "name": "70" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:71": { + "name": "71" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:72": { + "name": "72" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:73": { + "name": "73" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:74": { + "name": "74" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:75": { + "name": "75" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:76": { + "name": "76" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:77": { + "name": "77" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:78": { + "name": "78" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:79": { + "name": "79" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:80": { + "name": "80" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:81": { + "name": "81" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:82": { + "name": "82" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:83": { + "name": "83" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:84": { + "name": "84" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:85": { + "name": "85" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:86": { + "name": "86" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:87": { + "name": "87" + }, + "Zj7UnCAulEk.qrur9Dvnyt5:88": { + "name": "88" + } + }, + "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", + "Zj7UnCAulEk.qrur9Dvnyt5:11", + "Zj7UnCAulEk.qrur9Dvnyt5:12", + "Zj7UnCAulEk.qrur9Dvnyt5:13", + "Zj7UnCAulEk.qrur9Dvnyt5:14", + "Zj7UnCAulEk.qrur9Dvnyt5:15", + "Zj7UnCAulEk.qrur9Dvnyt5:16", + "Zj7UnCAulEk.qrur9Dvnyt5:17", + "Zj7UnCAulEk.qrur9Dvnyt5:18", + "Zj7UnCAulEk.qrur9Dvnyt5:19", + "Zj7UnCAulEk.qrur9Dvnyt5:20", + "Zj7UnCAulEk.qrur9Dvnyt5:21", + "Zj7UnCAulEk.qrur9Dvnyt5:22", + "Zj7UnCAulEk.qrur9Dvnyt5:23", + "Zj7UnCAulEk.qrur9Dvnyt5:24", + "Zj7UnCAulEk.qrur9Dvnyt5:25", + "Zj7UnCAulEk.qrur9Dvnyt5:26", + "Zj7UnCAulEk.qrur9Dvnyt5:27", + "Zj7UnCAulEk.qrur9Dvnyt5:28", + "Zj7UnCAulEk.qrur9Dvnyt5:29", + "Zj7UnCAulEk.qrur9Dvnyt5:30", + "Zj7UnCAulEk.qrur9Dvnyt5:31", + "Zj7UnCAulEk.qrur9Dvnyt5:32", + "Zj7UnCAulEk.qrur9Dvnyt5:33", + "Zj7UnCAulEk.qrur9Dvnyt5:34", + "Zj7UnCAulEk.qrur9Dvnyt5:35", + "Zj7UnCAulEk.qrur9Dvnyt5:36", + "Zj7UnCAulEk.qrur9Dvnyt5:37", + "Zj7UnCAulEk.qrur9Dvnyt5:38", + "Zj7UnCAulEk.qrur9Dvnyt5:39", + "Zj7UnCAulEk.qrur9Dvnyt5:40", + "Zj7UnCAulEk.qrur9Dvnyt5:41", + "Zj7UnCAulEk.qrur9Dvnyt5:42", + "Zj7UnCAulEk.qrur9Dvnyt5:43", + "Zj7UnCAulEk.qrur9Dvnyt5:44", + "Zj7UnCAulEk.qrur9Dvnyt5:45", + "Zj7UnCAulEk.qrur9Dvnyt5:46", + "Zj7UnCAulEk.qrur9Dvnyt5:47", + "Zj7UnCAulEk.qrur9Dvnyt5:48", + "Zj7UnCAulEk.qrur9Dvnyt5:49", + "Zj7UnCAulEk.qrur9Dvnyt5:50", + "Zj7UnCAulEk.qrur9Dvnyt5:51", + "Zj7UnCAulEk.qrur9Dvnyt5:52", + "Zj7UnCAulEk.qrur9Dvnyt5:53", + "Zj7UnCAulEk.qrur9Dvnyt5:54", + "Zj7UnCAulEk.qrur9Dvnyt5:55", + "Zj7UnCAulEk.qrur9Dvnyt5:56", + "Zj7UnCAulEk.qrur9Dvnyt5:57", + "Zj7UnCAulEk.qrur9Dvnyt5:58", + "Zj7UnCAulEk.qrur9Dvnyt5:59", + "Zj7UnCAulEk.qrur9Dvnyt5:60", + "Zj7UnCAulEk.qrur9Dvnyt5:61", + "Zj7UnCAulEk.qrur9Dvnyt5:62", + "Zj7UnCAulEk.qrur9Dvnyt5:63", + "Zj7UnCAulEk.qrur9Dvnyt5:64", + "Zj7UnCAulEk.qrur9Dvnyt5:65", + "Zj7UnCAulEk.qrur9Dvnyt5:66", + "Zj7UnCAulEk.qrur9Dvnyt5:67", + "Zj7UnCAulEk.qrur9Dvnyt5:68", + "Zj7UnCAulEk.qrur9Dvnyt5:69", + "Zj7UnCAulEk.qrur9Dvnyt5:70", + "Zj7UnCAulEk.qrur9Dvnyt5:71", + "Zj7UnCAulEk.qrur9Dvnyt5:72", + "Zj7UnCAulEk.qrur9Dvnyt5:73", + "Zj7UnCAulEk.qrur9Dvnyt5:74", + "Zj7UnCAulEk.qrur9Dvnyt5:75", + "Zj7UnCAulEk.qrur9Dvnyt5:76", + "Zj7UnCAulEk.qrur9Dvnyt5:77", + "Zj7UnCAulEk.qrur9Dvnyt5:78", + "Zj7UnCAulEk.qrur9Dvnyt5:79", + "Zj7UnCAulEk.qrur9Dvnyt5:80", + "Zj7UnCAulEk.qrur9Dvnyt5:81", + "Zj7UnCAulEk.qrur9Dvnyt5:82", + "Zj7UnCAulEk.qrur9Dvnyt5:83", + "Zj7UnCAulEk.qrur9Dvnyt5:84", + "Zj7UnCAulEk.qrur9Dvnyt5:85", + "Zj7UnCAulEk.qrur9Dvnyt5:86", + "Zj7UnCAulEk.qrur9Dvnyt5:87", + "Zj7UnCAulEk.qrur9Dvnyt5:88" + ], + "ou": ["ImspTQPwCqd"] + } + }, + "rowContext": {}, + "width": 4, + "rows": [ + ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202503", "70"], + ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202504", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202505", "67"], + ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202503", "70"], + ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202504", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202503", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202503", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202503", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202504", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202505", "65"], + ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202504", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202504", "30"], + ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202505", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202505", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202505", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202505", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202503", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202503", "65"], + ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202505", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202504", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202505", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202504", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202505", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202503", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202504", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202503", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202503", "39"], + ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202504", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202504", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202505", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202503", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202505", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202504", "34"], + ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202505", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202504", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202504", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202503", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202505", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202503", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202505", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202505", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202504", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202505", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202505", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202503", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202505", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202505", "31"], + ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202505", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202503", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202504", "32"], + ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202503", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202505", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202505", "66"], + ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202504", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202503", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202505", "48"], + ["", "ImspTQPwCqd", "202505", "5"], + ["", "ImspTQPwCqd", "202506", "12"] + ], + "height": 267, + "headerWidth": 4 +} 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..958379757 --- /dev/null +++ b/src/__demo__/data/event/optionset.data.hidena.json @@ -0,0 +1,116 @@ +{ + "headers": [ + { + "name": "Zj7UnCAulEk.fWIAEtYVEGk", + "column": "Mode of Discharge", + "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": { + "202504": { + "name": "April 2025" + }, + "202505": { + "name": "May 2025" + }, + "202506": { + "name": "June 2025" + }, + "ou": { + "name": "Organisation unit" + }, + "Fhbf4aKpZmZ": { + "code": "MODABSC", + "name": "Absconded" + }, + "Zj7UnCAulEk.fWIAEtYVEGk": { + "name": "Mode of Discharge" + }, + "gj2fKKyp8OH": { + "code": "MODDIED", + "name": "Died" + }, + "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" + }, + "fShHdgT7XGb": { + "code": "MODTRANS", + "name": "Transferred" + }, + "yeod5tOXpkP": { + "code": "MODDISCH", + "name": "Discharged" + } + }, + "dimensions": { + "pe": ["202504", "202505", "202506"], + "ou": ["ImspTQPwCqd"], + "Zj7UnCAulEk.fWIAEtYVEGk": [ + "yeod5tOXpkP", + "gj2fKKyp8OH", + "fShHdgT7XGb", + "Fhbf4aKpZmZ" + ] + } + }, + "rowContext": {}, + "headerWidth": 4, + "width": 4, + "rows": [ + ["gj2fKKyp8OH", "ImspTQPwCqd", "202504", "524"], + ["yeod5tOXpkP", "ImspTQPwCqd", "202504", "555"], + ["fShHdgT7XGb", "ImspTQPwCqd", "202504", "515"], + ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202504", "504"], + ["fShHdgT7XGb", "ImspTQPwCqd", "202506", "609"], + ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202505", "574"], + ["yeod5tOXpkP", "ImspTQPwCqd", "202505", "586"], + ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202506", "574"], + ["gj2fKKyp8OH", "ImspTQPwCqd", "202505", "565"], + ["gj2fKKyp8OH", "ImspTQPwCqd", "202506", "545"], + ["yeod5tOXpkP", "ImspTQPwCqd", "202506", "597"], + ["fShHdgT7XGb", "ImspTQPwCqd", "202505", "561"], + ["", "ImspTQPwCqd", "202505", "49"] + ], + "height": 24 +} diff --git a/src/__demo__/data/event/optionset.data.json b/src/__demo__/data/event/optionset.data.json index 958379757..30c1e16c9 100644 --- a/src/__demo__/data/event/optionset.data.json +++ b/src/__demo__/data/event/optionset.data.json @@ -81,6 +81,9 @@ "yeod5tOXpkP": { "code": "MODDISCH", "name": "Discharged" + }, + "": { + "name": "N/A" } }, "dimensions": { @@ -90,7 +93,8 @@ "yeod5tOXpkP", "gj2fKKyp8OH", "fShHdgT7XGb", - "Fhbf4aKpZmZ" + "Fhbf4aKpZmZ", + "" ] } }, diff --git a/src/__demo__/data/event/optionsets.data.hidena.json b/src/__demo__/data/event/optionsets.data.hidena.json new file mode 100644 index 000000000..88be1fad8 --- /dev/null +++ b/src/__demo__/data/event/optionsets.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/optionsets.data.json b/src/__demo__/data/event/optionsets.data.json index 88be1fad8..79b364a11 100644 --- a/src/__demo__/data/event/optionsets.data.json +++ b/src/__demo__/data/event/optionsets.data.json @@ -93,13 +93,16 @@ }, "LAST_3_MONTHS": { "name": "Last 3 months" + }, + "": { + "name": "N/A" } }, "dimensions": { "pe": ["202505", "202506", "202507"], "ou": ["ImspTQPwCqd"], - "stageA.element1": ["optionId1", "optionId2"], - "stageB.element2": ["optionId3", "optionId4"] + "stageA.element1": ["optionId1", "optionId2", ""], + "stageB.element2": ["optionId3", "optionId4", ""] } }, "rowContext": {}, 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..52083817d --- /dev/null +++ b/src/__demo__/data/event/yesonly.data.hidena.json @@ -0,0 +1,138 @@ +{ + "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": { + "202407": { + "name": "July 2024" + }, + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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:0": { + "name": "No" + }, + "jfuXZB3A1ko.hwG20Dyj6RK:1": { + "name": "Yes" + } + }, + "dimensions": { + "pe": [ + "202407", + "202408", + "202409", + "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"] + ], + "height": 8, + "headerWidth": 4 +} diff --git a/src/modules/response/__tests__/numeric.spec.js b/src/modules/response/__tests__/numeric.spec.js index dd929db6a..27e10cfd3 100644 --- a/src/modules/response/__tests__/numeric.spec.js +++ b/src/modules/response/__tests__/numeric.spec.js @@ -7,8 +7,10 @@ import { getNumericRows, getPrefixedValue, getUnique, + getUniqueSortedValues, sortStringsAsNumbersAsc, } from '../numeric.js' +import { NA_VALUE } from '../response.js' const testId = 'Zj7UnCAulEk.qrur9Dvnyt5' const headerIndex = 0 @@ -74,51 +76,44 @@ describe('numeric', () => { }) }) + describe('getUniqueSortedValues', () => { + expect( + getUniqueSortedValues( + [ + ['1', 'a'], + ['5', 'b'], + ['-1', 'c'], + ['', 'd'], + ['5', 'e'], + ['3', 'f'], + ], + headerIndex + ) + ).toEqual(['-1', '1', '3', '5']) + }) + describe('getPrefixedValue', () => { it('returns prefix and value separated by a colon', () => { expect(getPrefixedValue('123', 'id')).toBe('id:123') }) - - it('works with empty string prefix', () => { - expect(getPrefixedValue('abc', '')).toBe(':abc') - }) - - it('works with empty string value', () => { - expect(getPrefixedValue('', 'test')).toBe('') - }) - - it('works with both prefix and value empty', () => { - expect(getPrefixedValue('', '')).toBe('') - }) }) describe('getNumericItems', () => { it('returns an object with prefixed keys and correct names', () => { - const values = ['1', '2', ''] + const values = ['1', '2'] expect(getNumericItems(values, testId)).toEqual({ [testId + ':1']: { name: '1' }, [testId + ':2']: { name: '2' }, - '': { name: 'N/A' }, }) }) - - it('handles empty values array', () => { - expect(getNumericItems([], 'prefix')).toEqual({}) - }) }) describe('getNumericDimension', () => { it('returns object with dimensionId as key and correctly prefixed values', () => { - const values = ['1', '2', ''] + const values = ['1', '2'] expect(getNumericDimension(values, testId)).toEqual({ - [testId]: [testId + ':1', testId + ':2', ''], - }) - }) - - it('handles empty values array', () => { - expect(getNumericDimension([], 'prefix')).toEqual({ - prefix: [], + [testId]: [testId + ':1', testId + ':2'], }) }) }) @@ -128,14 +123,14 @@ describe('numeric', () => { const rows = [ ['a', '1', 'x'], ['b', '2', 'y'], - ['c', '', 'z'], + ['c', NA_VALUE, 'z'], ] const headerIndex = 1 expect(getNumericRows(rows, headerIndex, testId)).toEqual([ ['a', testId + ':1', 'x'], ['b', testId + ':2', 'y'], - ['c', '', 'z'], + ['c', NA_VALUE, 'z'], ]) }) diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index bf60a212f..c9cfa8de8 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -1,34 +1,21 @@ +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 responseNumericHideNa from '../../../__demo__/data/event/numeric.data.hidena.json' import responseNumeric from '../../../__demo__/data/event/numeric.data.json' import responseNumericOrg from '../../../__demo__/data/event/numeric.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 responseOptionSetsHideNa from '../../../__demo__/data/event/optionsets.data.hidena.json' import responseOptionSets from '../../../__demo__/data/event/optionsets.data.json' import responseOptionSetsOrg from '../../../__demo__/data/event/optionsets.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 { removeNaDimensionItems, transformResponse } from '../response.js' +import { transformResponse } from '../response.js' describe('response', () => { - describe('removeNaDimensionItems', () => { - it('removes empty strings from array values', () => { - const input = { dim1: ['a', '', 'b'], dim2: [''] } - const expected = { dim1: ['a', 'b'], dim2: [] } - expect(removeNaDimensionItems(input)).toEqual(expected) - }) - - it('leaves non-array values unchanged', () => { - const input = { dim1: 'abc', dim2: 123, dim3: null } - const expected = { dim1: 'abc', dim2: 123, dim3: null } - expect(removeNaDimensionItems(input)).toEqual(expected) - }) - - it('returns an empty object when given an empty object', () => { - expect(removeNaDimensionItems({})).toEqual({}) - }) - }) - describe('transformResponse', () => { describe('numeric', () => { it('transforms response', () => { @@ -37,34 +24,26 @@ describe('response', () => { ) }) - it('transforms response and hides N/A', () => { + it('transforms response and hides N/A data', () => { expect( - transformResponse(responseNumericOrg, { - hideNaData: true, - }).metaData.dimensions['Zj7UnCAulEk.qrur9Dvnyt5'].includes( - '' - ) - ).toEqual(false) + transformResponse(responseNumericOrg, { hideNaData: true }) + ).toEqual(responseNumericHideNa) }) }) describe('option set', () => { it('transforms response', () => { - expect( - transformResponse(responseOptionSetOrg, { - hideNaData: false, - }) - ).toEqual(responseOptionSet) + expect(transformResponse(responseOptionSetOrg)).toEqual( + responseOptionSet + ) }) - it('transforms response and hides N/A', () => { + it('transforms response and hides N/A data', () => { expect( transformResponse(responseOptionSetOrg, { hideNaData: true, - }).metaData.dimensions['Zj7UnCAulEk.fWIAEtYVEGk'].includes( - '' - ) - ).toBe(false) + }) + ).toEqual(responseOptionSetHideNa) }) it('transforms response with non-unique codes across two option sets', () => { @@ -72,6 +51,14 @@ describe('response', () => { responseOptionSets ) }) + + it('transforms response with non-unique codes across two option sets and hides N/A data', () => { + expect( + transformResponse(responseOptionSetOrg, { + hideNaData: true, + }) + ).toEqual(responseOptionSetsHideNa) + }) }) describe('boolean', () => { @@ -81,14 +68,12 @@ describe('response', () => { ) }) - it('transforms response and hides N/A', () => { + it('transforms response and hides N/A data', () => { expect( transformResponse(responseBooleanOrg, { hideNaData: true, - }).metaData.dimensions['A03MvHHogjR.bx6fsa0t90x'].includes( - '' - ) - ).toBe(false) + }) + ).toEqual(responseBooleanHideNa) }) }) @@ -99,14 +84,12 @@ describe('response', () => { ) }) - it('transforms response and hides N/A', () => { + it('transforms response and hides N/A data', () => { expect( transformResponse(responseYesOnlyOrg, { hideNaData: true, - }).metaData.dimensions['jfuXZB3A1ko.hwG20Dyj6RK'].includes( - '' - ) - ).toBe(false) + }) + ).toEqual(responseYesOnlyHideNa) }) }) }) diff --git a/src/modules/response/boolean.js b/src/modules/response/boolean.js index 6a183af35..e12a3e87d 100644 --- a/src/modules/response/boolean.js +++ b/src/modules/response/boolean.js @@ -17,9 +17,6 @@ export const applyBooleanHandler = (response, headerIndex) => { [getPrefixedValue('1', dimensionId)]: { name: i18n.t('Yes'), }, - '': { - name: i18n.t('N/A'), - }, }, }, } diff --git a/src/modules/response/numeric.js b/src/modules/response/numeric.js index dfe9fb14a..c55c8785e 100644 --- a/src/modules/response/numeric.js +++ b/src/modules/response/numeric.js @@ -1,29 +1,35 @@ -import i18n from '@dhis2/d2-i18n' +import { NA_VALUE } from './response.js' export const getUnique = (array) => [...new Set(array)] export const sortStringsAsNumbersAsc = (arr) => { return arr.slice().sort((a, b) => { - if (a === '' && b === '') { + if (a === NA_VALUE && b === NA_VALUE) { return 0 } - if (a === '') { + if (a === NA_VALUE) { return 1 } - if (b === '') { + if (b === NA_VALUE) { return -1 } return Number(a) - Number(b) }) } -export const getPrefixedValue = (value, prefix) => - value !== '' ? `${prefix}:${value}` : value +export const getUniqueSortedValues = (rows, headerIndex) => + sortStringsAsNumbersAsc( + getUnique( + rows.map((row) => row[headerIndex]).filter((value) => value.length) + ) + ) + +export const getPrefixedValue = (value, prefix) => `${prefix}:${value}` export const getNumericItems = (values, dimensionId) => values.reduce((items, value) => { items[getPrefixedValue(value, dimensionId)] = { - name: value || i18n.t('N/A'), + name: value, } return items }, {}) @@ -34,24 +40,29 @@ export const getNumericDimension = (values, dimensionId) => ({ export const getNumericRows = (rows, headerIndex, dimensionId) => { let row + let value return rows.map((r) => { - row = [...r] - row[headerIndex] = getPrefixedValue(row[headerIndex], dimensionId) - return row + value = r[headerIndex] + + if (value !== NA_VALUE) { + row = [...r] + row[headerIndex] = getPrefixedValue(row[headerIndex], dimensionId) + return row + } + + return r }) } export const applyNumericHandler = (response, headerIndex) => { - const uniqueSortedValues = sortStringsAsNumbersAsc( - getUnique(response.rows.map((r) => r[headerIndex])) - ) - const dimensionId = response.headers[headerIndex].name + const uniqueSortedValues = getUniqueSortedValues(response.rows, headerIndex) return { ...response, metaData: { + ...response.metaData, items: { ...response.metaData.items, ...getNumericItems(uniqueSortedValues, dimensionId), diff --git a/src/modules/response/optionSet.js b/src/modules/response/optionSet.js index de485f0dc..18d34453f 100644 --- a/src/modules/response/optionSet.js +++ b/src/modules/response/optionSet.js @@ -1,3 +1,5 @@ +import { NA_VALUE } from './response.js' + export const getOptionCodeIdMap = (optionIds, metaDataItems) => optionIds.reduce((map, optionId) => { map[metaDataItems[optionId].code] = optionId @@ -5,13 +7,13 @@ export const getOptionCodeIdMap = (optionIds, metaDataItems) => }, {}) export const getOptionIdRows = (rows, optionCodeIdMap, headerIndex) => { - let row let value + let row return rows.map((r) => { value = r[headerIndex] - if (value !== '') { + if (value !== NA_VALUE) { row = [...r] row[headerIndex] = optionCodeIdMap[value] return row diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 84a702c51..caac4146d 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -1,50 +1,56 @@ +import i18n from '@dhis2/d2-i18n' import { isBooleanValueType, isNumericValueType } from '../valueTypes.js' import { applyBooleanHandler } from './boolean.js' import { applyNumericHandler } from './numeric.js' import { applyOptionSetHandler } from './optionSet.js' -export const removeNaDimensionItems = (obj) => - Object.keys(obj).reduce((acc, key) => { - const value = obj[key] - acc[key] = Array.isArray(value) - ? value.filter((str) => str !== '') - : value - return acc - }, {}) +export const NA_VALUE = '' export const transformResponse = (response, { hideNaData } = {}) => { let transformedResponse = { ...response, } - response.headers.forEach((header, index) => { - if (header.meta) { - if (header.optionSet) { - transformedResponse = applyOptionSetHandler( - transformedResponse, - index - ) - } else if ( - isNumericValueType(header.valueType) && - !header.legendSet - ) { - transformedResponse = applyNumericHandler( - transformedResponse, - index - ) - } else if (isBooleanValueType(header.valueType)) { - transformedResponse = applyBooleanHandler( - transformedResponse, - index - ) - } + const metaHeaders = response.headers + .map((header, index) => ({ + ...header, + index, + })) + .filter((header) => Boolean(header.meta)) + + metaHeaders.forEach((header) => { + if (header.optionSet) { + transformedResponse = applyOptionSetHandler( + transformedResponse, + header.index + ) + } else if (isNumericValueType(header.valueType) && !header.legendSet) { + transformedResponse = applyNumericHandler( + transformedResponse, + header.index + ) + } else if (isBooleanValueType(header.valueType)) { + transformedResponse = applyBooleanHandler( + transformedResponse, + header.index + ) } }) - if (hideNaData) { - transformedResponse.metaData.dimensions = removeNaDimensionItems( - transformedResponse.metaData.dimensions - ) + if (!hideNaData) { + metaHeaders.forEach((header) => { + if ( + response.rows.map((row) => row[header.index]).includes(NA_VALUE) + ) { + transformedResponse.metaData.dimensions[ + header.name + ].dimensions.push(NA_VALUE) + } + }) + + transformedResponse.metaData.items[NA_VALUE] = { + name: i18n.t('N/A'), + } } return transformedResponse From 66ec9b6486a9bb0b20438f9d34aae460b1c6c66c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Tue, 12 Aug 2025 21:43:51 +0200 Subject: [PATCH 18/50] chore: fix tests with na data --- .../response/__tests__/boolean.spec.js | 10 +++---- .../response/__tests__/numeric.spec.js | 4 +-- .../response/__tests__/optionSet.spec.js | 12 ++++---- .../response/__tests__/response.spec.js | 2 +- src/modules/response/optionSet.js | 4 +-- src/modules/response/response.js | 30 +++++++++++++++---- 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/modules/response/__tests__/boolean.spec.js b/src/modules/response/__tests__/boolean.spec.js index dffe631cc..ac48fdce3 100644 --- a/src/modules/response/__tests__/boolean.spec.js +++ b/src/modules/response/__tests__/boolean.spec.js @@ -1,6 +1,6 @@ -import booleanResponse from '../../../__demo__/data/event/boolean.data.json' +import booleanResponseHideNa from '../../../__demo__/data/event/boolean.data.hidena.json' import booleanResponseOrg from '../../../__demo__/data/event/boolean.data.org.json' -import yesOnlyResponse from '../../../__demo__/data/event/yesonly.data.json' +import yesOnlyResponseHideNa from '../../../__demo__/data/event/yesonly.data.hidena.json' import yesOnlyResponseOrg from '../../../__demo__/data/event/yesonly.data.org.json' import { applyBooleanHandler } from '../boolean.js' @@ -8,11 +8,11 @@ const headerIndex = 0 describe('boolean', () => { describe('applyBooleanHandler', () => { - describe('boolean', () => { + describe('yes/no', () => { it('should return the transformed response', () => { expect( applyBooleanHandler(booleanResponseOrg, headerIndex) - ).toEqual(booleanResponse) + ).toEqual(booleanResponseHideNa) }) }) @@ -20,7 +20,7 @@ describe('boolean', () => { it('should return the transformed response', () => { expect( applyBooleanHandler(yesOnlyResponseOrg, headerIndex) - ).toEqual(yesOnlyResponse) + ).toEqual(yesOnlyResponseHideNa) }) }) }) diff --git a/src/modules/response/__tests__/numeric.spec.js b/src/modules/response/__tests__/numeric.spec.js index 27e10cfd3..500a105e2 100644 --- a/src/modules/response/__tests__/numeric.spec.js +++ b/src/modules/response/__tests__/numeric.spec.js @@ -1,4 +1,4 @@ -import response from '../../../__demo__/data/event/numeric.data.json' +import responseHideNa from '../../../__demo__/data/event/numeric.data.hidena.json' import responseOrg from '../../../__demo__/data/event/numeric.data.org.json' import { applyNumericHandler, @@ -142,7 +142,7 @@ describe('numeric', () => { describe('applyNumericHandler', () => { it('should return the transformed response', () => { expect(applyNumericHandler(responseOrg, headerIndex)).toEqual( - response + responseHideNa ) }) }) diff --git a/src/modules/response/__tests__/optionSet.spec.js b/src/modules/response/__tests__/optionSet.spec.js index 93cea550f..4d66337a8 100644 --- a/src/modules/response/__tests__/optionSet.spec.js +++ b/src/modules/response/__tests__/optionSet.spec.js @@ -1,4 +1,4 @@ -import response from '../../../__demo__/data/event/optionset.data.json' +import responseHideNa from '../../../__demo__/data/event/optionset.data.hidena.json' import responseOrg from '../../../__demo__/data/event/optionset.data.org.json' import { getOptionCodeIdMap, @@ -7,7 +7,7 @@ import { } from '../optionSet.js' const headerIndex = 0 -const testId = response.headers[headerIndex].name +const testId = responseHideNa.headers[headerIndex].name const testOptionCodeIdMap = { MODABSC: 'Fhbf4aKpZmZ', @@ -19,8 +19,8 @@ const testOptionCodeIdMap = { describe('optionSet', () => { describe('getOptionCodeIdMap', () => { it('should create an option code:id object', () => { - const testOptionIds = response.metaData.dimensions[testId] - const testOptionItems = response.metaData.items + const testOptionIds = responseHideNa.metaData.dimensions[testId] + const testOptionItems = responseHideNa.metaData.items expect(getOptionCodeIdMap(testOptionIds, testOptionItems)).toEqual( testOptionCodeIdMap @@ -36,14 +36,14 @@ describe('optionSet', () => { testOptionCodeIdMap, headerIndex ) - ).toEqual(response.rows) + ).toEqual(responseHideNa.rows) }) }) describe('applyOptionSetHandler', () => { it('should return the transformed response', () => { expect(applyOptionSetHandler(responseOrg, headerIndex)).toEqual( - response + responseHideNa ) }) }) diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index c9cfa8de8..66f286cf4 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -54,7 +54,7 @@ describe('response', () => { it('transforms response with non-unique codes across two option sets and hides N/A data', () => { expect( - transformResponse(responseOptionSetOrg, { + transformResponse(responseOptionSetsOrg, { hideNaData: true, }) ).toEqual(responseOptionSetsHideNa) diff --git a/src/modules/response/optionSet.js b/src/modules/response/optionSet.js index 18d34453f..34d635d55 100644 --- a/src/modules/response/optionSet.js +++ b/src/modules/response/optionSet.js @@ -1,8 +1,8 @@ import { NA_VALUE } from './response.js' -export const getOptionCodeIdMap = (optionIds, metaDataItems) => +export const getOptionCodeIdMap = (optionIds, items) => optionIds.reduce((map, optionId) => { - map[metaDataItems[optionId].code] = optionId + map[items[optionId].code] = optionId return map }, {}) diff --git a/src/modules/response/response.js b/src/modules/response/response.js index caac4146d..40d8b69b1 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -1,4 +1,8 @@ import i18n from '@dhis2/d2-i18n' +import { + DIMENSION_ID_ORGUNIT, + DIMENSION_ID_PERIOD, +} from '../predefinedDimensions.js' import { isBooleanValueType, isNumericValueType } from '../valueTypes.js' import { applyBooleanHandler } from './boolean.js' import { applyNumericHandler } from './numeric.js' @@ -6,9 +10,18 @@ import { applyOptionSetHandler } from './optionSet.js' export const NA_VALUE = '' -export const transformResponse = (response, { hideNaData } = {}) => { +export const transformResponse = (response, { hideNaData = false } = {}) => { let transformedResponse = { ...response, + metaData: { + ...response.metaData, + items: { + ...response.metaData.items, + }, + dimensions: { + ...response.metaData.dimensions, + }, + }, } const metaHeaders = response.headers @@ -16,7 +29,13 @@ export const transformResponse = (response, { hideNaData } = {}) => { ...header, index, })) - .filter((header) => Boolean(header.meta)) + .filter( + (header) => + Boolean(header.meta) && + ![DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT].includes( + header.name + ) + ) metaHeaders.forEach((header) => { if (header.optionSet) { @@ -42,9 +61,10 @@ export const transformResponse = (response, { hideNaData } = {}) => { if ( response.rows.map((row) => row[header.index]).includes(NA_VALUE) ) { - transformedResponse.metaData.dimensions[ - header.name - ].dimensions.push(NA_VALUE) + transformedResponse.metaData.dimensions[header.name] = [ + ...transformedResponse.metaData.dimensions[header.name], + NA_VALUE, + ] } }) From 88ec54318be6591a0e39a05919e5ac57370777b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 13 Aug 2025 16:28:01 +0200 Subject: [PATCH 19/50] chore: add more types (WIP) --- src/__demo__/data/event/datetime.data.json | 133 ++++++++++++++++++ .../data/event/datetime.data.org.json | 133 ++++++++++++++++++ src/modules/response/boolean.js | 10 +- .../response/{numeric.js => default.js} | 20 +-- src/modules/response/response.js | 55 +++++++- 5 files changed, 334 insertions(+), 17 deletions(-) create mode 100644 src/__demo__/data/event/datetime.data.json create mode 100644 src/__demo__/data/event/datetime.data.org.json rename src/modules/response/{numeric.js => default.js} (74%) diff --git a/src/__demo__/data/event/datetime.data.json b/src/__demo__/data/event/datetime.data.json new file mode 100644 index 000000000..f886d379e --- /dev/null +++ b/src/__demo__/data/event/datetime.data.json @@ -0,0 +1,133 @@ +{ + "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": { + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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" + }, + "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" + } + }, + "dimensions": { + "pe": [ + "202408", + "202409", + "202410", + "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.data.org.json b/src/__demo__/data/event/datetime.data.org.json new file mode 100644 index 000000000..f886d379e --- /dev/null +++ b/src/__demo__/data/event/datetime.data.org.json @@ -0,0 +1,133 @@ +{ + "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": { + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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" + }, + "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" + } + }, + "dimensions": { + "pe": [ + "202408", + "202409", + "202410", + "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/modules/response/boolean.js b/src/modules/response/boolean.js index e12a3e87d..1ff15c2fe 100644 --- a/src/modules/response/boolean.js +++ b/src/modules/response/boolean.js @@ -1,16 +1,16 @@ import i18n from '@dhis2/d2-i18n' -import { applyNumericHandler, getPrefixedValue } from './numeric.js' +import { applyDefaultHandler, getPrefixedValue } from './default.js' export const applyBooleanHandler = (response, headerIndex) => { const dimensionId = response.headers[headerIndex].name - const numericResponse = applyNumericHandler(response, headerIndex) + const defaultResponse = applyDefaultHandler(response, headerIndex) return { - ...numericResponse, + ...defaultResponse, metaData: { - ...numericResponse.metaData, + ...defaultResponse.metaData, items: { - ...numericResponse.metaData.items, + ...defaultResponse.metaData.items, [getPrefixedValue('0', dimensionId)]: { name: i18n.t('No'), }, diff --git a/src/modules/response/numeric.js b/src/modules/response/default.js similarity index 74% rename from src/modules/response/numeric.js rename to src/modules/response/default.js index c55c8785e..dda856298 100644 --- a/src/modules/response/numeric.js +++ b/src/modules/response/default.js @@ -26,19 +26,19 @@ export const getUniqueSortedValues = (rows, headerIndex) => export const getPrefixedValue = (value, prefix) => `${prefix}:${value}` -export const getNumericItems = (values, dimensionId) => +export const getItems = (values, dimensionId, itemFormatter) => values.reduce((items, value) => { items[getPrefixedValue(value, dimensionId)] = { - name: value, + name: itemFormatter ? itemFormatter(value) : value, } return items }, {}) -export const getNumericDimension = (values, dimensionId) => ({ +export const getDimensions = (values, dimensionId) => ({ [dimensionId]: values.map((value) => getPrefixedValue(value, dimensionId)), }) -export const getNumericRows = (rows, headerIndex, dimensionId) => { +export const getRows = (rows, headerIndex, dimensionId) => { let row let value @@ -55,7 +55,11 @@ export const getNumericRows = (rows, headerIndex, dimensionId) => { }) } -export const applyNumericHandler = (response, headerIndex) => { +export const applyDefaultHandler = ( + response, + headerIndex, + { itemFormatter } = {} +) => { const dimensionId = response.headers[headerIndex].name const uniqueSortedValues = getUniqueSortedValues(response.rows, headerIndex) @@ -65,13 +69,13 @@ export const applyNumericHandler = (response, headerIndex) => { ...response.metaData, items: { ...response.metaData.items, - ...getNumericItems(uniqueSortedValues, dimensionId), + ...getItems(uniqueSortedValues, dimensionId, itemFormatter), }, dimensions: { ...response.metaData.dimensions, - ...getNumericDimension(uniqueSortedValues, dimensionId), + ...getDimensions(uniqueSortedValues, dimensionId), }, }, - rows: [...getNumericRows(response.rows, headerIndex, dimensionId)], + rows: [...getRows(response.rows, headerIndex, dimensionId)], } } diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 40d8b69b1..e0ee5bc3c 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -3,9 +3,21 @@ import { DIMENSION_ID_ORGUNIT, DIMENSION_ID_PERIOD, } from '../predefinedDimensions.js' -import { isBooleanValueType, isNumericValueType } from '../valueTypes.js' +import { + isBooleanValueType, + isNumericValueType, + VALUE_TYPE_DATE, + VALUE_TYPE_DATETIME, + VALUE_TYPE_EMAIL, + VALUE_TYPE_PERCENTAGE, + VALUE_TYPE_PHONE_NUMBER, + VALUE_TYPE_TEXT, + VALUE_TYPE_TIME, + VALUE_TYPE_URL, + VALUE_TYPE_USERNAME, +} from '../valueTypes.js' import { applyBooleanHandler } from './boolean.js' -import { applyNumericHandler } from './numeric.js' +import { applyDefaultHandler } from './default.js' import { applyOptionSetHandler } from './optionSet.js' export const NA_VALUE = '' @@ -43,8 +55,18 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { transformedResponse, header.index ) - } else if (isNumericValueType(header.valueType) && !header.legendSet) { - transformedResponse = applyNumericHandler( + } else if ( + (isNumericValueType(header.valueType) && !header.legendSet) || + [ + VALUE_TYPE_EMAIL, + VALUE_TYPE_PHONE_NUMBER, + VALUE_TYPE_TEXT, + VALUE_TYPE_TIME, + VALUE_TYPE_URL, + VALUE_TYPE_USERNAME, + ].includes(header.valueType) + ) { + transformedResponse = applyDefaultHandler( transformedResponse, header.index ) @@ -53,6 +75,31 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { transformedResponse, header.index ) + } else if (header.valueType === VALUE_TYPE_DATETIME) { + transformedResponse = applyDefaultHandler( + transformedResponse, + header.index, + { + itemFormatter: (name) => name.replace(/:00\.0$/, ''), + } + ) + } else if (header.valueType === VALUE_TYPE_DATE) { + transformedResponse = applyDefaultHandler( + transformedResponse, + header.index, + { + itemFormatter: (name) => name.replace(/ 00:00:00\.0$/, ''), + } + ) + } else if (header.valueType === VALUE_TYPE_PERCENTAGE) { + transformedResponse = applyDefaultHandler( + transformedResponse, + header.index, + { + itemFormatter: (name) => + name.endsWith('.0') ? name.slice(0, -2) : name, + } + ) } }) From 98fb1ffe4ea0ba5207f6990f3541518918ff0f12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 14 Aug 2025 10:26:07 +0200 Subject: [PATCH 20/50] chore: date storybook --- src/__demo__/PivotTable.event.stories.js | 20 ++ src/__demo__/data/event/date.data.hidena.json | 214 +++++++++++++++++ src/__demo__/data/event/date.data.json | 221 ++++++++++++++++++ src/__demo__/data/event/date.data.org.json | 132 +++++++++++ .../data/event/date.visualization.json | 160 +++++++++++++ 5 files changed, 747 insertions(+) create mode 100644 src/__demo__/data/event/date.data.hidena.json create mode 100644 src/__demo__/data/event/date.data.json create mode 100644 src/__demo__/data/event/date.data.org.json create mode 100644 src/__demo__/data/event/date.visualization.json diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 3ae443565..08787e038 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -3,6 +3,8 @@ import React, { useState } from 'react' import { PivotTable } from '../index.js' import booleanData from './data/event/boolean.data.json' import booleanVisualization from './data/event/boolean.visualization.json' +import dateData from './data/event/date.data.json' +import dateVisualization from './data/event/date.visualization.json' import numericLegendsetData from './data/event/numeric-legendset.data.json' import numericLegendsetVisualization from './data/event/numeric-legendset.visualization.json' import numericData from './data/event/numeric.data.json' @@ -67,6 +69,24 @@ export default { decorators: [PivotTableOptionsWrapper], } +export const Date = (_, { pivotTableOptions }) => { + const visualization = { + ...dateVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +Date.story = { + name: 'Date', +} + export const Numeric = (_, { pivotTableOptions }) => { const visualization = { ...numericVisualization, 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..40ce50c20 --- /dev/null +++ b/src/__demo__/data/event/date.data.hidena.json @@ -0,0 +1,214 @@ +{ + "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": { + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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" + }, + "202507": { + "name": "July 2025" + }, + "jfuXZB3A1ko": { + "name": "Stage 1 - Repeatable" + }, + "ou": { + "name": "Organisation unit" + }, + "RldgRedJrco": { + "name": "E2E - Date" + }, + "J1QQtmzqhJz": { + "name": "E2E program" + }, + "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": [ + "202408", + "202409", + "202410", + "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..930ff7980 --- /dev/null +++ b/src/__demo__/data/event/date.data.json @@ -0,0 +1,221 @@ +{ + "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": { + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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" + }, + "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": "N/A" + } + }, + "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": [ + "202408", + "202409", + "202410", + "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..9f76c462a --- /dev/null +++ b/src/__demo__/data/event/date.data.org.json @@ -0,0 +1,132 @@ +{ + "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": { + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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" + }, + "202507": { + "name": "July 2025" + }, + "jfuXZB3A1ko": { + "name": "Stage 1 - Repeatable" + }, + "ou": { + "name": "Organisation unit" + }, + "RldgRedJrco": { + "name": "E2E - Date" + }, + "J1QQtmzqhJz": { + "name": "E2E program" + }, + "LAST_12_MONTHS": { + "name": "Last 12 months" + }, + "ImspTQPwCqd": { + "name": "Sierra Leone" + }, + "pe": { + "name": "Period" + } + }, + "dimensions": { + "jfuXZB3A1ko.RldgRedJrco": [], + "pe": [ + "202408", + "202409", + "202410", + "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": [] +} From 4bc958ae590b1939d3bb8fb41da9a82600448a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 14 Aug 2025 16:18:19 +0200 Subject: [PATCH 21/50] chore: fix response tests (wip) --- src/__demo__/data/event/date.data.hidena.json | 3 ++ src/__demo__/data/event/date.data.org.json | 3 ++ .../{numeric.spec.js => default.spec.js} | 44 +++++++------------ .../response/__tests__/response.spec.js | 15 +++++++ src/modules/response/default.js | 10 +++-- 5 files changed, 45 insertions(+), 30 deletions(-) rename src/modules/response/__tests__/{numeric.spec.js => default.spec.js} (78%) diff --git a/src/__demo__/data/event/date.data.hidena.json b/src/__demo__/data/event/date.data.hidena.json index 40ce50c20..7bb24a5bd 100644 --- a/src/__demo__/data/event/date.data.hidena.json +++ b/src/__demo__/data/event/date.data.hidena.json @@ -83,6 +83,9 @@ "J1QQtmzqhJz": { "name": "E2E program" }, + "jfuXZB3A1ko.RldgRedJrco": { + "name": "E2E - Date" + }, "LAST_12_MONTHS": { "name": "Last 12 months" }, diff --git a/src/__demo__/data/event/date.data.org.json b/src/__demo__/data/event/date.data.org.json index 9f76c462a..de1550d1d 100644 --- a/src/__demo__/data/event/date.data.org.json +++ b/src/__demo__/data/event/date.data.org.json @@ -83,6 +83,9 @@ "J1QQtmzqhJz": { "name": "E2E program" }, + "jfuXZB3A1ko.RldgRedJrco": { + "name": "E2E - Date" + }, "LAST_12_MONTHS": { "name": "Last 12 months" }, diff --git a/src/modules/response/__tests__/numeric.spec.js b/src/modules/response/__tests__/default.spec.js similarity index 78% rename from src/modules/response/__tests__/numeric.spec.js rename to src/modules/response/__tests__/default.spec.js index 500a105e2..d51a7e1cb 100644 --- a/src/modules/response/__tests__/numeric.spec.js +++ b/src/modules/response/__tests__/default.spec.js @@ -1,15 +1,15 @@ import responseHideNa from '../../../__demo__/data/event/numeric.data.hidena.json' import responseOrg from '../../../__demo__/data/event/numeric.data.org.json' import { - applyNumericHandler, - getNumericDimension, - getNumericItems, - getNumericRows, + applyDefaultHandler, + getDimensions, + getItems, + getRows, getPrefixedValue, getUnique, getUniqueSortedValues, - sortStringsAsNumbersAsc, -} from '../numeric.js' + sortValuesAsc, +} from '../default.js' import { NA_VALUE } from '../response.js' const testId = 'Zj7UnCAulEk.qrur9Dvnyt5' @@ -44,41 +44,31 @@ describe('numeric', () => { describe('sortStringsAsNumbersAsc', () => { it('sorts array of number strings numerically ascending', () => { const arr = ['10', '2', '1'] - expect(sortStringsAsNumbersAsc(arr)).toEqual(['1', '2', '10']) + expect(sortValuesAsc(arr)).toEqual(['1', '2', '10']) }) it('handles negative numbers and zeros as strings', () => { const arr = ['0', '-2', '5', '-10'] - expect(sortStringsAsNumbersAsc(arr)).toEqual([ - '-10', - '-2', - '0', - '5', - ]) + expect(sortValuesAsc(arr)).toEqual(['-10', '-2', '0', '5']) }) it('sorts strings with leading zeros numerically', () => { const arr = ['01', '1', '002', '2'] - expect(sortStringsAsNumbersAsc(arr)).toEqual([ - '01', - '1', - '002', - '2', - ]) + expect(sortValuesAsc(arr)).toEqual(['01', '1', '002', '2']) }) it('returns empty array when given empty array', () => { - expect(sortStringsAsNumbersAsc([])).toEqual([]) + expect(sortValuesAsc([])).toEqual([]) }) it('handles array with one item', () => { - expect(sortStringsAsNumbersAsc(['7'])).toEqual(['7']) + expect(sortValuesAsc(['7'])).toEqual(['7']) }) }) describe('getUniqueSortedValues', () => { expect( - getUniqueSortedValues( + sortValuesAsc( [ ['1', 'a'], ['5', 'b'], @@ -102,7 +92,7 @@ describe('numeric', () => { it('returns an object with prefixed keys and correct names', () => { const values = ['1', '2'] - expect(getNumericItems(values, testId)).toEqual({ + expect(getItems(values, testId)).toEqual({ [testId + ':1']: { name: '1' }, [testId + ':2']: { name: '2' }, }) @@ -112,7 +102,7 @@ describe('numeric', () => { describe('getNumericDimension', () => { it('returns object with dimensionId as key and correctly prefixed values', () => { const values = ['1', '2'] - expect(getNumericDimension(values, testId)).toEqual({ + expect(getDimensions(values, testId)).toEqual({ [testId]: [testId + ':1', testId + ':2'], }) }) @@ -127,7 +117,7 @@ describe('numeric', () => { ] const headerIndex = 1 - expect(getNumericRows(rows, headerIndex, testId)).toEqual([ + expect(getRows(rows, headerIndex, testId)).toEqual([ ['a', testId + ':1', 'x'], ['b', testId + ':2', 'y'], ['c', NA_VALUE, 'z'], @@ -135,13 +125,13 @@ describe('numeric', () => { }) it('handles empty rows array', () => { - expect(getNumericRows([], 1, 'a')).toEqual([]) + expect(getRows([], 1, 'a')).toEqual([]) }) }) describe('applyNumericHandler', () => { it('should return the transformed response', () => { - expect(applyNumericHandler(responseOrg, headerIndex)).toEqual( + expect(applyDefaultHandler(responseOrg, headerIndex)).toEqual( responseHideNa ) }) diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index 66f286cf4..ec25cba91 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -1,6 +1,9 @@ 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 responseNumericHideNa from '../../../__demo__/data/event/numeric.data.hidena.json' import responseNumeric from '../../../__demo__/data/event/numeric.data.json' import responseNumericOrg from '../../../__demo__/data/event/numeric.data.org.json' @@ -17,6 +20,18 @@ import { transformResponse } from '../response.js' describe('response', () => { describe('transformResponse', () => { + 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('numeric', () => { it('transforms response', () => { expect(transformResponse(responseNumericOrg)).toEqual( diff --git a/src/modules/response/default.js b/src/modules/response/default.js index dda856298..e9b77ada4 100644 --- a/src/modules/response/default.js +++ b/src/modules/response/default.js @@ -2,7 +2,7 @@ import { NA_VALUE } from './response.js' export const getUnique = (array) => [...new Set(array)] -export const sortStringsAsNumbersAsc = (arr) => { +export const sortValuesAsc = (arr) => { return arr.slice().sort((a, b) => { if (a === NA_VALUE && b === NA_VALUE) { return 0 @@ -13,12 +13,16 @@ export const sortStringsAsNumbersAsc = (arr) => { if (b === NA_VALUE) { return -1 } - return Number(a) - Number(b) + if (Number(a) && Number(b)) { + return Number(a) - Number(b) + } else { + return a.localeCompare(b) + } }) } export const getUniqueSortedValues = (rows, headerIndex) => - sortStringsAsNumbersAsc( + sortValuesAsc( getUnique( rows.map((row) => row[headerIndex]).filter((value) => value.length) ) From 04edc2493bca3be6f23f4d6a8a123acc959404a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 14 Aug 2025 16:33:53 +0200 Subject: [PATCH 22/50] chore: easify transformResponse (wip) --- src/modules/response/default.js | 1 + src/modules/response/response.js | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/modules/response/default.js b/src/modules/response/default.js index e9b77ada4..943a65db3 100644 --- a/src/modules/response/default.js +++ b/src/modules/response/default.js @@ -16,6 +16,7 @@ export const sortValuesAsc = (arr) => { if (Number(a) && Number(b)) { return Number(a) - Number(b) } else { + console.log('VALUES', typeof a, a, typeof b, b) return a.localeCompare(b) } }) diff --git a/src/modules/response/response.js b/src/modules/response/response.js index e0ee5bc3c..8f67bf203 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -22,6 +22,13 @@ import { applyOptionSetHandler } from './optionSet.js' export const NA_VALUE = '' +const itemFormatterByValueType = { + [VALUE_TYPE_DATETIME]: (name) => name.replace(/:00\.0$/, ''), + [VALUE_TYPE_DATE]: (name) => name.replace(/ 00:00:00\.0$/, ''), + [VALUE_TYPE_PERCENTAGE]: (name) => + name.endsWith('.0') ? name.slice(0, -2) : name, +} + export const transformResponse = (response, { hideNaData = false } = {}) => { let transformedResponse = { ...response, From 3242d1899bcbb2b68fe49f7bb8c56dda36973562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 18 Aug 2025 12:07:26 +0200 Subject: [PATCH 23/50] chore: fix sort fn --- .../response/__tests__/default.spec.js | 22 ++-- src/modules/response/default.js | 12 +- src/modules/response/response.js | 121 +++++++----------- 3 files changed, 71 insertions(+), 84 deletions(-) diff --git a/src/modules/response/__tests__/default.spec.js b/src/modules/response/__tests__/default.spec.js index d51a7e1cb..b1cc3428a 100644 --- a/src/modules/response/__tests__/default.spec.js +++ b/src/modules/response/__tests__/default.spec.js @@ -7,10 +7,9 @@ import { getRows, getPrefixedValue, getUnique, - getUniqueSortedValues, sortValuesAsc, } from '../default.js' -import { NA_VALUE } from '../response.js' +import { NA_VALUE, PREFIX_SEPARATOR } from '../response.js' const testId = 'Zj7UnCAulEk.qrur9Dvnyt5' const headerIndex = 0 @@ -66,7 +65,7 @@ describe('numeric', () => { }) }) - describe('getUniqueSortedValues', () => { + describe('sortValuesAsc', () => { expect( sortValuesAsc( [ @@ -84,7 +83,9 @@ describe('numeric', () => { describe('getPrefixedValue', () => { it('returns prefix and value separated by a colon', () => { - expect(getPrefixedValue('123', 'id')).toBe('id:123') + expect(getPrefixedValue('123', 'id')).toBe( + `id${PREFIX_SEPARATOR}123` + ) }) }) @@ -93,8 +94,8 @@ describe('numeric', () => { const values = ['1', '2'] expect(getItems(values, testId)).toEqual({ - [testId + ':1']: { name: '1' }, - [testId + ':2']: { name: '2' }, + [testId + `${PREFIX_SEPARATOR}1`]: { name: '1' }, + [testId + `${PREFIX_SEPARATOR}2`]: { name: '2' }, }) }) }) @@ -103,7 +104,10 @@ describe('numeric', () => { it('returns object with dimensionId as key and correctly prefixed values', () => { const values = ['1', '2'] expect(getDimensions(values, testId)).toEqual({ - [testId]: [testId + ':1', testId + ':2'], + [testId]: [ + testId + `${PREFIX_SEPARATOR}1`, + testId + `${PREFIX_SEPARATOR}2`, + ], }) }) }) @@ -118,8 +122,8 @@ describe('numeric', () => { const headerIndex = 1 expect(getRows(rows, headerIndex, testId)).toEqual([ - ['a', testId + ':1', 'x'], - ['b', testId + ':2', 'y'], + ['a', testId + `${PREFIX_SEPARATOR}1`, 'x'], + ['b', testId + `${PREFIX_SEPARATOR}2`, 'y'], ['c', NA_VALUE, 'z'], ]) }) diff --git a/src/modules/response/default.js b/src/modules/response/default.js index 943a65db3..34df84987 100644 --- a/src/modules/response/default.js +++ b/src/modules/response/default.js @@ -1,4 +1,4 @@ -import { NA_VALUE } from './response.js' +import { NA_VALUE, PREFIX_SEPARATOR } from './response.js' export const getUnique = (array) => [...new Set(array)] @@ -13,7 +13,7 @@ export const sortValuesAsc = (arr) => { if (b === NA_VALUE) { return -1 } - if (Number(a) && Number(b)) { + if (Number.isFinite(a) && Number.isFinite(b)) { return Number(a) - Number(b) } else { console.log('VALUES', typeof a, a, typeof b, b) @@ -29,7 +29,8 @@ export const getUniqueSortedValues = (rows, headerIndex) => ) ) -export const getPrefixedValue = (value, prefix) => `${prefix}:${value}` +export const getPrefixedValue = (value, prefix) => + `${prefix}${PREFIX_SEPARATOR}${value}` export const getItems = (values, dimensionId, itemFormatter) => values.reduce((items, value) => { @@ -66,8 +67,13 @@ export const applyDefaultHandler = ( { itemFormatter } = {} ) => { const dimensionId = response.headers[headerIndex].name + const uniqueSortedValues = getUniqueSortedValues(response.rows, headerIndex) + if (dimensionId === 'A03MvHHogjR.bx6fsa0t90x') { + console.log(response, headerIndex, uniqueSortedValues) + } + return { ...response, metaData: { diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 8f67bf203..f8218d4fa 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -5,22 +5,18 @@ import { } from '../predefinedDimensions.js' import { isBooleanValueType, - isNumericValueType, + VALUE_TYPE_AGE, + VALUE_TYPE_COORDINATE, VALUE_TYPE_DATE, VALUE_TYPE_DATETIME, - VALUE_TYPE_EMAIL, VALUE_TYPE_PERCENTAGE, - VALUE_TYPE_PHONE_NUMBER, - VALUE_TYPE_TEXT, - VALUE_TYPE_TIME, - VALUE_TYPE_URL, - VALUE_TYPE_USERNAME, } from '../valueTypes.js' import { applyBooleanHandler } from './boolean.js' import { applyDefaultHandler } from './default.js' import { applyOptionSetHandler } from './optionSet.js' export const NA_VALUE = '' +export const PREFIX_SEPARATOR = ':' const itemFormatterByValueType = { [VALUE_TYPE_DATETIME]: (name) => name.replace(/:00\.0$/, ''), @@ -30,19 +26,6 @@ const itemFormatterByValueType = { } export const transformResponse = (response, { hideNaData = false } = {}) => { - let transformedResponse = { - ...response, - metaData: { - ...response.metaData, - items: { - ...response.metaData.items, - }, - dimensions: { - ...response.metaData.dimensions, - }, - }, - } - const metaHeaders = response.headers .map((header, index) => ({ ...header, @@ -56,60 +39,54 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { ) ) + let transformedResponse = { + ...response, + metaData: { + ...response.metaData, + items: { + ...response.metaData.items, + }, + dimensions: { + ...response.metaData.dimensions, + }, + }, + } + + // Legendset does not need transformation + // Age and Coordinate not supported + // Option set and Boolean have separate handlers + // All other types use default handler with specific item formatter metaHeaders.forEach((header) => { - if (header.optionSet) { - transformedResponse = applyOptionSetHandler( - transformedResponse, - header.index + if ( + !( + header.legendSet || + [VALUE_TYPE_AGE, VALUE_TYPE_COORDINATE].includes(header.value) ) - } else if ( - (isNumericValueType(header.valueType) && !header.legendSet) || - [ - VALUE_TYPE_EMAIL, - VALUE_TYPE_PHONE_NUMBER, - VALUE_TYPE_TEXT, - VALUE_TYPE_TIME, - VALUE_TYPE_URL, - VALUE_TYPE_USERNAME, - ].includes(header.valueType) ) { - transformedResponse = applyDefaultHandler( - transformedResponse, - header.index - ) - } else if (isBooleanValueType(header.valueType)) { - transformedResponse = applyBooleanHandler( - transformedResponse, - header.index - ) - } else if (header.valueType === VALUE_TYPE_DATETIME) { - transformedResponse = applyDefaultHandler( - transformedResponse, - header.index, - { - itemFormatter: (name) => name.replace(/:00\.0$/, ''), - } - ) - } else if (header.valueType === VALUE_TYPE_DATE) { - transformedResponse = applyDefaultHandler( - transformedResponse, - header.index, - { - itemFormatter: (name) => name.replace(/ 00:00:00\.0$/, ''), - } - ) - } else if (header.valueType === VALUE_TYPE_PERCENTAGE) { - transformedResponse = applyDefaultHandler( - transformedResponse, - header.index, - { - itemFormatter: (name) => - name.endsWith('.0') ? name.slice(0, -2) : name, - } - ) + if (header.optionSet) { + transformedResponse = applyOptionSetHandler( + transformedResponse, + header.index + ) + } else if (isBooleanValueType(header.valueType)) { + transformedResponse = applyBooleanHandler( + transformedResponse, + header.index + ) + } else { + transformedResponse = applyDefaultHandler( + transformedResponse, + header.index, + { + itemFormatter: + itemFormatterByValueType[header.valueType], + } + ) + } } }) + // If Hide Na Data is not selected, we still only show N/A if there are N/A values if (!hideNaData) { metaHeaders.forEach((header) => { if ( @@ -119,12 +96,12 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { ...transformedResponse.metaData.dimensions[header.name], NA_VALUE, ] + + transformedResponse.metaData.items[NA_VALUE] = { + name: i18n.t('N/A'), + } } }) - - transformedResponse.metaData.items[NA_VALUE] = { - name: i18n.t('N/A'), - } } return transformedResponse From 44ac78ce79d25c399338ccf5fdba1d3502477e57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Mon, 18 Aug 2025 16:12:15 +0200 Subject: [PATCH 24/50] chore: fix default sort fn --- .../response/__tests__/default.spec.js | 79 +++++++++---------- src/modules/response/default.js | 60 ++++++-------- 2 files changed, 63 insertions(+), 76 deletions(-) diff --git a/src/modules/response/__tests__/default.spec.js b/src/modules/response/__tests__/default.spec.js index b1cc3428a..0b3f93eaa 100644 --- a/src/modules/response/__tests__/default.spec.js +++ b/src/modules/response/__tests__/default.spec.js @@ -1,5 +1,6 @@ import responseHideNa from '../../../__demo__/data/event/numeric.data.hidena.json' import responseOrg from '../../../__demo__/data/event/numeric.data.org.json' +import { VALUE_TYPE_NUMBER } from '../../valueTypes.js' import { applyDefaultHandler, getDimensions, @@ -7,14 +8,14 @@ import { getRows, getPrefixedValue, getUnique, - sortValuesAsc, + getValuesUniqueSortedAsc, } from '../default.js' import { NA_VALUE, PREFIX_SEPARATOR } from '../response.js' const testId = 'Zj7UnCAulEk.qrur9Dvnyt5' const headerIndex = 0 -describe('numeric', () => { +describe('default', () => { describe('getUnique', () => { it('removes duplicate string numbers and preserves first occurrence', () => { const arr = ['2', '10', '2', '01', '1', '-1', '-1', '1', '10'] @@ -40,47 +41,45 @@ describe('numeric', () => { }) }) - describe('sortStringsAsNumbersAsc', () => { - it('sorts array of number strings numerically ascending', () => { - const arr = ['10', '2', '1'] - expect(sortValuesAsc(arr)).toEqual(['1', '2', '10']) - }) - - it('handles negative numbers and zeros as strings', () => { - const arr = ['0', '-2', '5', '-10'] - expect(sortValuesAsc(arr)).toEqual(['-10', '-2', '0', '5']) - }) - - it('sorts strings with leading zeros numerically', () => { - const arr = ['01', '1', '002', '2'] - expect(sortValuesAsc(arr)).toEqual(['01', '1', '002', '2']) - }) - - it('returns empty array when given empty array', () => { - expect(sortValuesAsc([])).toEqual([]) - }) - - it('handles array with one item', () => { - expect(sortValuesAsc(['7'])).toEqual(['7']) + 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-numbers 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('sortValuesAsc', () => { - expect( - sortValuesAsc( - [ - ['1', 'a'], - ['5', 'b'], - ['-1', 'c'], - ['', 'd'], - ['5', 'e'], - ['3', 'f'], - ], - headerIndex - ) - ).toEqual(['-1', '1', '3', '5']) - }) - describe('getPrefixedValue', () => { it('returns prefix and value separated by a colon', () => { expect(getPrefixedValue('123', 'id')).toBe( diff --git a/src/modules/response/default.js b/src/modules/response/default.js index 34df84987..af2f2f158 100644 --- a/src/modules/response/default.js +++ b/src/modules/response/default.js @@ -1,33 +1,21 @@ +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 sortValuesAsc = (arr) => { - return arr.slice().sort((a, b) => { - if (a === NA_VALUE && b === NA_VALUE) { - return 0 - } - if (a === NA_VALUE) { - return 1 - } - if (b === NA_VALUE) { - return -1 - } - if (Number.isFinite(a) && Number.isFinite(b)) { - return Number(a) - Number(b) - } else { - console.log('VALUES', typeof a, a, typeof b, b) - return a.localeCompare(b) - } - }) -} - -export const getUniqueSortedValues = (rows, headerIndex) => - sortValuesAsc( - getUnique( - rows.map((row) => row[headerIndex]).filter((value) => value.length) - ) - ) +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}` @@ -66,13 +54,13 @@ export const applyDefaultHandler = ( headerIndex, { itemFormatter } = {} ) => { - const dimensionId = response.headers[headerIndex].name - - const uniqueSortedValues = getUniqueSortedValues(response.rows, headerIndex) - - if (dimensionId === 'A03MvHHogjR.bx6fsa0t90x') { - console.log(response, headerIndex, uniqueSortedValues) - } + const header = response.headers[headerIndex] + const uniqueSortedValuesAsc = getValuesUniqueSortedAsc( + response.rows + .map((row) => row[headerIndex]) + .filter((value) => value !== NA_VALUE), + header.valueType + ) return { ...response, @@ -80,13 +68,13 @@ export const applyDefaultHandler = ( ...response.metaData, items: { ...response.metaData.items, - ...getItems(uniqueSortedValues, dimensionId, itemFormatter), + ...getItems(uniqueSortedValuesAsc, header.name, itemFormatter), }, dimensions: { ...response.metaData.dimensions, - ...getDimensions(uniqueSortedValues, dimensionId), + ...getDimensions(uniqueSortedValuesAsc, header.name), }, }, - rows: [...getRows(response.rows, headerIndex, dimensionId)], + rows: [...getRows(response.rows, headerIndex, header.name)], } } From 34e874d95fd6fa1baa11618192d70cf7beffd322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Tue, 19 Aug 2025 16:04:27 +0200 Subject: [PATCH 25/50] chore: fix tests --- .../response/__tests__/default.spec.js | 46 ++++++++++--------- src/modules/response/default.js | 6 ++- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/modules/response/__tests__/default.spec.js b/src/modules/response/__tests__/default.spec.js index 0b3f93eaa..42b010572 100644 --- a/src/modules/response/__tests__/default.spec.js +++ b/src/modules/response/__tests__/default.spec.js @@ -17,7 +17,7 @@ const headerIndex = 0 describe('default', () => { describe('getUnique', () => { - it('removes duplicate string numbers and preserves first occurrence', () => { + 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']) }) @@ -27,14 +27,10 @@ describe('default', () => { expect(getUnique(arr)).toEqual(['01', '1']) }) - it('returns an empty array when given an empty array', () => { + it('handles empty array', () => { expect(getUnique([])).toEqual([]) }) - it('handles array with only one item', () => { - expect(getUnique(['42'])).toEqual(['42']) - }) - it('preserves order of first occurrence', () => { const arr = ['2', '1', '2', '1'] expect(getUnique(arr)).toEqual(['2', '1']) @@ -51,7 +47,7 @@ describe('default', () => { ).toEqual(['-1', '1', '3', '5', '10']) }) - it('sorts non-numbers as strings', () => { + it('sorts non-numeric strings as strings', () => { expect( getValuesUniqueSortedAsc([ '1995-04-18 13:54:00.0', @@ -88,21 +84,30 @@ describe('default', () => { }) }) - describe('getNumericItems', () => { + describe('getItems', () => { it('returns an object with prefixed keys and correct names', () => { - const values = ['1', '2'] - - expect(getItems(values, testId)).toEqual({ + 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('getNumericDimension', () => { - it('returns object with dimensionId as key and correctly prefixed values', () => { - const values = ['1', '2'] - expect(getDimensions(values, testId)).toEqual({ + 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`, @@ -111,19 +116,16 @@ describe('default', () => { }) }) - describe('getNumericRows', () => { + describe('getRows', () => { it('prefixes value at headerIndex for each row', () => { const rows = [ ['a', '1', 'x'], ['b', '2', 'y'], - ['c', NA_VALUE, 'z'], ] - const headerIndex = 1 - expect(getRows(rows, headerIndex, testId)).toEqual([ - ['a', testId + `${PREFIX_SEPARATOR}1`, 'x'], - ['b', testId + `${PREFIX_SEPARATOR}2`, 'y'], - ['c', NA_VALUE, 'z'], + expect(getRows(rows, 1, testId)).toEqual([ + ['a', `${testId}${PREFIX_SEPARATOR}1`, 'x'], + ['b', `${testId}${PREFIX_SEPARATOR}2`, 'y'], ]) }) diff --git a/src/modules/response/default.js b/src/modules/response/default.js index af2f2f158..69848bd33 100644 --- a/src/modules/response/default.js +++ b/src/modules/response/default.js @@ -20,7 +20,7 @@ export const getValuesUniqueSortedAsc = (values, valueType = VALUE_TYPE_TEXT) => export const getPrefixedValue = (value, prefix) => `${prefix}${PREFIX_SEPARATOR}${value}` -export const getItems = (values, dimensionId, itemFormatter) => +export const getItems = (values, dimensionId, { itemFormatter } = {}) => values.reduce((items, value) => { items[getPrefixedValue(value, dimensionId)] = { name: itemFormatter ? itemFormatter(value) : value, @@ -68,7 +68,9 @@ export const applyDefaultHandler = ( ...response.metaData, items: { ...response.metaData.items, - ...getItems(uniqueSortedValuesAsc, header.name, itemFormatter), + ...getItems(uniqueSortedValuesAsc, header.name, { + itemFormatter, + }), }, dimensions: { ...response.metaData.dimensions, From e5493bdebde45cc81c8e7ed54d506f20e1a77ef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 20 Aug 2025 16:11:06 +0200 Subject: [PATCH 26/50] chore: add response for datetime --- .../data/event/datetime.data.hidena.json | 224 ++++++++++++++++++ src/__demo__/data/event/datetime.data.json | 117 ++++++++- .../response/__tests__/default.spec.js | 46 +++- src/modules/response/response.js | 2 +- 4 files changed, 368 insertions(+), 21 deletions(-) create mode 100644 src/__demo__/data/event/datetime.data.hidena.json 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..24b6a0d3a --- /dev/null +++ b/src/__demo__/data/event/datetime.data.hidena.json @@ -0,0 +1,224 @@ +{ + "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": { + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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" + }, + "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" + } + }, + "dimensions": { + "pe": [ + "202408", + "202409", + "202410", + "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 index f886d379e..c531dfaa4 100644 --- a/src/__demo__/data/event/datetime.data.json +++ b/src/__demo__/data/event/datetime.data.json @@ -74,6 +74,36 @@ "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" }, @@ -91,6 +121,9 @@ }, "KWzx2tY8dFi": { "name": "E2E - Date & Time" + }, + "": { + "name": "N/A" } }, "dimensions": { @@ -109,24 +142,86 @@ "202507" ], "ou": ["ImspTQPwCqd"], - "jfuXZB3A1ko.KWzx2tY8dFi": [] + "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": [ - ["1995-04-17 13:53:00.0", "ImspTQPwCqd", "202503", "1"], + [ + "jfuXZB3A1ko.KWzx2tY8dFi: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"], + [ + "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"], - ["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"] + [ + "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/modules/response/__tests__/default.spec.js b/src/modules/response/__tests__/default.spec.js index 42b010572..cbca27ec2 100644 --- a/src/modules/response/__tests__/default.spec.js +++ b/src/modules/response/__tests__/default.spec.js @@ -1,6 +1,14 @@ -import responseHideNa from '../../../__demo__/data/event/numeric.data.hidena.json' -import responseOrg from '../../../__demo__/data/event/numeric.data.org.json' -import { VALUE_TYPE_NUMBER } from '../../valueTypes.js' +import dateResponseHideNa from '../../../__demo__/data/event/date.data.hidena.json' +import dateResponseOrg from '../../../__demo__/data/event/date.data.org.json' +import datetimeResponseHideNa from '../../../__demo__/data/event/datetime.data.hidena.json' +import datetimeResponseOrg from '../../../__demo__/data/event/datetime.data.org.json' +import numericResponseHideNa from '../../../__demo__/data/event/numeric.data.hidena.json' +import numericResponseOrg from '../../../__demo__/data/event/numeric.data.org.json' +import { + VALUE_TYPE_DATE, + VALUE_TYPE_DATETIME, + VALUE_TYPE_NUMBER, +} from '../../valueTypes.js' import { applyDefaultHandler, getDimensions, @@ -10,7 +18,7 @@ import { getUnique, getValuesUniqueSortedAsc, } from '../default.js' -import { NA_VALUE, PREFIX_SEPARATOR } from '../response.js' +import { itemFormatterByValueType, PREFIX_SEPARATOR } from '../response.js' const testId = 'Zj7UnCAulEk.qrur9Dvnyt5' const headerIndex = 0 @@ -134,11 +142,31 @@ describe('default', () => { }) }) - describe('applyNumericHandler', () => { - it('should return the transformed response', () => { - expect(applyDefaultHandler(responseOrg, headerIndex)).toEqual( - responseHideNa - ) + describe('applyDefaultHandler', () => { + describe('should return the transformed response', () => { + test('date', () => { + expect( + applyDefaultHandler(dateResponseOrg, headerIndex, { + itemFormatter: + itemFormatterByValueType[VALUE_TYPE_DATE], + }) + ).toEqual(dateResponseHideNa) + }) + + test('datetime', () => { + expect( + applyDefaultHandler(datetimeResponseOrg, headerIndex, { + itemFormatter: + itemFormatterByValueType[VALUE_TYPE_DATETIME], + }) + ).toEqual(datetimeResponseHideNa) + }) + + test('numeric', () => { + expect( + applyDefaultHandler(numericResponseOrg, headerIndex) + ).toEqual(numericResponseHideNa) + }) }) }) }) diff --git a/src/modules/response/response.js b/src/modules/response/response.js index f8218d4fa..04a1ef1d2 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -18,7 +18,7 @@ import { applyOptionSetHandler } from './optionSet.js' export const NA_VALUE = '' export const PREFIX_SEPARATOR = ':' -const itemFormatterByValueType = { +export const itemFormatterByValueType = { [VALUE_TYPE_DATETIME]: (name) => name.replace(/:00\.0$/, ''), [VALUE_TYPE_DATE]: (name) => name.replace(/ 00:00:00\.0$/, ''), [VALUE_TYPE_PERCENTAGE]: (name) => From 414d984bb7905c56c7e2d61bd6241c96838a845d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 21 Aug 2025 11:35:11 +0200 Subject: [PATCH 27/50] chore: change prefix separator --- .../data/event/boolean.data.hidena.json | 32 +- src/__demo__/data/event/boolean.data.json | 32 +- src/__demo__/data/event/date.data.hidena.json | 54 +- src/__demo__/data/event/date.data.json | 54 +- .../data/event/datetime.data.hidena.json | 60 +- src/__demo__/data/event/datetime.data.json | 60 +- .../data/event/numeric.data.hidena.json | 890 +++++++++--------- src/__demo__/data/event/numeric.data.json | 890 +++++++++--------- .../data/event/yesonly.data.hidena.json | 10 +- src/__demo__/data/event/yesonly.data.json | 10 +- src/modules/response/response.js | 2 +- 11 files changed, 1047 insertions(+), 1047 deletions(-) diff --git a/src/__demo__/data/event/boolean.data.hidena.json b/src/__demo__/data/event/boolean.data.hidena.json index a5491b66b..3cb146c90 100644 --- a/src/__demo__/data/event/boolean.data.hidena.json +++ b/src/__demo__/data/event/boolean.data.hidena.json @@ -77,10 +77,10 @@ "A03MvHHogjR": { "name": "Birth" }, - "A03MvHHogjR.bx6fsa0t90x:0": { + "A03MvHHogjR.bx6fsa0t90x_0": { "name": "No" }, - "A03MvHHogjR.bx6fsa0t90x:1": { + "A03MvHHogjR.bx6fsa0t90x_1": { "name": "Yes" } }, @@ -88,27 +88,27 @@ "pe": ["202501", "202502", "202503", "202504", "202505", "202506"], "ou": ["ImspTQPwCqd"], "A03MvHHogjR.bx6fsa0t90x": [ - "A03MvHHogjR.bx6fsa0t90x:0", - "A03MvHHogjR.bx6fsa0t90x:1" + "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"], + ["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"] + ["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 index a168fe107..0d3894d50 100644 --- a/src/__demo__/data/event/boolean.data.json +++ b/src/__demo__/data/event/boolean.data.json @@ -77,10 +77,10 @@ "A03MvHHogjR": { "name": "Birth" }, - "A03MvHHogjR.bx6fsa0t90x:0": { + "A03MvHHogjR.bx6fsa0t90x_0": { "name": "No" }, - "A03MvHHogjR.bx6fsa0t90x:1": { + "A03MvHHogjR.bx6fsa0t90x_1": { "name": "Yes" }, "": { @@ -91,8 +91,8 @@ "pe": ["202501", "202502", "202503", "202504", "202505", "202506"], "ou": ["ImspTQPwCqd"], "A03MvHHogjR.bx6fsa0t90x": [ - "A03MvHHogjR.bx6fsa0t90x:0", - "A03MvHHogjR.bx6fsa0t90x:1", + "A03MvHHogjR.bx6fsa0t90x_0", + "A03MvHHogjR.bx6fsa0t90x_1", "" ] } @@ -100,19 +100,19 @@ "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"], + ["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"] + ["A03MvHHogjR.bx6fsa0t90x_0", "ImspTQPwCqd", "202502", "311"] ], "height": 13, "headerWidth": 4 diff --git a/src/__demo__/data/event/date.data.hidena.json b/src/__demo__/data/event/date.data.hidena.json index 7bb24a5bd..8088845ef 100644 --- a/src/__demo__/data/event/date.data.hidena.json +++ b/src/__demo__/data/event/date.data.hidena.json @@ -95,45 +95,45 @@ "pe": { "name": "Period" }, - "jfuXZB3A1ko.RldgRedJrco:1992-05-04 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1992-05-04 00:00:00.0": { "name": "1992-05-04" }, - "jfuXZB3A1ko.RldgRedJrco:1994-01-02 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0": { "name": "1994-01-02" }, - "jfuXZB3A1ko.RldgRedJrco:1992-08-28 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1992-08-28 00:00:00.0": { "name": "1992-08-28" }, - "jfuXZB3A1ko.RldgRedJrco:1993-12-01 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1993-12-01 00:00:00.0": { "name": "1993-12-01" }, - "jfuXZB3A1ko.RldgRedJrco:1992-11-12 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1992-11-12 00:00:00.0": { "name": "1992-11-12" }, - "jfuXZB3A1ko.RldgRedJrco:1992-03-20 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1992-03-20 00:00:00.0": { "name": "1992-03-20" }, - "jfuXZB3A1ko.RldgRedJrco:1993-05-21 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1993-05-21 00:00:00.0": { "name": "1993-05-21" }, - "jfuXZB3A1ko.RldgRedJrco:1993-05-20 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1993-05-20 00:00:00.0": { "name": "1993-05-20" }, - "jfuXZB3A1ko.RldgRedJrco:1993-12-02 00:00:00.0": { + "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" + "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": [ "202408", @@ -157,56 +157,56 @@ "rows": [ ["", "ImspTQPwCqd", "202503", "1"], [ - "jfuXZB3A1ko.RldgRedJrco:1992-05-04 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1992-05-04 00:00:00.0", "ImspTQPwCqd", "202504", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1994-01-02 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0", "ImspTQPwCqd", "202501", "2" ], [ - "jfuXZB3A1ko.RldgRedJrco:1992-08-28 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1992-08-28 00:00:00.0", "ImspTQPwCqd", "202503", "1" ], ["", "ImspTQPwCqd", "202501", "1"], [ - "jfuXZB3A1ko.RldgRedJrco:1993-12-01 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1993-12-01 00:00:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1992-11-12 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1992-11-12 00:00:00.0", "ImspTQPwCqd", "202411", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1992-03-20 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1992-03-20 00:00:00.0", "ImspTQPwCqd", "202502", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1993-05-21 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1993-05-21 00:00:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1993-05-20 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1993-05-20 00:00:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1993-12-02 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0", "ImspTQPwCqd", "202412", "1" diff --git a/src/__demo__/data/event/date.data.json b/src/__demo__/data/event/date.data.json index 930ff7980..097df2b9d 100644 --- a/src/__demo__/data/event/date.data.json +++ b/src/__demo__/data/event/date.data.json @@ -95,31 +95,31 @@ "pe": { "name": "Period" }, - "jfuXZB3A1ko.RldgRedJrco:1992-05-04 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1992-05-04 00:00:00.0": { "name": "1992-05-04" }, - "jfuXZB3A1ko.RldgRedJrco:1994-01-02 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0": { "name": "1994-01-02" }, - "jfuXZB3A1ko.RldgRedJrco:1992-08-28 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1992-08-28 00:00:00.0": { "name": "1992-08-28" }, - "jfuXZB3A1ko.RldgRedJrco:1993-12-01 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1993-12-01 00:00:00.0": { "name": "1993-12-01" }, - "jfuXZB3A1ko.RldgRedJrco:1992-11-12 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1992-11-12 00:00:00.0": { "name": "1992-11-12" }, - "jfuXZB3A1ko.RldgRedJrco:1992-03-20 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1992-03-20 00:00:00.0": { "name": "1992-03-20" }, - "jfuXZB3A1ko.RldgRedJrco:1993-05-21 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1993-05-21 00:00:00.0": { "name": "1993-05-21" }, - "jfuXZB3A1ko.RldgRedJrco:1993-05-20 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1993-05-20 00:00:00.0": { "name": "1993-05-20" }, - "jfuXZB3A1ko.RldgRedJrco:1993-12-02 00:00:00.0": { + "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0": { "name": "1993-12-02" }, "": { @@ -128,15 +128,15 @@ }, "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", + "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": [ @@ -161,56 +161,56 @@ "rows": [ ["", "ImspTQPwCqd", "202503", "1"], [ - "jfuXZB3A1ko.RldgRedJrco:1992-05-04 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1992-05-04 00:00:00.0", "ImspTQPwCqd", "202504", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1994-01-02 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0", "ImspTQPwCqd", "202501", "2" ], [ - "jfuXZB3A1ko.RldgRedJrco:1992-08-28 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1992-08-28 00:00:00.0", "ImspTQPwCqd", "202503", "1" ], ["", "ImspTQPwCqd", "202501", "1"], [ - "jfuXZB3A1ko.RldgRedJrco:1993-12-01 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1993-12-01 00:00:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1992-11-12 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1992-11-12 00:00:00.0", "ImspTQPwCqd", "202411", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1992-03-20 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1992-03-20 00:00:00.0", "ImspTQPwCqd", "202502", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1993-05-21 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1993-05-21 00:00:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1993-05-20 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1993-05-20 00:00:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.RldgRedJrco:1993-12-02 00:00:00.0", + "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0", "ImspTQPwCqd", "202412", "1" diff --git a/src/__demo__/data/event/datetime.data.hidena.json b/src/__demo__/data/event/datetime.data.hidena.json index 24b6a0d3a..79e0b708e 100644 --- a/src/__demo__/data/event/datetime.data.hidena.json +++ b/src/__demo__/data/event/datetime.data.hidena.json @@ -74,34 +74,34 @@ "jfuXZB3A1ko": { "name": "Stage 1 - Repeatable" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1990-01-24 14:50:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1990-01-24 14:50:00.0": { "name": "1990-01-24 14:50" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1991-05-20 14:45:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-20 14:45:00.0": { "name": "1991-05-20 14:45" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1991-05-21 14:46:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-21 14:46:00.0": { "name": "1991-05-21 14:46" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1991-09-01 10:20:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1991-09-01 10:20:00.0": { "name": "1991-09-01 10:20" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1991-12-01 12:00:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-01 12:00:00.0": { "name": "1991-12-01 12:00" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1991-12-02 12:01:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-02 12:01:00.0": { "name": "1991-12-02 12:01" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1992-01-03 12:01:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-03 12:01:00.0": { "name": "1992-01-03 12:01" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1992-01-04 12:50:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-04 12:50:00.0": { "name": "1992-01-04 12:50" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1995-04-17 13:53:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1995-04-17 13:53:00.0": { "name": "1995-04-17 13:53" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1998-02-28 11:20:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1998-02-28 11:20:00.0": { "name": "1998-02-28 11:20" }, "ou": { @@ -140,16 +140,16 @@ ], "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" + "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" ] } }, @@ -157,63 +157,63 @@ "width": 4, "rows": [ [ - "jfuXZB3A1ko.KWzx2tY8dFi:1995-04-17 13:53:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1995-04-17 13:53:00.0", "ImspTQPwCqd", "202503", "1" ], ["", "ImspTQPwCqd", "202503", "1"], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1991-12-02 12:01:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-02 12:01:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1992-01-04 12:50:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-04 12:50:00.0", "ImspTQPwCqd", "202501", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1991-05-20 14:45:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-20 14:45:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1998-02-28 11:20:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1998-02-28 11:20:00.0", "ImspTQPwCqd", "202502", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1991-09-01 10:20:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1991-09-01 10:20:00.0", "ImspTQPwCqd", "202504", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1992-01-03 12:01:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-03 12:01:00.0", "ImspTQPwCqd", "202501", "1" ], ["", "ImspTQPwCqd", "202501", "1"], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1991-12-01 12:00:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-01 12:00:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1990-01-24 14:50:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1990-01-24 14:50:00.0", "ImspTQPwCqd", "202411", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1991-05-21 14:46:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-21 14:46:00.0", "ImspTQPwCqd", "202412", "1" diff --git a/src/__demo__/data/event/datetime.data.json b/src/__demo__/data/event/datetime.data.json index c531dfaa4..7dc7b9b01 100644 --- a/src/__demo__/data/event/datetime.data.json +++ b/src/__demo__/data/event/datetime.data.json @@ -74,34 +74,34 @@ "jfuXZB3A1ko": { "name": "Stage 1 - Repeatable" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1990-01-24 14:50:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1990-01-24 14:50:00.0": { "name": "1990-01-24 14:50" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1991-05-20 14:45:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-20 14:45:00.0": { "name": "1991-05-20 14:45" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1991-05-21 14:46:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-21 14:46:00.0": { "name": "1991-05-21 14:46" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1991-09-01 10:20:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1991-09-01 10:20:00.0": { "name": "1991-09-01 10:20" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1991-12-01 12:00:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-01 12:00:00.0": { "name": "1991-12-01 12:00" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1991-12-02 12:01:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-02 12:01:00.0": { "name": "1991-12-02 12:01" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1992-01-03 12:01:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-03 12:01:00.0": { "name": "1992-01-03 12:01" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1992-01-04 12:50:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-04 12:50:00.0": { "name": "1992-01-04 12:50" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1995-04-17 13:53:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1995-04-17 13:53:00.0": { "name": "1995-04-17 13:53" }, - "jfuXZB3A1ko.KWzx2tY8dFi:1998-02-28 11:20:00.0": { + "jfuXZB3A1ko.KWzx2tY8dFi_1998-02-28 11:20:00.0": { "name": "1998-02-28 11:20" }, "ou": { @@ -143,16 +143,16 @@ ], "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", + "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", "" ] } @@ -161,63 +161,63 @@ "width": 4, "rows": [ [ - "jfuXZB3A1ko.KWzx2tY8dFi:1995-04-17 13:53:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1995-04-17 13:53:00.0", "ImspTQPwCqd", "202503", "1" ], ["", "ImspTQPwCqd", "202503", "1"], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1991-12-02 12:01:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-02 12:01:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1992-01-04 12:50:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-04 12:50:00.0", "ImspTQPwCqd", "202501", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1991-05-20 14:45:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-20 14:45:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1998-02-28 11:20:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1998-02-28 11:20:00.0", "ImspTQPwCqd", "202502", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1991-09-01 10:20:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1991-09-01 10:20:00.0", "ImspTQPwCqd", "202504", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1992-01-03 12:01:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1992-01-03 12:01:00.0", "ImspTQPwCqd", "202501", "1" ], ["", "ImspTQPwCqd", "202501", "1"], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1991-12-01 12:00:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1991-12-01 12:00:00.0", "ImspTQPwCqd", "202412", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1990-01-24 14:50:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1990-01-24 14:50:00.0", "ImspTQPwCqd", "202411", "1" ], [ - "jfuXZB3A1ko.KWzx2tY8dFi:1991-05-21 14:46:00.0", + "jfuXZB3A1ko.KWzx2tY8dFi_1991-05-21 14:46:00.0", "ImspTQPwCqd", "202412", "1" diff --git a/src/__demo__/data/event/numeric.data.hidena.json b/src/__demo__/data/event/numeric.data.hidena.json index e72cd76c9..34d0b8f98 100644 --- a/src/__demo__/data/event/numeric.data.hidena.json +++ b/src/__demo__/data/event/numeric.data.hidena.json @@ -68,366 +68,366 @@ "Zj7UnCAulEk": { "name": "Inpatient morbidity and mortality" }, - "Zj7UnCAulEk.qrur9Dvnyt5:0": { + "Zj7UnCAulEk.qrur9Dvnyt5_0": { "name": "0" }, - "Zj7UnCAulEk.qrur9Dvnyt5:1": { + "Zj7UnCAulEk.qrur9Dvnyt5_1": { "name": "1" }, - "Zj7UnCAulEk.qrur9Dvnyt5:2": { + "Zj7UnCAulEk.qrur9Dvnyt5_2": { "name": "2" }, - "Zj7UnCAulEk.qrur9Dvnyt5:3": { + "Zj7UnCAulEk.qrur9Dvnyt5_3": { "name": "3" }, - "Zj7UnCAulEk.qrur9Dvnyt5:4": { + "Zj7UnCAulEk.qrur9Dvnyt5_4": { "name": "4" }, - "Zj7UnCAulEk.qrur9Dvnyt5:5": { + "Zj7UnCAulEk.qrur9Dvnyt5_5": { "name": "5" }, - "Zj7UnCAulEk.qrur9Dvnyt5:6": { + "Zj7UnCAulEk.qrur9Dvnyt5_6": { "name": "6" }, - "Zj7UnCAulEk.qrur9Dvnyt5:7": { + "Zj7UnCAulEk.qrur9Dvnyt5_7": { "name": "7" }, - "Zj7UnCAulEk.qrur9Dvnyt5:8": { + "Zj7UnCAulEk.qrur9Dvnyt5_8": { "name": "8" }, - "Zj7UnCAulEk.qrur9Dvnyt5:9": { + "Zj7UnCAulEk.qrur9Dvnyt5_9": { "name": "9" }, - "Zj7UnCAulEk.qrur9Dvnyt5:10": { + "Zj7UnCAulEk.qrur9Dvnyt5_10": { "name": "10" }, - "Zj7UnCAulEk.qrur9Dvnyt5:11": { + "Zj7UnCAulEk.qrur9Dvnyt5_11": { "name": "11" }, - "Zj7UnCAulEk.qrur9Dvnyt5:12": { + "Zj7UnCAulEk.qrur9Dvnyt5_12": { "name": "12" }, - "Zj7UnCAulEk.qrur9Dvnyt5:13": { + "Zj7UnCAulEk.qrur9Dvnyt5_13": { "name": "13" }, - "Zj7UnCAulEk.qrur9Dvnyt5:14": { + "Zj7UnCAulEk.qrur9Dvnyt5_14": { "name": "14" }, - "Zj7UnCAulEk.qrur9Dvnyt5:15": { + "Zj7UnCAulEk.qrur9Dvnyt5_15": { "name": "15" }, - "Zj7UnCAulEk.qrur9Dvnyt5:16": { + "Zj7UnCAulEk.qrur9Dvnyt5_16": { "name": "16" }, - "Zj7UnCAulEk.qrur9Dvnyt5:17": { + "Zj7UnCAulEk.qrur9Dvnyt5_17": { "name": "17" }, - "Zj7UnCAulEk.qrur9Dvnyt5:18": { + "Zj7UnCAulEk.qrur9Dvnyt5_18": { "name": "18" }, - "Zj7UnCAulEk.qrur9Dvnyt5:19": { + "Zj7UnCAulEk.qrur9Dvnyt5_19": { "name": "19" }, - "Zj7UnCAulEk.qrur9Dvnyt5:20": { + "Zj7UnCAulEk.qrur9Dvnyt5_20": { "name": "20" }, - "Zj7UnCAulEk.qrur9Dvnyt5:21": { + "Zj7UnCAulEk.qrur9Dvnyt5_21": { "name": "21" }, - "Zj7UnCAulEk.qrur9Dvnyt5:22": { + "Zj7UnCAulEk.qrur9Dvnyt5_22": { "name": "22" }, - "Zj7UnCAulEk.qrur9Dvnyt5:23": { + "Zj7UnCAulEk.qrur9Dvnyt5_23": { "name": "23" }, - "Zj7UnCAulEk.qrur9Dvnyt5:24": { + "Zj7UnCAulEk.qrur9Dvnyt5_24": { "name": "24" }, - "Zj7UnCAulEk.qrur9Dvnyt5:25": { + "Zj7UnCAulEk.qrur9Dvnyt5_25": { "name": "25" }, - "Zj7UnCAulEk.qrur9Dvnyt5:26": { + "Zj7UnCAulEk.qrur9Dvnyt5_26": { "name": "26" }, - "Zj7UnCAulEk.qrur9Dvnyt5:27": { + "Zj7UnCAulEk.qrur9Dvnyt5_27": { "name": "27" }, - "Zj7UnCAulEk.qrur9Dvnyt5:28": { + "Zj7UnCAulEk.qrur9Dvnyt5_28": { "name": "28" }, - "Zj7UnCAulEk.qrur9Dvnyt5:29": { + "Zj7UnCAulEk.qrur9Dvnyt5_29": { "name": "29" }, - "Zj7UnCAulEk.qrur9Dvnyt5:30": { + "Zj7UnCAulEk.qrur9Dvnyt5_30": { "name": "30" }, - "Zj7UnCAulEk.qrur9Dvnyt5:31": { + "Zj7UnCAulEk.qrur9Dvnyt5_31": { "name": "31" }, - "Zj7UnCAulEk.qrur9Dvnyt5:32": { + "Zj7UnCAulEk.qrur9Dvnyt5_32": { "name": "32" }, - "Zj7UnCAulEk.qrur9Dvnyt5:33": { + "Zj7UnCAulEk.qrur9Dvnyt5_33": { "name": "33" }, - "Zj7UnCAulEk.qrur9Dvnyt5:34": { + "Zj7UnCAulEk.qrur9Dvnyt5_34": { "name": "34" }, - "Zj7UnCAulEk.qrur9Dvnyt5:35": { + "Zj7UnCAulEk.qrur9Dvnyt5_35": { "name": "35" }, - "Zj7UnCAulEk.qrur9Dvnyt5:36": { + "Zj7UnCAulEk.qrur9Dvnyt5_36": { "name": "36" }, - "Zj7UnCAulEk.qrur9Dvnyt5:37": { + "Zj7UnCAulEk.qrur9Dvnyt5_37": { "name": "37" }, - "Zj7UnCAulEk.qrur9Dvnyt5:38": { + "Zj7UnCAulEk.qrur9Dvnyt5_38": { "name": "38" }, - "Zj7UnCAulEk.qrur9Dvnyt5:39": { + "Zj7UnCAulEk.qrur9Dvnyt5_39": { "name": "39" }, - "Zj7UnCAulEk.qrur9Dvnyt5:40": { + "Zj7UnCAulEk.qrur9Dvnyt5_40": { "name": "40" }, - "Zj7UnCAulEk.qrur9Dvnyt5:41": { + "Zj7UnCAulEk.qrur9Dvnyt5_41": { "name": "41" }, - "Zj7UnCAulEk.qrur9Dvnyt5:42": { + "Zj7UnCAulEk.qrur9Dvnyt5_42": { "name": "42" }, - "Zj7UnCAulEk.qrur9Dvnyt5:43": { + "Zj7UnCAulEk.qrur9Dvnyt5_43": { "name": "43" }, - "Zj7UnCAulEk.qrur9Dvnyt5:44": { + "Zj7UnCAulEk.qrur9Dvnyt5_44": { "name": "44" }, - "Zj7UnCAulEk.qrur9Dvnyt5:45": { + "Zj7UnCAulEk.qrur9Dvnyt5_45": { "name": "45" }, - "Zj7UnCAulEk.qrur9Dvnyt5:46": { + "Zj7UnCAulEk.qrur9Dvnyt5_46": { "name": "46" }, - "Zj7UnCAulEk.qrur9Dvnyt5:47": { + "Zj7UnCAulEk.qrur9Dvnyt5_47": { "name": "47" }, - "Zj7UnCAulEk.qrur9Dvnyt5:48": { + "Zj7UnCAulEk.qrur9Dvnyt5_48": { "name": "48" }, - "Zj7UnCAulEk.qrur9Dvnyt5:49": { + "Zj7UnCAulEk.qrur9Dvnyt5_49": { "name": "49" }, - "Zj7UnCAulEk.qrur9Dvnyt5:50": { + "Zj7UnCAulEk.qrur9Dvnyt5_50": { "name": "50" }, - "Zj7UnCAulEk.qrur9Dvnyt5:51": { + "Zj7UnCAulEk.qrur9Dvnyt5_51": { "name": "51" }, - "Zj7UnCAulEk.qrur9Dvnyt5:52": { + "Zj7UnCAulEk.qrur9Dvnyt5_52": { "name": "52" }, - "Zj7UnCAulEk.qrur9Dvnyt5:53": { + "Zj7UnCAulEk.qrur9Dvnyt5_53": { "name": "53" }, - "Zj7UnCAulEk.qrur9Dvnyt5:54": { + "Zj7UnCAulEk.qrur9Dvnyt5_54": { "name": "54" }, - "Zj7UnCAulEk.qrur9Dvnyt5:55": { + "Zj7UnCAulEk.qrur9Dvnyt5_55": { "name": "55" }, - "Zj7UnCAulEk.qrur9Dvnyt5:56": { + "Zj7UnCAulEk.qrur9Dvnyt5_56": { "name": "56" }, - "Zj7UnCAulEk.qrur9Dvnyt5:57": { + "Zj7UnCAulEk.qrur9Dvnyt5_57": { "name": "57" }, - "Zj7UnCAulEk.qrur9Dvnyt5:58": { + "Zj7UnCAulEk.qrur9Dvnyt5_58": { "name": "58" }, - "Zj7UnCAulEk.qrur9Dvnyt5:59": { + "Zj7UnCAulEk.qrur9Dvnyt5_59": { "name": "59" }, - "Zj7UnCAulEk.qrur9Dvnyt5:60": { + "Zj7UnCAulEk.qrur9Dvnyt5_60": { "name": "60" }, - "Zj7UnCAulEk.qrur9Dvnyt5:61": { + "Zj7UnCAulEk.qrur9Dvnyt5_61": { "name": "61" }, - "Zj7UnCAulEk.qrur9Dvnyt5:62": { + "Zj7UnCAulEk.qrur9Dvnyt5_62": { "name": "62" }, - "Zj7UnCAulEk.qrur9Dvnyt5:63": { + "Zj7UnCAulEk.qrur9Dvnyt5_63": { "name": "63" }, - "Zj7UnCAulEk.qrur9Dvnyt5:64": { + "Zj7UnCAulEk.qrur9Dvnyt5_64": { "name": "64" }, - "Zj7UnCAulEk.qrur9Dvnyt5:65": { + "Zj7UnCAulEk.qrur9Dvnyt5_65": { "name": "65" }, - "Zj7UnCAulEk.qrur9Dvnyt5:66": { + "Zj7UnCAulEk.qrur9Dvnyt5_66": { "name": "66" }, - "Zj7UnCAulEk.qrur9Dvnyt5:67": { + "Zj7UnCAulEk.qrur9Dvnyt5_67": { "name": "67" }, - "Zj7UnCAulEk.qrur9Dvnyt5:68": { + "Zj7UnCAulEk.qrur9Dvnyt5_68": { "name": "68" }, - "Zj7UnCAulEk.qrur9Dvnyt5:69": { + "Zj7UnCAulEk.qrur9Dvnyt5_69": { "name": "69" }, - "Zj7UnCAulEk.qrur9Dvnyt5:70": { + "Zj7UnCAulEk.qrur9Dvnyt5_70": { "name": "70" }, - "Zj7UnCAulEk.qrur9Dvnyt5:71": { + "Zj7UnCAulEk.qrur9Dvnyt5_71": { "name": "71" }, - "Zj7UnCAulEk.qrur9Dvnyt5:72": { + "Zj7UnCAulEk.qrur9Dvnyt5_72": { "name": "72" }, - "Zj7UnCAulEk.qrur9Dvnyt5:73": { + "Zj7UnCAulEk.qrur9Dvnyt5_73": { "name": "73" }, - "Zj7UnCAulEk.qrur9Dvnyt5:74": { + "Zj7UnCAulEk.qrur9Dvnyt5_74": { "name": "74" }, - "Zj7UnCAulEk.qrur9Dvnyt5:75": { + "Zj7UnCAulEk.qrur9Dvnyt5_75": { "name": "75" }, - "Zj7UnCAulEk.qrur9Dvnyt5:76": { + "Zj7UnCAulEk.qrur9Dvnyt5_76": { "name": "76" }, - "Zj7UnCAulEk.qrur9Dvnyt5:77": { + "Zj7UnCAulEk.qrur9Dvnyt5_77": { "name": "77" }, - "Zj7UnCAulEk.qrur9Dvnyt5:78": { + "Zj7UnCAulEk.qrur9Dvnyt5_78": { "name": "78" }, - "Zj7UnCAulEk.qrur9Dvnyt5:79": { + "Zj7UnCAulEk.qrur9Dvnyt5_79": { "name": "79" }, - "Zj7UnCAulEk.qrur9Dvnyt5:80": { + "Zj7UnCAulEk.qrur9Dvnyt5_80": { "name": "80" }, - "Zj7UnCAulEk.qrur9Dvnyt5:81": { + "Zj7UnCAulEk.qrur9Dvnyt5_81": { "name": "81" }, - "Zj7UnCAulEk.qrur9Dvnyt5:82": { + "Zj7UnCAulEk.qrur9Dvnyt5_82": { "name": "82" }, - "Zj7UnCAulEk.qrur9Dvnyt5:83": { + "Zj7UnCAulEk.qrur9Dvnyt5_83": { "name": "83" }, - "Zj7UnCAulEk.qrur9Dvnyt5:84": { + "Zj7UnCAulEk.qrur9Dvnyt5_84": { "name": "84" }, - "Zj7UnCAulEk.qrur9Dvnyt5:85": { + "Zj7UnCAulEk.qrur9Dvnyt5_85": { "name": "85" }, - "Zj7UnCAulEk.qrur9Dvnyt5:86": { + "Zj7UnCAulEk.qrur9Dvnyt5_86": { "name": "86" }, - "Zj7UnCAulEk.qrur9Dvnyt5:87": { + "Zj7UnCAulEk.qrur9Dvnyt5_87": { "name": "87" }, - "Zj7UnCAulEk.qrur9Dvnyt5:88": { + "Zj7UnCAulEk.qrur9Dvnyt5_88": { "name": "88" } }, "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", - "Zj7UnCAulEk.qrur9Dvnyt5:11", - "Zj7UnCAulEk.qrur9Dvnyt5:12", - "Zj7UnCAulEk.qrur9Dvnyt5:13", - "Zj7UnCAulEk.qrur9Dvnyt5:14", - "Zj7UnCAulEk.qrur9Dvnyt5:15", - "Zj7UnCAulEk.qrur9Dvnyt5:16", - "Zj7UnCAulEk.qrur9Dvnyt5:17", - "Zj7UnCAulEk.qrur9Dvnyt5:18", - "Zj7UnCAulEk.qrur9Dvnyt5:19", - "Zj7UnCAulEk.qrur9Dvnyt5:20", - "Zj7UnCAulEk.qrur9Dvnyt5:21", - "Zj7UnCAulEk.qrur9Dvnyt5:22", - "Zj7UnCAulEk.qrur9Dvnyt5:23", - "Zj7UnCAulEk.qrur9Dvnyt5:24", - "Zj7UnCAulEk.qrur9Dvnyt5:25", - "Zj7UnCAulEk.qrur9Dvnyt5:26", - "Zj7UnCAulEk.qrur9Dvnyt5:27", - "Zj7UnCAulEk.qrur9Dvnyt5:28", - "Zj7UnCAulEk.qrur9Dvnyt5:29", - "Zj7UnCAulEk.qrur9Dvnyt5:30", - "Zj7UnCAulEk.qrur9Dvnyt5:31", - "Zj7UnCAulEk.qrur9Dvnyt5:32", - "Zj7UnCAulEk.qrur9Dvnyt5:33", - "Zj7UnCAulEk.qrur9Dvnyt5:34", - "Zj7UnCAulEk.qrur9Dvnyt5:35", - "Zj7UnCAulEk.qrur9Dvnyt5:36", - "Zj7UnCAulEk.qrur9Dvnyt5:37", - "Zj7UnCAulEk.qrur9Dvnyt5:38", - "Zj7UnCAulEk.qrur9Dvnyt5:39", - "Zj7UnCAulEk.qrur9Dvnyt5:40", - "Zj7UnCAulEk.qrur9Dvnyt5:41", - "Zj7UnCAulEk.qrur9Dvnyt5:42", - "Zj7UnCAulEk.qrur9Dvnyt5:43", - "Zj7UnCAulEk.qrur9Dvnyt5:44", - "Zj7UnCAulEk.qrur9Dvnyt5:45", - "Zj7UnCAulEk.qrur9Dvnyt5:46", - "Zj7UnCAulEk.qrur9Dvnyt5:47", - "Zj7UnCAulEk.qrur9Dvnyt5:48", - "Zj7UnCAulEk.qrur9Dvnyt5:49", - "Zj7UnCAulEk.qrur9Dvnyt5:50", - "Zj7UnCAulEk.qrur9Dvnyt5:51", - "Zj7UnCAulEk.qrur9Dvnyt5:52", - "Zj7UnCAulEk.qrur9Dvnyt5:53", - "Zj7UnCAulEk.qrur9Dvnyt5:54", - "Zj7UnCAulEk.qrur9Dvnyt5:55", - "Zj7UnCAulEk.qrur9Dvnyt5:56", - "Zj7UnCAulEk.qrur9Dvnyt5:57", - "Zj7UnCAulEk.qrur9Dvnyt5:58", - "Zj7UnCAulEk.qrur9Dvnyt5:59", - "Zj7UnCAulEk.qrur9Dvnyt5:60", - "Zj7UnCAulEk.qrur9Dvnyt5:61", - "Zj7UnCAulEk.qrur9Dvnyt5:62", - "Zj7UnCAulEk.qrur9Dvnyt5:63", - "Zj7UnCAulEk.qrur9Dvnyt5:64", - "Zj7UnCAulEk.qrur9Dvnyt5:65", - "Zj7UnCAulEk.qrur9Dvnyt5:66", - "Zj7UnCAulEk.qrur9Dvnyt5:67", - "Zj7UnCAulEk.qrur9Dvnyt5:68", - "Zj7UnCAulEk.qrur9Dvnyt5:69", - "Zj7UnCAulEk.qrur9Dvnyt5:70", - "Zj7UnCAulEk.qrur9Dvnyt5:71", - "Zj7UnCAulEk.qrur9Dvnyt5:72", - "Zj7UnCAulEk.qrur9Dvnyt5:73", - "Zj7UnCAulEk.qrur9Dvnyt5:74", - "Zj7UnCAulEk.qrur9Dvnyt5:75", - "Zj7UnCAulEk.qrur9Dvnyt5:76", - "Zj7UnCAulEk.qrur9Dvnyt5:77", - "Zj7UnCAulEk.qrur9Dvnyt5:78", - "Zj7UnCAulEk.qrur9Dvnyt5:79", - "Zj7UnCAulEk.qrur9Dvnyt5:80", - "Zj7UnCAulEk.qrur9Dvnyt5:81", - "Zj7UnCAulEk.qrur9Dvnyt5:82", - "Zj7UnCAulEk.qrur9Dvnyt5:83", - "Zj7UnCAulEk.qrur9Dvnyt5:84", - "Zj7UnCAulEk.qrur9Dvnyt5:85", - "Zj7UnCAulEk.qrur9Dvnyt5:86", - "Zj7UnCAulEk.qrur9Dvnyt5:87", - "Zj7UnCAulEk.qrur9Dvnyt5:88" + "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", + "Zj7UnCAulEk.qrur9Dvnyt5_11", + "Zj7UnCAulEk.qrur9Dvnyt5_12", + "Zj7UnCAulEk.qrur9Dvnyt5_13", + "Zj7UnCAulEk.qrur9Dvnyt5_14", + "Zj7UnCAulEk.qrur9Dvnyt5_15", + "Zj7UnCAulEk.qrur9Dvnyt5_16", + "Zj7UnCAulEk.qrur9Dvnyt5_17", + "Zj7UnCAulEk.qrur9Dvnyt5_18", + "Zj7UnCAulEk.qrur9Dvnyt5_19", + "Zj7UnCAulEk.qrur9Dvnyt5_20", + "Zj7UnCAulEk.qrur9Dvnyt5_21", + "Zj7UnCAulEk.qrur9Dvnyt5_22", + "Zj7UnCAulEk.qrur9Dvnyt5_23", + "Zj7UnCAulEk.qrur9Dvnyt5_24", + "Zj7UnCAulEk.qrur9Dvnyt5_25", + "Zj7UnCAulEk.qrur9Dvnyt5_26", + "Zj7UnCAulEk.qrur9Dvnyt5_27", + "Zj7UnCAulEk.qrur9Dvnyt5_28", + "Zj7UnCAulEk.qrur9Dvnyt5_29", + "Zj7UnCAulEk.qrur9Dvnyt5_30", + "Zj7UnCAulEk.qrur9Dvnyt5_31", + "Zj7UnCAulEk.qrur9Dvnyt5_32", + "Zj7UnCAulEk.qrur9Dvnyt5_33", + "Zj7UnCAulEk.qrur9Dvnyt5_34", + "Zj7UnCAulEk.qrur9Dvnyt5_35", + "Zj7UnCAulEk.qrur9Dvnyt5_36", + "Zj7UnCAulEk.qrur9Dvnyt5_37", + "Zj7UnCAulEk.qrur9Dvnyt5_38", + "Zj7UnCAulEk.qrur9Dvnyt5_39", + "Zj7UnCAulEk.qrur9Dvnyt5_40", + "Zj7UnCAulEk.qrur9Dvnyt5_41", + "Zj7UnCAulEk.qrur9Dvnyt5_42", + "Zj7UnCAulEk.qrur9Dvnyt5_43", + "Zj7UnCAulEk.qrur9Dvnyt5_44", + "Zj7UnCAulEk.qrur9Dvnyt5_45", + "Zj7UnCAulEk.qrur9Dvnyt5_46", + "Zj7UnCAulEk.qrur9Dvnyt5_47", + "Zj7UnCAulEk.qrur9Dvnyt5_48", + "Zj7UnCAulEk.qrur9Dvnyt5_49", + "Zj7UnCAulEk.qrur9Dvnyt5_50", + "Zj7UnCAulEk.qrur9Dvnyt5_51", + "Zj7UnCAulEk.qrur9Dvnyt5_52", + "Zj7UnCAulEk.qrur9Dvnyt5_53", + "Zj7UnCAulEk.qrur9Dvnyt5_54", + "Zj7UnCAulEk.qrur9Dvnyt5_55", + "Zj7UnCAulEk.qrur9Dvnyt5_56", + "Zj7UnCAulEk.qrur9Dvnyt5_57", + "Zj7UnCAulEk.qrur9Dvnyt5_58", + "Zj7UnCAulEk.qrur9Dvnyt5_59", + "Zj7UnCAulEk.qrur9Dvnyt5_60", + "Zj7UnCAulEk.qrur9Dvnyt5_61", + "Zj7UnCAulEk.qrur9Dvnyt5_62", + "Zj7UnCAulEk.qrur9Dvnyt5_63", + "Zj7UnCAulEk.qrur9Dvnyt5_64", + "Zj7UnCAulEk.qrur9Dvnyt5_65", + "Zj7UnCAulEk.qrur9Dvnyt5_66", + "Zj7UnCAulEk.qrur9Dvnyt5_67", + "Zj7UnCAulEk.qrur9Dvnyt5_68", + "Zj7UnCAulEk.qrur9Dvnyt5_69", + "Zj7UnCAulEk.qrur9Dvnyt5_70", + "Zj7UnCAulEk.qrur9Dvnyt5_71", + "Zj7UnCAulEk.qrur9Dvnyt5_72", + "Zj7UnCAulEk.qrur9Dvnyt5_73", + "Zj7UnCAulEk.qrur9Dvnyt5_74", + "Zj7UnCAulEk.qrur9Dvnyt5_75", + "Zj7UnCAulEk.qrur9Dvnyt5_76", + "Zj7UnCAulEk.qrur9Dvnyt5_77", + "Zj7UnCAulEk.qrur9Dvnyt5_78", + "Zj7UnCAulEk.qrur9Dvnyt5_79", + "Zj7UnCAulEk.qrur9Dvnyt5_80", + "Zj7UnCAulEk.qrur9Dvnyt5_81", + "Zj7UnCAulEk.qrur9Dvnyt5_82", + "Zj7UnCAulEk.qrur9Dvnyt5_83", + "Zj7UnCAulEk.qrur9Dvnyt5_84", + "Zj7UnCAulEk.qrur9Dvnyt5_85", + "Zj7UnCAulEk.qrur9Dvnyt5_86", + "Zj7UnCAulEk.qrur9Dvnyt5_87", + "Zj7UnCAulEk.qrur9Dvnyt5_88" ], "ou": ["ImspTQPwCqd"] } @@ -435,273 +435,273 @@ "rowContext": {}, "width": 4, "rows": [ - ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202503", "70"], - ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202504", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202505", "67"], - ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202503", "70"], - ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202504", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202503", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202503", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202503", "35"], - ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202504", "35"], - ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202505", "65"], - ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202504", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202504", "30"], - ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202505", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202505", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202505", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202505", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202504", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202504", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202503", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202503", "65"], - ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202505", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202504", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202505", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202504", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202505", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202503", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202504", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202504", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202503", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202503", "39"], - ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202504", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202504", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202505", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202503", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202505", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202504", "34"], - ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202505", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202504", "35"], - ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202504", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202503", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202505", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202503", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202505", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202505", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202504", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202505", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202505", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202503", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202505", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202505", "31"], - ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202505", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202503", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202504", "32"], - ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202503", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202505", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202505", "66"], - ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202504", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202503", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202503", "70"], + ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202504", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202505", "67"], + ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202503", "70"], + ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202504", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202503", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202503", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202503", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202504", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202505", "65"], + ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202504", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202504", "30"], + ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202505", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202505", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202505", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202505", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202503", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202503", "65"], + ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202505", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202504", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202505", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202504", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202505", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202503", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202504", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202503", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202503", "39"], + ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202504", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202504", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202505", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202503", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202505", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202504", "34"], + ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202505", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202504", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202504", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202503", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202505", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202503", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202505", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202505", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202504", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202505", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202505", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202503", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202505", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202505", "31"], + ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202505", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202503", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202504", "32"], + ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202503", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202505", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202505", "66"], + ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202504", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202503", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202505", "48"], ["", "ImspTQPwCqd", "202505", "5"], ["", "ImspTQPwCqd", "202506", "12"] ], diff --git a/src/__demo__/data/event/numeric.data.json b/src/__demo__/data/event/numeric.data.json index cc4af747a..b3b49552e 100644 --- a/src/__demo__/data/event/numeric.data.json +++ b/src/__demo__/data/event/numeric.data.json @@ -68,271 +68,271 @@ "Zj7UnCAulEk": { "name": "Inpatient morbidity and mortality" }, - "Zj7UnCAulEk.qrur9Dvnyt5:0": { + "Zj7UnCAulEk.qrur9Dvnyt5_0": { "name": "0" }, - "Zj7UnCAulEk.qrur9Dvnyt5:1": { + "Zj7UnCAulEk.qrur9Dvnyt5_1": { "name": "1" }, - "Zj7UnCAulEk.qrur9Dvnyt5:2": { + "Zj7UnCAulEk.qrur9Dvnyt5_2": { "name": "2" }, - "Zj7UnCAulEk.qrur9Dvnyt5:3": { + "Zj7UnCAulEk.qrur9Dvnyt5_3": { "name": "3" }, - "Zj7UnCAulEk.qrur9Dvnyt5:4": { + "Zj7UnCAulEk.qrur9Dvnyt5_4": { "name": "4" }, - "Zj7UnCAulEk.qrur9Dvnyt5:5": { + "Zj7UnCAulEk.qrur9Dvnyt5_5": { "name": "5" }, - "Zj7UnCAulEk.qrur9Dvnyt5:6": { + "Zj7UnCAulEk.qrur9Dvnyt5_6": { "name": "6" }, - "Zj7UnCAulEk.qrur9Dvnyt5:7": { + "Zj7UnCAulEk.qrur9Dvnyt5_7": { "name": "7" }, - "Zj7UnCAulEk.qrur9Dvnyt5:8": { + "Zj7UnCAulEk.qrur9Dvnyt5_8": { "name": "8" }, - "Zj7UnCAulEk.qrur9Dvnyt5:9": { + "Zj7UnCAulEk.qrur9Dvnyt5_9": { "name": "9" }, - "Zj7UnCAulEk.qrur9Dvnyt5:10": { + "Zj7UnCAulEk.qrur9Dvnyt5_10": { "name": "10" }, - "Zj7UnCAulEk.qrur9Dvnyt5:11": { + "Zj7UnCAulEk.qrur9Dvnyt5_11": { "name": "11" }, - "Zj7UnCAulEk.qrur9Dvnyt5:12": { + "Zj7UnCAulEk.qrur9Dvnyt5_12": { "name": "12" }, - "Zj7UnCAulEk.qrur9Dvnyt5:13": { + "Zj7UnCAulEk.qrur9Dvnyt5_13": { "name": "13" }, - "Zj7UnCAulEk.qrur9Dvnyt5:14": { + "Zj7UnCAulEk.qrur9Dvnyt5_14": { "name": "14" }, - "Zj7UnCAulEk.qrur9Dvnyt5:15": { + "Zj7UnCAulEk.qrur9Dvnyt5_15": { "name": "15" }, - "Zj7UnCAulEk.qrur9Dvnyt5:16": { + "Zj7UnCAulEk.qrur9Dvnyt5_16": { "name": "16" }, - "Zj7UnCAulEk.qrur9Dvnyt5:17": { + "Zj7UnCAulEk.qrur9Dvnyt5_17": { "name": "17" }, - "Zj7UnCAulEk.qrur9Dvnyt5:18": { + "Zj7UnCAulEk.qrur9Dvnyt5_18": { "name": "18" }, - "Zj7UnCAulEk.qrur9Dvnyt5:19": { + "Zj7UnCAulEk.qrur9Dvnyt5_19": { "name": "19" }, - "Zj7UnCAulEk.qrur9Dvnyt5:20": { + "Zj7UnCAulEk.qrur9Dvnyt5_20": { "name": "20" }, - "Zj7UnCAulEk.qrur9Dvnyt5:21": { + "Zj7UnCAulEk.qrur9Dvnyt5_21": { "name": "21" }, - "Zj7UnCAulEk.qrur9Dvnyt5:22": { + "Zj7UnCAulEk.qrur9Dvnyt5_22": { "name": "22" }, - "Zj7UnCAulEk.qrur9Dvnyt5:23": { + "Zj7UnCAulEk.qrur9Dvnyt5_23": { "name": "23" }, - "Zj7UnCAulEk.qrur9Dvnyt5:24": { + "Zj7UnCAulEk.qrur9Dvnyt5_24": { "name": "24" }, - "Zj7UnCAulEk.qrur9Dvnyt5:25": { + "Zj7UnCAulEk.qrur9Dvnyt5_25": { "name": "25" }, - "Zj7UnCAulEk.qrur9Dvnyt5:26": { + "Zj7UnCAulEk.qrur9Dvnyt5_26": { "name": "26" }, - "Zj7UnCAulEk.qrur9Dvnyt5:27": { + "Zj7UnCAulEk.qrur9Dvnyt5_27": { "name": "27" }, - "Zj7UnCAulEk.qrur9Dvnyt5:28": { + "Zj7UnCAulEk.qrur9Dvnyt5_28": { "name": "28" }, - "Zj7UnCAulEk.qrur9Dvnyt5:29": { + "Zj7UnCAulEk.qrur9Dvnyt5_29": { "name": "29" }, - "Zj7UnCAulEk.qrur9Dvnyt5:30": { + "Zj7UnCAulEk.qrur9Dvnyt5_30": { "name": "30" }, - "Zj7UnCAulEk.qrur9Dvnyt5:31": { + "Zj7UnCAulEk.qrur9Dvnyt5_31": { "name": "31" }, - "Zj7UnCAulEk.qrur9Dvnyt5:32": { + "Zj7UnCAulEk.qrur9Dvnyt5_32": { "name": "32" }, - "Zj7UnCAulEk.qrur9Dvnyt5:33": { + "Zj7UnCAulEk.qrur9Dvnyt5_33": { "name": "33" }, - "Zj7UnCAulEk.qrur9Dvnyt5:34": { + "Zj7UnCAulEk.qrur9Dvnyt5_34": { "name": "34" }, - "Zj7UnCAulEk.qrur9Dvnyt5:35": { + "Zj7UnCAulEk.qrur9Dvnyt5_35": { "name": "35" }, - "Zj7UnCAulEk.qrur9Dvnyt5:36": { + "Zj7UnCAulEk.qrur9Dvnyt5_36": { "name": "36" }, - "Zj7UnCAulEk.qrur9Dvnyt5:37": { + "Zj7UnCAulEk.qrur9Dvnyt5_37": { "name": "37" }, - "Zj7UnCAulEk.qrur9Dvnyt5:38": { + "Zj7UnCAulEk.qrur9Dvnyt5_38": { "name": "38" }, - "Zj7UnCAulEk.qrur9Dvnyt5:39": { + "Zj7UnCAulEk.qrur9Dvnyt5_39": { "name": "39" }, - "Zj7UnCAulEk.qrur9Dvnyt5:40": { + "Zj7UnCAulEk.qrur9Dvnyt5_40": { "name": "40" }, - "Zj7UnCAulEk.qrur9Dvnyt5:41": { + "Zj7UnCAulEk.qrur9Dvnyt5_41": { "name": "41" }, - "Zj7UnCAulEk.qrur9Dvnyt5:42": { + "Zj7UnCAulEk.qrur9Dvnyt5_42": { "name": "42" }, - "Zj7UnCAulEk.qrur9Dvnyt5:43": { + "Zj7UnCAulEk.qrur9Dvnyt5_43": { "name": "43" }, - "Zj7UnCAulEk.qrur9Dvnyt5:44": { + "Zj7UnCAulEk.qrur9Dvnyt5_44": { "name": "44" }, - "Zj7UnCAulEk.qrur9Dvnyt5:45": { + "Zj7UnCAulEk.qrur9Dvnyt5_45": { "name": "45" }, - "Zj7UnCAulEk.qrur9Dvnyt5:46": { + "Zj7UnCAulEk.qrur9Dvnyt5_46": { "name": "46" }, - "Zj7UnCAulEk.qrur9Dvnyt5:47": { + "Zj7UnCAulEk.qrur9Dvnyt5_47": { "name": "47" }, - "Zj7UnCAulEk.qrur9Dvnyt5:48": { + "Zj7UnCAulEk.qrur9Dvnyt5_48": { "name": "48" }, - "Zj7UnCAulEk.qrur9Dvnyt5:49": { + "Zj7UnCAulEk.qrur9Dvnyt5_49": { "name": "49" }, - "Zj7UnCAulEk.qrur9Dvnyt5:50": { + "Zj7UnCAulEk.qrur9Dvnyt5_50": { "name": "50" }, - "Zj7UnCAulEk.qrur9Dvnyt5:51": { + "Zj7UnCAulEk.qrur9Dvnyt5_51": { "name": "51" }, - "Zj7UnCAulEk.qrur9Dvnyt5:52": { + "Zj7UnCAulEk.qrur9Dvnyt5_52": { "name": "52" }, - "Zj7UnCAulEk.qrur9Dvnyt5:53": { + "Zj7UnCAulEk.qrur9Dvnyt5_53": { "name": "53" }, - "Zj7UnCAulEk.qrur9Dvnyt5:54": { + "Zj7UnCAulEk.qrur9Dvnyt5_54": { "name": "54" }, - "Zj7UnCAulEk.qrur9Dvnyt5:55": { + "Zj7UnCAulEk.qrur9Dvnyt5_55": { "name": "55" }, - "Zj7UnCAulEk.qrur9Dvnyt5:56": { + "Zj7UnCAulEk.qrur9Dvnyt5_56": { "name": "56" }, - "Zj7UnCAulEk.qrur9Dvnyt5:57": { + "Zj7UnCAulEk.qrur9Dvnyt5_57": { "name": "57" }, - "Zj7UnCAulEk.qrur9Dvnyt5:58": { + "Zj7UnCAulEk.qrur9Dvnyt5_58": { "name": "58" }, - "Zj7UnCAulEk.qrur9Dvnyt5:59": { + "Zj7UnCAulEk.qrur9Dvnyt5_59": { "name": "59" }, - "Zj7UnCAulEk.qrur9Dvnyt5:60": { + "Zj7UnCAulEk.qrur9Dvnyt5_60": { "name": "60" }, - "Zj7UnCAulEk.qrur9Dvnyt5:61": { + "Zj7UnCAulEk.qrur9Dvnyt5_61": { "name": "61" }, - "Zj7UnCAulEk.qrur9Dvnyt5:62": { + "Zj7UnCAulEk.qrur9Dvnyt5_62": { "name": "62" }, - "Zj7UnCAulEk.qrur9Dvnyt5:63": { + "Zj7UnCAulEk.qrur9Dvnyt5_63": { "name": "63" }, - "Zj7UnCAulEk.qrur9Dvnyt5:64": { + "Zj7UnCAulEk.qrur9Dvnyt5_64": { "name": "64" }, - "Zj7UnCAulEk.qrur9Dvnyt5:65": { + "Zj7UnCAulEk.qrur9Dvnyt5_65": { "name": "65" }, - "Zj7UnCAulEk.qrur9Dvnyt5:66": { + "Zj7UnCAulEk.qrur9Dvnyt5_66": { "name": "66" }, - "Zj7UnCAulEk.qrur9Dvnyt5:67": { + "Zj7UnCAulEk.qrur9Dvnyt5_67": { "name": "67" }, - "Zj7UnCAulEk.qrur9Dvnyt5:68": { + "Zj7UnCAulEk.qrur9Dvnyt5_68": { "name": "68" }, - "Zj7UnCAulEk.qrur9Dvnyt5:69": { + "Zj7UnCAulEk.qrur9Dvnyt5_69": { "name": "69" }, - "Zj7UnCAulEk.qrur9Dvnyt5:70": { + "Zj7UnCAulEk.qrur9Dvnyt5_70": { "name": "70" }, - "Zj7UnCAulEk.qrur9Dvnyt5:71": { + "Zj7UnCAulEk.qrur9Dvnyt5_71": { "name": "71" }, - "Zj7UnCAulEk.qrur9Dvnyt5:72": { + "Zj7UnCAulEk.qrur9Dvnyt5_72": { "name": "72" }, - "Zj7UnCAulEk.qrur9Dvnyt5:73": { + "Zj7UnCAulEk.qrur9Dvnyt5_73": { "name": "73" }, - "Zj7UnCAulEk.qrur9Dvnyt5:74": { + "Zj7UnCAulEk.qrur9Dvnyt5_74": { "name": "74" }, - "Zj7UnCAulEk.qrur9Dvnyt5:75": { + "Zj7UnCAulEk.qrur9Dvnyt5_75": { "name": "75" }, - "Zj7UnCAulEk.qrur9Dvnyt5:76": { + "Zj7UnCAulEk.qrur9Dvnyt5_76": { "name": "76" }, - "Zj7UnCAulEk.qrur9Dvnyt5:77": { + "Zj7UnCAulEk.qrur9Dvnyt5_77": { "name": "77" }, - "Zj7UnCAulEk.qrur9Dvnyt5:78": { + "Zj7UnCAulEk.qrur9Dvnyt5_78": { "name": "78" }, - "Zj7UnCAulEk.qrur9Dvnyt5:79": { + "Zj7UnCAulEk.qrur9Dvnyt5_79": { "name": "79" }, - "Zj7UnCAulEk.qrur9Dvnyt5:80": { + "Zj7UnCAulEk.qrur9Dvnyt5_80": { "name": "80" }, - "Zj7UnCAulEk.qrur9Dvnyt5:81": { + "Zj7UnCAulEk.qrur9Dvnyt5_81": { "name": "81" }, - "Zj7UnCAulEk.qrur9Dvnyt5:82": { + "Zj7UnCAulEk.qrur9Dvnyt5_82": { "name": "82" }, - "Zj7UnCAulEk.qrur9Dvnyt5:83": { + "Zj7UnCAulEk.qrur9Dvnyt5_83": { "name": "83" }, - "Zj7UnCAulEk.qrur9Dvnyt5:84": { + "Zj7UnCAulEk.qrur9Dvnyt5_84": { "name": "84" }, - "Zj7UnCAulEk.qrur9Dvnyt5:85": { + "Zj7UnCAulEk.qrur9Dvnyt5_85": { "name": "85" }, - "Zj7UnCAulEk.qrur9Dvnyt5:86": { + "Zj7UnCAulEk.qrur9Dvnyt5_86": { "name": "86" }, - "Zj7UnCAulEk.qrur9Dvnyt5:87": { + "Zj7UnCAulEk.qrur9Dvnyt5_87": { "name": "87" }, - "Zj7UnCAulEk.qrur9Dvnyt5:88": { + "Zj7UnCAulEk.qrur9Dvnyt5_88": { "name": "88" }, "": { @@ -342,95 +342,95 @@ "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", - "Zj7UnCAulEk.qrur9Dvnyt5:11", - "Zj7UnCAulEk.qrur9Dvnyt5:12", - "Zj7UnCAulEk.qrur9Dvnyt5:13", - "Zj7UnCAulEk.qrur9Dvnyt5:14", - "Zj7UnCAulEk.qrur9Dvnyt5:15", - "Zj7UnCAulEk.qrur9Dvnyt5:16", - "Zj7UnCAulEk.qrur9Dvnyt5:17", - "Zj7UnCAulEk.qrur9Dvnyt5:18", - "Zj7UnCAulEk.qrur9Dvnyt5:19", - "Zj7UnCAulEk.qrur9Dvnyt5:20", - "Zj7UnCAulEk.qrur9Dvnyt5:21", - "Zj7UnCAulEk.qrur9Dvnyt5:22", - "Zj7UnCAulEk.qrur9Dvnyt5:23", - "Zj7UnCAulEk.qrur9Dvnyt5:24", - "Zj7UnCAulEk.qrur9Dvnyt5:25", - "Zj7UnCAulEk.qrur9Dvnyt5:26", - "Zj7UnCAulEk.qrur9Dvnyt5:27", - "Zj7UnCAulEk.qrur9Dvnyt5:28", - "Zj7UnCAulEk.qrur9Dvnyt5:29", - "Zj7UnCAulEk.qrur9Dvnyt5:30", - "Zj7UnCAulEk.qrur9Dvnyt5:31", - "Zj7UnCAulEk.qrur9Dvnyt5:32", - "Zj7UnCAulEk.qrur9Dvnyt5:33", - "Zj7UnCAulEk.qrur9Dvnyt5:34", - "Zj7UnCAulEk.qrur9Dvnyt5:35", - "Zj7UnCAulEk.qrur9Dvnyt5:36", - "Zj7UnCAulEk.qrur9Dvnyt5:37", - "Zj7UnCAulEk.qrur9Dvnyt5:38", - "Zj7UnCAulEk.qrur9Dvnyt5:39", - "Zj7UnCAulEk.qrur9Dvnyt5:40", - "Zj7UnCAulEk.qrur9Dvnyt5:41", - "Zj7UnCAulEk.qrur9Dvnyt5:42", - "Zj7UnCAulEk.qrur9Dvnyt5:43", - "Zj7UnCAulEk.qrur9Dvnyt5:44", - "Zj7UnCAulEk.qrur9Dvnyt5:45", - "Zj7UnCAulEk.qrur9Dvnyt5:46", - "Zj7UnCAulEk.qrur9Dvnyt5:47", - "Zj7UnCAulEk.qrur9Dvnyt5:48", - "Zj7UnCAulEk.qrur9Dvnyt5:49", - "Zj7UnCAulEk.qrur9Dvnyt5:50", - "Zj7UnCAulEk.qrur9Dvnyt5:51", - "Zj7UnCAulEk.qrur9Dvnyt5:52", - "Zj7UnCAulEk.qrur9Dvnyt5:53", - "Zj7UnCAulEk.qrur9Dvnyt5:54", - "Zj7UnCAulEk.qrur9Dvnyt5:55", - "Zj7UnCAulEk.qrur9Dvnyt5:56", - "Zj7UnCAulEk.qrur9Dvnyt5:57", - "Zj7UnCAulEk.qrur9Dvnyt5:58", - "Zj7UnCAulEk.qrur9Dvnyt5:59", - "Zj7UnCAulEk.qrur9Dvnyt5:60", - "Zj7UnCAulEk.qrur9Dvnyt5:61", - "Zj7UnCAulEk.qrur9Dvnyt5:62", - "Zj7UnCAulEk.qrur9Dvnyt5:63", - "Zj7UnCAulEk.qrur9Dvnyt5:64", - "Zj7UnCAulEk.qrur9Dvnyt5:65", - "Zj7UnCAulEk.qrur9Dvnyt5:66", - "Zj7UnCAulEk.qrur9Dvnyt5:67", - "Zj7UnCAulEk.qrur9Dvnyt5:68", - "Zj7UnCAulEk.qrur9Dvnyt5:69", - "Zj7UnCAulEk.qrur9Dvnyt5:70", - "Zj7UnCAulEk.qrur9Dvnyt5:71", - "Zj7UnCAulEk.qrur9Dvnyt5:72", - "Zj7UnCAulEk.qrur9Dvnyt5:73", - "Zj7UnCAulEk.qrur9Dvnyt5:74", - "Zj7UnCAulEk.qrur9Dvnyt5:75", - "Zj7UnCAulEk.qrur9Dvnyt5:76", - "Zj7UnCAulEk.qrur9Dvnyt5:77", - "Zj7UnCAulEk.qrur9Dvnyt5:78", - "Zj7UnCAulEk.qrur9Dvnyt5:79", - "Zj7UnCAulEk.qrur9Dvnyt5:80", - "Zj7UnCAulEk.qrur9Dvnyt5:81", - "Zj7UnCAulEk.qrur9Dvnyt5:82", - "Zj7UnCAulEk.qrur9Dvnyt5:83", - "Zj7UnCAulEk.qrur9Dvnyt5:84", - "Zj7UnCAulEk.qrur9Dvnyt5:85", - "Zj7UnCAulEk.qrur9Dvnyt5:86", - "Zj7UnCAulEk.qrur9Dvnyt5:87", - "Zj7UnCAulEk.qrur9Dvnyt5:88", + "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", + "Zj7UnCAulEk.qrur9Dvnyt5_11", + "Zj7UnCAulEk.qrur9Dvnyt5_12", + "Zj7UnCAulEk.qrur9Dvnyt5_13", + "Zj7UnCAulEk.qrur9Dvnyt5_14", + "Zj7UnCAulEk.qrur9Dvnyt5_15", + "Zj7UnCAulEk.qrur9Dvnyt5_16", + "Zj7UnCAulEk.qrur9Dvnyt5_17", + "Zj7UnCAulEk.qrur9Dvnyt5_18", + "Zj7UnCAulEk.qrur9Dvnyt5_19", + "Zj7UnCAulEk.qrur9Dvnyt5_20", + "Zj7UnCAulEk.qrur9Dvnyt5_21", + "Zj7UnCAulEk.qrur9Dvnyt5_22", + "Zj7UnCAulEk.qrur9Dvnyt5_23", + "Zj7UnCAulEk.qrur9Dvnyt5_24", + "Zj7UnCAulEk.qrur9Dvnyt5_25", + "Zj7UnCAulEk.qrur9Dvnyt5_26", + "Zj7UnCAulEk.qrur9Dvnyt5_27", + "Zj7UnCAulEk.qrur9Dvnyt5_28", + "Zj7UnCAulEk.qrur9Dvnyt5_29", + "Zj7UnCAulEk.qrur9Dvnyt5_30", + "Zj7UnCAulEk.qrur9Dvnyt5_31", + "Zj7UnCAulEk.qrur9Dvnyt5_32", + "Zj7UnCAulEk.qrur9Dvnyt5_33", + "Zj7UnCAulEk.qrur9Dvnyt5_34", + "Zj7UnCAulEk.qrur9Dvnyt5_35", + "Zj7UnCAulEk.qrur9Dvnyt5_36", + "Zj7UnCAulEk.qrur9Dvnyt5_37", + "Zj7UnCAulEk.qrur9Dvnyt5_38", + "Zj7UnCAulEk.qrur9Dvnyt5_39", + "Zj7UnCAulEk.qrur9Dvnyt5_40", + "Zj7UnCAulEk.qrur9Dvnyt5_41", + "Zj7UnCAulEk.qrur9Dvnyt5_42", + "Zj7UnCAulEk.qrur9Dvnyt5_43", + "Zj7UnCAulEk.qrur9Dvnyt5_44", + "Zj7UnCAulEk.qrur9Dvnyt5_45", + "Zj7UnCAulEk.qrur9Dvnyt5_46", + "Zj7UnCAulEk.qrur9Dvnyt5_47", + "Zj7UnCAulEk.qrur9Dvnyt5_48", + "Zj7UnCAulEk.qrur9Dvnyt5_49", + "Zj7UnCAulEk.qrur9Dvnyt5_50", + "Zj7UnCAulEk.qrur9Dvnyt5_51", + "Zj7UnCAulEk.qrur9Dvnyt5_52", + "Zj7UnCAulEk.qrur9Dvnyt5_53", + "Zj7UnCAulEk.qrur9Dvnyt5_54", + "Zj7UnCAulEk.qrur9Dvnyt5_55", + "Zj7UnCAulEk.qrur9Dvnyt5_56", + "Zj7UnCAulEk.qrur9Dvnyt5_57", + "Zj7UnCAulEk.qrur9Dvnyt5_58", + "Zj7UnCAulEk.qrur9Dvnyt5_59", + "Zj7UnCAulEk.qrur9Dvnyt5_60", + "Zj7UnCAulEk.qrur9Dvnyt5_61", + "Zj7UnCAulEk.qrur9Dvnyt5_62", + "Zj7UnCAulEk.qrur9Dvnyt5_63", + "Zj7UnCAulEk.qrur9Dvnyt5_64", + "Zj7UnCAulEk.qrur9Dvnyt5_65", + "Zj7UnCAulEk.qrur9Dvnyt5_66", + "Zj7UnCAulEk.qrur9Dvnyt5_67", + "Zj7UnCAulEk.qrur9Dvnyt5_68", + "Zj7UnCAulEk.qrur9Dvnyt5_69", + "Zj7UnCAulEk.qrur9Dvnyt5_70", + "Zj7UnCAulEk.qrur9Dvnyt5_71", + "Zj7UnCAulEk.qrur9Dvnyt5_72", + "Zj7UnCAulEk.qrur9Dvnyt5_73", + "Zj7UnCAulEk.qrur9Dvnyt5_74", + "Zj7UnCAulEk.qrur9Dvnyt5_75", + "Zj7UnCAulEk.qrur9Dvnyt5_76", + "Zj7UnCAulEk.qrur9Dvnyt5_77", + "Zj7UnCAulEk.qrur9Dvnyt5_78", + "Zj7UnCAulEk.qrur9Dvnyt5_79", + "Zj7UnCAulEk.qrur9Dvnyt5_80", + "Zj7UnCAulEk.qrur9Dvnyt5_81", + "Zj7UnCAulEk.qrur9Dvnyt5_82", + "Zj7UnCAulEk.qrur9Dvnyt5_83", + "Zj7UnCAulEk.qrur9Dvnyt5_84", + "Zj7UnCAulEk.qrur9Dvnyt5_85", + "Zj7UnCAulEk.qrur9Dvnyt5_86", + "Zj7UnCAulEk.qrur9Dvnyt5_87", + "Zj7UnCAulEk.qrur9Dvnyt5_88", "" ], "ou": ["ImspTQPwCqd"] @@ -439,273 +439,273 @@ "rowContext": {}, "width": 4, "rows": [ - ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202503", "70"], - ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202504", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202505", "67"], - ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202503", "70"], - ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202504", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202503", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202503", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:80", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202503", "35"], - ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202504", "35"], - ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202505", "65"], - ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202504", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:56", "ImspTQPwCqd", "202504", "30"], - ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:63", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202505", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202505", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202505", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:76", "ImspTQPwCqd", "202505", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202504", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202504", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202503", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202503", "65"], - ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202505", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:19", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:2", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202504", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202505", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202504", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:61", "ImspTQPwCqd", "202505", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202503", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202504", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202504", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:52", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:29", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202503", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5:26", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:33", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:60", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:34", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:15", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:71", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:72", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:44", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:67", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:83", "ImspTQPwCqd", "202503", "39"], - ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202504", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202504", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202505", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202503", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:16", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:9", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202505", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5:54", "ImspTQPwCqd", "202504", "34"], - ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202505", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5:53", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:57", "ImspTQPwCqd", "202504", "35"], - ["Zj7UnCAulEk.qrur9Dvnyt5:17", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:59", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:84", "ImspTQPwCqd", "202504", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:11", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:65", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5:46", "ImspTQPwCqd", "202503", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:38", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:8", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202505", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:31", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:70", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5:87", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:6", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:30", "ImspTQPwCqd", "202503", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:45", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5:4", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:25", "ImspTQPwCqd", "202505", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:66", "ImspTQPwCqd", "202505", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5:55", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:64", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:28", "ImspTQPwCqd", "202504", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:68", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:21", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:39", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:40", "ImspTQPwCqd", "202505", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5:10", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202505", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:7", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:5", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:75", "ImspTQPwCqd", "202503", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5:51", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:81", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5:18", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:24", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5:78", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:62", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:42", "ImspTQPwCqd", "202505", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:49", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5:0", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:20", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5:37", "ImspTQPwCqd", "202505", "31"], - ["Zj7UnCAulEk.qrur9Dvnyt5:79", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5:22", "ImspTQPwCqd", "202505", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:74", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5:82", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:41", "ImspTQPwCqd", "202503", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5:32", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:85", "ImspTQPwCqd", "202504", "32"], - ["Zj7UnCAulEk.qrur9Dvnyt5:50", "ImspTQPwCqd", "202503", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:35", "ImspTQPwCqd", "202505", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:69", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:88", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5:23", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5:1", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5:86", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5:47", "ImspTQPwCqd", "202505", "66"], - ["Zj7UnCAulEk.qrur9Dvnyt5:14", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5:73", "ImspTQPwCqd", "202504", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5:43", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:77", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5:13", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5:12", "ImspTQPwCqd", "202503", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5:48", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5:3", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5:36", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:27", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5:58", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202503", "70"], + ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202504", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202505", "67"], + ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202503", "70"], + ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202504", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202503", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202503", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202503", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202504", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202505", "65"], + ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202504", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202504", "30"], + ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202503", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202504", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202505", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202505", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202505", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202505", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202505", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202505", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202503", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202503", "65"], + ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202505", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202504", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202505", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202504", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202505", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202503", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202504", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202504", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202505", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202505", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202504", "64"], + ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202503", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202503", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202503", "39"], + ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202504", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202504", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202505", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202504", "42"], + ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202503", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202503", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202505", "57"], + ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202504", "34"], + ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202505", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202504", "35"], + ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202504", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202505", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202503", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202504", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202503", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202503", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202505", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202504", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202503", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202505", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202503", "51"], + ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202503", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202505", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202505", "41"], + ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202503", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202504", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202503", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202504", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202505", "60"], + ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202504", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202505", "58"], + ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202503", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202503", "36"], + ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202505", "37"], + ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202505", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202505", "61"], + ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202504", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202505", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202505", "45"], + ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202504", "54"], + ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202505", "31"], + ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202505", "46"], + ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202505", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202504", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202504", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202503", "62"], + ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202503", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202504", "32"], + ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202503", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202505", "40"], + ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202503", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202504", "52"], + ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202503", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202505", "50"], + ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202504", "48"], + ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202505", "53"], + ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202505", "43"], + ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202505", "66"], + ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202504", "38"], + ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202504", "59"], + ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202505", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202503", "55"], + ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202503", "47"], + ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202503", "63"], + ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202504", "44"], + ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202503", "56"], + ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202504", "49"], + ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202505", "48"], ["", "ImspTQPwCqd", "202505", "5"], ["", "ImspTQPwCqd", "202506", "12"] ], diff --git a/src/__demo__/data/event/yesonly.data.hidena.json b/src/__demo__/data/event/yesonly.data.hidena.json index 52083817d..c63700970 100644 --- a/src/__demo__/data/event/yesonly.data.hidena.json +++ b/src/__demo__/data/event/yesonly.data.hidena.json @@ -95,10 +95,10 @@ "pe": { "name": "Period" }, - "jfuXZB3A1ko.hwG20Dyj6RK:0": { + "jfuXZB3A1ko.hwG20Dyj6RK_0": { "name": "No" }, - "jfuXZB3A1ko.hwG20Dyj6RK:1": { + "jfuXZB3A1ko.hwG20Dyj6RK_1": { "name": "Yes" } }, @@ -118,7 +118,7 @@ "202506" ], "ou": ["ImspTQPwCqd"], - "jfuXZB3A1ko.hwG20Dyj6RK": ["jfuXZB3A1ko.hwG20Dyj6RK:1"] + "jfuXZB3A1ko.hwG20Dyj6RK": ["jfuXZB3A1ko.hwG20Dyj6RK_1"] } }, "rowContext": {}, @@ -128,9 +128,9 @@ ["", "ImspTQPwCqd", "202503", "2"], ["", "ImspTQPwCqd", "202504", "1"], ["", "ImspTQPwCqd", "202502", "1"], - ["jfuXZB3A1ko.hwG20Dyj6RK:1", "ImspTQPwCqd", "202501", "1"], + ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202501", "1"], ["", "ImspTQPwCqd", "202501", "2"], - ["jfuXZB3A1ko.hwG20Dyj6RK:1", "ImspTQPwCqd", "202412", "3"], + ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202412", "3"], ["", "ImspTQPwCqd", "202411", "1"] ], "height": 8, diff --git a/src/__demo__/data/event/yesonly.data.json b/src/__demo__/data/event/yesonly.data.json index 2c74ccae4..8907f4f50 100644 --- a/src/__demo__/data/event/yesonly.data.json +++ b/src/__demo__/data/event/yesonly.data.json @@ -95,10 +95,10 @@ "pe": { "name": "Period" }, - "jfuXZB3A1ko.hwG20Dyj6RK:0": { + "jfuXZB3A1ko.hwG20Dyj6RK_0": { "name": "No" }, - "jfuXZB3A1ko.hwG20Dyj6RK:1": { + "jfuXZB3A1ko.hwG20Dyj6RK_1": { "name": "Yes" }, "": { @@ -121,7 +121,7 @@ "202506" ], "ou": ["ImspTQPwCqd"], - "jfuXZB3A1ko.hwG20Dyj6RK": ["jfuXZB3A1ko.hwG20Dyj6RK:1", ""] + "jfuXZB3A1ko.hwG20Dyj6RK": ["jfuXZB3A1ko.hwG20Dyj6RK_1", ""] } }, "rowContext": {}, @@ -131,9 +131,9 @@ ["", "ImspTQPwCqd", "202503", "2"], ["", "ImspTQPwCqd", "202504", "1"], ["", "ImspTQPwCqd", "202502", "1"], - ["jfuXZB3A1ko.hwG20Dyj6RK:1", "ImspTQPwCqd", "202501", "1"], + ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202501", "1"], ["", "ImspTQPwCqd", "202501", "2"], - ["jfuXZB3A1ko.hwG20Dyj6RK:1", "ImspTQPwCqd", "202412", "3"], + ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202412", "3"], ["", "ImspTQPwCqd", "202411", "1"] ], "height": 8, diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 04a1ef1d2..82e9104ae 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -16,7 +16,7 @@ import { applyDefaultHandler } from './default.js' import { applyOptionSetHandler } from './optionSet.js' export const NA_VALUE = '' -export const PREFIX_SEPARATOR = ':' +export const PREFIX_SEPARATOR = '_' export const itemFormatterByValueType = { [VALUE_TYPE_DATETIME]: (name) => name.replace(/:00\.0$/, ''), From c8798096c019a5f6778d929fd439375a034b3187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 21 Aug 2025 11:56:55 +0200 Subject: [PATCH 28/50] chore: datetime --- src/__demo__/PivotTable.event.stories.js | 20 +++ .../data/event/datetime.data.hidena.json | 3 + src/__demo__/data/event/datetime.data.json | 3 + .../data/event/datetime.visualization.json | 148 ++++++++++++++++++ 4 files changed, 174 insertions(+) create mode 100644 src/__demo__/data/event/datetime.visualization.json diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 08787e038..6b6e02030 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -5,6 +5,8 @@ import booleanData from './data/event/boolean.data.json' import booleanVisualization from './data/event/boolean.visualization.json' import dateData from './data/event/date.data.json' import dateVisualization from './data/event/date.visualization.json' +import datetimeData from './data/event/datetime.data.json' +import datetimeVisualization from './data/event/datetime.visualization.json' import numericLegendsetData from './data/event/numeric-legendset.data.json' import numericLegendsetVisualization from './data/event/numeric-legendset.visualization.json' import numericData from './data/event/numeric.data.json' @@ -87,6 +89,24 @@ Date.story = { name: 'Date', } +export const Datetime = (_, { pivotTableOptions }) => { + const visualization = { + ...datetimeVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +Datetime.story = { + name: 'Datetime', +} + export const Numeric = (_, { pivotTableOptions }) => { const visualization = { ...numericVisualization, diff --git a/src/__demo__/data/event/datetime.data.hidena.json b/src/__demo__/data/event/datetime.data.hidena.json index 79e0b708e..3e4d5aa38 100644 --- a/src/__demo__/data/event/datetime.data.hidena.json +++ b/src/__demo__/data/event/datetime.data.hidena.json @@ -121,6 +121,9 @@ }, "KWzx2tY8dFi": { "name": "E2E - Date & Time" + }, + "jfuXZB3A1ko.KWzx2tY8dFi": { + "name": "E2E - Date & Time" } }, "dimensions": { diff --git a/src/__demo__/data/event/datetime.data.json b/src/__demo__/data/event/datetime.data.json index 7dc7b9b01..4c47446d0 100644 --- a/src/__demo__/data/event/datetime.data.json +++ b/src/__demo__/data/event/datetime.data.json @@ -122,6 +122,9 @@ "KWzx2tY8dFi": { "name": "E2E - Date & Time" }, + "jfuXZB3A1ko.KWzx2tY8dFi": { + "name": "E2E - Date & Time" + }, "": { "name": "N/A" } 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": [] +} From 2a1d354136234cac6830c5329582ca28092403d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Fri, 22 Aug 2025 16:25:58 +0200 Subject: [PATCH 29/50] chore: email example storybook --- src/__demo__/PivotTable.event.stories.js | 38 +++- .../data/event/email.data.hidena.json | 204 +++++++++++++++++ src/__demo__/data/event/email.data.json | 208 ++++++++++++++++++ src/__demo__/data/event/email.data.org.json | 132 +++++++++++ .../data/event/email.visualization.json | 148 +++++++++++++ ...a.hidena.json => integer.data.hidena.json} | 0 .../{numeric.data.json => integer.data.json} | 0 ...ic.data.org.json => integer.data.org.json} | 0 ...zation.json => integer.visualization.json} | 12 +- .../response/__tests__/response.spec.js | 18 ++ 10 files changed, 744 insertions(+), 16 deletions(-) create mode 100644 src/__demo__/data/event/email.data.hidena.json create mode 100644 src/__demo__/data/event/email.data.json create mode 100644 src/__demo__/data/event/email.data.org.json create mode 100644 src/__demo__/data/event/email.visualization.json rename src/__demo__/data/event/{numeric.data.hidena.json => integer.data.hidena.json} (100%) rename src/__demo__/data/event/{numeric.data.json => integer.data.json} (100%) rename src/__demo__/data/event/{numeric.data.org.json => integer.data.org.json} (100%) rename src/__demo__/data/event/{numeric.visualization.json => integer.visualization.json} (95%) diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 6b6e02030..b09541c99 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -7,10 +7,12 @@ import dateData from './data/event/date.data.json' import dateVisualization from './data/event/date.visualization.json' import datetimeData from './data/event/datetime.data.json' import datetimeVisualization from './data/event/datetime.visualization.json' +import emailData from './data/event/email.data.json' +import emailVisualization from './data/event/email.visualization.json' +import integerData from './data/event/integer.data.json' +import integerVisualization from './data/event/integer.visualization.json' import numericLegendsetData from './data/event/numeric-legendset.data.json' import numericLegendsetVisualization from './data/event/numeric-legendset.visualization.json' -import numericData from './data/event/numeric.data.json' -import numericVisualization from './data/event/numeric.visualization.json' import optionsetData from './data/event/optionset.data.json' import optionsetVisualization from './data/event/optionset.visualization.json' import optionsetsData from './data/event/optionsets.data.json' @@ -71,6 +73,24 @@ export default { decorators: [PivotTableOptionsWrapper], } +export const Boolean = (_, { pivotTableOptions }) => { + const visualization = { + ...booleanVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + +Boolean.story = { + name: 'Boolean', +} + export const Date = (_, { pivotTableOptions }) => { const visualization = { ...dateVisualization, @@ -109,14 +129,14 @@ Datetime.story = { export const Numeric = (_, { pivotTableOptions }) => { const visualization = { - ...numericVisualization, + ...integerVisualization, ...visualizationReset, ...pivotTableOptions, } return (
- +
) } @@ -181,22 +201,22 @@ OptionsetsNonUniqueCodes.story = { name: 'Optionset, non-unique codes', } -export const Boolean = (_, { pivotTableOptions }) => { +export const Text = (_, { pivotTableOptions }) => { const visualization = { - ...booleanVisualization, + ...emailVisualization, ...visualizationReset, ...pivotTableOptions, } return (
- +
) } -Boolean.story = { - name: 'Boolean', +Text.story = { + name: 'Text', } export const Yesonly = (_, { pivotTableOptions }) => { 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..a7e79a37f --- /dev/null +++ b/src/__demo__/data/event/email.data.hidena.json @@ -0,0 +1,204 @@ +{ + "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": { + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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" + }, + "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": [ + "202408", + "202409", + "202410", + "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..06ab89a1d --- /dev/null +++ b/src/__demo__/data/event/email.data.json @@ -0,0 +1,208 @@ +{ + "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": { + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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" + }, + "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": "N/A" + } + }, + "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": [ + "202408", + "202409", + "202410", + "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_yemail@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..f794f5251 --- /dev/null +++ b/src/__demo__/data/event/email.data.org.json @@ -0,0 +1,132 @@ +{ + "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": { + "202408": { + "name": "August 2024" + }, + "202409": { + "name": "September 2024" + }, + "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" + }, + "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" + } + }, + "dimensions": { + "jfuXZB3A1ko.RUZ2EBP6HQn": [], + "pe": [ + "202408", + "202409", + "202410", + "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/numeric.data.hidena.json b/src/__demo__/data/event/integer.data.hidena.json similarity index 100% rename from src/__demo__/data/event/numeric.data.hidena.json rename to src/__demo__/data/event/integer.data.hidena.json diff --git a/src/__demo__/data/event/numeric.data.json b/src/__demo__/data/event/integer.data.json similarity index 100% rename from src/__demo__/data/event/numeric.data.json rename to src/__demo__/data/event/integer.data.json diff --git a/src/__demo__/data/event/numeric.data.org.json b/src/__demo__/data/event/integer.data.org.json similarity index 100% rename from src/__demo__/data/event/numeric.data.org.json rename to src/__demo__/data/event/integer.data.org.json diff --git a/src/__demo__/data/event/numeric.visualization.json b/src/__demo__/data/event/integer.visualization.json similarity index 95% rename from src/__demo__/data/event/numeric.visualization.json rename to src/__demo__/data/event/integer.visualization.json index 1160edb3c..9f2d66272 100644 --- a/src/__demo__/data/event/numeric.visualization.json +++ b/src/__demo__/data/event/integer.visualization.json @@ -1,5 +1,5 @@ { - "name": "Numeric", + "name": "Integer", "created": "2025-06-30T10:27:41.277", "lastUpdated": "2025-06-30T10:27:41.277", "translations": [], @@ -87,9 +87,7 @@ { "parent": "COLUMN", "dimension": "ou", - "values": [ - "ImspTQPwCqd" - ] + "values": ["ImspTQPwCqd"] } ], "legacy": true, @@ -129,7 +127,7 @@ "dimension": "Zj7UnCAulEk.qrur9Dvnyt5" } ], - "displayName": "A1 numeric-legendset", + "displayName": "Integer", "access": { "manage": true, "externalize": true, @@ -159,7 +157,7 @@ "name": "Age in years" } }, - "displayFormName": "A1 numeric-legendset", + "displayFormName": "Integer", "id": "kNl4fqsY9hJ", "attributeValues": [] -} \ No newline at end of file +} diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index ec25cba91..42d41b172 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -4,6 +4,7 @@ import responseBooleanOrg from '../../../__demo__/data/event/boolean.data.org.js 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 responseEmailOrg from '../../../__demo__/data/event/email.data.org.json' import responseNumericHideNa from '../../../__demo__/data/event/numeric.data.hidena.json' import responseNumeric from '../../../__demo__/data/event/numeric.data.json' import responseNumericOrg from '../../../__demo__/data/event/numeric.data.org.json' @@ -32,6 +33,23 @@ describe('response', () => { }) }) + describe('email', () => { + it('transforms response', () => { + console.log( + transformResponse(responseEmailOrg).metaData.dimensions[ + 'jfuXZB3A1ko.RUZ2EBP6HQn' + ] + ) + expect(transformResponse(responseEmailOrg)).toEqual({}) + }) + + it('transforms response and hides N/A data', () => { + expect( + transformResponse(responseDateOrg, { hideNaData: true }) + ).toEqual(responseDateHideNa) + }) + }) + describe('numeric', () => { it('transforms response', () => { expect(transformResponse(responseNumericOrg)).toEqual( From 037f6b6e79e042eb657ec86bc1dcddcb7b7235e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Fri, 29 Aug 2025 11:06:17 +0200 Subject: [PATCH 30/50] chore: implement 'no value' in the engine --- src/__demo__/data/event/boolean.data.json | 3 -- src/__demo__/data/event/date.data.json | 3 -- src/__demo__/data/event/datetime.data.json | 3 -- src/__demo__/data/event/email.data.json | 3 -- src/__demo__/data/event/integer.data.json | 3 -- .../data/event/numeric-legendset.data.json | 3 -- src/__demo__/data/event/optionset.data.json | 3 -- src/__demo__/data/event/optionsets.data.json | 3 -- src/__demo__/data/event/yesonly.data.json | 4 -- .../ItemSelector/ItemSelector.js | 49 +++++++++---------- .../PivotTable/PivotTableRowHeaderCell.js | 1 + .../PivotTable/styles/PivotTable.style.js | 6 +++ src/modules/pivotTable/PivotTableEngine.js | 7 ++- src/modules/pivotTable/getHeaderForDisplay.js | 4 +- .../response/__tests__/response.spec.js | 9 ++-- src/modules/response/response.js | 3 +- 16 files changed, 44 insertions(+), 63 deletions(-) diff --git a/src/__demo__/data/event/boolean.data.json b/src/__demo__/data/event/boolean.data.json index 0d3894d50..4d7afb881 100644 --- a/src/__demo__/data/event/boolean.data.json +++ b/src/__demo__/data/event/boolean.data.json @@ -82,9 +82,6 @@ }, "A03MvHHogjR.bx6fsa0t90x_1": { "name": "Yes" - }, - "": { - "name": "N/A" } }, "dimensions": { diff --git a/src/__demo__/data/event/date.data.json b/src/__demo__/data/event/date.data.json index 097df2b9d..607c53725 100644 --- a/src/__demo__/data/event/date.data.json +++ b/src/__demo__/data/event/date.data.json @@ -121,9 +121,6 @@ }, "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0": { "name": "1993-12-02" - }, - "": { - "name": "N/A" } }, "dimensions": { diff --git a/src/__demo__/data/event/datetime.data.json b/src/__demo__/data/event/datetime.data.json index 4c47446d0..4bac29e80 100644 --- a/src/__demo__/data/event/datetime.data.json +++ b/src/__demo__/data/event/datetime.data.json @@ -124,9 +124,6 @@ }, "jfuXZB3A1ko.KWzx2tY8dFi": { "name": "E2E - Date & Time" - }, - "": { - "name": "N/A" } }, "dimensions": { diff --git a/src/__demo__/data/event/email.data.json b/src/__demo__/data/event/email.data.json index 06ab89a1d..caa1f6b54 100644 --- a/src/__demo__/data/event/email.data.json +++ b/src/__demo__/data/event/email.data.json @@ -115,9 +115,6 @@ }, "jfuXZB3A1ko.RUZ2EBP6HQn_test@pmail.com": { "name": "test@pmail.com" - }, - "": { - "name": "N/A" } }, "dimensions": { diff --git a/src/__demo__/data/event/integer.data.json b/src/__demo__/data/event/integer.data.json index b3b49552e..d8947aaec 100644 --- a/src/__demo__/data/event/integer.data.json +++ b/src/__demo__/data/event/integer.data.json @@ -334,9 +334,6 @@ }, "Zj7UnCAulEk.qrur9Dvnyt5_88": { "name": "88" - }, - "": { - "name": "N/A" } }, "dimensions": { diff --git a/src/__demo__/data/event/numeric-legendset.data.json b/src/__demo__/data/event/numeric-legendset.data.json index 28798e4fd..b55745688 100644 --- a/src/__demo__/data/event/numeric-legendset.data.json +++ b/src/__demo__/data/event/numeric-legendset.data.json @@ -95,9 +95,6 @@ }, "LAST_3_MONTHS": { "name": "Last 3 months" - }, - "": { - "name": "N/A" } }, "dimensions": { diff --git a/src/__demo__/data/event/optionset.data.json b/src/__demo__/data/event/optionset.data.json index 30c1e16c9..b7b2740fc 100644 --- a/src/__demo__/data/event/optionset.data.json +++ b/src/__demo__/data/event/optionset.data.json @@ -81,9 +81,6 @@ "yeod5tOXpkP": { "code": "MODDISCH", "name": "Discharged" - }, - "": { - "name": "N/A" } }, "dimensions": { diff --git a/src/__demo__/data/event/optionsets.data.json b/src/__demo__/data/event/optionsets.data.json index 79b364a11..e04f8f66c 100644 --- a/src/__demo__/data/event/optionsets.data.json +++ b/src/__demo__/data/event/optionsets.data.json @@ -93,9 +93,6 @@ }, "LAST_3_MONTHS": { "name": "Last 3 months" - }, - "": { - "name": "N/A" } }, "dimensions": { diff --git a/src/__demo__/data/event/yesonly.data.json b/src/__demo__/data/event/yesonly.data.json index 8907f4f50..28bb2cd94 100644 --- a/src/__demo__/data/event/yesonly.data.json +++ b/src/__demo__/data/event/yesonly.data.json @@ -101,10 +101,6 @@ "jfuXZB3A1ko.hwG20Dyj6RK_1": { "name": "Yes" }, - "": { - "name": "N/A" - } - }, "dimensions": { "pe": [ "202407", 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/PivotTableRowHeaderCell.js b/src/components/PivotTable/PivotTableRowHeaderCell.js index 81701efcb..69f16fa97 100644 --- a/src/components/PivotTable/PivotTableRowHeaderCell.js +++ b/src/components/PivotTable/PivotTableRowHeaderCell.js @@ -32,6 +32,7 @@ export const PivotTableRowHeaderCell = ({ header.label !== 'Subtotal' ? 'row-header' : 'empty-header', + header.isNaData && 'nadata-header', header.includesHierarchy && 'row-header-hierarchy', { 'fixed-header': engine.options.fixRowHeaders, diff --git a/src/components/PivotTable/styles/PivotTable.style.js b/src/components/PivotTable/styles/PivotTable.style.js index 769454e98..70d373e67 100644 --- a/src/components/PivotTable/styles/PivotTable.style.js +++ b/src/components/PivotTable/styles/PivotTable.style.js @@ -140,6 +140,12 @@ export const cell = css` .empty-header { background-color: #cddaed; } + .nadata-header { + color: ${colors.grey600}; + font-style: italic; + font-family: monospace; + letter-spacing: -0.3px; + } .total-header { background-color: #bac6d8; } diff --git a/src/modules/pivotTable/PivotTableEngine.js b/src/modules/pivotTable/PivotTableEngine.js index 519e422ef..758d60713 100644 --- a/src/modules/pivotTable/PivotTableEngine.js +++ b/src/modules/pivotTable/PivotTableEngine.js @@ -114,12 +114,15 @@ const buildDimensionLookup = (visualization, metadata, headers) => { meta: metadata.items[row.dimension], count: metadata.dimensions[row.dimension].length, itemIds: metadata.dimensions[row.dimension], - items: metadata.dimensions[row.dimension].map( - (item) => metadata.items[item] + items: metadata.dimensions[row.dimension].map((item) => + item === '' + ? { name: i18n.t('No value'), isNaData: true } + : metadata.items[item] ), 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..a9ec6267d 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 @@ -39,9 +38,12 @@ export const getHeaderForDisplay = ({ ? currentHeader.hierarchy.join(' / ') : currentHeader?.name + const isNaData = currentHeader.isNaData + return { span, label, includesHierarchy, + isNaData, } } diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index 42d41b172..9bbbfd543 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -35,11 +35,10 @@ describe('response', () => { describe('email', () => { it('transforms response', () => { - console.log( - transformResponse(responseEmailOrg).metaData.dimensions[ - 'jfuXZB3A1ko.RUZ2EBP6HQn' - ] - ) + transformResponse(responseEmailOrg).metaData.dimensions[ + 'jfuXZB3A1ko.RUZ2EBP6HQn' + ] + expect(transformResponse(responseEmailOrg)).toEqual({}) }) diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 82e9104ae..3bfd1ac43 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -16,6 +16,7 @@ import { applyDefaultHandler } from './default.js' import { applyOptionSetHandler } from './optionSet.js' export const NA_VALUE = '' +export const NA_VALUE_DISPLAY_NAME = i18n.t('No value') export const PREFIX_SEPARATOR = '_' export const itemFormatterByValueType = { @@ -98,7 +99,7 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { ] transformedResponse.metaData.items[NA_VALUE] = { - name: i18n.t('N/A'), + name: NA_VALUE_DISPLAY_NAME, } } }) From 9d8b963f0655793767f20f1d6e0b36e412ab1fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Fri, 29 Aug 2025 11:20:02 +0200 Subject: [PATCH 31/50] chore: fix test files --- .../data/event/datetime.data.org.json | 3 +++ src/__demo__/data/event/email.data.json | 2 +- src/__demo__/data/event/email.data.org.json | 3 +++ src/__demo__/data/event/yesonly.data.json | 3 ++- .../response/__tests__/default.spec.js | 4 ++-- .../response/__tests__/response.spec.js | 22 +++++++++---------- src/modules/response/response.js | 4 ---- 7 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/__demo__/data/event/datetime.data.org.json b/src/__demo__/data/event/datetime.data.org.json index f886d379e..c78d417a4 100644 --- a/src/__demo__/data/event/datetime.data.org.json +++ b/src/__demo__/data/event/datetime.data.org.json @@ -91,6 +91,9 @@ }, "KWzx2tY8dFi": { "name": "E2E - Date & Time" + }, + "jfuXZB3A1ko.KWzx2tY8dFi": { + "name": "E2E - Date & Time" } }, "dimensions": { diff --git a/src/__demo__/data/event/email.data.json b/src/__demo__/data/event/email.data.json index caa1f6b54..2a195a847 100644 --- a/src/__demo__/data/event/email.data.json +++ b/src/__demo__/data/event/email.data.json @@ -187,7 +187,7 @@ "1" ], [ - "jfuXZB3A1ko.RUZ2EBP6HQn_yemail@dhis2.org", + "jfuXZB3A1ko.RUZ2EBP6HQn_myemail@dhis2.org", "ImspTQPwCqd", "202504", "1" diff --git a/src/__demo__/data/event/email.data.org.json b/src/__demo__/data/event/email.data.org.json index f794f5251..ddeeef4b5 100644 --- a/src/__demo__/data/event/email.data.org.json +++ b/src/__demo__/data/event/email.data.org.json @@ -91,6 +91,9 @@ }, "RUZ2EBP6HQn": { "name": "E2E - Email" + }, + "jfuXZB3A1ko.RUZ2EBP6HQn": { + "name": "E2E - Email" } }, "dimensions": { diff --git a/src/__demo__/data/event/yesonly.data.json b/src/__demo__/data/event/yesonly.data.json index 28bb2cd94..176713e0c 100644 --- a/src/__demo__/data/event/yesonly.data.json +++ b/src/__demo__/data/event/yesonly.data.json @@ -100,7 +100,8 @@ }, "jfuXZB3A1ko.hwG20Dyj6RK_1": { "name": "Yes" - }, + } + }, "dimensions": { "pe": [ "202407", diff --git a/src/modules/response/__tests__/default.spec.js b/src/modules/response/__tests__/default.spec.js index cbca27ec2..d798e9006 100644 --- a/src/modules/response/__tests__/default.spec.js +++ b/src/modules/response/__tests__/default.spec.js @@ -2,8 +2,8 @@ import dateResponseHideNa from '../../../__demo__/data/event/date.data.hidena.js import dateResponseOrg from '../../../__demo__/data/event/date.data.org.json' import datetimeResponseHideNa from '../../../__demo__/data/event/datetime.data.hidena.json' import datetimeResponseOrg from '../../../__demo__/data/event/datetime.data.org.json' -import numericResponseHideNa from '../../../__demo__/data/event/numeric.data.hidena.json' -import numericResponseOrg from '../../../__demo__/data/event/numeric.data.org.json' +import numericResponseHideNa from '../../../__demo__/data/event/integer.data.hidena.json' +import numericResponseOrg from '../../../__demo__/data/event/integer.data.org.json' import { VALUE_TYPE_DATE, VALUE_TYPE_DATETIME, diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index 9bbbfd543..ec53b4474 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -4,10 +4,12 @@ import responseBooleanOrg from '../../../__demo__/data/event/boolean.data.org.js 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 responseEmailOrg from '../../../__demo__/data/event/email.data.org.json' -import responseNumericHideNa from '../../../__demo__/data/event/numeric.data.hidena.json' -import responseNumeric from '../../../__demo__/data/event/numeric.data.json' -import responseNumericOrg from '../../../__demo__/data/event/numeric.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' @@ -33,19 +35,15 @@ describe('response', () => { }) }) - describe('email', () => { + describe('text', () => { it('transforms response', () => { - transformResponse(responseEmailOrg).metaData.dimensions[ - 'jfuXZB3A1ko.RUZ2EBP6HQn' - ] - - expect(transformResponse(responseEmailOrg)).toEqual({}) + expect(transformResponse(responseTextOrg)).toEqual(responseText) }) it('transforms response and hides N/A data', () => { expect( - transformResponse(responseDateOrg, { hideNaData: true }) - ).toEqual(responseDateHideNa) + transformResponse(responseTextOrg, { hideNaData: true }) + ).toEqual(responseTextHideNa) }) }) diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 3bfd1ac43..3b1d03a7a 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -97,10 +97,6 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { ...transformedResponse.metaData.dimensions[header.name], NA_VALUE, ] - - transformedResponse.metaData.items[NA_VALUE] = { - name: NA_VALUE_DISPLAY_NAME, - } } }) } From c90f2071ea4b0268b3a2c4a5f070fe143d48fb29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Fri, 29 Aug 2025 15:18:28 +0200 Subject: [PATCH 32/50] chore: storybook for no value --- src/__demo__/PivotTable.event.stories.js | 181 ++++++++++++++++-- .../data/event/optionset.data.hidena.json | 93 +++++---- src/__demo__/data/event/optionset.data.json | 94 ++++----- .../data/event/optionset.data.org.json | 93 +++++---- .../data/event/optionset.visualization.json | 31 ++- .../data/event/optionsets.data.hidena.json | 125 ------------ src/__demo__/data/event/optionsets.data.json | 125 ------------ .../data/event/optionsets.data.org.json | 125 ------------ .../data/event/optionsets.visualization.json | 158 --------------- 9 files changed, 330 insertions(+), 695 deletions(-) delete mode 100644 src/__demo__/data/event/optionsets.data.hidena.json delete mode 100644 src/__demo__/data/event/optionsets.data.json delete mode 100644 src/__demo__/data/event/optionsets.data.org.json delete mode 100644 src/__demo__/data/event/optionsets.visualization.json diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index b09541c99..14c4afd11 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -1,22 +1,28 @@ 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 numericLegendsetDataHideNa from './data/event/numeric-legendset.data.hidena.json' import numericLegendsetData from './data/event/numeric-legendset.data.json' import numericLegendsetVisualization from './data/event/numeric-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 optionsetsData from './data/event/optionsets.data.json' -import optionsetsVisualization from './data/event/optionsets.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' @@ -69,11 +75,11 @@ const PivotTableOptionsWrapper = (story) => { } export default { - title: 'PivotTable (event enrollment)', + title: 'PivotTable (event)', decorators: [PivotTableOptionsWrapper], } -export const Boolean = (_, { pivotTableOptions }) => { +export const BooleanNA = (_, { pivotTableOptions }) => { const visualization = { ...booleanVisualization, ...visualizationReset, @@ -87,11 +93,32 @@ export const Boolean = (_, { pivotTableOptions }) => { ) } +BooleanNA.story = { + name: 'BooleanNA', +} + +export const Boolean = (_, { pivotTableOptions }) => { + const visualization = { + ...booleanVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + Boolean.story = { name: 'Boolean', } -export const Date = (_, { pivotTableOptions }) => { +export const DateNA = (_, { pivotTableOptions }) => { const visualization = { ...dateVisualization, ...visualizationReset, @@ -105,11 +132,29 @@ export const Date = (_, { pivotTableOptions }) => { ) } +DateNA.story = { + name: 'DateNA', +} + +export const Date = (_, { pivotTableOptions }) => { + const visualization = { + ...dateVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + Date.story = { name: 'Date', } -export const Datetime = (_, { pivotTableOptions }) => { +export const DatetimeNA = (_, { pivotTableOptions }) => { const visualization = { ...datetimeVisualization, ...visualizationReset, @@ -123,11 +168,32 @@ export const Datetime = (_, { pivotTableOptions }) => { ) } +DatetimeNA.story = { + name: 'DatetimeNA', +} + +export const Datetime = (_, { pivotTableOptions }) => { + const visualization = { + ...datetimeVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + Datetime.story = { name: 'Datetime', } -export const Numeric = (_, { pivotTableOptions }) => { +export const NumericNA = (_, { pivotTableOptions }) => { const visualization = { ...integerVisualization, ...visualizationReset, @@ -141,11 +207,32 @@ export const Numeric = (_, { pivotTableOptions }) => { ) } +NumericNA.story = { + name: 'NumericNA', +} + +export const Numeric = (_, { pivotTableOptions }) => { + const visualization = { + ...integerVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + Numeric.story = { name: 'Numeric', } -export const NumericLegendset = (_, { pivotTableOptions }) => { +export const NumericLegendsetNA = (_, { pivotTableOptions }) => { const visualization = { ...numericLegendsetVisualization, ...visualizationReset, @@ -161,11 +248,31 @@ export const NumericLegendset = (_, { pivotTableOptions }) => { ) } +NumericLegendsetNA.story = { + name: 'Numeric with legendset NA', +} + +export const NumericLegendset = (_, { pivotTableOptions }) => { + const visualization = { + ...numericLegendsetVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + return ( +
+ +
+ ) +} + NumericLegendset.story = { name: 'Numeric with legendset', } -export const Optionset = (_, { pivotTableOptions }) => { +export const OptionsetNA = (_, { pivotTableOptions }) => { const visualization = { ...optionsetVisualization, ...visualizationReset, @@ -179,26 +286,47 @@ export const Optionset = (_, { pivotTableOptions }) => { ) } +OptionsetNA.story = { + name: 'OptionsetNA', +} + +export const Optionset = (_, { pivotTableOptions }) => { + const visualization = { + ...optionsetVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + Optionset.story = { name: 'Optionset', } -export const OptionsetsNonUniqueCodes = (_, { pivotTableOptions }) => { +export const TextNA = (_, { pivotTableOptions }) => { const visualization = { - ...optionsetsVisualization, + ...emailVisualization, ...visualizationReset, ...pivotTableOptions, } return (
- +
) } -OptionsetsNonUniqueCodes.story = { - name: 'Optionset, non-unique codes', +TextNA.story = { + name: 'TextNA', } export const Text = (_, { pivotTableOptions }) => { @@ -210,7 +338,7 @@ export const Text = (_, { pivotTableOptions }) => { return (
- +
) } @@ -219,7 +347,7 @@ Text.story = { name: 'Text', } -export const Yesonly = (_, { pivotTableOptions }) => { +export const YesonlyNA = (_, { pivotTableOptions }) => { const visualization = { ...yesonlyVisualization, ...visualizationReset, @@ -233,6 +361,27 @@ export const Yesonly = (_, { pivotTableOptions }) => { ) } +YesonlyNA.story = { + name: 'YesonlyNA', +} + +export const Yesonly = (_, { pivotTableOptions }) => { + const visualization = { + ...yesonlyVisualization, + ...visualizationReset, + ...pivotTableOptions, + } + + return ( +
+ +
+ ) +} + Yesonly.story = { name: 'Boolean', } diff --git a/src/__demo__/data/event/optionset.data.hidena.json b/src/__demo__/data/event/optionset.data.hidena.json index 958379757..88be1fad8 100644 --- a/src/__demo__/data/event/optionset.data.hidena.json +++ b/src/__demo__/data/event/optionset.data.hidena.json @@ -1,8 +1,17 @@ { "headers": [ { - "name": "Zj7UnCAulEk.fWIAEtYVEGk", - "column": "Mode of Discharge", + "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, @@ -36,28 +45,39 @@ ], "metaData": { "items": { - "202504": { - "name": "April 2025" - }, "202505": { "name": "May 2025" }, "202506": { "name": "June 2025" }, + "202507": { + "name": "July 2025" + }, "ou": { "name": "Organisation unit" }, - "Fhbf4aKpZmZ": { - "code": "MODABSC", - "name": "Absconded" + "optionId1": { + "code": "ONE", + "name": "One" + }, + "optionId2": { + "code": "TWO", + "name": "Two" + }, + "optionId3": { + "code": "ONE", + "name": "Single" }, - "Zj7UnCAulEk.fWIAEtYVEGk": { - "name": "Mode of Discharge" + "optionId4": { + "code": "TWO", + "name": "Double" }, - "gj2fKKyp8OH": { - "code": "MODDIED", - "name": "Died" + "stageA.element1": { + "name": "Option set A" + }, + "stageB.element2": { + "name": "Option set B with shared codes" }, "Zj7UnCAulEk": { "name": "Inpatient morbidity and mortality" @@ -73,44 +93,33 @@ }, "LAST_3_MONTHS": { "name": "Last 3 months" - }, - "fShHdgT7XGb": { - "code": "MODTRANS", - "name": "Transferred" - }, - "yeod5tOXpkP": { - "code": "MODDISCH", - "name": "Discharged" } }, "dimensions": { - "pe": ["202504", "202505", "202506"], + "pe": ["202505", "202506", "202507"], "ou": ["ImspTQPwCqd"], - "Zj7UnCAulEk.fWIAEtYVEGk": [ - "yeod5tOXpkP", - "gj2fKKyp8OH", - "fShHdgT7XGb", - "Fhbf4aKpZmZ" - ] + "stageA.element1": ["optionId1", "optionId2"], + "stageB.element2": ["optionId3", "optionId4"] } }, "rowContext": {}, "headerWidth": 4, "width": 4, "rows": [ - ["gj2fKKyp8OH", "ImspTQPwCqd", "202504", "524"], - ["yeod5tOXpkP", "ImspTQPwCqd", "202504", "555"], - ["fShHdgT7XGb", "ImspTQPwCqd", "202504", "515"], - ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202504", "504"], - ["fShHdgT7XGb", "ImspTQPwCqd", "202506", "609"], - ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202505", "574"], - ["yeod5tOXpkP", "ImspTQPwCqd", "202505", "586"], - ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202506", "574"], - ["gj2fKKyp8OH", "ImspTQPwCqd", "202505", "565"], - ["gj2fKKyp8OH", "ImspTQPwCqd", "202506", "545"], - ["yeod5tOXpkP", "ImspTQPwCqd", "202506", "597"], - ["fShHdgT7XGb", "ImspTQPwCqd", "202505", "561"], - ["", "ImspTQPwCqd", "202505", "49"] + ["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": 24 + "height": 12 } diff --git a/src/__demo__/data/event/optionset.data.json b/src/__demo__/data/event/optionset.data.json index b7b2740fc..e04f8f66c 100644 --- a/src/__demo__/data/event/optionset.data.json +++ b/src/__demo__/data/event/optionset.data.json @@ -1,8 +1,17 @@ { "headers": [ { - "name": "Zj7UnCAulEk.fWIAEtYVEGk", - "column": "Mode of Discharge", + "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, @@ -36,28 +45,39 @@ ], "metaData": { "items": { - "202504": { - "name": "April 2025" - }, "202505": { "name": "May 2025" }, "202506": { "name": "June 2025" }, + "202507": { + "name": "July 2025" + }, "ou": { "name": "Organisation unit" }, - "Fhbf4aKpZmZ": { - "code": "MODABSC", - "name": "Absconded" + "optionId1": { + "code": "ONE", + "name": "One" + }, + "optionId2": { + "code": "TWO", + "name": "Two" + }, + "optionId3": { + "code": "ONE", + "name": "Single" }, - "Zj7UnCAulEk.fWIAEtYVEGk": { - "name": "Mode of Discharge" + "optionId4": { + "code": "TWO", + "name": "Double" }, - "gj2fKKyp8OH": { - "code": "MODDIED", - "name": "Died" + "stageA.element1": { + "name": "Option set A" + }, + "stageB.element2": { + "name": "Option set B with shared codes" }, "Zj7UnCAulEk": { "name": "Inpatient morbidity and mortality" @@ -73,45 +93,33 @@ }, "LAST_3_MONTHS": { "name": "Last 3 months" - }, - "fShHdgT7XGb": { - "code": "MODTRANS", - "name": "Transferred" - }, - "yeod5tOXpkP": { - "code": "MODDISCH", - "name": "Discharged" } }, "dimensions": { - "pe": ["202504", "202505", "202506"], + "pe": ["202505", "202506", "202507"], "ou": ["ImspTQPwCqd"], - "Zj7UnCAulEk.fWIAEtYVEGk": [ - "yeod5tOXpkP", - "gj2fKKyp8OH", - "fShHdgT7XGb", - "Fhbf4aKpZmZ", - "" - ] + "stageA.element1": ["optionId1", "optionId2", ""], + "stageB.element2": ["optionId3", "optionId4", ""] } }, "rowContext": {}, "headerWidth": 4, "width": 4, "rows": [ - ["gj2fKKyp8OH", "ImspTQPwCqd", "202504", "524"], - ["yeod5tOXpkP", "ImspTQPwCqd", "202504", "555"], - ["fShHdgT7XGb", "ImspTQPwCqd", "202504", "515"], - ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202504", "504"], - ["fShHdgT7XGb", "ImspTQPwCqd", "202506", "609"], - ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202505", "574"], - ["yeod5tOXpkP", "ImspTQPwCqd", "202505", "586"], - ["Fhbf4aKpZmZ", "ImspTQPwCqd", "202506", "574"], - ["gj2fKKyp8OH", "ImspTQPwCqd", "202505", "565"], - ["gj2fKKyp8OH", "ImspTQPwCqd", "202506", "545"], - ["yeod5tOXpkP", "ImspTQPwCqd", "202506", "597"], - ["fShHdgT7XGb", "ImspTQPwCqd", "202505", "561"], - ["", "ImspTQPwCqd", "202505", "49"] + ["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": 24 + "height": 12 } diff --git a/src/__demo__/data/event/optionset.data.org.json b/src/__demo__/data/event/optionset.data.org.json index de953743a..0c89be891 100644 --- a/src/__demo__/data/event/optionset.data.org.json +++ b/src/__demo__/data/event/optionset.data.org.json @@ -1,8 +1,17 @@ { "headers": [ { - "name": "Zj7UnCAulEk.fWIAEtYVEGk", - "column": "Mode of Discharge", + "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, @@ -36,28 +45,39 @@ ], "metaData": { "items": { - "202504": { - "name": "April 2025" - }, "202505": { "name": "May 2025" }, "202506": { "name": "June 2025" }, + "202507": { + "name": "July 2025" + }, "ou": { "name": "Organisation unit" }, - "Fhbf4aKpZmZ": { - "code": "MODABSC", - "name": "Absconded" + "optionId1": { + "code": "ONE", + "name": "One" + }, + "optionId2": { + "code": "TWO", + "name": "Two" + }, + "optionId3": { + "code": "ONE", + "name": "Single" }, - "Zj7UnCAulEk.fWIAEtYVEGk": { - "name": "Mode of Discharge" + "optionId4": { + "code": "TWO", + "name": "Double" }, - "gj2fKKyp8OH": { - "code": "MODDIED", - "name": "Died" + "stageA.element1": { + "name": "Option set A" + }, + "stageB.element2": { + "name": "Option set B with shared codes" }, "Zj7UnCAulEk": { "name": "Inpatient morbidity and mortality" @@ -73,44 +93,33 @@ }, "LAST_3_MONTHS": { "name": "Last 3 months" - }, - "fShHdgT7XGb": { - "code": "MODTRANS", - "name": "Transferred" - }, - "yeod5tOXpkP": { - "code": "MODDISCH", - "name": "Discharged" } }, "dimensions": { - "pe": ["202504", "202505", "202506"], + "pe": ["202505", "202506", "202507"], "ou": ["ImspTQPwCqd"], - "Zj7UnCAulEk.fWIAEtYVEGk": [ - "yeod5tOXpkP", - "gj2fKKyp8OH", - "fShHdgT7XGb", - "Fhbf4aKpZmZ" - ] + "stageA.element1": ["optionId1", "optionId2"], + "stageB.element2": ["optionId3", "optionId4"] } }, "rowContext": {}, "headerWidth": 4, "width": 4, "rows": [ - ["MODDIED", "ImspTQPwCqd", "202504", "524"], - ["MODDISCH", "ImspTQPwCqd", "202504", "555"], - ["MODTRANS", "ImspTQPwCqd", "202504", "515"], - ["MODABSC", "ImspTQPwCqd", "202504", "504"], - ["MODTRANS", "ImspTQPwCqd", "202506", "609"], - ["MODABSC", "ImspTQPwCqd", "202505", "574"], - ["MODDISCH", "ImspTQPwCqd", "202505", "586"], - ["MODABSC", "ImspTQPwCqd", "202506", "574"], - ["MODDIED", "ImspTQPwCqd", "202505", "565"], - ["MODDIED", "ImspTQPwCqd", "202506", "545"], - ["MODDISCH", "ImspTQPwCqd", "202506", "597"], - ["MODTRANS", "ImspTQPwCqd", "202505", "561"], - ["", "ImspTQPwCqd", "202505", "49"] + ["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": 24 + "height": 12 } diff --git a/src/__demo__/data/event/optionset.visualization.json b/src/__demo__/data/event/optionset.visualization.json index 473016c59..38f6ccd33 100644 --- a/src/__demo__/data/event/optionset.visualization.json +++ b/src/__demo__/data/event/optionset.visualization.json @@ -1,5 +1,5 @@ { - "name": "Text with option set", + "name": "Two option sets with shared option codes", "created": "2025-06-30T10:27:41.277", "lastUpdated": "2025-06-30T10:27:41.277", "translations": [], @@ -40,18 +40,6 @@ "categoryDimensions": [], "categoryOptionGroupSetDimensions": [], "attributeDimensions": [], - "dataElementDimensions": [ - { - "dataElement": { - "name": "Age in years", - "id": "qrur9Dvnyt5" - }, - "legendSet": { - "name": "Age 10y interval", - "id": "Yf6UHoPkdS6" - } - } - ], "programIndicatorDimensions": [], "subscribers": [], "digitGroupSeparator": "SPACE", @@ -87,9 +75,7 @@ { "parent": "COLUMN", "dimension": "ou", - "values": [ - "ImspTQPwCqd" - ] + "values": ["ImspTQPwCqd"] } ], "legacy": true, @@ -124,9 +110,16 @@ { "items": [], "programStage": { - "id": "Zj7UnCAulEk" + "id": "stageA" + }, + "dimension": "stageA.element1" + }, + { + "items": [], + "programStage": { + "id": "stageB" }, - "dimension": "Zj7UnCAulEk.fWIAEtYVEGk" + "dimension": "stageB.element2" } ], "displayName": "Text with option set", @@ -162,4 +155,4 @@ "displayFormName": "Text with option set", "id": "kNl4fqsY9hJ", "attributeValues": [] -} \ No newline at end of file +} diff --git a/src/__demo__/data/event/optionsets.data.hidena.json b/src/__demo__/data/event/optionsets.data.hidena.json deleted file mode 100644 index 88be1fad8..000000000 --- a/src/__demo__/data/event/optionsets.data.hidena.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "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/optionsets.data.json b/src/__demo__/data/event/optionsets.data.json deleted file mode 100644 index e04f8f66c..000000000 --- a/src/__demo__/data/event/optionsets.data.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "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/optionsets.data.org.json b/src/__demo__/data/event/optionsets.data.org.json deleted file mode 100644 index 0c89be891..000000000 --- a/src/__demo__/data/event/optionsets.data.org.json +++ /dev/null @@ -1,125 +0,0 @@ -{ - "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/optionsets.visualization.json b/src/__demo__/data/event/optionsets.visualization.json deleted file mode 100644 index 38f6ccd33..000000000 --- a/src/__demo__/data/event/optionsets.visualization.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "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": [] -} From 2be53ab38cf3df09d1c36a3f2bc45b35ee13ae22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Tue, 2 Sep 2025 10:06:48 +0200 Subject: [PATCH 33/50] chore: update numeric example --- .../data/event/integer.data.hidena.json | 551 +----------------- src/__demo__/data/event/integer.data.json | 549 +---------------- src/__demo__/data/event/integer.data.org.json | 249 +------- src/modules/response/response.js | 2 +- 4 files changed, 8 insertions(+), 1343 deletions(-) diff --git a/src/__demo__/data/event/integer.data.hidena.json b/src/__demo__/data/event/integer.data.hidena.json index 34d0b8f98..a49a59de4 100644 --- a/src/__demo__/data/event/integer.data.hidena.json +++ b/src/__demo__/data/event/integer.data.hidena.json @@ -100,240 +100,6 @@ }, "Zj7UnCAulEk.qrur9Dvnyt5_10": { "name": "10" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_11": { - "name": "11" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_12": { - "name": "12" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_13": { - "name": "13" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_14": { - "name": "14" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_15": { - "name": "15" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_16": { - "name": "16" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_17": { - "name": "17" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_18": { - "name": "18" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_19": { - "name": "19" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_20": { - "name": "20" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_21": { - "name": "21" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_22": { - "name": "22" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_23": { - "name": "23" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_24": { - "name": "24" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_25": { - "name": "25" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_26": { - "name": "26" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_27": { - "name": "27" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_28": { - "name": "28" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_29": { - "name": "29" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_30": { - "name": "30" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_31": { - "name": "31" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_32": { - "name": "32" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_33": { - "name": "33" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_34": { - "name": "34" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_35": { - "name": "35" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_36": { - "name": "36" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_37": { - "name": "37" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_38": { - "name": "38" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_39": { - "name": "39" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_40": { - "name": "40" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_41": { - "name": "41" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_42": { - "name": "42" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_43": { - "name": "43" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_44": { - "name": "44" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_45": { - "name": "45" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_46": { - "name": "46" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_47": { - "name": "47" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_48": { - "name": "48" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_49": { - "name": "49" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_50": { - "name": "50" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_51": { - "name": "51" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_52": { - "name": "52" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_53": { - "name": "53" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_54": { - "name": "54" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_55": { - "name": "55" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_56": { - "name": "56" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_57": { - "name": "57" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_58": { - "name": "58" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_59": { - "name": "59" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_60": { - "name": "60" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_61": { - "name": "61" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_62": { - "name": "62" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_63": { - "name": "63" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_64": { - "name": "64" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_65": { - "name": "65" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_66": { - "name": "66" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_67": { - "name": "67" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_68": { - "name": "68" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_69": { - "name": "69" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_70": { - "name": "70" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_71": { - "name": "71" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_72": { - "name": "72" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_73": { - "name": "73" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_74": { - "name": "74" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_75": { - "name": "75" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_76": { - "name": "76" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_77": { - "name": "77" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_78": { - "name": "78" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_79": { - "name": "79" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_80": { - "name": "80" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_81": { - "name": "81" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_82": { - "name": "82" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_83": { - "name": "83" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_84": { - "name": "84" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_85": { - "name": "85" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_86": { - "name": "86" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_87": { - "name": "87" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_88": { - "name": "88" } }, "dimensions": { @@ -349,85 +115,7 @@ "Zj7UnCAulEk.qrur9Dvnyt5_7", "Zj7UnCAulEk.qrur9Dvnyt5_8", "Zj7UnCAulEk.qrur9Dvnyt5_9", - "Zj7UnCAulEk.qrur9Dvnyt5_10", - "Zj7UnCAulEk.qrur9Dvnyt5_11", - "Zj7UnCAulEk.qrur9Dvnyt5_12", - "Zj7UnCAulEk.qrur9Dvnyt5_13", - "Zj7UnCAulEk.qrur9Dvnyt5_14", - "Zj7UnCAulEk.qrur9Dvnyt5_15", - "Zj7UnCAulEk.qrur9Dvnyt5_16", - "Zj7UnCAulEk.qrur9Dvnyt5_17", - "Zj7UnCAulEk.qrur9Dvnyt5_18", - "Zj7UnCAulEk.qrur9Dvnyt5_19", - "Zj7UnCAulEk.qrur9Dvnyt5_20", - "Zj7UnCAulEk.qrur9Dvnyt5_21", - "Zj7UnCAulEk.qrur9Dvnyt5_22", - "Zj7UnCAulEk.qrur9Dvnyt5_23", - "Zj7UnCAulEk.qrur9Dvnyt5_24", - "Zj7UnCAulEk.qrur9Dvnyt5_25", - "Zj7UnCAulEk.qrur9Dvnyt5_26", - "Zj7UnCAulEk.qrur9Dvnyt5_27", - "Zj7UnCAulEk.qrur9Dvnyt5_28", - "Zj7UnCAulEk.qrur9Dvnyt5_29", - "Zj7UnCAulEk.qrur9Dvnyt5_30", - "Zj7UnCAulEk.qrur9Dvnyt5_31", - "Zj7UnCAulEk.qrur9Dvnyt5_32", - "Zj7UnCAulEk.qrur9Dvnyt5_33", - "Zj7UnCAulEk.qrur9Dvnyt5_34", - "Zj7UnCAulEk.qrur9Dvnyt5_35", - "Zj7UnCAulEk.qrur9Dvnyt5_36", - "Zj7UnCAulEk.qrur9Dvnyt5_37", - "Zj7UnCAulEk.qrur9Dvnyt5_38", - "Zj7UnCAulEk.qrur9Dvnyt5_39", - "Zj7UnCAulEk.qrur9Dvnyt5_40", - "Zj7UnCAulEk.qrur9Dvnyt5_41", - "Zj7UnCAulEk.qrur9Dvnyt5_42", - "Zj7UnCAulEk.qrur9Dvnyt5_43", - "Zj7UnCAulEk.qrur9Dvnyt5_44", - "Zj7UnCAulEk.qrur9Dvnyt5_45", - "Zj7UnCAulEk.qrur9Dvnyt5_46", - "Zj7UnCAulEk.qrur9Dvnyt5_47", - "Zj7UnCAulEk.qrur9Dvnyt5_48", - "Zj7UnCAulEk.qrur9Dvnyt5_49", - "Zj7UnCAulEk.qrur9Dvnyt5_50", - "Zj7UnCAulEk.qrur9Dvnyt5_51", - "Zj7UnCAulEk.qrur9Dvnyt5_52", - "Zj7UnCAulEk.qrur9Dvnyt5_53", - "Zj7UnCAulEk.qrur9Dvnyt5_54", - "Zj7UnCAulEk.qrur9Dvnyt5_55", - "Zj7UnCAulEk.qrur9Dvnyt5_56", - "Zj7UnCAulEk.qrur9Dvnyt5_57", - "Zj7UnCAulEk.qrur9Dvnyt5_58", - "Zj7UnCAulEk.qrur9Dvnyt5_59", - "Zj7UnCAulEk.qrur9Dvnyt5_60", - "Zj7UnCAulEk.qrur9Dvnyt5_61", - "Zj7UnCAulEk.qrur9Dvnyt5_62", - "Zj7UnCAulEk.qrur9Dvnyt5_63", - "Zj7UnCAulEk.qrur9Dvnyt5_64", - "Zj7UnCAulEk.qrur9Dvnyt5_65", - "Zj7UnCAulEk.qrur9Dvnyt5_66", - "Zj7UnCAulEk.qrur9Dvnyt5_67", - "Zj7UnCAulEk.qrur9Dvnyt5_68", - "Zj7UnCAulEk.qrur9Dvnyt5_69", - "Zj7UnCAulEk.qrur9Dvnyt5_70", - "Zj7UnCAulEk.qrur9Dvnyt5_71", - "Zj7UnCAulEk.qrur9Dvnyt5_72", - "Zj7UnCAulEk.qrur9Dvnyt5_73", - "Zj7UnCAulEk.qrur9Dvnyt5_74", - "Zj7UnCAulEk.qrur9Dvnyt5_75", - "Zj7UnCAulEk.qrur9Dvnyt5_76", - "Zj7UnCAulEk.qrur9Dvnyt5_77", - "Zj7UnCAulEk.qrur9Dvnyt5_78", - "Zj7UnCAulEk.qrur9Dvnyt5_79", - "Zj7UnCAulEk.qrur9Dvnyt5_80", - "Zj7UnCAulEk.qrur9Dvnyt5_81", - "Zj7UnCAulEk.qrur9Dvnyt5_82", - "Zj7UnCAulEk.qrur9Dvnyt5_83", - "Zj7UnCAulEk.qrur9Dvnyt5_84", - "Zj7UnCAulEk.qrur9Dvnyt5_85", - "Zj7UnCAulEk.qrur9Dvnyt5_86", - "Zj7UnCAulEk.qrur9Dvnyt5_87", - "Zj7UnCAulEk.qrur9Dvnyt5_88" + "Zj7UnCAulEk.qrur9Dvnyt5_10" ], "ou": ["ImspTQPwCqd"] } @@ -435,275 +123,42 @@ "rowContext": {}, "width": 4, "rows": [ - ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202503", "70"], - ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202504", "48"], ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202504", "47"], ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202505", "67"], - ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202504", "42"], ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202503", "55"], ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202503", "70"], - ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202504", "43"], ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202503", "62"], ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202503", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202505", "52"], ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202503", "35"], - ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202504", "35"], ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202505", "65"], - ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202504", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202504", "30"], - ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202505", "54"], ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202505", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202504", "63"], ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202505", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202505", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202505", "42"], ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202504", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202504", "41"], ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202503", "51"], ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202503", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202503", "65"], - ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202505", "38"], ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202504", "46"], ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202504", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202505", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202504", "61"], ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202505", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202503", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202504", "47"], ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202504", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202503", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202503", "39"], - ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202504", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202504", "58"], ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202505", "41"], ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202503", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202503", "51"], ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202503", "51"], ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202505", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202504", "34"], - ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202505", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202504", "35"], - ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202504", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202503", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202504", "52"], ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202505", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202504", "48"], ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202504", "63"], ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202503", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202505", "61"], ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202505", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202505", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202504", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202505", "60"], ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202505", "58"], ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202503", "50"], ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202503", "47"], ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202503", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202505", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202505", "45"], ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202505", "31"], - ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202505", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202503", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202504", "32"], - ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202503", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202505", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202505", "50"], ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202504", "48"], ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202505", "66"], - ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202504", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202503", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202504", "44"], ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202505", "48"], ["", "ImspTQPwCqd", "202505", "5"], - ["", "ImspTQPwCqd", "202506", "12"] + ["", "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 index d8947aaec..9cd0fed79 100644 --- a/src/__demo__/data/event/integer.data.json +++ b/src/__demo__/data/event/integer.data.json @@ -100,240 +100,6 @@ }, "Zj7UnCAulEk.qrur9Dvnyt5_10": { "name": "10" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_11": { - "name": "11" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_12": { - "name": "12" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_13": { - "name": "13" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_14": { - "name": "14" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_15": { - "name": "15" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_16": { - "name": "16" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_17": { - "name": "17" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_18": { - "name": "18" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_19": { - "name": "19" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_20": { - "name": "20" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_21": { - "name": "21" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_22": { - "name": "22" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_23": { - "name": "23" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_24": { - "name": "24" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_25": { - "name": "25" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_26": { - "name": "26" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_27": { - "name": "27" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_28": { - "name": "28" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_29": { - "name": "29" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_30": { - "name": "30" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_31": { - "name": "31" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_32": { - "name": "32" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_33": { - "name": "33" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_34": { - "name": "34" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_35": { - "name": "35" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_36": { - "name": "36" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_37": { - "name": "37" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_38": { - "name": "38" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_39": { - "name": "39" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_40": { - "name": "40" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_41": { - "name": "41" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_42": { - "name": "42" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_43": { - "name": "43" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_44": { - "name": "44" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_45": { - "name": "45" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_46": { - "name": "46" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_47": { - "name": "47" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_48": { - "name": "48" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_49": { - "name": "49" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_50": { - "name": "50" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_51": { - "name": "51" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_52": { - "name": "52" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_53": { - "name": "53" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_54": { - "name": "54" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_55": { - "name": "55" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_56": { - "name": "56" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_57": { - "name": "57" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_58": { - "name": "58" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_59": { - "name": "59" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_60": { - "name": "60" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_61": { - "name": "61" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_62": { - "name": "62" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_63": { - "name": "63" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_64": { - "name": "64" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_65": { - "name": "65" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_66": { - "name": "66" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_67": { - "name": "67" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_68": { - "name": "68" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_69": { - "name": "69" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_70": { - "name": "70" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_71": { - "name": "71" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_72": { - "name": "72" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_73": { - "name": "73" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_74": { - "name": "74" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_75": { - "name": "75" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_76": { - "name": "76" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_77": { - "name": "77" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_78": { - "name": "78" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_79": { - "name": "79" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_80": { - "name": "80" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_81": { - "name": "81" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_82": { - "name": "82" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_83": { - "name": "83" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_84": { - "name": "84" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_85": { - "name": "85" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_86": { - "name": "86" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_87": { - "name": "87" - }, - "Zj7UnCAulEk.qrur9Dvnyt5_88": { - "name": "88" } }, "dimensions": { @@ -350,84 +116,6 @@ "Zj7UnCAulEk.qrur9Dvnyt5_8", "Zj7UnCAulEk.qrur9Dvnyt5_9", "Zj7UnCAulEk.qrur9Dvnyt5_10", - "Zj7UnCAulEk.qrur9Dvnyt5_11", - "Zj7UnCAulEk.qrur9Dvnyt5_12", - "Zj7UnCAulEk.qrur9Dvnyt5_13", - "Zj7UnCAulEk.qrur9Dvnyt5_14", - "Zj7UnCAulEk.qrur9Dvnyt5_15", - "Zj7UnCAulEk.qrur9Dvnyt5_16", - "Zj7UnCAulEk.qrur9Dvnyt5_17", - "Zj7UnCAulEk.qrur9Dvnyt5_18", - "Zj7UnCAulEk.qrur9Dvnyt5_19", - "Zj7UnCAulEk.qrur9Dvnyt5_20", - "Zj7UnCAulEk.qrur9Dvnyt5_21", - "Zj7UnCAulEk.qrur9Dvnyt5_22", - "Zj7UnCAulEk.qrur9Dvnyt5_23", - "Zj7UnCAulEk.qrur9Dvnyt5_24", - "Zj7UnCAulEk.qrur9Dvnyt5_25", - "Zj7UnCAulEk.qrur9Dvnyt5_26", - "Zj7UnCAulEk.qrur9Dvnyt5_27", - "Zj7UnCAulEk.qrur9Dvnyt5_28", - "Zj7UnCAulEk.qrur9Dvnyt5_29", - "Zj7UnCAulEk.qrur9Dvnyt5_30", - "Zj7UnCAulEk.qrur9Dvnyt5_31", - "Zj7UnCAulEk.qrur9Dvnyt5_32", - "Zj7UnCAulEk.qrur9Dvnyt5_33", - "Zj7UnCAulEk.qrur9Dvnyt5_34", - "Zj7UnCAulEk.qrur9Dvnyt5_35", - "Zj7UnCAulEk.qrur9Dvnyt5_36", - "Zj7UnCAulEk.qrur9Dvnyt5_37", - "Zj7UnCAulEk.qrur9Dvnyt5_38", - "Zj7UnCAulEk.qrur9Dvnyt5_39", - "Zj7UnCAulEk.qrur9Dvnyt5_40", - "Zj7UnCAulEk.qrur9Dvnyt5_41", - "Zj7UnCAulEk.qrur9Dvnyt5_42", - "Zj7UnCAulEk.qrur9Dvnyt5_43", - "Zj7UnCAulEk.qrur9Dvnyt5_44", - "Zj7UnCAulEk.qrur9Dvnyt5_45", - "Zj7UnCAulEk.qrur9Dvnyt5_46", - "Zj7UnCAulEk.qrur9Dvnyt5_47", - "Zj7UnCAulEk.qrur9Dvnyt5_48", - "Zj7UnCAulEk.qrur9Dvnyt5_49", - "Zj7UnCAulEk.qrur9Dvnyt5_50", - "Zj7UnCAulEk.qrur9Dvnyt5_51", - "Zj7UnCAulEk.qrur9Dvnyt5_52", - "Zj7UnCAulEk.qrur9Dvnyt5_53", - "Zj7UnCAulEk.qrur9Dvnyt5_54", - "Zj7UnCAulEk.qrur9Dvnyt5_55", - "Zj7UnCAulEk.qrur9Dvnyt5_56", - "Zj7UnCAulEk.qrur9Dvnyt5_57", - "Zj7UnCAulEk.qrur9Dvnyt5_58", - "Zj7UnCAulEk.qrur9Dvnyt5_59", - "Zj7UnCAulEk.qrur9Dvnyt5_60", - "Zj7UnCAulEk.qrur9Dvnyt5_61", - "Zj7UnCAulEk.qrur9Dvnyt5_62", - "Zj7UnCAulEk.qrur9Dvnyt5_63", - "Zj7UnCAulEk.qrur9Dvnyt5_64", - "Zj7UnCAulEk.qrur9Dvnyt5_65", - "Zj7UnCAulEk.qrur9Dvnyt5_66", - "Zj7UnCAulEk.qrur9Dvnyt5_67", - "Zj7UnCAulEk.qrur9Dvnyt5_68", - "Zj7UnCAulEk.qrur9Dvnyt5_69", - "Zj7UnCAulEk.qrur9Dvnyt5_70", - "Zj7UnCAulEk.qrur9Dvnyt5_71", - "Zj7UnCAulEk.qrur9Dvnyt5_72", - "Zj7UnCAulEk.qrur9Dvnyt5_73", - "Zj7UnCAulEk.qrur9Dvnyt5_74", - "Zj7UnCAulEk.qrur9Dvnyt5_75", - "Zj7UnCAulEk.qrur9Dvnyt5_76", - "Zj7UnCAulEk.qrur9Dvnyt5_77", - "Zj7UnCAulEk.qrur9Dvnyt5_78", - "Zj7UnCAulEk.qrur9Dvnyt5_79", - "Zj7UnCAulEk.qrur9Dvnyt5_80", - "Zj7UnCAulEk.qrur9Dvnyt5_81", - "Zj7UnCAulEk.qrur9Dvnyt5_82", - "Zj7UnCAulEk.qrur9Dvnyt5_83", - "Zj7UnCAulEk.qrur9Dvnyt5_84", - "Zj7UnCAulEk.qrur9Dvnyt5_85", - "Zj7UnCAulEk.qrur9Dvnyt5_86", - "Zj7UnCAulEk.qrur9Dvnyt5_87", - "Zj7UnCAulEk.qrur9Dvnyt5_88", "" ], "ou": ["ImspTQPwCqd"] @@ -436,275 +124,42 @@ "rowContext": {}, "width": 4, "rows": [ - ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202503", "70"], - ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202504", "48"], ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202504", "47"], ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202505", "67"], - ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202504", "42"], ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202503", "55"], ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202503", "70"], - ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202504", "43"], ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202503", "62"], ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202503", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202505", "52"], ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_80", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202503", "35"], - ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202504", "35"], ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202505", "65"], - ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202504", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_56", "ImspTQPwCqd", "202504", "30"], - ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202503", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_63", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202505", "54"], ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202504", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202505", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202504", "63"], ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202505", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202505", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202505", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5_76", "ImspTQPwCqd", "202505", "42"], ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202504", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202504", "41"], ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202503", "51"], ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202505", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202503", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202503", "65"], - ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202505", "38"], ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_19", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202504", "46"], ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202504", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202505", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202504", "61"], ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_61", "ImspTQPwCqd", "202505", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202503", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202504", "47"], ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202504", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_52", "ImspTQPwCqd", "202505", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_29", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202505", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202504", "64"], - ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202503", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5_26", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_33", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_60", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_34", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_15", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_71", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202503", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_72", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_44", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_67", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_83", "ImspTQPwCqd", "202503", "39"], - ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202504", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202504", "58"], ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202505", "41"], ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202504", "42"], - ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202503", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_16", "ImspTQPwCqd", "202503", "51"], ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202503", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202503", "51"], ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202504", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202505", "57"], - ["Zj7UnCAulEk.qrur9Dvnyt5_54", "ImspTQPwCqd", "202504", "34"], - ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202505", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5_53", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_57", "ImspTQPwCqd", "202504", "35"], - ["Zj7UnCAulEk.qrur9Dvnyt5_17", "ImspTQPwCqd", "202504", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202505", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_59", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202503", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_84", "ImspTQPwCqd", "202504", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_11", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_65", "ImspTQPwCqd", "202503", "60"], - ["Zj7UnCAulEk.qrur9Dvnyt5_46", "ImspTQPwCqd", "202503", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_38", "ImspTQPwCqd", "202504", "52"], ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202505", "58"], - ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_31", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202505", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_70", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_87", "ImspTQPwCqd", "202504", "48"], ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202504", "63"], ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202504", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_30", "ImspTQPwCqd", "202503", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202505", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_45", "ImspTQPwCqd", "202503", "51"], - ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202505", "61"], ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202503", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_25", "ImspTQPwCqd", "202505", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5_66", "ImspTQPwCqd", "202505", "41"], - ["Zj7UnCAulEk.qrur9Dvnyt5_55", "ImspTQPwCqd", "202503", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_64", "ImspTQPwCqd", "202504", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_28", "ImspTQPwCqd", "202504", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5_68", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_21", "ImspTQPwCqd", "202503", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202504", "45"], - ["Zj7UnCAulEk.qrur9Dvnyt5_39", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_40", "ImspTQPwCqd", "202505", "60"], ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202504", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202505", "58"], ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202503", "44"], - ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202503", "50"], ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202503", "47"], ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_75", "ImspTQPwCqd", "202503", "36"], - ["Zj7UnCAulEk.qrur9Dvnyt5_51", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_81", "ImspTQPwCqd", "202505", "37"], - ["Zj7UnCAulEk.qrur9Dvnyt5_18", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_24", "ImspTQPwCqd", "202505", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202505", "61"], - ["Zj7UnCAulEk.qrur9Dvnyt5_78", "ImspTQPwCqd", "202504", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_62", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_42", "ImspTQPwCqd", "202505", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_49", "ImspTQPwCqd", "202505", "45"], ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202505", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_20", "ImspTQPwCqd", "202504", "54"], - ["Zj7UnCAulEk.qrur9Dvnyt5_37", "ImspTQPwCqd", "202505", "31"], - ["Zj7UnCAulEk.qrur9Dvnyt5_79", "ImspTQPwCqd", "202505", "46"], - ["Zj7UnCAulEk.qrur9Dvnyt5_22", "ImspTQPwCqd", "202505", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202504", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5_74", "ImspTQPwCqd", "202504", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_82", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_41", "ImspTQPwCqd", "202503", "62"], - ["Zj7UnCAulEk.qrur9Dvnyt5_32", "ImspTQPwCqd", "202503", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_85", "ImspTQPwCqd", "202504", "32"], - ["Zj7UnCAulEk.qrur9Dvnyt5_50", "ImspTQPwCqd", "202503", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5_35", "ImspTQPwCqd", "202505", "40"], - ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202503", "50"], - ["Zj7UnCAulEk.qrur9Dvnyt5_69", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_88", "ImspTQPwCqd", "202504", "52"], - ["Zj7UnCAulEk.qrur9Dvnyt5_23", "ImspTQPwCqd", "202503", "48"], - ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202505", "50"], ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202504", "48"], ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202505", "53"], - ["Zj7UnCAulEk.qrur9Dvnyt5_86", "ImspTQPwCqd", "202505", "43"], - ["Zj7UnCAulEk.qrur9Dvnyt5_47", "ImspTQPwCqd", "202505", "66"], - ["Zj7UnCAulEk.qrur9Dvnyt5_14", "ImspTQPwCqd", "202504", "38"], - ["Zj7UnCAulEk.qrur9Dvnyt5_73", "ImspTQPwCqd", "202504", "59"], - ["Zj7UnCAulEk.qrur9Dvnyt5_43", "ImspTQPwCqd", "202505", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_77", "ImspTQPwCqd", "202503", "55"], - ["Zj7UnCAulEk.qrur9Dvnyt5_13", "ImspTQPwCqd", "202503", "47"], - ["Zj7UnCAulEk.qrur9Dvnyt5_12", "ImspTQPwCqd", "202503", "63"], - ["Zj7UnCAulEk.qrur9Dvnyt5_48", "ImspTQPwCqd", "202504", "44"], ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202503", "56"], - ["Zj7UnCAulEk.qrur9Dvnyt5_36", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_27", "ImspTQPwCqd", "202504", "49"], - ["Zj7UnCAulEk.qrur9Dvnyt5_58", "ImspTQPwCqd", "202505", "48"], ["", "ImspTQPwCqd", "202505", "5"], - ["", "ImspTQPwCqd", "202506", "12"] + ["", "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 index 07b109113..03f706157 100644 --- a/src/__demo__/data/event/integer.data.org.json +++ b/src/__demo__/data/event/integer.data.org.json @@ -77,273 +77,28 @@ "rowContext": {}, "width": 4, "rows": [ - ["26", "ImspTQPwCqd", "202503", "51"], - ["84", "ImspTQPwCqd", "202503", "70"], - ["25", "ImspTQPwCqd", "202504", "46"], - ["81", "ImspTQPwCqd", "202503", "53"], - ["13", "ImspTQPwCqd", "202505", "55"], - ["57", "ImspTQPwCqd", "202503", "48"], - ["24", "ImspTQPwCqd", "202504", "48"], ["8", "ImspTQPwCqd", "202503", "47"], - ["80", "ImspTQPwCqd", "202504", "47"], ["3", "ImspTQPwCqd", "202505", "67"], - ["14", "ImspTQPwCqd", "202503", "55"], - ["67", "ImspTQPwCqd", "202504", "45"], - ["74", "ImspTQPwCqd", "202503", "48"], - ["83", "ImspTQPwCqd", "202504", "42"], ["0", "ImspTQPwCqd", "202503", "55"], ["5", "ImspTQPwCqd", "202503", "70"], - ["52", "ImspTQPwCqd", "202503", "53"], - ["54", "ImspTQPwCqd", "202503", "57"], - ["44", "ImspTQPwCqd", "202504", "43"], ["10", "ImspTQPwCqd", "202505", "61"], - ["42", "ImspTQPwCqd", "202503", "46"], - ["15", "ImspTQPwCqd", "202504", "64"], - ["26", "ImspTQPwCqd", "202505", "45"], - ["62", "ImspTQPwCqd", "202503", "57"], - ["78", "ImspTQPwCqd", "202505", "54"], - ["80", "ImspTQPwCqd", "202503", "62"], ["7", "ImspTQPwCqd", "202505", "52"], - ["39", "ImspTQPwCqd", "202504", "53"], - ["71", "ImspTQPwCqd", "202505", "44"], - ["71", "ImspTQPwCqd", "202504", "53"], - ["44", "ImspTQPwCqd", "202503", "57"], - ["34", "ImspTQPwCqd", "202503", "40"], - ["88", "ImspTQPwCqd", "202505", "54"], - ["56", "ImspTQPwCqd", "202503", "44"], - ["41", "ImspTQPwCqd", "202504", "53"], - ["59", "ImspTQPwCqd", "202505", "48"], - ["61", "ImspTQPwCqd", "202504", "52"], - ["28", "ImspTQPwCqd", "202505", "52"], - ["9", "ImspTQPwCqd", "202504", "54"], - ["16", "ImspTQPwCqd", "202505", "46"], - ["80", "ImspTQPwCqd", "202505", "37"], - ["67", "ImspTQPwCqd", "202503", "35"], - ["63", "ImspTQPwCqd", "202504", "35"], - ["6", "ImspTQPwCqd", "202505", "65"], - ["28", "ImspTQPwCqd", "202503", "44"], - ["68", "ImspTQPwCqd", "202505", "50"], - ["72", "ImspTQPwCqd", "202503", "47"], - ["47", "ImspTQPwCqd", "202503", "45"], - ["13", "ImspTQPwCqd", "202504", "51"], - ["56", "ImspTQPwCqd", "202505", "51"], - ["66", "ImspTQPwCqd", "202504", "43"], - ["75", "ImspTQPwCqd", "202505", "51"], - ["82", "ImspTQPwCqd", "202505", "49"], - ["16", "ImspTQPwCqd", "202504", "44"], - ["56", "ImspTQPwCqd", "202504", "30"], - ["31", "ImspTQPwCqd", "202504", "50"], - ["52", "ImspTQPwCqd", "202504", "54"], - ["34", "ImspTQPwCqd", "202504", "50"], - ["30", "ImspTQPwCqd", "202505", "55"], - ["20", "ImspTQPwCqd", "202503", "49"], - ["76", "ImspTQPwCqd", "202503", "49"], - ["63", "ImspTQPwCqd", "202503", "49"], - ["29", "ImspTQPwCqd", "202505", "53"], - ["20", "ImspTQPwCqd", "202505", "43"], - ["12", "ImspTQPwCqd", "202505", "48"], - ["63", "ImspTQPwCqd", "202505", "55"], - ["42", "ImspTQPwCqd", "202504", "42"], - ["64", "ImspTQPwCqd", "202505", "54"], - ["9", "ImspTQPwCqd", "202505", "54"], - ["12", "ImspTQPwCqd", "202504", "49"], - ["19", "ImspTQPwCqd", "202504", "50"], - ["76", "ImspTQPwCqd", "202504", "48"], - ["17", "ImspTQPwCqd", "202505", "42"], - ["21", "ImspTQPwCqd", "202504", "51"], - ["50", "ImspTQPwCqd", "202504", "63"], ["6", "ImspTQPwCqd", "202503", "53"], - ["83", "ImspTQPwCqd", "202505", "56"], - ["31", "ImspTQPwCqd", "202503", "55"], - ["88", "ImspTQPwCqd", "202503", "45"], - ["36", "ImspTQPwCqd", "202505", "52"], - ["61", "ImspTQPwCqd", "202503", "45"], - ["51", "ImspTQPwCqd", "202505", "62"], - ["76", "ImspTQPwCqd", "202505", "42"], ["2", "ImspTQPwCqd", "202504", "45"], - ["53", "ImspTQPwCqd", "202504", "41"], - ["43", "ImspTQPwCqd", "202504", "41"], ["10", "ImspTQPwCqd", "202503", "51"], ["2", "ImspTQPwCqd", "202505", "51"], - ["70", "ImspTQPwCqd", "202503", "50"], - ["46", "ImspTQPwCqd", "202505", "51"], - ["36", "ImspTQPwCqd", "202503", "54"], - ["86", "ImspTQPwCqd", "202503", "61"], - ["19", "ImspTQPwCqd", "202503", "51"], - ["23", "ImspTQPwCqd", "202504", "55"], - ["35", "ImspTQPwCqd", "202503", "65"], - ["70", "ImspTQPwCqd", "202505", "38"], + ["6", "ImspTQPwCqd", "202504", "53"], ["3", "ImspTQPwCqd", "202504", "38"], - ["79", "ImspTQPwCqd", "202504", "52"], - ["33", "ImspTQPwCqd", "202503", "55"], - ["43", "ImspTQPwCqd", "202503", "46"], - ["19", "ImspTQPwCqd", "202505", "37"], - ["35", "ImspTQPwCqd", "202504", "46"], ["2", "ImspTQPwCqd", "202503", "41"], - ["54", "ImspTQPwCqd", "202505", "55"], - ["51", "ImspTQPwCqd", "202504", "56"], - ["50", "ImspTQPwCqd", "202505", "57"], - ["22", "ImspTQPwCqd", "202503", "60"], - ["46", "ImspTQPwCqd", "202504", "61"], ["8", "ImspTQPwCqd", "202504", "44"], - ["61", "ImspTQPwCqd", "202505", "60"], - ["39", "ImspTQPwCqd", "202503", "52"], - ["48", "ImspTQPwCqd", "202505", "44"], - ["64", "ImspTQPwCqd", "202503", "58"], - ["65", "ImspTQPwCqd", "202504", "47"], ["7", "ImspTQPwCqd", "202504", "40"], - ["60", "ImspTQPwCqd", "202504", "38"], - ["38", "ImspTQPwCqd", "202503", "50"], - ["33", "ImspTQPwCqd", "202504", "41"], - ["52", "ImspTQPwCqd", "202505", "48"], - ["29", "ImspTQPwCqd", "202504", "42"], - ["11", "ImspTQPwCqd", "202504", "45"], - ["72", "ImspTQPwCqd", "202504", "44"], - ["29", "ImspTQPwCqd", "202503", "52"], - ["32", "ImspTQPwCqd", "202504", "64"], - ["15", "ImspTQPwCqd", "202503", "54"], - ["55", "ImspTQPwCqd", "202504", "63"], - ["21", "ImspTQPwCqd", "202505", "54"], - ["60", "ImspTQPwCqd", "202505", "50"], - ["86", "ImspTQPwCqd", "202504", "55"], - ["30", "ImspTQPwCqd", "202504", "64"], - ["48", "ImspTQPwCqd", "202503", "58"], - ["26", "ImspTQPwCqd", "202504", "54"], - ["33", "ImspTQPwCqd", "202505", "43"], - ["60", "ImspTQPwCqd", "202503", "47"], - ["69", "ImspTQPwCqd", "202503", "53"], - ["34", "ImspTQPwCqd", "202505", "50"], - ["15", "ImspTQPwCqd", "202505", "44"], - ["71", "ImspTQPwCqd", "202503", "48"], - ["66", "ImspTQPwCqd", "202503", "57"], - ["72", "ImspTQPwCqd", "202505", "47"], - ["24", "ImspTQPwCqd", "202503", "52"], - ["77", "ImspTQPwCqd", "202504", "53"], - ["40", "ImspTQPwCqd", "202503", "56"], - ["38", "ImspTQPwCqd", "202505", "55"], - ["44", "ImspTQPwCqd", "202505", "50"], - ["67", "ImspTQPwCqd", "202505", "49"], - ["83", "ImspTQPwCqd", "202503", "39"], - ["69", "ImspTQPwCqd", "202504", "36"], - ["49", "ImspTQPwCqd", "202503", "46"], - ["37", "ImspTQPwCqd", "202503", "60"], - ["87", "ImspTQPwCqd", "202503", "51"], - ["45", "ImspTQPwCqd", "202504", "58"], + ["0", "ImspTQPwCqd", "202504", "55"], ["4", "ImspTQPwCqd", "202505", "41"], ["4", "ImspTQPwCqd", "202504", "42"], - ["81", "ImspTQPwCqd", "202504", "51"], - ["82", "ImspTQPwCqd", "202504", "54"], - ["40", "ImspTQPwCqd", "202504", "51"], - ["85", "ImspTQPwCqd", "202503", "43"], - ["16", "ImspTQPwCqd", "202503", "51"], - ["9", "ImspTQPwCqd", "202503", "52"], - ["17", "ImspTQPwCqd", "202503", "45"], - ["45", "ImspTQPwCqd", "202505", "45"], - ["55", "ImspTQPwCqd", "202505", "50"], - ["57", "ImspTQPwCqd", "202505", "45"], - ["73", "ImspTQPwCqd", "202503", "51"], - ["0", "ImspTQPwCqd", "202504", "55"], - ["58", "ImspTQPwCqd", "202503", "56"], - ["49", "ImspTQPwCqd", "202504", "48"], - ["11", "ImspTQPwCqd", "202505", "57"], - ["54", "ImspTQPwCqd", "202504", "34"], - ["53", "ImspTQPwCqd", "202505", "38"], - ["53", "ImspTQPwCqd", "202503", "41"], - ["84", "ImspTQPwCqd", "202505", "47"], - ["57", "ImspTQPwCqd", "202504", "35"], - ["17", "ImspTQPwCqd", "202504", "51"], - ["59", "ImspTQPwCqd", "202504", "44"], - ["18", "ImspTQPwCqd", "202504", "52"], - ["68", "ImspTQPwCqd", "202503", "55"], - ["74", "ImspTQPwCqd", "202505", "55"], - ["65", "ImspTQPwCqd", "202505", "50"], - ["59", "ImspTQPwCqd", "202503", "50"], - ["62", "ImspTQPwCqd", "202504", "49"], - ["78", "ImspTQPwCqd", "202503", "41"], - ["84", "ImspTQPwCqd", "202504", "62"], - ["47", "ImspTQPwCqd", "202504", "54"], - ["11", "ImspTQPwCqd", "202503", "53"], - ["65", "ImspTQPwCqd", "202503", "60"], - ["46", "ImspTQPwCqd", "202503", "59"], - ["25", "ImspTQPwCqd", "202503", "56"], - ["87", "ImspTQPwCqd", "202505", "49"], - ["38", "ImspTQPwCqd", "202504", "52"], ["8", "ImspTQPwCqd", "202505", "43"], - ["14", "ImspTQPwCqd", "202505", "58"], - ["18", "ImspTQPwCqd", "202505", "47"], - ["31", "ImspTQPwCqd", "202505", "46"], - ["41", "ImspTQPwCqd", "202505", "45"], - ["70", "ImspTQPwCqd", "202504", "49"], - ["22", "ImspTQPwCqd", "202504", "40"], - ["87", "ImspTQPwCqd", "202504", "48"], - ["5", "ImspTQPwCqd", "202504", "63"], - ["6", "ImspTQPwCqd", "202504", "53"], - ["30", "ImspTQPwCqd", "202503", "36"], - ["23", "ImspTQPwCqd", "202505", "44"], - ["45", "ImspTQPwCqd", "202503", "51"], - ["27", "ImspTQPwCqd", "202505", "61"], - ["4", "ImspTQPwCqd", "202503", "54"], - ["25", "ImspTQPwCqd", "202505", "62"], - ["66", "ImspTQPwCqd", "202505", "41"], - ["55", "ImspTQPwCqd", "202503", "46"], - ["64", "ImspTQPwCqd", "202504", "44"], - ["28", "ImspTQPwCqd", "202504", "62"], - ["68", "ImspTQPwCqd", "202504", "49"], - ["37", "ImspTQPwCqd", "202504", "55"], - ["21", "ImspTQPwCqd", "202503", "53"], - ["75", "ImspTQPwCqd", "202504", "45"], - ["39", "ImspTQPwCqd", "202505", "53"], - ["40", "ImspTQPwCqd", "202505", "60"], - ["10", "ImspTQPwCqd", "202504", "46"], - ["85", "ImspTQPwCqd", "202505", "58"], - ["1", "ImspTQPwCqd", "202503", "44"], - ["79", "ImspTQPwCqd", "202503", "50"], ["7", "ImspTQPwCqd", "202503", "47"], ["5", "ImspTQPwCqd", "202505", "46"], - ["75", "ImspTQPwCqd", "202503", "36"], - ["51", "ImspTQPwCqd", "202503", "50"], - ["81", "ImspTQPwCqd", "202505", "37"], - ["18", "ImspTQPwCqd", "202503", "55"], - ["24", "ImspTQPwCqd", "202505", "47"], - ["32", "ImspTQPwCqd", "202505", "61"], - ["78", "ImspTQPwCqd", "202504", "55"], - ["62", "ImspTQPwCqd", "202505", "53"], - ["42", "ImspTQPwCqd", "202505", "59"], - ["77", "ImspTQPwCqd", "202505", "50"], - ["49", "ImspTQPwCqd", "202505", "45"], ["0", "ImspTQPwCqd", "202505", "50"], - ["20", "ImspTQPwCqd", "202504", "54"], - ["37", "ImspTQPwCqd", "202505", "31"], - ["79", "ImspTQPwCqd", "202505", "46"], - ["22", "ImspTQPwCqd", "202505", "59"], - ["58", "ImspTQPwCqd", "202504", "63"], - ["74", "ImspTQPwCqd", "202504", "40"], - ["82", "ImspTQPwCqd", "202503", "55"], - ["41", "ImspTQPwCqd", "202503", "62"], - ["32", "ImspTQPwCqd", "202503", "52"], - ["85", "ImspTQPwCqd", "202504", "32"], - ["50", "ImspTQPwCqd", "202503", "63"], - ["35", "ImspTQPwCqd", "202505", "40"], - ["27", "ImspTQPwCqd", "202503", "50"], - ["69", "ImspTQPwCqd", "202505", "49"], - ["88", "ImspTQPwCqd", "202504", "52"], - ["23", "ImspTQPwCqd", "202503", "48"], - ["73", "ImspTQPwCqd", "202505", "50"], - ["1", "ImspTQPwCqd", "202504", "48"], - ["1", "ImspTQPwCqd", "202505", "53"], - ["86", "ImspTQPwCqd", "202505", "43"], - ["47", "ImspTQPwCqd", "202505", "66"], - ["14", "ImspTQPwCqd", "202504", "38"], - ["73", "ImspTQPwCqd", "202504", "59"], - ["43", "ImspTQPwCqd", "202505", "49"], - ["77", "ImspTQPwCqd", "202503", "55"], - ["13", "ImspTQPwCqd", "202503", "47"], - ["12", "ImspTQPwCqd", "202503", "63"], - ["48", "ImspTQPwCqd", "202504", "44"], - ["3", "ImspTQPwCqd", "202503", "56"], - ["36", "ImspTQPwCqd", "202504", "49"], - ["27", "ImspTQPwCqd", "202504", "49"], - ["58", "ImspTQPwCqd", "202505", "48"], ["", "ImspTQPwCqd", "202505", "5"], ["", "ImspTQPwCqd", "202506", "12"] ], diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 3b1d03a7a..0c702e83b 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -87,7 +87,7 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { } }) - // If Hide Na Data is not selected, we still only show N/A if there are N/A values + // When "Hide Na Data" option is disabled, we still only show the "No value" item if there are N/A values if (!hideNaData) { metaHeaders.forEach((header) => { if ( From 62cbbc5446027f0514d84e0c09c02fa53410dacc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Tue, 2 Sep 2025 10:58:56 +0200 Subject: [PATCH 34/50] test: update option set and response tests --- src/__demo__/data/event/integer.data.org.json | 18 +++++-- .../response/__tests__/optionSet.spec.js | 48 ++++++++++++------- .../response/__tests__/response.spec.js | 21 +------- src/modules/response/response.js | 42 ++++++++-------- 4 files changed, 67 insertions(+), 62 deletions(-) diff --git a/src/__demo__/data/event/integer.data.org.json b/src/__demo__/data/event/integer.data.org.json index 03f706157..85e16ec81 100644 --- a/src/__demo__/data/event/integer.data.org.json +++ b/src/__demo__/data/event/integer.data.org.json @@ -83,24 +83,36 @@ ["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"], - ["6", "ImspTQPwCqd", "202504", "53"], ["3", "ImspTQPwCqd", "202504", "38"], ["2", "ImspTQPwCqd", "202503", "41"], ["8", "ImspTQPwCqd", "202504", "44"], ["7", "ImspTQPwCqd", "202504", "40"], - ["0", "ImspTQPwCqd", "202504", "55"], ["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", "202506", "12"] + ["", "ImspTQPwCqd", "202504", "12"], + ["", "ImspTQPwCqd", "202503", "10"] ], "height": 267, "headerWidth": 4 diff --git a/src/modules/response/__tests__/optionSet.spec.js b/src/modules/response/__tests__/optionSet.spec.js index 4d66337a8..222c5506a 100644 --- a/src/modules/response/__tests__/optionSet.spec.js +++ b/src/modules/response/__tests__/optionSet.spec.js @@ -6,45 +6,57 @@ import { applyOptionSetHandler, } from '../optionSet.js' -const headerIndex = 0 -const testId = responseHideNa.headers[headerIndex].name - -const testOptionCodeIdMap = { - MODABSC: 'Fhbf4aKpZmZ', - MODDIED: 'gj2fKKyp8OH', - MODTRANS: 'fShHdgT7XGb', - MODDISCH: 'yeod5tOXpkP', +const testOptionCodeIdMap1 = { + ONE: 'optionId1', + TWO: 'optionId2', +} + +const testOptionCodeIdMap2 = { + ONE: 'optionId3', + TWO: 'optionId4', } describe('optionSet', () => { 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( - testOptionCodeIdMap + 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', () => { - expect( - getOptionIdRows( - responseOrg.rows, - testOptionCodeIdMap, - headerIndex - ) - ).toEqual(responseHideNa.rows) + const optionSet1Rows = getOptionIdRows( + responseOrg.rows, + testOptionCodeIdMap1, + 0 + ) + + const optionSet1And2Rows = getOptionIdRows( + optionSet1Rows, + testOptionCodeIdMap2, + 1 + ) + + expect(optionSet1And2Rows).toEqual(responseHideNa.rows) }) }) describe('applyOptionSetHandler', () => { it('should return the transformed response', () => { - expect(applyOptionSetHandler(responseOrg, headerIndex)).toEqual( - responseHideNa + const optionSet1Response = applyOptionSetHandler(responseOrg, 0) + const optionSet1And2Response = applyOptionSetHandler( + optionSet1Response, + 1 ) + + expect(optionSet1And2Response).toEqual(responseHideNa) }) }) }) diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index ec53b4474..44cb9980d 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -13,9 +13,6 @@ import responseNumericOrg from '../../../__demo__/data/event/integer.data.org.js 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 responseOptionSetsHideNa from '../../../__demo__/data/event/optionsets.data.hidena.json' -import responseOptionSets from '../../../__demo__/data/event/optionsets.data.json' -import responseOptionSetsOrg from '../../../__demo__/data/event/optionsets.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' @@ -62,33 +59,19 @@ describe('response', () => { }) describe('option set', () => { - it('transforms response', () => { + it('transforms response with non-unique codes across two option sets', () => { expect(transformResponse(responseOptionSetOrg)).toEqual( responseOptionSet ) }) - it('transforms response and hides N/A data', () => { + it('transforms response with non-unique codes across two option sets and hides N/A data', () => { expect( transformResponse(responseOptionSetOrg, { hideNaData: true, }) ).toEqual(responseOptionSetHideNa) }) - - it('transforms response with non-unique codes across two option sets', () => { - expect(transformResponse(responseOptionSetsOrg)).toEqual( - responseOptionSets - ) - }) - - it('transforms response with non-unique codes across two option sets and hides N/A data', () => { - expect( - transformResponse(responseOptionSetsOrg, { - hideNaData: true, - }) - ).toEqual(responseOptionSetsHideNa) - }) }) describe('boolean', () => { diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 0c702e83b..2e58a8626 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -20,6 +20,7 @@ export const NA_VALUE_DISPLAY_NAME = i18n.t('No value') export const PREFIX_SEPARATOR = '_' export const itemFormatterByValueType = { + [VALUE_TYPE_AGE]: (name) => name.replace(/ 00:00:00\.0$/, ''), [VALUE_TYPE_DATETIME]: (name) => name.replace(/:00\.0$/, ''), [VALUE_TYPE_DATE]: (name) => name.replace(/ 00:00:00\.0$/, ''), [VALUE_TYPE_PERCENTAGE]: (name) => @@ -27,19 +28,8 @@ export const itemFormatterByValueType = { } export const transformResponse = (response, { hideNaData = false } = {}) => { - const metaHeaders = response.headers - .map((header, index) => ({ - ...header, - index, - })) - .filter( - (header) => - Boolean(header.meta) && - ![DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT].includes( - header.name - ) - ) - + // Do not modify the original response + // Rows is mapped by the handlers let transformedResponse = { ...response, metaData: { @@ -53,17 +43,24 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { }, } - // Legendset does not need transformation - // Age and Coordinate not supported + // Add index to all headers + // Include only headers that are "meta" and skip "pe" and "ou" + const metaHeaders = response.headers + .map((header, index) => Object.assign({}, header, { index })) + .filter( + (header) => + Boolean(header.meta) && + ![DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT].includes( + header.name + ) + ) + + // Legendsets use uids and do not need transformation + // Coordinate not supported // Option set and Boolean have separate handlers // All other types use default handler with specific item formatter metaHeaders.forEach((header) => { - if ( - !( - header.legendSet || - [VALUE_TYPE_AGE, VALUE_TYPE_COORDINATE].includes(header.value) - ) - ) { + if (!(header.legendSet || header.valueType === VALUE_TYPE_COORDINATE)) { if (header.optionSet) { transformedResponse = applyOptionSetHandler( transformedResponse, @@ -87,7 +84,8 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { } }) - // When "Hide Na Data" option is disabled, we still only show the "No value" item if there are N/A values + // 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 ( From e35b2a1f5f9fc23c21ec835c83a80c24fd1d8320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Tue, 2 Sep 2025 11:17:23 +0200 Subject: [PATCH 35/50] chore: update storybook examples --- src/__demo__/data/event/date.data.hidena.json | 12 ------------ src/__demo__/data/event/date.data.json | 12 ------------ src/__demo__/data/event/date.data.org.json | 12 ------------ .../data/event/datetime.data.hidena.json | 12 ------------ src/__demo__/data/event/datetime.data.json | 12 ------------ src/__demo__/data/event/datetime.data.org.json | 12 ------------ src/__demo__/data/event/email.data.hidena.json | 12 ------------ src/__demo__/data/event/email.data.json | 12 ------------ src/__demo__/data/event/email.data.org.json | 12 ------------ .../data/event/yesonly.data.hidena.json | 18 +++++------------- src/__demo__/data/event/yesonly.data.json | 18 +++++------------- src/__demo__/data/event/yesonly.data.org.json | 18 +++++------------- 12 files changed, 15 insertions(+), 147 deletions(-) diff --git a/src/__demo__/data/event/date.data.hidena.json b/src/__demo__/data/event/date.data.hidena.json index 8088845ef..e86f3fc07 100644 --- a/src/__demo__/data/event/date.data.hidena.json +++ b/src/__demo__/data/event/date.data.hidena.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, - "202410": { - "name": "October 2024" - }, "202411": { "name": "November 2024" }, @@ -136,9 +127,6 @@ "jfuXZB3A1ko.RldgRedJrco_1994-01-02 00:00:00.0" ], "pe": [ - "202408", - "202409", - "202410", "202411", "202412", "202501", diff --git a/src/__demo__/data/event/date.data.json b/src/__demo__/data/event/date.data.json index 607c53725..6c645854f 100644 --- a/src/__demo__/data/event/date.data.json +++ b/src/__demo__/data/event/date.data.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, - "202410": { - "name": "October 2024" - }, "202411": { "name": "November 2024" }, @@ -137,9 +128,6 @@ "" ], "pe": [ - "202408", - "202409", - "202410", "202411", "202412", "202501", diff --git a/src/__demo__/data/event/date.data.org.json b/src/__demo__/data/event/date.data.org.json index de1550d1d..3855fd984 100644 --- a/src/__demo__/data/event/date.data.org.json +++ b/src/__demo__/data/event/date.data.org.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, - "202410": { - "name": "October 2024" - }, "202411": { "name": "November 2024" }, @@ -99,9 +90,6 @@ "dimensions": { "jfuXZB3A1ko.RldgRedJrco": [], "pe": [ - "202408", - "202409", - "202410", "202411", "202412", "202501", diff --git a/src/__demo__/data/event/datetime.data.hidena.json b/src/__demo__/data/event/datetime.data.hidena.json index 3e4d5aa38..310ea9194 100644 --- a/src/__demo__/data/event/datetime.data.hidena.json +++ b/src/__demo__/data/event/datetime.data.hidena.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, - "202410": { - "name": "October 2024" - }, "202411": { "name": "November 2024" }, @@ -128,9 +119,6 @@ }, "dimensions": { "pe": [ - "202408", - "202409", - "202410", "202411", "202412", "202501", diff --git a/src/__demo__/data/event/datetime.data.json b/src/__demo__/data/event/datetime.data.json index 4bac29e80..e5c5baa92 100644 --- a/src/__demo__/data/event/datetime.data.json +++ b/src/__demo__/data/event/datetime.data.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, - "202410": { - "name": "October 2024" - }, "202411": { "name": "November 2024" }, @@ -128,9 +119,6 @@ }, "dimensions": { "pe": [ - "202408", - "202409", - "202410", "202411", "202412", "202501", diff --git a/src/__demo__/data/event/datetime.data.org.json b/src/__demo__/data/event/datetime.data.org.json index c78d417a4..99427efb5 100644 --- a/src/__demo__/data/event/datetime.data.org.json +++ b/src/__demo__/data/event/datetime.data.org.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, - "202410": { - "name": "October 2024" - }, "202411": { "name": "November 2024" }, @@ -98,9 +89,6 @@ }, "dimensions": { "pe": [ - "202408", - "202409", - "202410", "202411", "202412", "202501", diff --git a/src/__demo__/data/event/email.data.hidena.json b/src/__demo__/data/event/email.data.hidena.json index a7e79a37f..11ea7f012 100644 --- a/src/__demo__/data/event/email.data.hidena.json +++ b/src/__demo__/data/event/email.data.hidena.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, - "202410": { - "name": "October 2024" - }, "202411": { "name": "November 2024" }, @@ -128,9 +119,6 @@ "jfuXZB3A1ko.RUZ2EBP6HQn_test@pmail.com" ], "pe": [ - "202408", - "202409", - "202410", "202411", "202412", "202501", diff --git a/src/__demo__/data/event/email.data.json b/src/__demo__/data/event/email.data.json index 2a195a847..bc12dc0d2 100644 --- a/src/__demo__/data/event/email.data.json +++ b/src/__demo__/data/event/email.data.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, - "202410": { - "name": "October 2024" - }, "202411": { "name": "November 2024" }, @@ -129,9 +120,6 @@ "" ], "pe": [ - "202408", - "202409", - "202410", "202411", "202412", "202501", diff --git a/src/__demo__/data/event/email.data.org.json b/src/__demo__/data/event/email.data.org.json index ddeeef4b5..8b62c9f9e 100644 --- a/src/__demo__/data/event/email.data.org.json +++ b/src/__demo__/data/event/email.data.org.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, - "202410": { - "name": "October 2024" - }, "202411": { "name": "November 2024" }, @@ -99,9 +90,6 @@ "dimensions": { "jfuXZB3A1ko.RUZ2EBP6HQn": [], "pe": [ - "202408", - "202409", - "202410", "202411", "202412", "202501", diff --git a/src/__demo__/data/event/yesonly.data.hidena.json b/src/__demo__/data/event/yesonly.data.hidena.json index c63700970..033abd5e3 100644 --- a/src/__demo__/data/event/yesonly.data.hidena.json +++ b/src/__demo__/data/event/yesonly.data.hidena.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202407": { - "name": "July 2024" - }, - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, "202410": { "name": "October 2024" }, @@ -104,9 +95,6 @@ }, "dimensions": { "pe": [ - "202407", - "202408", - "202409", "202410", "202411", "202412", @@ -131,7 +119,11 @@ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202501", "1"], ["", "ImspTQPwCqd", "202501", "2"], ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202412", "3"], - ["", "ImspTQPwCqd", "202411", "1"] + ["", "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 index 176713e0c..1474f1b71 100644 --- a/src/__demo__/data/event/yesonly.data.json +++ b/src/__demo__/data/event/yesonly.data.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202407": { - "name": "July 2024" - }, - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, "202410": { "name": "October 2024" }, @@ -104,9 +95,6 @@ }, "dimensions": { "pe": [ - "202407", - "202408", - "202409", "202410", "202411", "202412", @@ -131,7 +119,11 @@ ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202501", "1"], ["", "ImspTQPwCqd", "202501", "2"], ["jfuXZB3A1ko.hwG20Dyj6RK_1", "ImspTQPwCqd", "202412", "3"], - ["", "ImspTQPwCqd", "202411", "1"] + ["", "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 index b3d238775..7af7032fa 100644 --- a/src/__demo__/data/event/yesonly.data.org.json +++ b/src/__demo__/data/event/yesonly.data.org.json @@ -35,15 +35,6 @@ ], "metaData": { "items": { - "202407": { - "name": "July 2024" - }, - "202408": { - "name": "August 2024" - }, - "202409": { - "name": "September 2024" - }, "202410": { "name": "October 2024" }, @@ -98,9 +89,6 @@ }, "dimensions": { "pe": [ - "202407", - "202408", - "202409", "202410", "202411", "202412", @@ -125,7 +113,11 @@ ["1", "ImspTQPwCqd", "202501", "1"], ["", "ImspTQPwCqd", "202501", "2"], ["1", "ImspTQPwCqd", "202412", "3"], - ["", "ImspTQPwCqd", "202411", "1"] + ["", "ImspTQPwCqd", "202411", "1"], + ["1", "ImspTQPwCqd", "202411", "4"], + ["1", "ImspTQPwCqd", "202503", "2"], + ["1", "ImspTQPwCqd", "202504", "1"], + ["1", "ImspTQPwCqd", "202502", "1"] ], "height": 8, "headerWidth": 4 From 37516619958946581e644caecbc7d0dd2bbd1600 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Tue, 2 Sep 2025 11:30:24 +0200 Subject: [PATCH 36/50] chore: rename test files --- src/__demo__/PivotTable.event.stories.js | 14 +++---- ...son => integer-legendset.data.hidena.json} | 0 ....data.json => integer-legendset.data.json} | 0 ...n => integer-legendset.visualization.json} | 6 +-- .../response/__tests__/response.spec.js | 41 +++++++++++++------ 5 files changed, 38 insertions(+), 23 deletions(-) rename src/__demo__/data/event/{numeric-legendset.data.hidena.json => integer-legendset.data.hidena.json} (100%) rename src/__demo__/data/event/{numeric-legendset.data.json => integer-legendset.data.json} (100%) rename src/__demo__/data/event/{numeric-legendset.visualization.json => integer-legendset.visualization.json} (98%) diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 14c4afd11..543bd38d5 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -13,12 +13,12 @@ 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 integerLegendsetDataHideNa from './data/event/integer-legendset.data.hidena.json' +import integerLegendsetData from './data/event/integer-legendset.data.json' +import integerLegendsetVisualization from './data/event/integer-legendset.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 numericLegendsetDataHideNa from './data/event/numeric-legendset.data.hidena.json' -import numericLegendsetData from './data/event/numeric-legendset.data.json' -import numericLegendsetVisualization from './data/event/numeric-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' @@ -234,14 +234,14 @@ Numeric.story = { export const NumericLegendsetNA = (_, { pivotTableOptions }) => { const visualization = { - ...numericLegendsetVisualization, + ...integerLegendsetVisualization, ...visualizationReset, ...pivotTableOptions, } return (
@@ -254,14 +254,14 @@ NumericLegendsetNA.story = { export const NumericLegendset = (_, { pivotTableOptions }) => { const visualization = { - ...numericLegendsetVisualization, + ...integerLegendsetVisualization, ...visualizationReset, ...pivotTableOptions, } return (
diff --git a/src/__demo__/data/event/numeric-legendset.data.hidena.json b/src/__demo__/data/event/integer-legendset.data.hidena.json similarity index 100% rename from src/__demo__/data/event/numeric-legendset.data.hidena.json rename to src/__demo__/data/event/integer-legendset.data.hidena.json diff --git a/src/__demo__/data/event/numeric-legendset.data.json b/src/__demo__/data/event/integer-legendset.data.json similarity index 100% rename from src/__demo__/data/event/numeric-legendset.data.json rename to src/__demo__/data/event/integer-legendset.data.json diff --git a/src/__demo__/data/event/numeric-legendset.visualization.json b/src/__demo__/data/event/integer-legendset.visualization.json similarity index 98% rename from src/__demo__/data/event/numeric-legendset.visualization.json rename to src/__demo__/data/event/integer-legendset.visualization.json index a761711a7..3c063c1ef 100644 --- a/src/__demo__/data/event/numeric-legendset.visualization.json +++ b/src/__demo__/data/event/integer-legendset.visualization.json @@ -87,9 +87,7 @@ { "parent": "COLUMN", "dimension": "ou", - "values": [ - "ImspTQPwCqd" - ] + "values": ["ImspTQPwCqd"] } ], "legacy": true, @@ -165,4 +163,4 @@ "displayFormName": "A1 numeric-legendset", "id": "kNl4fqsY9hJ", "attributeValues": [] -} \ No newline at end of file +} diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index 44cb9980d..6ebef198d 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -4,6 +4,9 @@ import responseBooleanOrg from '../../../__demo__/data/event/boolean.data.org.js 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' @@ -20,6 +23,22 @@ import { transformResponse } from '../response.js' describe('response', () => { 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) @@ -32,15 +51,17 @@ describe('response', () => { }) }) - describe('text', () => { + describe('datetime', () => { it('transforms response', () => { - expect(transformResponse(responseTextOrg)).toEqual(responseText) + expect(transformResponse(responseDatetimeOrg)).toEqual( + responseDatetime + ) }) it('transforms response and hides N/A data', () => { expect( - transformResponse(responseTextOrg, { hideNaData: true }) - ).toEqual(responseTextHideNa) + transformResponse(responseDatetimeOrg, { hideNaData: true }) + ).toEqual(responseDatetimeHideNa) }) }) @@ -74,19 +95,15 @@ describe('response', () => { }) }) - describe('boolean', () => { + describe('text', () => { it('transforms response', () => { - expect(transformResponse(responseBooleanOrg)).toEqual( - responseBoolean - ) + expect(transformResponse(responseTextOrg)).toEqual(responseText) }) it('transforms response and hides N/A data', () => { expect( - transformResponse(responseBooleanOrg, { - hideNaData: true, - }) - ).toEqual(responseBooleanHideNa) + transformResponse(responseTextOrg, { hideNaData: true }) + ).toEqual(responseTextHideNa) }) }) From b69fc5bee29a5a61dcdb573ce4d2824346177eab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Tue, 2 Sep 2025 15:39:02 +0200 Subject: [PATCH 37/50] fix: skip unsupported value types --- src/__demo__/PivotTable.event.stories.js | 2 +- src/modules/response/response.js | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 543bd38d5..1a82f509f 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -383,5 +383,5 @@ export const Yesonly = (_, { pivotTableOptions }) => { } Yesonly.story = { - name: 'Boolean', + name: 'Yesonly', } diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 2e58a8626..9e3dd655b 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -9,7 +9,12 @@ import { 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, } from '../valueTypes.js' import { applyBooleanHandler } from './boolean.js' import { applyDefaultHandler } from './default.js' @@ -18,6 +23,14 @@ import { applyOptionSetHandler } from './optionSet.js' export const NA_VALUE = '' export const NA_VALUE_DISPLAY_NAME = i18n.t('No value') export const PREFIX_SEPARATOR = '_' +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 itemFormatterByValueType = { [VALUE_TYPE_AGE]: (name) => name.replace(/ 00:00:00\.0$/, ''), @@ -56,11 +69,16 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { ) // Legendsets use uids and do not need transformation - // Coordinate not supported + // 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 || header.valueType === VALUE_TYPE_COORDINATE)) { + if ( + !( + header.legendSet || + UNSUPPORTED_VALUE_TYPES.includes(header.valueType) + ) + ) { if (header.optionSet) { transformedResponse = applyOptionSetHandler( transformedResponse, From fcb65929a27a791a79d91b98ac5cacf67b000b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 3 Sep 2025 10:22:48 +0200 Subject: [PATCH 38/50] fix: no value names defined by input --- src/__demo__/data/event/boolean.data.json | 3 +++ src/__demo__/data/event/date.data.json | 3 +++ src/__demo__/data/event/datetime.data.json | 3 +++ src/__demo__/data/event/email.data.json | 3 +++ src/__demo__/data/event/integer-legendset.data.json | 3 +++ src/__demo__/data/event/integer.data.json | 3 +++ src/__demo__/data/event/optionset.data.json | 3 +++ src/__demo__/data/event/yesonly.data.json | 3 +++ src/modules/pivotTable/PivotTableEngine.js | 5 ++++- src/modules/response/response.js | 4 ++++ 10 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/__demo__/data/event/boolean.data.json b/src/__demo__/data/event/boolean.data.json index 4d7afb881..bc9d08dbe 100644 --- a/src/__demo__/data/event/boolean.data.json +++ b/src/__demo__/data/event/boolean.data.json @@ -82,6 +82,9 @@ }, "A03MvHHogjR.bx6fsa0t90x_1": { "name": "Yes" + }, + "": { + "name": "No value" } }, "dimensions": { diff --git a/src/__demo__/data/event/date.data.json b/src/__demo__/data/event/date.data.json index 6c645854f..4b0cf3990 100644 --- a/src/__demo__/data/event/date.data.json +++ b/src/__demo__/data/event/date.data.json @@ -112,6 +112,9 @@ }, "jfuXZB3A1ko.RldgRedJrco_1993-12-02 00:00:00.0": { "name": "1993-12-02" + }, + "": { + "name": "No value" } }, "dimensions": { diff --git a/src/__demo__/data/event/datetime.data.json b/src/__demo__/data/event/datetime.data.json index e5c5baa92..7fef1d9ff 100644 --- a/src/__demo__/data/event/datetime.data.json +++ b/src/__demo__/data/event/datetime.data.json @@ -115,6 +115,9 @@ }, "jfuXZB3A1ko.KWzx2tY8dFi": { "name": "E2E - Date & Time" + }, + "": { + "name": "No value" } }, "dimensions": { diff --git a/src/__demo__/data/event/email.data.json b/src/__demo__/data/event/email.data.json index bc12dc0d2..a1ffa69d6 100644 --- a/src/__demo__/data/event/email.data.json +++ b/src/__demo__/data/event/email.data.json @@ -106,6 +106,9 @@ }, "jfuXZB3A1ko.RUZ2EBP6HQn_test@pmail.com": { "name": "test@pmail.com" + }, + "": { + "name": "No value" } }, "dimensions": { diff --git a/src/__demo__/data/event/integer-legendset.data.json b/src/__demo__/data/event/integer-legendset.data.json index b55745688..8fce65893 100644 --- a/src/__demo__/data/event/integer-legendset.data.json +++ b/src/__demo__/data/event/integer-legendset.data.json @@ -95,6 +95,9 @@ }, "LAST_3_MONTHS": { "name": "Last 3 months" + }, + "": { + "name": "No value" } }, "dimensions": { diff --git a/src/__demo__/data/event/integer.data.json b/src/__demo__/data/event/integer.data.json index 9cd0fed79..0c67b1537 100644 --- a/src/__demo__/data/event/integer.data.json +++ b/src/__demo__/data/event/integer.data.json @@ -100,6 +100,9 @@ }, "Zj7UnCAulEk.qrur9Dvnyt5_10": { "name": "10" + }, + "": { + "name": "No value" } }, "dimensions": { diff --git a/src/__demo__/data/event/optionset.data.json b/src/__demo__/data/event/optionset.data.json index e04f8f66c..005fb1a6a 100644 --- a/src/__demo__/data/event/optionset.data.json +++ b/src/__demo__/data/event/optionset.data.json @@ -93,6 +93,9 @@ }, "LAST_3_MONTHS": { "name": "Last 3 months" + }, + "": { + "name": "No value" } }, "dimensions": { diff --git a/src/__demo__/data/event/yesonly.data.json b/src/__demo__/data/event/yesonly.data.json index 1474f1b71..aeda13cec 100644 --- a/src/__demo__/data/event/yesonly.data.json +++ b/src/__demo__/data/event/yesonly.data.json @@ -91,6 +91,9 @@ }, "jfuXZB3A1ko.hwG20Dyj6RK_1": { "name": "Yes" + }, + "": { + "name": "No value" } }, "dimensions": { diff --git a/src/modules/pivotTable/PivotTableEngine.js b/src/modules/pivotTable/PivotTableEngine.js index 758d60713..42d121eb4 100644 --- a/src/modules/pivotTable/PivotTableEngine.js +++ b/src/modules/pivotTable/PivotTableEngine.js @@ -116,7 +116,10 @@ const buildDimensionLookup = (visualization, metadata, headers) => { itemIds: metadata.dimensions[row.dimension], items: metadata.dimensions[row.dimension].map((item) => item === '' - ? { name: i18n.t('No value'), isNaData: true } + ? { + ...metadata.items[item], + isNaData: true, + } : metadata.items[item] ), isDxDimension: isDxDimension(metadata.items[row.dimension]), diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 9e3dd655b..cfdc3d6b3 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -113,6 +113,10 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { ...transformedResponse.metaData.dimensions[header.name], NA_VALUE, ] + + transformedResponse.metaData.items[NA_VALUE] = { + name: i18n.t('No value'), + } } }) } From 347b90562c9aaa791bf8a99462435b4b3b7b4759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 3 Sep 2025 10:27:54 +0200 Subject: [PATCH 39/50] chore: rename to legendset --- src/__demo__/PivotTable.event.stories.js | 53 +++++++++---------- ...hidena.json => legendset.data.hidena.json} | 0 ...egendset.data.json => legendset.data.json} | 0 ...tion.json => legendset.visualization.json} | 0 4 files changed, 25 insertions(+), 28 deletions(-) rename src/__demo__/data/event/{integer-legendset.data.hidena.json => legendset.data.hidena.json} (100%) rename src/__demo__/data/event/{integer-legendset.data.json => legendset.data.json} (100%) rename src/__demo__/data/event/{integer-legendset.visualization.json => legendset.visualization.json} (100%) diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index 1a82f509f..f5de549d7 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -13,12 +13,12 @@ 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 integerLegendsetDataHideNa from './data/event/integer-legendset.data.hidena.json' -import integerLegendsetData from './data/event/integer-legendset.data.json' -import integerLegendsetVisualization from './data/event/integer-legendset.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' @@ -193,83 +193,80 @@ Datetime.story = { name: 'Datetime', } -export const NumericNA = (_, { pivotTableOptions }) => { +export const LegendsetNA = (_, { pivotTableOptions }) => { const visualization = { - ...integerVisualization, + ...legendsetVisualization, ...visualizationReset, ...pivotTableOptions, } - return (
- +
) } -NumericNA.story = { - name: 'NumericNA', +LegendsetNA.story = { + name: 'LegendsetNA', } -export const Numeric = (_, { pivotTableOptions }) => { +export const Legendset = (_, { pivotTableOptions }) => { const visualization = { - ...integerVisualization, + ...legendsetVisualization, ...visualizationReset, ...pivotTableOptions, } - return (
) } -Numeric.story = { - name: 'Numeric', +Legendset.story = { + name: 'Legendset', } -export const NumericLegendsetNA = (_, { pivotTableOptions }) => { +export const NumericNA = (_, { pivotTableOptions }) => { const visualization = { - ...integerLegendsetVisualization, + ...integerVisualization, ...visualizationReset, ...pivotTableOptions, } + return (
- +
) } -NumericLegendsetNA.story = { - name: 'Numeric with legendset NA', +NumericNA.story = { + name: 'NumericNA', } -export const NumericLegendset = (_, { pivotTableOptions }) => { +export const Numeric = (_, { pivotTableOptions }) => { const visualization = { - ...integerLegendsetVisualization, + ...integerVisualization, ...visualizationReset, ...pivotTableOptions, } + return (
) } -NumericLegendset.story = { - name: 'Numeric with legendset', +Numeric.story = { + name: 'Numeric', } export const OptionsetNA = (_, { pivotTableOptions }) => { diff --git a/src/__demo__/data/event/integer-legendset.data.hidena.json b/src/__demo__/data/event/legendset.data.hidena.json similarity index 100% rename from src/__demo__/data/event/integer-legendset.data.hidena.json rename to src/__demo__/data/event/legendset.data.hidena.json diff --git a/src/__demo__/data/event/integer-legendset.data.json b/src/__demo__/data/event/legendset.data.json similarity index 100% rename from src/__demo__/data/event/integer-legendset.data.json rename to src/__demo__/data/event/legendset.data.json diff --git a/src/__demo__/data/event/integer-legendset.visualization.json b/src/__demo__/data/event/legendset.visualization.json similarity index 100% rename from src/__demo__/data/event/integer-legendset.visualization.json rename to src/__demo__/data/event/legendset.visualization.json From 92f0c1b13c4599dead1641310eb6716a315f308a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 3 Sep 2025 11:00:12 +0200 Subject: [PATCH 40/50] chore: add time + update storybook display name --- src/__demo__/PivotTable.event.stories.js | 117 ++++++------ src/__demo__/data/event/time.data.hidena.json | 165 +++++++++++++++++ src/__demo__/data/event/time.data.json | 169 ++++++++++++++++++ src/__demo__/data/event/time.data.org.json | 128 +++++++++++++ .../data/event/time.visualization.json | 148 +++++++++++++++ .../response/__tests__/response.spec.js | 15 ++ 6 files changed, 685 insertions(+), 57 deletions(-) create mode 100644 src/__demo__/data/event/time.data.hidena.json create mode 100644 src/__demo__/data/event/time.data.json create mode 100644 src/__demo__/data/event/time.data.org.json create mode 100644 src/__demo__/data/event/time.visualization.json diff --git a/src/__demo__/PivotTable.event.stories.js b/src/__demo__/PivotTable.event.stories.js index f5de549d7..e0fdd1e85 100644 --- a/src/__demo__/PivotTable.event.stories.js +++ b/src/__demo__/PivotTable.event.stories.js @@ -22,6 +22,9 @@ 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' @@ -79,7 +82,7 @@ export default { decorators: [PivotTableOptionsWrapper], } -export const BooleanNA = (_, { pivotTableOptions }) => { +export const TypeBooleanNA = (_, { pivotTableOptions }) => { const visualization = { ...booleanVisualization, ...visualizationReset, @@ -93,11 +96,9 @@ export const BooleanNA = (_, { pivotTableOptions }) => { ) } -BooleanNA.story = { - name: 'BooleanNA', -} +TypeBooleanNA.storyName = 'Boolean N/A' -export const Boolean = (_, { pivotTableOptions }) => { +export const TypeBoolean = (_, { pivotTableOptions }) => { const visualization = { ...booleanVisualization, ...visualizationReset, @@ -114,11 +115,9 @@ export const Boolean = (_, { pivotTableOptions }) => { ) } -Boolean.story = { - name: 'Boolean', -} +TypeBoolean.storyName = 'Boolean' -export const DateNA = (_, { pivotTableOptions }) => { +export const TypeDateNA = (_, { pivotTableOptions }) => { const visualization = { ...dateVisualization, ...visualizationReset, @@ -132,11 +131,9 @@ export const DateNA = (_, { pivotTableOptions }) => { ) } -DateNA.story = { - name: 'DateNA', -} +TypeDateNA.storyName = 'Date N/A' -export const Date = (_, { pivotTableOptions }) => { +export const TypeDate = (_, { pivotTableOptions }) => { const visualization = { ...dateVisualization, ...visualizationReset, @@ -150,11 +147,9 @@ export const Date = (_, { pivotTableOptions }) => { ) } -Date.story = { - name: 'Date', -} +TypeDate.storyName = 'Date' -export const DatetimeNA = (_, { pivotTableOptions }) => { +export const TypeDatetimeNA = (_, { pivotTableOptions }) => { const visualization = { ...datetimeVisualization, ...visualizationReset, @@ -168,11 +163,9 @@ export const DatetimeNA = (_, { pivotTableOptions }) => { ) } -DatetimeNA.story = { - name: 'DatetimeNA', -} +TypeDatetimeNA.storyName = 'Datetime N/A' -export const Datetime = (_, { pivotTableOptions }) => { +export const TypeDatetime = (_, { pivotTableOptions }) => { const visualization = { ...datetimeVisualization, ...visualizationReset, @@ -189,11 +182,9 @@ export const Datetime = (_, { pivotTableOptions }) => { ) } -Datetime.story = { - name: 'Datetime', -} +TypeDatetime.storyName = 'Datetime' -export const LegendsetNA = (_, { pivotTableOptions }) => { +export const TypeLegendsetNA = (_, { pivotTableOptions }) => { const visualization = { ...legendsetVisualization, ...visualizationReset, @@ -206,11 +197,9 @@ export const LegendsetNA = (_, { pivotTableOptions }) => { ) } -LegendsetNA.story = { - name: 'LegendsetNA', -} +TypeLegendsetNA.storyName = 'Legendset N/A' -export const Legendset = (_, { pivotTableOptions }) => { +export const TypeLegendset = (_, { pivotTableOptions }) => { const visualization = { ...legendsetVisualization, ...visualizationReset, @@ -226,11 +215,9 @@ export const Legendset = (_, { pivotTableOptions }) => { ) } -Legendset.story = { - name: 'Legendset', -} +TypeLegendset.storyName = 'Legendset' -export const NumericNA = (_, { pivotTableOptions }) => { +export const TypeNumericNA = (_, { pivotTableOptions }) => { const visualization = { ...integerVisualization, ...visualizationReset, @@ -244,11 +231,9 @@ export const NumericNA = (_, { pivotTableOptions }) => { ) } -NumericNA.story = { - name: 'NumericNA', -} +TypeNumericNA.storyName = 'Numeric N/A' -export const Numeric = (_, { pivotTableOptions }) => { +export const TypeNumeric = (_, { pivotTableOptions }) => { const visualization = { ...integerVisualization, ...visualizationReset, @@ -265,9 +250,7 @@ export const Numeric = (_, { pivotTableOptions }) => { ) } -Numeric.story = { - name: 'Numeric', -} +TypeNumeric.storyName = 'Numeric' export const OptionsetNA = (_, { pivotTableOptions }) => { const visualization = { @@ -283,9 +266,7 @@ export const OptionsetNA = (_, { pivotTableOptions }) => { ) } -OptionsetNA.story = { - name: 'OptionsetNA', -} +OptionsetNA.storyName = 'Optionset N/A' export const Optionset = (_, { pivotTableOptions }) => { const visualization = { @@ -304,9 +285,7 @@ export const Optionset = (_, { pivotTableOptions }) => { ) } -Optionset.story = { - name: 'Optionset', -} +Optionset.storyName = 'Optionset' export const TextNA = (_, { pivotTableOptions }) => { const visualization = { @@ -322,9 +301,7 @@ export const TextNA = (_, { pivotTableOptions }) => { ) } -TextNA.story = { - name: 'TextNA', -} +TextNA.storyName = 'Text N/A' export const Text = (_, { pivotTableOptions }) => { const visualization = { @@ -340,10 +317,40 @@ export const Text = (_, { pivotTableOptions }) => { ) } -Text.story = { - name: 'Text', +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, @@ -358,9 +365,7 @@ export const YesonlyNA = (_, { pivotTableOptions }) => { ) } -YesonlyNA.story = { - name: 'YesonlyNA', -} +YesonlyNA.storyName = 'Yesonly N/A' export const Yesonly = (_, { pivotTableOptions }) => { const visualization = { @@ -379,6 +384,4 @@ export const Yesonly = (_, { pivotTableOptions }) => { ) } -Yesonly.story = { - name: 'Yesonly', -} +Yesonly.storyName = 'Yesonly' 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..ce991e829 --- /dev/null +++ b/src/__demo__/data/event/time.data.json @@ -0,0 +1,169 @@ +{ + "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" + } + }, + "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/modules/response/__tests__/response.spec.js b/src/modules/response/__tests__/response.spec.js index 6ebef198d..d75af8521 100644 --- a/src/modules/response/__tests__/response.spec.js +++ b/src/modules/response/__tests__/response.spec.js @@ -16,6 +16,9 @@ import responseNumericOrg from '../../../__demo__/data/event/integer.data.org.js 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' @@ -107,6 +110,18 @@ describe('response', () => { }) }) + 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( From 3c59c4fdf8ae7a8af73394f67a30acf3c9b1745f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 3 Sep 2025 11:03:16 +0200 Subject: [PATCH 41/50] chore: make sonarqube happy --- src/modules/response/response.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modules/response/response.js b/src/modules/response/response.js index cfdc3d6b3..3f3b49908 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -59,7 +59,10 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { // Add index to all headers // Include only headers that are "meta" and skip "pe" and "ou" const metaHeaders = response.headers - .map((header, index) => Object.assign({}, header, { index })) + .map((header, index) => ({ + ...header, + index, + })) .filter( (header) => Boolean(header.meta) && From 229ad13b6838213f5b593f56b6c0139ce2a2d423 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Wed, 3 Sep 2025 12:17:36 +0200 Subject: [PATCH 42/50] fix: apply 'no value' correctly to col headers --- src/__demo__/data/event/boolean.visualization.json | 6 ++---- src/components/PivotTable/PivotTableColumnHeaderCell.js | 1 + src/components/PivotTable/styles/PivotTable.style.js | 3 --- src/modules/pivotTable/PivotTableEngine.js | 9 +++++++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/__demo__/data/event/boolean.visualization.json b/src/__demo__/data/event/boolean.visualization.json index 47cde8706..f78b64d80 100644 --- a/src/__demo__/data/event/boolean.visualization.json +++ b/src/__demo__/data/event/boolean.visualization.json @@ -84,9 +84,7 @@ { "parent": "COLUMN", "dimension": "ou", - "values": [ - "ImspTQPwCqd" - ] + "values": ["ImspTQPwCqd"] } ], "legacy": true, @@ -159,4 +157,4 @@ "displayFormName": "Boolean", "id": "xLPn5T11Vd4", "attributeValues": [] -} \ No newline at end of file +} diff --git a/src/components/PivotTable/PivotTableColumnHeaderCell.js b/src/components/PivotTable/PivotTableColumnHeaderCell.js index c1987bb2c..ddd97cda9 100644 --- a/src/components/PivotTable/PivotTableColumnHeaderCell.js +++ b/src/components/PivotTable/PivotTableColumnHeaderCell.js @@ -61,6 +61,7 @@ export const PivotTableColumnHeaderCell = ({ header.label !== 'Subtotal' // TODO: Actually look up the column type! ? 'column-header' : 'empty-header', + header.isNaData && 'nadata-header', { 'fixed-header': engine.options.fixColumnHeaders, }, diff --git a/src/components/PivotTable/styles/PivotTable.style.js b/src/components/PivotTable/styles/PivotTable.style.js index 70d373e67..8b1c65e49 100644 --- a/src/components/PivotTable/styles/PivotTable.style.js +++ b/src/components/PivotTable/styles/PivotTable.style.js @@ -142,9 +142,6 @@ export const cell = css` } .nadata-header { color: ${colors.grey600}; - font-style: italic; - font-family: monospace; - letter-spacing: -0.3px; } .total-header { background-color: #bac6d8; diff --git a/src/modules/pivotTable/PivotTableEngine.js b/src/modules/pivotTable/PivotTableEngine.js index 42d121eb4..c5820e7d7 100644 --- a/src/modules/pivotTable/PivotTableEngine.js +++ b/src/modules/pivotTable/PivotTableEngine.js @@ -131,8 +131,13 @@ const buildDimensionLookup = (visualization, metadata, headers) => { meta: metadata.items[column.dimension], count: metadata.dimensions[column.dimension].length, itemIds: metadata.dimensions[column.dimension], - items: metadata.dimensions[column.dimension].map( - (item) => metadata.items[item] + items: metadata.dimensions[column.dimension].map((item) => + item === '' + ? { + ...metadata.items[item], + isNaData: true, + } + : metadata.items[item] ), isDxDimension: isDxDimension(metadata.items[column.dimension]), position: 'column', From 5a1a2f8790048a78945da87c8efa07a03131e6f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 4 Sep 2025 09:59:58 +0200 Subject: [PATCH 43/50] fix: support flexible style for dimension items (DHIS2-19818) (#1790) * fix: keep engine unaware of nadata, pass in style instead * chore: update storybook --- src/__demo__/data/event/boolean.data.json | 8 +++++++- src/__demo__/data/event/date.data.json | 8 +++++++- src/__demo__/data/event/datetime.data.json | 8 +++++++- src/__demo__/data/event/email.data.json | 8 +++++++- src/__demo__/data/event/integer.data.json | 8 +++++++- src/__demo__/data/event/legendset.data.json | 8 +++++++- src/__demo__/data/event/optionset.data.json | 8 +++++++- src/__demo__/data/event/time.data.json | 8 +++++++- src/__demo__/data/event/yesonly.data.json | 8 +++++++- .../PivotTable/PivotTableColumnHeaderCell.js | 2 +- .../PivotTable/PivotTableRowHeaderCell.js | 2 +- .../PivotTable/styles/PivotTable.style.js | 3 --- .../pivotTable/AdaptiveClippingController.js | 1 + src/modules/pivotTable/PivotTableEngine.js | 18 ++++-------------- src/modules/pivotTable/getHeaderForDisplay.js | 4 +--- src/modules/pivotTable/measureText.js | 14 +++++++++----- src/modules/response/response.js | 17 ++++++++++++----- 17 files changed, 92 insertions(+), 41 deletions(-) diff --git a/src/__demo__/data/event/boolean.data.json b/src/__demo__/data/event/boolean.data.json index bc9d08dbe..6d48278b1 100644 --- a/src/__demo__/data/event/boolean.data.json +++ b/src/__demo__/data/event/boolean.data.json @@ -84,7 +84,13 @@ "name": "Yes" }, "": { - "name": "No value" + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } } }, "dimensions": { diff --git a/src/__demo__/data/event/date.data.json b/src/__demo__/data/event/date.data.json index 4b0cf3990..2fa472a22 100644 --- a/src/__demo__/data/event/date.data.json +++ b/src/__demo__/data/event/date.data.json @@ -114,7 +114,13 @@ "name": "1993-12-02" }, "": { - "name": "No value" + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } } }, "dimensions": { diff --git a/src/__demo__/data/event/datetime.data.json b/src/__demo__/data/event/datetime.data.json index 7fef1d9ff..4e5d58827 100644 --- a/src/__demo__/data/event/datetime.data.json +++ b/src/__demo__/data/event/datetime.data.json @@ -117,7 +117,13 @@ "name": "E2E - Date & Time" }, "": { - "name": "No value" + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } } }, "dimensions": { diff --git a/src/__demo__/data/event/email.data.json b/src/__demo__/data/event/email.data.json index a1ffa69d6..660808d92 100644 --- a/src/__demo__/data/event/email.data.json +++ b/src/__demo__/data/event/email.data.json @@ -108,7 +108,13 @@ "name": "test@pmail.com" }, "": { - "name": "No value" + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } } }, "dimensions": { diff --git a/src/__demo__/data/event/integer.data.json b/src/__demo__/data/event/integer.data.json index 0c67b1537..fc8d9f0e6 100644 --- a/src/__demo__/data/event/integer.data.json +++ b/src/__demo__/data/event/integer.data.json @@ -102,7 +102,13 @@ "name": "10" }, "": { - "name": "No value" + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } } }, "dimensions": { diff --git a/src/__demo__/data/event/legendset.data.json b/src/__demo__/data/event/legendset.data.json index 8fce65893..60c27d19e 100644 --- a/src/__demo__/data/event/legendset.data.json +++ b/src/__demo__/data/event/legendset.data.json @@ -97,7 +97,13 @@ "name": "Last 3 months" }, "": { - "name": "No value" + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } } }, "dimensions": { diff --git a/src/__demo__/data/event/optionset.data.json b/src/__demo__/data/event/optionset.data.json index 005fb1a6a..992025f8b 100644 --- a/src/__demo__/data/event/optionset.data.json +++ b/src/__demo__/data/event/optionset.data.json @@ -95,7 +95,13 @@ "name": "Last 3 months" }, "": { - "name": "No value" + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } } }, "dimensions": { diff --git a/src/__demo__/data/event/time.data.json b/src/__demo__/data/event/time.data.json index ce991e829..233b86f66 100644 --- a/src/__demo__/data/event/time.data.json +++ b/src/__demo__/data/event/time.data.json @@ -117,7 +117,13 @@ "name": "Period" }, "": { - "name": "No value" + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } } }, "dimensions": { diff --git a/src/__demo__/data/event/yesonly.data.json b/src/__demo__/data/event/yesonly.data.json index aeda13cec..b523b3738 100644 --- a/src/__demo__/data/event/yesonly.data.json +++ b/src/__demo__/data/event/yesonly.data.json @@ -93,7 +93,13 @@ "name": "Yes" }, "": { - "name": "No value" + "name": "No value", + "style": { + "fontStyle": "italic", + "color": "#6C7787", + "fontFamily": "monospace", + "letterSpacing": "-0.3px" + } } }, "dimensions": { diff --git a/src/components/PivotTable/PivotTableColumnHeaderCell.js b/src/components/PivotTable/PivotTableColumnHeaderCell.js index ddd97cda9..85a357f11 100644 --- a/src/components/PivotTable/PivotTableColumnHeaderCell.js +++ b/src/components/PivotTable/PivotTableColumnHeaderCell.js @@ -61,7 +61,6 @@ export const PivotTableColumnHeaderCell = ({ header.label !== 'Subtotal' // TODO: Actually look up the column type! ? 'column-header' : 'empty-header', - header.isNaData && 'nadata-header', { 'fixed-header': engine.options.fixColumnHeaders, }, @@ -78,6 +77,7 @@ export const PivotTableColumnHeaderCell = ({ {header.label} diff --git a/src/components/PivotTable/PivotTableRowHeaderCell.js b/src/components/PivotTable/PivotTableRowHeaderCell.js index 69f16fa97..c519d3349 100644 --- a/src/components/PivotTable/PivotTableRowHeaderCell.js +++ b/src/components/PivotTable/PivotTableRowHeaderCell.js @@ -32,7 +32,6 @@ export const PivotTableRowHeaderCell = ({ header.label !== 'Subtotal' ? 'row-header' : 'empty-header', - header.isNaData && 'nadata-header', header.includesHierarchy && 'row-header-hierarchy', { 'fixed-header': engine.options.fixRowHeaders, @@ -50,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/components/PivotTable/styles/PivotTable.style.js b/src/components/PivotTable/styles/PivotTable.style.js index 8b1c65e49..769454e98 100644 --- a/src/components/PivotTable/styles/PivotTable.style.js +++ b/src/components/PivotTable/styles/PivotTable.style.js @@ -140,9 +140,6 @@ export const cell = css` .empty-header { background-color: #cddaed; } - .nadata-header { - color: ${colors.grey600}; - } .total-header { background-color: #bac6d8; } 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 c5820e7d7..909058cf0 100644 --- a/src/modules/pivotTable/PivotTableEngine.js +++ b/src/modules/pivotTable/PivotTableEngine.js @@ -114,13 +114,8 @@ const buildDimensionLookup = (visualization, metadata, headers) => { meta: metadata.items[row.dimension], count: metadata.dimensions[row.dimension].length, itemIds: metadata.dimensions[row.dimension], - items: metadata.dimensions[row.dimension].map((item) => - item === '' - ? { - ...metadata.items[item], - isNaData: true, - } - : metadata.items[item] + items: metadata.dimensions[row.dimension].map( + (item) => metadata.items[item] ), isDxDimension: isDxDimension(metadata.items[row.dimension]), position: 'row', @@ -131,13 +126,8 @@ const buildDimensionLookup = (visualization, metadata, headers) => { meta: metadata.items[column.dimension], count: metadata.dimensions[column.dimension].length, itemIds: metadata.dimensions[column.dimension], - items: metadata.dimensions[column.dimension].map((item) => - item === '' - ? { - ...metadata.items[item], - isNaData: true, - } - : metadata.items[item] + items: metadata.dimensions[column.dimension].map( + (item) => metadata.items[item] ), isDxDimension: isDxDimension(metadata.items[column.dimension]), position: 'column', diff --git a/src/modules/pivotTable/getHeaderForDisplay.js b/src/modules/pivotTable/getHeaderForDisplay.js index a9ec6267d..ddc510db4 100644 --- a/src/modules/pivotTable/getHeaderForDisplay.js +++ b/src/modules/pivotTable/getHeaderForDisplay.js @@ -38,12 +38,10 @@ export const getHeaderForDisplay = ({ ? currentHeader.hierarchy.join(' / ') : currentHeader?.name - const isNaData = currentHeader.isNaData - return { span, label, includesHierarchy, - isNaData, + ...(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/response.js b/src/modules/response/response.js index 3f3b49908..9ae589e0c 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -20,9 +20,18 @@ import { applyBooleanHandler } from './boolean.js' import { applyDefaultHandler } from './default.js' import { applyOptionSetHandler } from './optionSet.js' -export const NA_VALUE = '' -export const NA_VALUE_DISPLAY_NAME = i18n.t('No value') 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, @@ -117,9 +126,7 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { NA_VALUE, ] - transformedResponse.metaData.items[NA_VALUE] = { - name: i18n.t('No value'), - } + transformedResponse.metaData.items[NA_VALUE] = NA_VALUE_ITEM } }) } From 1f22d70ec90ccb69bbc19eb2cf687ca703e841d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 4 Sep 2025 10:42:42 +0200 Subject: [PATCH 44/50] fix: use default handler and item formatter for booleans --- .../data/event/yesonly.data.hidena.json | 3 -- src/__demo__/data/event/yesonly.data.json | 3 -- .../response/__tests__/boolean.spec.js | 27 --------------- .../response/__tests__/default.spec.js | 6 ++-- src/modules/response/boolean.js | 23 ------------- src/modules/response/response.js | 34 +++++++++++-------- 6 files changed, 23 insertions(+), 73 deletions(-) delete mode 100644 src/modules/response/__tests__/boolean.spec.js delete mode 100644 src/modules/response/boolean.js diff --git a/src/__demo__/data/event/yesonly.data.hidena.json b/src/__demo__/data/event/yesonly.data.hidena.json index 033abd5e3..c386b7191 100644 --- a/src/__demo__/data/event/yesonly.data.hidena.json +++ b/src/__demo__/data/event/yesonly.data.hidena.json @@ -86,9 +86,6 @@ "pe": { "name": "Period" }, - "jfuXZB3A1ko.hwG20Dyj6RK_0": { - "name": "No" - }, "jfuXZB3A1ko.hwG20Dyj6RK_1": { "name": "Yes" } diff --git a/src/__demo__/data/event/yesonly.data.json b/src/__demo__/data/event/yesonly.data.json index b523b3738..d781716f1 100644 --- a/src/__demo__/data/event/yesonly.data.json +++ b/src/__demo__/data/event/yesonly.data.json @@ -86,9 +86,6 @@ "pe": { "name": "Period" }, - "jfuXZB3A1ko.hwG20Dyj6RK_0": { - "name": "No" - }, "jfuXZB3A1ko.hwG20Dyj6RK_1": { "name": "Yes" }, diff --git a/src/modules/response/__tests__/boolean.spec.js b/src/modules/response/__tests__/boolean.spec.js deleted file mode 100644 index ac48fdce3..000000000 --- a/src/modules/response/__tests__/boolean.spec.js +++ /dev/null @@ -1,27 +0,0 @@ -import booleanResponseHideNa from '../../../__demo__/data/event/boolean.data.hidena.json' -import booleanResponseOrg from '../../../__demo__/data/event/boolean.data.org.json' -import yesOnlyResponseHideNa from '../../../__demo__/data/event/yesonly.data.hidena.json' -import yesOnlyResponseOrg from '../../../__demo__/data/event/yesonly.data.org.json' -import { applyBooleanHandler } from '../boolean.js' - -const headerIndex = 0 - -describe('boolean', () => { - describe('applyBooleanHandler', () => { - describe('yes/no', () => { - it('should return the transformed response', () => { - expect( - applyBooleanHandler(booleanResponseOrg, headerIndex) - ).toEqual(booleanResponseHideNa) - }) - }) - - describe('yes only', () => { - it('should return the transformed response', () => { - expect( - applyBooleanHandler(yesOnlyResponseOrg, headerIndex) - ).toEqual(yesOnlyResponseHideNa) - }) - }) - }) -}) diff --git a/src/modules/response/__tests__/default.spec.js b/src/modules/response/__tests__/default.spec.js index d798e9006..66695277f 100644 --- a/src/modules/response/__tests__/default.spec.js +++ b/src/modules/response/__tests__/default.spec.js @@ -18,7 +18,7 @@ import { getUnique, getValuesUniqueSortedAsc, } from '../default.js' -import { itemFormatterByValueType, PREFIX_SEPARATOR } from '../response.js' +import { getItemFormatterByValueType, PREFIX_SEPARATOR } from '../response.js' const testId = 'Zj7UnCAulEk.qrur9Dvnyt5' const headerIndex = 0 @@ -148,7 +148,7 @@ describe('default', () => { expect( applyDefaultHandler(dateResponseOrg, headerIndex, { itemFormatter: - itemFormatterByValueType[VALUE_TYPE_DATE], + getItemFormatterByValueType(VALUE_TYPE_DATE), }) ).toEqual(dateResponseHideNa) }) @@ -157,7 +157,7 @@ describe('default', () => { expect( applyDefaultHandler(datetimeResponseOrg, headerIndex, { itemFormatter: - itemFormatterByValueType[VALUE_TYPE_DATETIME], + getItemFormatterByValueType(VALUE_TYPE_DATETIME), }) ).toEqual(datetimeResponseHideNa) }) diff --git a/src/modules/response/boolean.js b/src/modules/response/boolean.js deleted file mode 100644 index 1ff15c2fe..000000000 --- a/src/modules/response/boolean.js +++ /dev/null @@ -1,23 +0,0 @@ -import i18n from '@dhis2/d2-i18n' -import { applyDefaultHandler, getPrefixedValue } from './default.js' - -export const applyBooleanHandler = (response, headerIndex) => { - const dimensionId = response.headers[headerIndex].name - const defaultResponse = applyDefaultHandler(response, headerIndex) - - return { - ...defaultResponse, - metaData: { - ...defaultResponse.metaData, - items: { - ...defaultResponse.metaData.items, - [getPrefixedValue('0', dimensionId)]: { - name: i18n.t('No'), - }, - [getPrefixedValue('1', dimensionId)]: { - name: i18n.t('Yes'), - }, - }, - }, - } -} diff --git a/src/modules/response/response.js b/src/modules/response/response.js index 9ae589e0c..59adf9b59 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/response.js @@ -6,6 +6,7 @@ import { import { isBooleanValueType, VALUE_TYPE_AGE, + VALUE_TYPE_BOOLEAN, VALUE_TYPE_COORDINATE, VALUE_TYPE_DATE, VALUE_TYPE_DATETIME, @@ -15,8 +16,8 @@ import { VALUE_TYPE_MULTI_TEXT, VALUE_TYPE_PERCENTAGE, VALUE_TYPE_REFERENCE, + VALUE_TYPE_TRUE_ONLY, } from '../valueTypes.js' -import { applyBooleanHandler } from './boolean.js' import { applyDefaultHandler } from './default.js' import { applyOptionSetHandler } from './optionSet.js' @@ -41,12 +42,21 @@ export const UNSUPPORTED_VALUE_TYPES = [ VALUE_TYPE_REFERENCE, ] -export const itemFormatterByValueType = { - [VALUE_TYPE_AGE]: (name) => name.replace(/ 00:00:00\.0$/, ''), - [VALUE_TYPE_DATETIME]: (name) => name.replace(/:00\.0$/, ''), - [VALUE_TYPE_DATE]: (name) => name.replace(/ 00:00:00\.0$/, ''), - [VALUE_TYPE_PERCENTAGE]: (name) => - name.endsWith('.0') ? name.slice(0, -2) : name, +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 } = {}) => { @@ -96,18 +106,14 @@ export const transformResponse = (response, { hideNaData = false } = {}) => { transformedResponse, header.index ) - } else if (isBooleanValueType(header.valueType)) { - transformedResponse = applyBooleanHandler( - transformedResponse, - header.index - ) } else { transformedResponse = applyDefaultHandler( transformedResponse, header.index, { - itemFormatter: - itemFormatterByValueType[header.valueType], + itemFormatter: getItemFormatterByValueType( + header.valueType + ), } ) } From 9fc73d375ea7681d27f9f841449a2f300041be77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 4 Sep 2025 11:52:51 +0200 Subject: [PATCH 45/50] chore: restructure and export --- src/__demo__/data/event/integer.data.org.json | 3 ++- src/index.js | 4 ++++ .../response/{ => event}/__tests__/default.spec.js | 14 +++++++------- .../{ => event}/__tests__/optionSet.spec.js | 4 ++-- .../{ => event}/__tests__/response.spec.js | 0 src/modules/response/{ => event}/default.js | 2 +- src/modules/response/{ => event}/optionSet.js | 0 src/modules/response/{ => event}/response.js | 4 ++-- 8 files changed, 18 insertions(+), 13 deletions(-) rename src/modules/response/{ => event}/__tests__/default.spec.js (90%) rename src/modules/response/{ => event}/__tests__/optionSet.spec.js (91%) rename src/modules/response/{ => event}/__tests__/response.spec.js (100%) rename src/modules/response/{ => event}/default.js (98%) rename src/modules/response/{ => event}/optionSet.js (100%) rename src/modules/response/{ => event}/response.js (98%) diff --git a/src/__demo__/data/event/integer.data.org.json b/src/__demo__/data/event/integer.data.org.json index 85e16ec81..806aeb642 100644 --- a/src/__demo__/data/event/integer.data.org.json +++ b/src/__demo__/data/event/integer.data.org.json @@ -71,7 +71,8 @@ }, "dimensions": { "pe": ["202503", "202504", "202505"], - "ou": ["ImspTQPwCqd"] + "ou": ["ImspTQPwCqd"], + "Zj7UnCAulEk.qrur9Dvnyt5": [] } }, "rowContext": {}, 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/response/__tests__/default.spec.js b/src/modules/response/event/__tests__/default.spec.js similarity index 90% rename from src/modules/response/__tests__/default.spec.js rename to src/modules/response/event/__tests__/default.spec.js index 66695277f..b0df1d6e5 100644 --- a/src/modules/response/__tests__/default.spec.js +++ b/src/modules/response/event/__tests__/default.spec.js @@ -1,14 +1,14 @@ -import dateResponseHideNa from '../../../__demo__/data/event/date.data.hidena.json' -import dateResponseOrg from '../../../__demo__/data/event/date.data.org.json' -import datetimeResponseHideNa from '../../../__demo__/data/event/datetime.data.hidena.json' -import datetimeResponseOrg from '../../../__demo__/data/event/datetime.data.org.json' -import numericResponseHideNa from '../../../__demo__/data/event/integer.data.hidena.json' -import numericResponseOrg from '../../../__demo__/data/event/integer.data.org.json' +import dateResponseHideNa from '../../../../__demo__/data/event/date.data.hidena.json' +import dateResponseOrg from '../../../../__demo__/data/event/date.data.org.json' +import datetimeResponseHideNa from '../../../../__demo__/data/event/datetime.data.hidena.json' +import datetimeResponseOrg from '../../../../__demo__/data/event/datetime.data.org.json' +import numericResponseHideNa from '../../../../__demo__/data/event/integer.data.hidena.json' +import numericResponseOrg from '../../../../__demo__/data/event/integer.data.org.json' import { VALUE_TYPE_DATE, VALUE_TYPE_DATETIME, VALUE_TYPE_NUMBER, -} from '../../valueTypes.js' +} from '../../../valueTypes.js' import { applyDefaultHandler, getDimensions, diff --git a/src/modules/response/__tests__/optionSet.spec.js b/src/modules/response/event/__tests__/optionSet.spec.js similarity index 91% rename from src/modules/response/__tests__/optionSet.spec.js rename to src/modules/response/event/__tests__/optionSet.spec.js index 222c5506a..a21c88d07 100644 --- a/src/modules/response/__tests__/optionSet.spec.js +++ b/src/modules/response/event/__tests__/optionSet.spec.js @@ -1,5 +1,5 @@ -import responseHideNa from '../../../__demo__/data/event/optionset.data.hidena.json' -import responseOrg from '../../../__demo__/data/event/optionset.data.org.json' +import responseHideNa from '../../../../__demo__/data/event/optionset.data.hidena.json' +import responseOrg from '../../../../__demo__/data/event/optionset.data.org.json' import { getOptionCodeIdMap, getOptionIdRows, diff --git a/src/modules/response/__tests__/response.spec.js b/src/modules/response/event/__tests__/response.spec.js similarity index 100% rename from src/modules/response/__tests__/response.spec.js rename to src/modules/response/event/__tests__/response.spec.js diff --git a/src/modules/response/default.js b/src/modules/response/event/default.js similarity index 98% rename from src/modules/response/default.js rename to src/modules/response/event/default.js index 69848bd33..f98e71e67 100644 --- a/src/modules/response/default.js +++ b/src/modules/response/event/default.js @@ -2,7 +2,7 @@ import { isBooleanValueType, isNumericValueType, VALUE_TYPE_TEXT, -} from '../valueTypes.js' +} from '../../valueTypes.js' import { NA_VALUE, PREFIX_SEPARATOR } from './response.js' export const getUnique = (array) => [...new Set(array)] diff --git a/src/modules/response/optionSet.js b/src/modules/response/event/optionSet.js similarity index 100% rename from src/modules/response/optionSet.js rename to src/modules/response/event/optionSet.js diff --git a/src/modules/response/response.js b/src/modules/response/event/response.js similarity index 98% rename from src/modules/response/response.js rename to src/modules/response/event/response.js index 59adf9b59..5820974fc 100644 --- a/src/modules/response/response.js +++ b/src/modules/response/event/response.js @@ -2,7 +2,7 @@ import i18n from '@dhis2/d2-i18n' import { DIMENSION_ID_ORGUNIT, DIMENSION_ID_PERIOD, -} from '../predefinedDimensions.js' +} from '../../predefinedDimensions.js' import { isBooleanValueType, VALUE_TYPE_AGE, @@ -17,7 +17,7 @@ import { VALUE_TYPE_PERCENTAGE, VALUE_TYPE_REFERENCE, VALUE_TYPE_TRUE_ONLY, -} from '../valueTypes.js' +} from '../../valueTypes.js' import { applyDefaultHandler } from './default.js' import { applyOptionSetHandler } from './optionSet.js' From a3a1f477affb8cb35f84aa90260a0693e3a872a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 4 Sep 2025 11:56:31 +0200 Subject: [PATCH 46/50] chore: update paths --- .../response/event/__tests__/response.spec.js | 48 +++++++++---------- src/modules/response/event/response.js | 1 - 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/modules/response/event/__tests__/response.spec.js b/src/modules/response/event/__tests__/response.spec.js index d75af8521..4218be71b 100644 --- a/src/modules/response/event/__tests__/response.spec.js +++ b/src/modules/response/event/__tests__/response.spec.js @@ -1,27 +1,27 @@ -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 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 { transformResponse } from '../response.js' describe('response', () => { diff --git a/src/modules/response/event/response.js b/src/modules/response/event/response.js index 5820974fc..b25f8ad7b 100644 --- a/src/modules/response/event/response.js +++ b/src/modules/response/event/response.js @@ -4,7 +4,6 @@ import { DIMENSION_ID_PERIOD, } from '../../predefinedDimensions.js' import { - isBooleanValueType, VALUE_TYPE_AGE, VALUE_TYPE_BOOLEAN, VALUE_TYPE_COORDINATE, From 7bcf3b0e305cd45d01c8e9911d1fc9c63e261301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 4 Sep 2025 14:30:50 +0200 Subject: [PATCH 47/50] test: update tests --- .../response/event/__tests__/default.spec.js | 30 ++----------------- .../event/__tests__/optionSet.spec.js | 14 ++------- .../response/event/__tests__/response.spec.js | 21 ++++++++++++- 3 files changed, 24 insertions(+), 41 deletions(-) diff --git a/src/modules/response/event/__tests__/default.spec.js b/src/modules/response/event/__tests__/default.spec.js index b0df1d6e5..ca593cf96 100644 --- a/src/modules/response/event/__tests__/default.spec.js +++ b/src/modules/response/event/__tests__/default.spec.js @@ -24,6 +24,8 @@ const testId = 'Zj7UnCAulEk.qrur9Dvnyt5' const headerIndex = 0 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'] @@ -141,32 +143,4 @@ describe('default', () => { expect(getRows([], 1, 'a')).toEqual([]) }) }) - - describe('applyDefaultHandler', () => { - describe('should return the transformed response', () => { - test('date', () => { - expect( - applyDefaultHandler(dateResponseOrg, headerIndex, { - itemFormatter: - getItemFormatterByValueType(VALUE_TYPE_DATE), - }) - ).toEqual(dateResponseHideNa) - }) - - test('datetime', () => { - expect( - applyDefaultHandler(datetimeResponseOrg, headerIndex, { - itemFormatter: - getItemFormatterByValueType(VALUE_TYPE_DATETIME), - }) - ).toEqual(datetimeResponseHideNa) - }) - - test('numeric', () => { - expect( - applyDefaultHandler(numericResponseOrg, headerIndex) - ).toEqual(numericResponseHideNa) - }) - }) - }) }) diff --git a/src/modules/response/event/__tests__/optionSet.spec.js b/src/modules/response/event/__tests__/optionSet.spec.js index a21c88d07..acaf5143d 100644 --- a/src/modules/response/event/__tests__/optionSet.spec.js +++ b/src/modules/response/event/__tests__/optionSet.spec.js @@ -17,6 +17,8 @@ const testOptionCodeIdMap2 = { } 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 @@ -47,16 +49,4 @@ describe('optionSet', () => { expect(optionSet1And2Rows).toEqual(responseHideNa.rows) }) }) - - describe('applyOptionSetHandler', () => { - it('should return the transformed response', () => { - const optionSet1Response = applyOptionSetHandler(responseOrg, 0) - const optionSet1And2Response = applyOptionSetHandler( - optionSet1Response, - 1 - ) - - expect(optionSet1And2Response).toEqual(responseHideNa) - }) - }) }) diff --git a/src/modules/response/event/__tests__/response.spec.js b/src/modules/response/event/__tests__/response.spec.js index 4218be71b..48fba5524 100644 --- a/src/modules/response/event/__tests__/response.spec.js +++ b/src/modules/response/event/__tests__/response.spec.js @@ -22,9 +22,28 @@ 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 { transformResponse } from '../response.js' +import { getItemFormatterByValueType, transformResponse } from '../response.js' describe('response', () => { + describe('getItemFormatterByValueType', () => { + it('should return the correct formatter and format correctly', () => { + expect(getItemFormatterByValueType('BOOLEAN')('1')).toBe('Yes') + expect(getItemFormatterByValueType('BOOLEAN')('0')).toBe('No') + expect(getItemFormatterByValueType('TRUE_ONLY')('1')).toBe('Yes') + expect( + getItemFormatterByValueType('AGE')('1985-01-01 00:00:00.0') + ).toBe('1985-01-01') + expect( + getItemFormatterByValueType('DATE')('2023-01-01 00:00:00.0') + ).toBe('2023-01-01') + expect( + getItemFormatterByValueType('DATETIME')('2023-01-01 12:00:00.0') + ).toBe('2023-01-01 12:00') + expect(getItemFormatterByValueType('PERCENTAGE')('50.0')).toBe('50') + expect(getItemFormatterByValueType('NOT_A_TYPE')).toBe(undefined) + }) + }) + describe('transformResponse', () => { describe('boolean', () => { it('transforms response', () => { From ed2e50c0ca1e3d875b0d1366b04bb8d2d9fca1e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 4 Sep 2025 15:43:44 +0200 Subject: [PATCH 48/50] chore: remove unused imports --- .../response/event/__tests__/default.spec.js | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/modules/response/event/__tests__/default.spec.js b/src/modules/response/event/__tests__/default.spec.js index ca593cf96..c4cf2ca01 100644 --- a/src/modules/response/event/__tests__/default.spec.js +++ b/src/modules/response/event/__tests__/default.spec.js @@ -1,16 +1,5 @@ -import dateResponseHideNa from '../../../../__demo__/data/event/date.data.hidena.json' -import dateResponseOrg from '../../../../__demo__/data/event/date.data.org.json' -import datetimeResponseHideNa from '../../../../__demo__/data/event/datetime.data.hidena.json' -import datetimeResponseOrg from '../../../../__demo__/data/event/datetime.data.org.json' -import numericResponseHideNa from '../../../../__demo__/data/event/integer.data.hidena.json' -import numericResponseOrg from '../../../../__demo__/data/event/integer.data.org.json' +import { VALUE_TYPE_NUMBER } from '../../../valueTypes.js' import { - VALUE_TYPE_DATE, - VALUE_TYPE_DATETIME, - VALUE_TYPE_NUMBER, -} from '../../../valueTypes.js' -import { - applyDefaultHandler, getDimensions, getItems, getRows, @@ -18,7 +7,7 @@ import { getUnique, getValuesUniqueSortedAsc, } from '../default.js' -import { getItemFormatterByValueType, PREFIX_SEPARATOR } from '../response.js' +import { PREFIX_SEPARATOR } from '../response.js' const testId = 'Zj7UnCAulEk.qrur9Dvnyt5' const headerIndex = 0 From 31dda11e2cb83550d5498fbdfe9053712b07f05f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Thu, 4 Sep 2025 15:46:21 +0200 Subject: [PATCH 49/50] chore: remove unused vars --- src/modules/response/event/__tests__/default.spec.js | 1 - src/modules/response/event/__tests__/optionSet.spec.js | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/modules/response/event/__tests__/default.spec.js b/src/modules/response/event/__tests__/default.spec.js index c4cf2ca01..ea1be6b47 100644 --- a/src/modules/response/event/__tests__/default.spec.js +++ b/src/modules/response/event/__tests__/default.spec.js @@ -10,7 +10,6 @@ import { import { PREFIX_SEPARATOR } from '../response.js' const testId = 'Zj7UnCAulEk.qrur9Dvnyt5' -const headerIndex = 0 describe('default', () => { // applyDefaultHandler is tested by response.spec.js diff --git a/src/modules/response/event/__tests__/optionSet.spec.js b/src/modules/response/event/__tests__/optionSet.spec.js index acaf5143d..5de660762 100644 --- a/src/modules/response/event/__tests__/optionSet.spec.js +++ b/src/modules/response/event/__tests__/optionSet.spec.js @@ -1,10 +1,6 @@ import responseHideNa from '../../../../__demo__/data/event/optionset.data.hidena.json' import responseOrg from '../../../../__demo__/data/event/optionset.data.org.json' -import { - getOptionCodeIdMap, - getOptionIdRows, - applyOptionSetHandler, -} from '../optionSet.js' +import { getOptionCodeIdMap, getOptionIdRows } from '../optionSet.js' const testOptionCodeIdMap1 = { ONE: 'optionId1', From 10dd1341195d264eaeb52757da9dd4763231d104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Henrik=20=C3=98verland?= Date: Fri, 5 Sep 2025 09:32:58 +0200 Subject: [PATCH 50/50] test: use consts --- i18n/en.pot | 7 ++-- .../response/event/__tests__/response.spec.js | 36 +++++++++++++++---- 2 files changed, 34 insertions(+), 9 deletions(-) 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/modules/response/event/__tests__/response.spec.js b/src/modules/response/event/__tests__/response.spec.js index 48fba5524..8566ef653 100644 --- a/src/modules/response/event/__tests__/response.spec.js +++ b/src/modules/response/event/__tests__/response.spec.js @@ -22,24 +22,46 @@ 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('BOOLEAN')('1')).toBe('Yes') - expect(getItemFormatterByValueType('BOOLEAN')('0')).toBe('No') - expect(getItemFormatterByValueType('TRUE_ONLY')('1')).toBe('Yes') + 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('AGE')('1985-01-01 00:00:00.0') + getItemFormatterByValueType(VALUE_TYPE_AGE)( + '1985-01-01 00:00:00.0' + ) ).toBe('1985-01-01') expect( - getItemFormatterByValueType('DATE')('2023-01-01 00:00:00.0') + getItemFormatterByValueType(VALUE_TYPE_DATE)( + '2023-01-01 00:00:00.0' + ) ).toBe('2023-01-01') expect( - getItemFormatterByValueType('DATETIME')('2023-01-01 12:00:00.0') + getItemFormatterByValueType(VALUE_TYPE_DATETIME)( + '2023-01-01 12:00:00.0' + ) ).toBe('2023-01-01 12:00') - expect(getItemFormatterByValueType('PERCENTAGE')('50.0')).toBe('50') + expect( + getItemFormatterByValueType(VALUE_TYPE_PERCENTAGE)('50.0') + ).toBe('50') expect(getItemFormatterByValueType('NOT_A_TYPE')).toBe(undefined) }) })