@dhis2/analytics 28.0.4 → 28.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/__demo__/OpenFileDialog.stories.js +19 -1
- package/build/cjs/__demo__/{PivotTable.stories.js → PivotTable.aggregate.stories.js} +38 -38
- package/build/cjs/__demo__/PivotTable.event.stories.js +440 -0
- package/build/cjs/__demo__/data/event/boolean.data.hidena.json +115 -0
- package/build/cjs/__demo__/data/event/boolean.data.json +125 -0
- package/build/cjs/__demo__/data/event/boolean.data.org.json +106 -0
- package/build/cjs/__demo__/data/event/boolean.visualization.json +160 -0
- package/build/cjs/__demo__/data/event/date.data.hidena.json +205 -0
- package/build/cjs/__demo__/data/event/date.data.json +215 -0
- package/build/cjs/__demo__/data/event/date.data.org.json +123 -0
- package/build/cjs/__demo__/data/event/date.visualization.json +160 -0
- package/build/cjs/__demo__/data/event/datetime.data.hidena.json +215 -0
- package/build/cjs/__demo__/data/event/datetime.data.json +225 -0
- package/build/cjs/__demo__/data/event/datetime.data.org.json +124 -0
- package/build/cjs/__demo__/data/event/datetime.visualization.json +148 -0
- package/build/cjs/__demo__/data/event/email.data.hidena.json +192 -0
- package/build/cjs/__demo__/data/event/email.data.json +202 -0
- package/build/cjs/__demo__/data/event/email.data.org.json +123 -0
- package/build/cjs/__demo__/data/event/email.visualization.json +148 -0
- package/build/cjs/__demo__/data/event/integer.data.hidena.json +165 -0
- package/build/cjs/__demo__/data/event/integer.data.json +175 -0
- package/build/cjs/__demo__/data/event/integer.data.org.json +120 -0
- package/build/cjs/__demo__/data/event/integer.visualization.json +163 -0
- package/build/cjs/__demo__/data/event/legendset.data.hidena.json +154 -0
- package/build/cjs/__demo__/data/event/legendset.data.json +164 -0
- package/build/cjs/__demo__/data/event/legendset.visualization.json +166 -0
- package/build/cjs/__demo__/data/event/optionset.data.hidena.json +125 -0
- package/build/cjs/__demo__/data/event/optionset.data.json +134 -0
- package/build/cjs/__demo__/data/event/optionset.data.org.json +125 -0
- package/build/cjs/__demo__/data/event/optionset.visualization.json +158 -0
- package/build/cjs/__demo__/data/event/time.data.hidena.json +165 -0
- package/build/cjs/__demo__/data/event/time.data.json +175 -0
- package/build/cjs/__demo__/data/event/time.data.org.json +128 -0
- package/build/cjs/__demo__/data/event/time.visualization.json +148 -0
- package/build/cjs/__demo__/data/event/yesonly.data.hidena.json +127 -0
- package/build/cjs/__demo__/data/event/yesonly.data.json +136 -0
- package/build/cjs/__demo__/data/event/yesonly.data.org.json +124 -0
- package/build/cjs/__demo__/data/event/yesonly.visualization.json +161 -0
- package/build/cjs/components/DataDimension/ItemSelector/ItemSelector.js +19 -22
- package/build/cjs/components/DimensionsPanel/List/DimensionList.js +3 -1
- package/build/cjs/components/DimensionsPanel/List/__tests__/DimensionItem.spec.js +48 -41
- package/build/cjs/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap +110 -114
- package/build/cjs/components/DimensionsPanel/__tests__/DimensionsPanel.spec.js +36 -33
- package/build/cjs/components/FileMenu/__tests__/DeleteDialog.spec.js +24 -27
- package/build/cjs/components/FileMenu/__tests__/FileMenu.spec.js +51 -31
- package/build/cjs/components/FileMenu/__tests__/GetLinkDialog.spec.js +28 -31
- package/build/cjs/components/FileMenu/__tests__/RenameDialog.spec.js +17 -11
- package/build/cjs/components/FileMenu/__tests__/SaveAsDialog.spec.js +44 -37
- package/build/cjs/components/Filter/__tests__/Filter.spec.js +29 -34
- package/build/cjs/components/OpenFileDialog/CreatedByFilter.js +9 -1
- package/build/cjs/components/OpenFileDialog/OpenFileDialog.js +14 -34
- package/build/cjs/components/OpenFileDialog/VisTypeFilter.js +39 -1
- package/build/cjs/components/OpenFileDialog/__tests__/OpenFileDialog.spec.js +51 -0
- package/build/cjs/components/OrgUnitDimension/__tests__/OrgUnitDimension.spec.js +78 -44
- package/build/cjs/components/PeriodDimension/FixedPeriodFilter.js +1 -0
- package/build/cjs/components/PeriodDimension/RelativePeriodFilter.js +3 -2
- package/build/cjs/components/PeriodDimension/__tests__/FixedPeriodSingleSelect.spec.js +14 -21
- package/build/cjs/components/PeriodDimension/__tests__/PeriodDimension.spec.js +27 -23
- package/build/cjs/components/PivotTable/PivotTableColumnHeaderCell.js +3 -0
- package/build/cjs/components/PivotTable/PivotTableRowHeaderCell.js +2 -1
- package/build/cjs/components/RichText/Editor/__tests__/Editor.spec.js +6 -7
- package/build/cjs/components/RichText/Parser/__tests__/MdParser.spec.js +1 -1
- package/build/cjs/components/RichText/Parser/__tests__/Parser.spec.js +22 -23
- package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuBar.spec.js +52 -42
- package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +8 -8
- package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuList.spec.js +23 -18
- package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuListItem.spec.js +23 -17
- package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/__snapshots__/HoverMenuList.spec.js.snap +63 -0
- package/build/cjs/components/Toolbar/InterpretationsAndDetailsToggler.js +3 -1
- package/build/cjs/components/Toolbar/__tests__/InterpretationsAndDetailsToggler.spec.js +19 -18
- package/build/cjs/components/Toolbar/__tests__/Toolbar.spec.js +8 -8
- package/build/cjs/components/Toolbar/__tests__/ToolbarSidebar.spec.js +14 -11
- package/build/cjs/components/Toolbar/__tests__/UpdateButton.spec.js +16 -14
- package/build/cjs/components/TranslationDialog/TranslationModal/TranslationModal.js +2 -1
- package/build/cjs/components/TranslationDialog/TranslationModal/__tests__/TranslationModal.spec.js +25 -16
- package/build/cjs/index.js +8 -0
- package/build/cjs/locales/en/translations.json +1 -0
- package/build/cjs/modules/pivotTable/AdaptiveClippingController.js +2 -1
- package/build/cjs/modules/pivotTable/getHeaderForDisplay.js +4 -1
- package/build/cjs/modules/pivotTable/measureText.js +7 -6
- package/build/cjs/modules/response/event/__tests__/default.spec.js +77 -0
- package/build/cjs/modules/response/event/__tests__/optionSet.spec.js +35 -0
- package/build/cjs/modules/response/event/__tests__/response.spec.js +125 -0
- package/build/cjs/modules/response/event/default.js +65 -0
- package/build/cjs/modules/response/event/optionSet.js +36 -0
- package/build/cjs/modules/response/event/response.js +95 -0
- package/build/es/__demo__/OpenFileDialog.stories.js +17 -0
- package/build/es/__demo__/{PivotTable.stories.js → PivotTable.aggregate.stories.js} +38 -38
- package/build/es/__demo__/PivotTable.event.stories.js +414 -0
- package/build/es/__demo__/data/event/boolean.data.hidena.json +115 -0
- package/build/es/__demo__/data/event/boolean.data.json +125 -0
- package/build/es/__demo__/data/event/boolean.data.org.json +106 -0
- package/build/es/__demo__/data/event/boolean.visualization.json +160 -0
- package/build/es/__demo__/data/event/date.data.hidena.json +205 -0
- package/build/es/__demo__/data/event/date.data.json +215 -0
- package/build/es/__demo__/data/event/date.data.org.json +123 -0
- package/build/es/__demo__/data/event/date.visualization.json +160 -0
- package/build/es/__demo__/data/event/datetime.data.hidena.json +215 -0
- package/build/es/__demo__/data/event/datetime.data.json +225 -0
- package/build/es/__demo__/data/event/datetime.data.org.json +124 -0
- package/build/es/__demo__/data/event/datetime.visualization.json +148 -0
- package/build/es/__demo__/data/event/email.data.hidena.json +192 -0
- package/build/es/__demo__/data/event/email.data.json +202 -0
- package/build/es/__demo__/data/event/email.data.org.json +123 -0
- package/build/es/__demo__/data/event/email.visualization.json +148 -0
- package/build/es/__demo__/data/event/integer.data.hidena.json +165 -0
- package/build/es/__demo__/data/event/integer.data.json +175 -0
- package/build/es/__demo__/data/event/integer.data.org.json +120 -0
- package/build/es/__demo__/data/event/integer.visualization.json +163 -0
- package/build/es/__demo__/data/event/legendset.data.hidena.json +154 -0
- package/build/es/__demo__/data/event/legendset.data.json +164 -0
- package/build/es/__demo__/data/event/legendset.visualization.json +166 -0
- package/build/es/__demo__/data/event/optionset.data.hidena.json +125 -0
- package/build/es/__demo__/data/event/optionset.data.json +134 -0
- package/build/es/__demo__/data/event/optionset.data.org.json +125 -0
- package/build/es/__demo__/data/event/optionset.visualization.json +158 -0
- package/build/es/__demo__/data/event/time.data.hidena.json +165 -0
- package/build/es/__demo__/data/event/time.data.json +175 -0
- package/build/es/__demo__/data/event/time.data.org.json +128 -0
- package/build/es/__demo__/data/event/time.visualization.json +148 -0
- package/build/es/__demo__/data/event/yesonly.data.hidena.json +127 -0
- package/build/es/__demo__/data/event/yesonly.data.json +136 -0
- package/build/es/__demo__/data/event/yesonly.data.org.json +124 -0
- package/build/es/__demo__/data/event/yesonly.visualization.json +161 -0
- package/build/es/components/DataDimension/ItemSelector/ItemSelector.js +19 -22
- package/build/es/components/DimensionsPanel/List/DimensionList.js +3 -1
- package/build/es/components/DimensionsPanel/List/__tests__/DimensionItem.spec.js +47 -40
- package/build/es/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap +110 -114
- package/build/es/components/DimensionsPanel/__tests__/DimensionsPanel.spec.js +35 -32
- package/build/es/components/FileMenu/__tests__/DeleteDialog.spec.js +23 -26
- package/build/es/components/FileMenu/__tests__/FileMenu.spec.js +52 -32
- package/build/es/components/FileMenu/__tests__/GetLinkDialog.spec.js +27 -30
- package/build/es/components/FileMenu/__tests__/RenameDialog.spec.js +18 -12
- package/build/es/components/FileMenu/__tests__/SaveAsDialog.spec.js +43 -36
- package/build/es/components/Filter/__tests__/Filter.spec.js +28 -33
- package/build/es/components/OpenFileDialog/CreatedByFilter.js +7 -0
- package/build/es/components/OpenFileDialog/OpenFileDialog.js +14 -35
- package/build/es/components/OpenFileDialog/VisTypeFilter.js +38 -1
- package/build/es/components/OpenFileDialog/__tests__/OpenFileDialog.spec.js +49 -0
- package/build/es/components/OrgUnitDimension/__tests__/OrgUnitDimension.spec.js +77 -43
- package/build/es/components/PeriodDimension/FixedPeriodFilter.js +1 -0
- package/build/es/components/PeriodDimension/RelativePeriodFilter.js +3 -2
- package/build/es/components/PeriodDimension/__tests__/FixedPeriodSingleSelect.spec.js +13 -20
- package/build/es/components/PeriodDimension/__tests__/PeriodDimension.spec.js +26 -22
- package/build/es/components/PivotTable/PivotTableColumnHeaderCell.js +3 -0
- package/build/es/components/PivotTable/PivotTableRowHeaderCell.js +2 -1
- package/build/es/components/RichText/Editor/__tests__/Editor.spec.js +7 -8
- package/build/es/components/RichText/Parser/__tests__/MdParser.spec.js +1 -1
- package/build/es/components/RichText/Parser/__tests__/Parser.spec.js +21 -22
- package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuBar.spec.js +53 -43
- package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +7 -7
- package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuList.spec.js +23 -18
- package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuListItem.spec.js +21 -15
- package/build/es/components/Toolbar/HoverMenuBar/__tests__/__snapshots__/HoverMenuList.spec.js.snap +63 -0
- package/build/es/components/Toolbar/InterpretationsAndDetailsToggler.js +3 -1
- package/build/es/components/Toolbar/__tests__/InterpretationsAndDetailsToggler.spec.js +18 -17
- package/build/es/components/Toolbar/__tests__/Toolbar.spec.js +7 -7
- package/build/es/components/Toolbar/__tests__/ToolbarSidebar.spec.js +13 -10
- package/build/es/components/Toolbar/__tests__/UpdateButton.spec.js +15 -13
- package/build/es/components/TranslationDialog/TranslationModal/TranslationModal.js +2 -1
- package/build/es/components/TranslationDialog/TranslationModal/__tests__/TranslationModal.spec.js +24 -15
- package/build/es/index.js +4 -0
- package/build/es/locales/en/translations.json +1 -0
- package/build/es/modules/pivotTable/AdaptiveClippingController.js +2 -1
- package/build/es/modules/pivotTable/getHeaderForDisplay.js +4 -1
- package/build/es/modules/pivotTable/measureText.js +7 -6
- package/build/es/modules/response/event/__tests__/default.spec.js +75 -0
- package/build/es/modules/response/event/__tests__/optionSet.spec.js +32 -0
- package/build/es/modules/response/event/__tests__/response.spec.js +122 -0
- package/build/es/modules/response/event/default.js +52 -0
- package/build/es/modules/response/event/optionSet.js +27 -0
- package/build/es/modules/response/event/response.js +86 -0
- package/package.json +2 -4
- package/build/cjs/components/OrgUnitDimension/__tests__/__snapshots__/OrgUnitDimension.spec.js.snap +0 -89
- package/build/cjs/components/PeriodDimension/__tests__/PeriodSelector.spec.js +0 -29
- package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/FixedPeriodSingleSelect.spec.js.snap +0 -92
- package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +0 -16
- package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +0 -89
- package/build/es/components/OrgUnitDimension/__tests__/__snapshots__/OrgUnitDimension.spec.js.snap +0 -89
- package/build/es/components/PeriodDimension/__tests__/PeriodSelector.spec.js +0 -26
- package/build/es/components/PeriodDimension/__tests__/__snapshots__/FixedPeriodSingleSelect.spec.js.snap +0 -92
- package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +0 -16
- package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +0 -89
- /package/build/cjs/__demo__/data/{avgTotalAggregationType.data.json → aggregate/avgTotalAggregationType.data.json} +0 -0
- /package/build/cjs/__demo__/data/{avgTotalAggregationType.metadata.json → aggregate/avgTotalAggregationType.metadata.json} +0 -0
- /package/build/cjs/__demo__/data/{avgTotalAggregationType.visualization.json → aggregate/avgTotalAggregationType.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{deep.data.json → aggregate/deep.data.json} +0 -0
- /package/build/cjs/__demo__/data/{deep.visualization.json → aggregate/deep.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{deepWithFilters.data.json → aggregate/deepWithFilters.data.json} +0 -0
- /package/build/cjs/__demo__/data/{deepWithFilters.visualization.json → aggregate/deepWithFilters.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{degs.data.json → aggregate/degs.data.json} +0 -0
- /package/build/cjs/__demo__/data/{degs.metadata.json → aggregate/degs.metadata.json} +0 -0
- /package/build/cjs/__demo__/data/{degs.visualization.json → aggregate/degs.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{diseaseWeeks.data.json → aggregate/diseaseWeeks.data.json} +0 -0
- /package/build/cjs/__demo__/data/{diseaseWeeks.metadata.json → aggregate/diseaseWeeks.metadata.json} +0 -0
- /package/build/cjs/__demo__/data/{diseaseWeeks.visualization.json → aggregate/diseaseWeeks.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{emptyColumns.data.json → aggregate/emptyColumns.data.json} +0 -0
- /package/build/cjs/__demo__/data/{emptyColumns.metadata.json → aggregate/emptyColumns.metadata.json} +0 -0
- /package/build/cjs/__demo__/data/{emptyColumns.visualization.json → aggregate/emptyColumns.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{emptyRows.data.json → aggregate/emptyRows.data.json} +0 -0
- /package/build/cjs/__demo__/data/{emptyRows.visualization.json → aggregate/emptyRows.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{hierarchy.data.json → aggregate/hierarchy.data.json} +0 -0
- /package/build/cjs/__demo__/data/{hierarchy.metadata.json → aggregate/hierarchy.metadata.json} +0 -0
- /package/build/cjs/__demo__/data/{hierarchy.visualization.json → aggregate/hierarchy.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{lastFiveYears.data.json → aggregate/lastFiveYears.data.json} +0 -0
- /package/build/cjs/__demo__/data/{lastFiveYears.metadata.json → aggregate/lastFiveYears.metadata.json} +0 -0
- /package/build/cjs/__demo__/data/{lastFiveYears.visualization.json → aggregate/lastFiveYears.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{narrative.data.json → aggregate/narrative.data.json} +0 -0
- /package/build/cjs/__demo__/data/{narrative.metadata.json → aggregate/narrative.metadata.json} +0 -0
- /package/build/cjs/__demo__/data/{narrative.visualization.json → aggregate/narrative.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{simple.data.json → aggregate/simple.data.json} +0 -0
- /package/build/cjs/__demo__/data/{simple.metadata.json → aggregate/simple.metadata.json} +0 -0
- /package/build/cjs/__demo__/data/{simple.visualization.json → aggregate/simple.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{target-with-legend.data.json → aggregate/target-with-legend.data.json} +0 -0
- /package/build/cjs/__demo__/data/{target-with-legend.metadata.json → aggregate/target-with-legend.metadata.json} +0 -0
- /package/build/cjs/__demo__/data/{target-with-legend.visualization.json → aggregate/target-with-legend.visualization.json} +0 -0
- /package/build/cjs/__demo__/data/{under-above-100.legendSet.json → aggregate/under-above-100.legendSet.json} +0 -0
- /package/build/cjs/__demo__/data/{weeklyColumns.data.json → aggregate/weeklyColumns.data.json} +0 -0
- /package/build/cjs/__demo__/data/{weeklyColumns.metadata.json → aggregate/weeklyColumns.metadata.json} +0 -0
- /package/build/cjs/__demo__/data/{weeklyColumns.visualization.json → aggregate/weeklyColumns.visualization.json} +0 -0
- /package/build/es/__demo__/data/{avgTotalAggregationType.data.json → aggregate/avgTotalAggregationType.data.json} +0 -0
- /package/build/es/__demo__/data/{avgTotalAggregationType.metadata.json → aggregate/avgTotalAggregationType.metadata.json} +0 -0
- /package/build/es/__demo__/data/{avgTotalAggregationType.visualization.json → aggregate/avgTotalAggregationType.visualization.json} +0 -0
- /package/build/es/__demo__/data/{deep.data.json → aggregate/deep.data.json} +0 -0
- /package/build/es/__demo__/data/{deep.visualization.json → aggregate/deep.visualization.json} +0 -0
- /package/build/es/__demo__/data/{deepWithFilters.data.json → aggregate/deepWithFilters.data.json} +0 -0
- /package/build/es/__demo__/data/{deepWithFilters.visualization.json → aggregate/deepWithFilters.visualization.json} +0 -0
- /package/build/es/__demo__/data/{degs.data.json → aggregate/degs.data.json} +0 -0
- /package/build/es/__demo__/data/{degs.metadata.json → aggregate/degs.metadata.json} +0 -0
- /package/build/es/__demo__/data/{degs.visualization.json → aggregate/degs.visualization.json} +0 -0
- /package/build/es/__demo__/data/{diseaseWeeks.data.json → aggregate/diseaseWeeks.data.json} +0 -0
- /package/build/es/__demo__/data/{diseaseWeeks.metadata.json → aggregate/diseaseWeeks.metadata.json} +0 -0
- /package/build/es/__demo__/data/{diseaseWeeks.visualization.json → aggregate/diseaseWeeks.visualization.json} +0 -0
- /package/build/es/__demo__/data/{emptyColumns.data.json → aggregate/emptyColumns.data.json} +0 -0
- /package/build/es/__demo__/data/{emptyColumns.metadata.json → aggregate/emptyColumns.metadata.json} +0 -0
- /package/build/es/__demo__/data/{emptyColumns.visualization.json → aggregate/emptyColumns.visualization.json} +0 -0
- /package/build/es/__demo__/data/{emptyRows.data.json → aggregate/emptyRows.data.json} +0 -0
- /package/build/es/__demo__/data/{emptyRows.visualization.json → aggregate/emptyRows.visualization.json} +0 -0
- /package/build/es/__demo__/data/{hierarchy.data.json → aggregate/hierarchy.data.json} +0 -0
- /package/build/es/__demo__/data/{hierarchy.metadata.json → aggregate/hierarchy.metadata.json} +0 -0
- /package/build/es/__demo__/data/{hierarchy.visualization.json → aggregate/hierarchy.visualization.json} +0 -0
- /package/build/es/__demo__/data/{lastFiveYears.data.json → aggregate/lastFiveYears.data.json} +0 -0
- /package/build/es/__demo__/data/{lastFiveYears.metadata.json → aggregate/lastFiveYears.metadata.json} +0 -0
- /package/build/es/__demo__/data/{lastFiveYears.visualization.json → aggregate/lastFiveYears.visualization.json} +0 -0
- /package/build/es/__demo__/data/{narrative.data.json → aggregate/narrative.data.json} +0 -0
- /package/build/es/__demo__/data/{narrative.metadata.json → aggregate/narrative.metadata.json} +0 -0
- /package/build/es/__demo__/data/{narrative.visualization.json → aggregate/narrative.visualization.json} +0 -0
- /package/build/es/__demo__/data/{simple.data.json → aggregate/simple.data.json} +0 -0
- /package/build/es/__demo__/data/{simple.metadata.json → aggregate/simple.metadata.json} +0 -0
- /package/build/es/__demo__/data/{simple.visualization.json → aggregate/simple.visualization.json} +0 -0
- /package/build/es/__demo__/data/{target-with-legend.data.json → aggregate/target-with-legend.data.json} +0 -0
- /package/build/es/__demo__/data/{target-with-legend.metadata.json → aggregate/target-with-legend.metadata.json} +0 -0
- /package/build/es/__demo__/data/{target-with-legend.visualization.json → aggregate/target-with-legend.visualization.json} +0 -0
- /package/build/es/__demo__/data/{under-above-100.legendSet.json → aggregate/under-above-100.legendSet.json} +0 -0
- /package/build/es/__demo__/data/{weeklyColumns.data.json → aggregate/weeklyColumns.data.json} +0 -0
- /package/build/es/__demo__/data/{weeklyColumns.metadata.json → aggregate/weeklyColumns.metadata.json} +0 -0
- /package/build/es/__demo__/data/{weeklyColumns.visualization.json → aggregate/weeklyColumns.visualization.json} +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { VALUE_TYPE_NUMBER } from '../../../valueTypes.js';
|
|
2
|
+
import { getDimensions, getItems, getRows, getPrefixedValue, getUnique, getValuesUniqueSortedAsc } from '../default.js';
|
|
3
|
+
import { PREFIX_SEPARATOR } from '../response.js';
|
|
4
|
+
const testId = 'Zj7UnCAulEk.qrur9Dvnyt5';
|
|
5
|
+
describe('default', () => {
|
|
6
|
+
// applyDefaultHandler is tested by response.spec.js
|
|
7
|
+
|
|
8
|
+
describe('getUnique', () => {
|
|
9
|
+
it('removes duplicate string numbers', () => {
|
|
10
|
+
const arr = ['2', '10', '2', '01', '1', '-1', '-1', '1', '10'];
|
|
11
|
+
expect(getUnique(arr)).toEqual(['2', '10', '01', '1', '-1']);
|
|
12
|
+
});
|
|
13
|
+
it('treats "01" and "1" as different strings', () => {
|
|
14
|
+
const arr = ['01', '1', '01'];
|
|
15
|
+
expect(getUnique(arr)).toEqual(['01', '1']);
|
|
16
|
+
});
|
|
17
|
+
it('handles empty array', () => {
|
|
18
|
+
expect(getUnique([])).toEqual([]);
|
|
19
|
+
});
|
|
20
|
+
it('preserves order of first occurrence', () => {
|
|
21
|
+
const arr = ['2', '1', '2', '1'];
|
|
22
|
+
expect(getUnique(arr)).toEqual(['2', '1']);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('getValuesUniqueSortedAsc', () => {
|
|
26
|
+
it('sorts string numbers numerically', () => {
|
|
27
|
+
expect(getValuesUniqueSortedAsc(['1', '10', '-1', '5', '5', '3'], VALUE_TYPE_NUMBER)).toEqual(['-1', '1', '3', '5', '10']);
|
|
28
|
+
});
|
|
29
|
+
it('sorts non-numeric strings as strings', () => {
|
|
30
|
+
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']);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
describe('getPrefixedValue', () => {
|
|
34
|
+
it('returns prefix and value separated by a colon', () => {
|
|
35
|
+
expect(getPrefixedValue('123', 'id')).toBe(`id${PREFIX_SEPARATOR}123`);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('getItems', () => {
|
|
39
|
+
it('returns an object with prefixed keys and correct names', () => {
|
|
40
|
+
expect(getItems(['1', '2'], testId)).toEqual({
|
|
41
|
+
[testId + `${PREFIX_SEPARATOR}1`]: {
|
|
42
|
+
name: '1'
|
|
43
|
+
},
|
|
44
|
+
[testId + `${PREFIX_SEPARATOR}2`]: {
|
|
45
|
+
name: '2'
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
it('uses the formatter if one is provided', () => {
|
|
50
|
+
expect(getItems(['world'], 'hello', {
|
|
51
|
+
itemFormatter: str => str.toUpperCase()
|
|
52
|
+
})).toEqual({
|
|
53
|
+
[`hello${PREFIX_SEPARATOR}world`]: {
|
|
54
|
+
name: 'WORLD'
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('getDimensions', () => {
|
|
60
|
+
it('returns an object with dimensionId as key and correctly prefixed values', () => {
|
|
61
|
+
expect(getDimensions(['1', '2'], testId)).toEqual({
|
|
62
|
+
[testId]: [testId + `${PREFIX_SEPARATOR}1`, testId + `${PREFIX_SEPARATOR}2`]
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('getRows', () => {
|
|
67
|
+
it('prefixes value at headerIndex for each row', () => {
|
|
68
|
+
const rows = [['a', '1', 'x'], ['b', '2', 'y']];
|
|
69
|
+
expect(getRows(rows, 1, testId)).toEqual([['a', `${testId}${PREFIX_SEPARATOR}1`, 'x'], ['b', `${testId}${PREFIX_SEPARATOR}2`, 'y']]);
|
|
70
|
+
});
|
|
71
|
+
it('handles empty rows array', () => {
|
|
72
|
+
expect(getRows([], 1, 'a')).toEqual([]);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import responseHideNa from '../../../../__demo__/data/event/optionset.data.hidena.json';
|
|
2
|
+
import responseOrg from '../../../../__demo__/data/event/optionset.data.org.json';
|
|
3
|
+
import { getOptionCodeIdMap, getOptionIdRows } from '../optionSet.js';
|
|
4
|
+
const testOptionCodeIdMap1 = {
|
|
5
|
+
ONE: 'optionId1',
|
|
6
|
+
TWO: 'optionId2'
|
|
7
|
+
};
|
|
8
|
+
const testOptionCodeIdMap2 = {
|
|
9
|
+
ONE: 'optionId3',
|
|
10
|
+
TWO: 'optionId4'
|
|
11
|
+
};
|
|
12
|
+
describe('optionSet', () => {
|
|
13
|
+
// applyOptionSetHandler is tested by response.spec.js
|
|
14
|
+
|
|
15
|
+
describe('getOptionCodeIdMap', () => {
|
|
16
|
+
it('should create an option code:id object', () => {
|
|
17
|
+
const testId = responseHideNa.headers[0].name;
|
|
18
|
+
const testOptionIds = responseHideNa.metaData.dimensions[testId];
|
|
19
|
+
const testOptionItems = responseHideNa.metaData.items;
|
|
20
|
+
expect(getOptionCodeIdMap(testOptionIds, testOptionItems)).toEqual(testOptionCodeIdMap1);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// Test the solution for two option sets with shared option codes
|
|
25
|
+
describe('getOptionIdRows', () => {
|
|
26
|
+
it('should replace option codes with ids in the right index', () => {
|
|
27
|
+
const optionSet1Rows = getOptionIdRows(responseOrg.rows, testOptionCodeIdMap1, 0);
|
|
28
|
+
const optionSet1And2Rows = getOptionIdRows(optionSet1Rows, testOptionCodeIdMap2, 1);
|
|
29
|
+
expect(optionSet1And2Rows).toEqual(responseHideNa.rows);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import responseBooleanHideNa from '../../../../__demo__/data/event/boolean.data.hidena.json';
|
|
2
|
+
import responseBoolean from '../../../../__demo__/data/event/boolean.data.json';
|
|
3
|
+
import responseBooleanOrg from '../../../../__demo__/data/event/boolean.data.org.json';
|
|
4
|
+
import responseDateHideNa from '../../../../__demo__/data/event/date.data.hidena.json';
|
|
5
|
+
import responseDate from '../../../../__demo__/data/event/date.data.json';
|
|
6
|
+
import responseDateOrg from '../../../../__demo__/data/event/date.data.org.json';
|
|
7
|
+
import responseDatetimeHideNa from '../../../../__demo__/data/event/datetime.data.hidena.json';
|
|
8
|
+
import responseDatetime from '../../../../__demo__/data/event/datetime.data.json';
|
|
9
|
+
import responseDatetimeOrg from '../../../../__demo__/data/event/datetime.data.org.json';
|
|
10
|
+
import responseTextHideNa from '../../../../__demo__/data/event/email.data.hidena.json';
|
|
11
|
+
import responseText from '../../../../__demo__/data/event/email.data.json';
|
|
12
|
+
import responseTextOrg from '../../../../__demo__/data/event/email.data.org.json';
|
|
13
|
+
import responseNumericHideNa from '../../../../__demo__/data/event/integer.data.hidena.json';
|
|
14
|
+
import responseNumeric from '../../../../__demo__/data/event/integer.data.json';
|
|
15
|
+
import responseNumericOrg from '../../../../__demo__/data/event/integer.data.org.json';
|
|
16
|
+
import responseOptionSetHideNa from '../../../../__demo__/data/event/optionset.data.hidena.json';
|
|
17
|
+
import responseOptionSet from '../../../../__demo__/data/event/optionset.data.json';
|
|
18
|
+
import responseOptionSetOrg from '../../../../__demo__/data/event/optionset.data.org.json';
|
|
19
|
+
import responseTimeHideNa from '../../../../__demo__/data/event/time.data.hidena.json';
|
|
20
|
+
import responseTime from '../../../../__demo__/data/event/time.data.json';
|
|
21
|
+
import responseTimeOrg from '../../../../__demo__/data/event/time.data.org.json';
|
|
22
|
+
import responseYesOnlyHideNa from '../../../../__demo__/data/event/yesonly.data.hidena.json';
|
|
23
|
+
import responseYesOnly from '../../../../__demo__/data/event/yesonly.data.json';
|
|
24
|
+
import responseYesOnlyOrg from '../../../../__demo__/data/event/yesonly.data.org.json';
|
|
25
|
+
import { VALUE_TYPE_AGE, VALUE_TYPE_BOOLEAN, VALUE_TYPE_DATE, VALUE_TYPE_DATETIME, VALUE_TYPE_PERCENTAGE, VALUE_TYPE_TRUE_ONLY } from '../../../valueTypes.js';
|
|
26
|
+
import { getItemFormatterByValueType, transformResponse } from '../response.js';
|
|
27
|
+
describe('response', () => {
|
|
28
|
+
describe('getItemFormatterByValueType', () => {
|
|
29
|
+
it('should return the correct formatter and format correctly', () => {
|
|
30
|
+
expect(getItemFormatterByValueType(VALUE_TYPE_BOOLEAN)('1')).toBe('Yes');
|
|
31
|
+
expect(getItemFormatterByValueType(VALUE_TYPE_BOOLEAN)('0')).toBe('No');
|
|
32
|
+
expect(getItemFormatterByValueType(VALUE_TYPE_TRUE_ONLY)('1')).toBe('Yes');
|
|
33
|
+
expect(getItemFormatterByValueType(VALUE_TYPE_AGE)('1985-01-01 00:00:00.0')).toBe('1985-01-01');
|
|
34
|
+
expect(getItemFormatterByValueType(VALUE_TYPE_DATE)('2023-01-01 00:00:00.0')).toBe('2023-01-01');
|
|
35
|
+
expect(getItemFormatterByValueType(VALUE_TYPE_DATETIME)('2023-01-01 12:00:00.0')).toBe('2023-01-01 12:00');
|
|
36
|
+
expect(getItemFormatterByValueType(VALUE_TYPE_PERCENTAGE)('50.0')).toBe('50');
|
|
37
|
+
expect(getItemFormatterByValueType('NOT_A_TYPE')).toBe(undefined);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('transformResponse', () => {
|
|
41
|
+
describe('boolean', () => {
|
|
42
|
+
it('transforms response', () => {
|
|
43
|
+
expect(transformResponse(responseBooleanOrg)).toEqual(responseBoolean);
|
|
44
|
+
});
|
|
45
|
+
it('transforms response and hides N/A data', () => {
|
|
46
|
+
expect(transformResponse(responseBooleanOrg, {
|
|
47
|
+
hideNaData: true
|
|
48
|
+
})).toEqual(responseBooleanHideNa);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('date', () => {
|
|
52
|
+
it('transforms response', () => {
|
|
53
|
+
expect(transformResponse(responseDateOrg)).toEqual(responseDate);
|
|
54
|
+
});
|
|
55
|
+
it('transforms response and hides N/A data', () => {
|
|
56
|
+
expect(transformResponse(responseDateOrg, {
|
|
57
|
+
hideNaData: true
|
|
58
|
+
})).toEqual(responseDateHideNa);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('datetime', () => {
|
|
62
|
+
it('transforms response', () => {
|
|
63
|
+
expect(transformResponse(responseDatetimeOrg)).toEqual(responseDatetime);
|
|
64
|
+
});
|
|
65
|
+
it('transforms response and hides N/A data', () => {
|
|
66
|
+
expect(transformResponse(responseDatetimeOrg, {
|
|
67
|
+
hideNaData: true
|
|
68
|
+
})).toEqual(responseDatetimeHideNa);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('numeric', () => {
|
|
72
|
+
it('transforms response', () => {
|
|
73
|
+
expect(transformResponse(responseNumericOrg)).toEqual(responseNumeric);
|
|
74
|
+
});
|
|
75
|
+
it('transforms response and hides N/A data', () => {
|
|
76
|
+
expect(transformResponse(responseNumericOrg, {
|
|
77
|
+
hideNaData: true
|
|
78
|
+
})).toEqual(responseNumericHideNa);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('option set', () => {
|
|
82
|
+
it('transforms response with non-unique codes across two option sets', () => {
|
|
83
|
+
expect(transformResponse(responseOptionSetOrg)).toEqual(responseOptionSet);
|
|
84
|
+
});
|
|
85
|
+
it('transforms response with non-unique codes across two option sets and hides N/A data', () => {
|
|
86
|
+
expect(transformResponse(responseOptionSetOrg, {
|
|
87
|
+
hideNaData: true
|
|
88
|
+
})).toEqual(responseOptionSetHideNa);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('text', () => {
|
|
92
|
+
it('transforms response', () => {
|
|
93
|
+
expect(transformResponse(responseTextOrg)).toEqual(responseText);
|
|
94
|
+
});
|
|
95
|
+
it('transforms response and hides N/A data', () => {
|
|
96
|
+
expect(transformResponse(responseTextOrg, {
|
|
97
|
+
hideNaData: true
|
|
98
|
+
})).toEqual(responseTextHideNa);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('time', () => {
|
|
102
|
+
it('transforms response', () => {
|
|
103
|
+
expect(transformResponse(responseTimeOrg)).toEqual(responseTime);
|
|
104
|
+
});
|
|
105
|
+
it('transforms response and hides N/A data', () => {
|
|
106
|
+
expect(transformResponse(responseTimeOrg, {
|
|
107
|
+
hideNaData: true
|
|
108
|
+
})).toEqual(responseTimeHideNa);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('yes only', () => {
|
|
112
|
+
it('transforms response', () => {
|
|
113
|
+
expect(transformResponse(responseYesOnlyOrg)).toEqual(responseYesOnly);
|
|
114
|
+
});
|
|
115
|
+
it('transforms response and hides N/A data', () => {
|
|
116
|
+
expect(transformResponse(responseYesOnlyOrg, {
|
|
117
|
+
hideNaData: true
|
|
118
|
+
})).toEqual(responseYesOnlyHideNa);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { isBooleanValueType, isNumericValueType, VALUE_TYPE_TEXT } from '../../valueTypes.js';
|
|
2
|
+
import { NA_VALUE, PREFIX_SEPARATOR } from './response.js';
|
|
3
|
+
export const getUnique = array => [...new Set(array)];
|
|
4
|
+
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));
|
|
5
|
+
export const getPrefixedValue = (value, prefix) => `${prefix}${PREFIX_SEPARATOR}${value}`;
|
|
6
|
+
export const getItems = (values, dimensionId, {
|
|
7
|
+
itemFormatter
|
|
8
|
+
} = {}) => values.reduce((items, value) => {
|
|
9
|
+
items[getPrefixedValue(value, dimensionId)] = {
|
|
10
|
+
name: itemFormatter ? itemFormatter(value) : value
|
|
11
|
+
};
|
|
12
|
+
return items;
|
|
13
|
+
}, {});
|
|
14
|
+
export const getDimensions = (values, dimensionId) => ({
|
|
15
|
+
[dimensionId]: values.map(value => getPrefixedValue(value, dimensionId))
|
|
16
|
+
});
|
|
17
|
+
export const getRows = (rows, headerIndex, dimensionId) => {
|
|
18
|
+
let row;
|
|
19
|
+
let value;
|
|
20
|
+
return rows.map(r => {
|
|
21
|
+
value = r[headerIndex];
|
|
22
|
+
if (value !== NA_VALUE) {
|
|
23
|
+
row = [...r];
|
|
24
|
+
row[headerIndex] = getPrefixedValue(row[headerIndex], dimensionId);
|
|
25
|
+
return row;
|
|
26
|
+
}
|
|
27
|
+
return r;
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
export const applyDefaultHandler = (response, headerIndex, {
|
|
31
|
+
itemFormatter
|
|
32
|
+
} = {}) => {
|
|
33
|
+
const header = response.headers[headerIndex];
|
|
34
|
+
const uniqueSortedValuesAsc = getValuesUniqueSortedAsc(response.rows.map(row => row[headerIndex]).filter(value => value !== NA_VALUE), header.valueType);
|
|
35
|
+
return {
|
|
36
|
+
...response,
|
|
37
|
+
metaData: {
|
|
38
|
+
...response.metaData,
|
|
39
|
+
items: {
|
|
40
|
+
...response.metaData.items,
|
|
41
|
+
...getItems(uniqueSortedValuesAsc, header.name, {
|
|
42
|
+
itemFormatter
|
|
43
|
+
})
|
|
44
|
+
},
|
|
45
|
+
dimensions: {
|
|
46
|
+
...response.metaData.dimensions,
|
|
47
|
+
...getDimensions(uniqueSortedValuesAsc, header.name)
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
rows: [...getRows(response.rows, headerIndex, header.name)]
|
|
51
|
+
};
|
|
52
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { NA_VALUE } from './response.js';
|
|
2
|
+
export const getOptionCodeIdMap = (optionIds, items) => optionIds.reduce((map, optionId) => {
|
|
3
|
+
map[items[optionId].code] = optionId;
|
|
4
|
+
return map;
|
|
5
|
+
}, {});
|
|
6
|
+
export const getOptionIdRows = (rows, optionCodeIdMap, headerIndex) => {
|
|
7
|
+
let value;
|
|
8
|
+
let row;
|
|
9
|
+
return rows.map(r => {
|
|
10
|
+
value = r[headerIndex];
|
|
11
|
+
if (value !== NA_VALUE) {
|
|
12
|
+
row = [...r];
|
|
13
|
+
row[headerIndex] = optionCodeIdMap[value];
|
|
14
|
+
return row;
|
|
15
|
+
}
|
|
16
|
+
return r;
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
export const applyOptionSetHandler = (response, headerIndex) => {
|
|
20
|
+
const header = response.headers[headerIndex];
|
|
21
|
+
const optionIds = response.metaData.dimensions[header.name];
|
|
22
|
+
const optionCodeIdMap = getOptionCodeIdMap(optionIds, response.metaData.items);
|
|
23
|
+
return {
|
|
24
|
+
...response,
|
|
25
|
+
rows: getOptionIdRows(response.rows, optionCodeIdMap, headerIndex)
|
|
26
|
+
};
|
|
27
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import i18n from '@dhis2/d2-i18n';
|
|
2
|
+
import { DIMENSION_ID_ORGUNIT, DIMENSION_ID_PERIOD } from '../../predefinedDimensions.js';
|
|
3
|
+
import { VALUE_TYPE_AGE, VALUE_TYPE_BOOLEAN, VALUE_TYPE_COORDINATE, VALUE_TYPE_DATE, VALUE_TYPE_DATETIME, VALUE_TYPE_FILE_RESOURCE, VALUE_TYPE_GEOJSON, VALUE_TYPE_IMAGE, VALUE_TYPE_MULTI_TEXT, VALUE_TYPE_PERCENTAGE, VALUE_TYPE_REFERENCE, VALUE_TYPE_TRUE_ONLY } from '../../valueTypes.js';
|
|
4
|
+
import { applyDefaultHandler } from './default.js';
|
|
5
|
+
import { applyOptionSetHandler } from './optionSet.js';
|
|
6
|
+
export const PREFIX_SEPARATOR = '_';
|
|
7
|
+
export const NA_VALUE = '';
|
|
8
|
+
export const NA_VALUE_ITEM = {
|
|
9
|
+
name: i18n.t('No value'),
|
|
10
|
+
style: {
|
|
11
|
+
fontStyle: 'italic',
|
|
12
|
+
color: '#6C7787',
|
|
13
|
+
fontFamily: 'monospace',
|
|
14
|
+
letterSpacing: '-0.3px'
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
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];
|
|
18
|
+
export const getItemFormatterByValueType = valueType => {
|
|
19
|
+
switch (valueType) {
|
|
20
|
+
case VALUE_TYPE_AGE:
|
|
21
|
+
case VALUE_TYPE_DATE:
|
|
22
|
+
return name => name.replace(/ 00:00:00\.0$/, '');
|
|
23
|
+
case VALUE_TYPE_BOOLEAN:
|
|
24
|
+
case VALUE_TYPE_TRUE_ONLY:
|
|
25
|
+
return name => name === '1' ? i18n.t('Yes') : i18n.t('No');
|
|
26
|
+
case VALUE_TYPE_DATETIME:
|
|
27
|
+
return name => name.replace(/:00\.0$/, '');
|
|
28
|
+
case VALUE_TYPE_PERCENTAGE:
|
|
29
|
+
return name => name.endsWith('.0') ? name.slice(0, -2) : name;
|
|
30
|
+
default:
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
export const transformResponse = (response, {
|
|
35
|
+
hideNaData = false
|
|
36
|
+
} = {}) => {
|
|
37
|
+
// Do not modify the original response
|
|
38
|
+
// Rows is mapped by the handlers
|
|
39
|
+
let transformedResponse = {
|
|
40
|
+
...response,
|
|
41
|
+
metaData: {
|
|
42
|
+
...response.metaData,
|
|
43
|
+
items: {
|
|
44
|
+
...response.metaData.items
|
|
45
|
+
},
|
|
46
|
+
dimensions: {
|
|
47
|
+
...response.metaData.dimensions
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// Add index to all headers
|
|
53
|
+
// Include only headers that are "meta" and skip "pe" and "ou"
|
|
54
|
+
const metaHeaders = response.headers.map((header, index) => ({
|
|
55
|
+
...header,
|
|
56
|
+
index
|
|
57
|
+
})).filter(header => Boolean(header.meta) && ![DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT].includes(header.name));
|
|
58
|
+
|
|
59
|
+
// Legendsets use uids and do not need transformation
|
|
60
|
+
// Skip unsupported value types
|
|
61
|
+
// Option set and Boolean have separate handlers
|
|
62
|
+
// All other types use default handler with specific item formatter
|
|
63
|
+
metaHeaders.forEach(header => {
|
|
64
|
+
if (!(header.legendSet || UNSUPPORTED_VALUE_TYPES.includes(header.valueType))) {
|
|
65
|
+
if (header.optionSet) {
|
|
66
|
+
transformedResponse = applyOptionSetHandler(transformedResponse, header.index);
|
|
67
|
+
} else {
|
|
68
|
+
transformedResponse = applyDefaultHandler(transformedResponse, header.index, {
|
|
69
|
+
itemFormatter: getItemFormatterByValueType(header.valueType)
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Add "No value" dimension item if "Hide NA data" option is disabled
|
|
76
|
+
// Only add if there is at least one empty value
|
|
77
|
+
if (!hideNaData) {
|
|
78
|
+
metaHeaders.forEach(header => {
|
|
79
|
+
if (response.rows.map(row => row[header.index]).includes(NA_VALUE)) {
|
|
80
|
+
transformedResponse.metaData.dimensions[header.name] = [...transformedResponse.metaData.dimensions[header.name], NA_VALUE];
|
|
81
|
+
transformedResponse.metaData.items[NA_VALUE] = NA_VALUE_ITEM;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return transformedResponse;
|
|
86
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dhis2/analytics",
|
|
3
|
-
"version": "28.0
|
|
3
|
+
"version": "28.1.0",
|
|
4
4
|
"main": "./build/cjs/index.js",
|
|
5
5
|
"module": "./build/es/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -42,10 +42,8 @@
|
|
|
42
42
|
"@testing-library/dom": "^10.4.0",
|
|
43
43
|
"@testing-library/jest-dom": "^6.6.3",
|
|
44
44
|
"@testing-library/react": "^16.3.0",
|
|
45
|
-
"
|
|
46
|
-
"enzyme-adapter-react-16": "^1.15.6",
|
|
45
|
+
"@testing-library/user-event": "^14.6.1",
|
|
47
46
|
"fs-extra": "^10.1.0",
|
|
48
|
-
"jest-enzyme": "^7.0.2",
|
|
49
47
|
"prop-types": "^15",
|
|
50
48
|
"react": "^18.3.1",
|
|
51
49
|
"react-dom": "^18.3.1",
|
package/build/cjs/components/OrgUnitDimension/__tests__/__snapshots__/OrgUnitDimension.spec.js.snap
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
-
|
|
3
|
-
exports[`The OrgUnitDimension component matches the snapshot 1`] = `
|
|
4
|
-
<div
|
|
5
|
-
className="container"
|
|
6
|
-
>
|
|
7
|
-
<div
|
|
8
|
-
className="userOrgUnitsWrapper"
|
|
9
|
-
>
|
|
10
|
-
<Checkbox
|
|
11
|
-
checked={false}
|
|
12
|
-
dataTest="dhis2-uicore-checkbox"
|
|
13
|
-
dense={true}
|
|
14
|
-
indeterminate={false}
|
|
15
|
-
label="User organisation unit"
|
|
16
|
-
onChange={[Function]}
|
|
17
|
-
/>
|
|
18
|
-
<Checkbox
|
|
19
|
-
checked={false}
|
|
20
|
-
dataTest="dhis2-uicore-checkbox"
|
|
21
|
-
dense={true}
|
|
22
|
-
indeterminate={false}
|
|
23
|
-
label="User sub-units"
|
|
24
|
-
onChange={[Function]}
|
|
25
|
-
/>
|
|
26
|
-
<Checkbox
|
|
27
|
-
checked={false}
|
|
28
|
-
dataTest="dhis2-uicore-checkbox"
|
|
29
|
-
dense={true}
|
|
30
|
-
indeterminate={false}
|
|
31
|
-
label="User sub-x2-units"
|
|
32
|
-
onChange={[Function]}
|
|
33
|
-
/>
|
|
34
|
-
</div>
|
|
35
|
-
<div
|
|
36
|
-
className="orgUnitTreeWrapper"
|
|
37
|
-
>
|
|
38
|
-
<OrganisationUnitTree
|
|
39
|
-
dataTest="org-unit-tree"
|
|
40
|
-
initiallyExpanded={Array []}
|
|
41
|
-
onChange={[Function]}
|
|
42
|
-
roots={Array []}
|
|
43
|
-
selected={Array []}
|
|
44
|
-
/>
|
|
45
|
-
</div>
|
|
46
|
-
<div
|
|
47
|
-
className="selectsWrapper"
|
|
48
|
-
>
|
|
49
|
-
<MultiSelect
|
|
50
|
-
dataTest="org-unit-level-select"
|
|
51
|
-
dense={true}
|
|
52
|
-
loading={true}
|
|
53
|
-
onChange={[Function]}
|
|
54
|
-
placeholder="Select a level"
|
|
55
|
-
selected={Array []}
|
|
56
|
-
/>
|
|
57
|
-
<MultiSelect
|
|
58
|
-
dataTest="org-unit-group-select"
|
|
59
|
-
dense={true}
|
|
60
|
-
loading={true}
|
|
61
|
-
onChange={[Function]}
|
|
62
|
-
placeholder="Select a group"
|
|
63
|
-
selected={Array []}
|
|
64
|
-
/>
|
|
65
|
-
</div>
|
|
66
|
-
<div
|
|
67
|
-
className="summaryWrapper"
|
|
68
|
-
>
|
|
69
|
-
<span
|
|
70
|
-
className="summaryText"
|
|
71
|
-
>
|
|
72
|
-
Nothing selected
|
|
73
|
-
</span>
|
|
74
|
-
<div
|
|
75
|
-
className="deselectButton"
|
|
76
|
-
>
|
|
77
|
-
<Button
|
|
78
|
-
disabled={true}
|
|
79
|
-
onClick={[Function]}
|
|
80
|
-
secondary={true}
|
|
81
|
-
small={true}
|
|
82
|
-
>
|
|
83
|
-
Deselect all
|
|
84
|
-
</Button>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
<style />
|
|
88
|
-
</div>
|
|
89
|
-
`;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _enzyme = require("enzyme");
|
|
4
|
-
var _react = _interopRequireDefault(require("react"));
|
|
5
|
-
var _PeriodTransfer = _interopRequireDefault(require("../PeriodTransfer.js"));
|
|
6
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
-
describe('The Period Selector component', () => {
|
|
8
|
-
let props;
|
|
9
|
-
let shallowPeriodTransfer;
|
|
10
|
-
const getWrapper = () => {
|
|
11
|
-
if (!shallowPeriodTransfer) {
|
|
12
|
-
shallowPeriodTransfer = (0, _enzyme.shallow)(/*#__PURE__*/_react.default.createElement(_PeriodTransfer.default, props));
|
|
13
|
-
}
|
|
14
|
-
return shallowPeriodTransfer;
|
|
15
|
-
};
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
props = {
|
|
18
|
-
initialSelectedPeriods: [],
|
|
19
|
-
onSelect: jest.fn(),
|
|
20
|
-
rightFooter: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null),
|
|
21
|
-
dataTest: 'period-dimension'
|
|
22
|
-
};
|
|
23
|
-
shallowPeriodTransfer = undefined;
|
|
24
|
-
});
|
|
25
|
-
it('matches the snapshot', () => {
|
|
26
|
-
const wrapper = getWrapper();
|
|
27
|
-
expect(wrapper).toMatchSnapshot();
|
|
28
|
-
});
|
|
29
|
-
});
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
-
|
|
3
|
-
exports[`The Fixed Period Single Select component matches the snapshot 1`] = `
|
|
4
|
-
<div
|
|
5
|
-
data-test="dhis2-analytics-fixedperiodselect"
|
|
6
|
-
>
|
|
7
|
-
<div
|
|
8
|
-
className="row"
|
|
9
|
-
>
|
|
10
|
-
<FixedPeriodFilter
|
|
11
|
-
currentPeriodType="MONTHLY"
|
|
12
|
-
currentYear="2014"
|
|
13
|
-
onSelectPeriodType={[Function]}
|
|
14
|
-
onSelectYear={[Function]}
|
|
15
|
-
/>
|
|
16
|
-
</div>
|
|
17
|
-
<SingleSelectField
|
|
18
|
-
clearText={[Function]}
|
|
19
|
-
dataTest="dhis2-uiwidgets-singleselectfield"
|
|
20
|
-
dense={true}
|
|
21
|
-
empty={[Function]}
|
|
22
|
-
filterPlaceholder={[Function]}
|
|
23
|
-
label="Period"
|
|
24
|
-
loadingText={[Function]}
|
|
25
|
-
noMatchText={[Function]}
|
|
26
|
-
onChange={[Function]}
|
|
27
|
-
selected="201405"
|
|
28
|
-
>
|
|
29
|
-
<SingleSelectOption
|
|
30
|
-
key="201401"
|
|
31
|
-
label="January 2014"
|
|
32
|
-
value="201401"
|
|
33
|
-
/>
|
|
34
|
-
<SingleSelectOption
|
|
35
|
-
key="201402"
|
|
36
|
-
label="February 2014"
|
|
37
|
-
value="201402"
|
|
38
|
-
/>
|
|
39
|
-
<SingleSelectOption
|
|
40
|
-
key="201403"
|
|
41
|
-
label="March 2014"
|
|
42
|
-
value="201403"
|
|
43
|
-
/>
|
|
44
|
-
<SingleSelectOption
|
|
45
|
-
key="201404"
|
|
46
|
-
label="April 2014"
|
|
47
|
-
value="201404"
|
|
48
|
-
/>
|
|
49
|
-
<SingleSelectOption
|
|
50
|
-
key="201405"
|
|
51
|
-
label="May 2014"
|
|
52
|
-
value="201405"
|
|
53
|
-
/>
|
|
54
|
-
<SingleSelectOption
|
|
55
|
-
key="201406"
|
|
56
|
-
label="June 2014"
|
|
57
|
-
value="201406"
|
|
58
|
-
/>
|
|
59
|
-
<SingleSelectOption
|
|
60
|
-
key="201407"
|
|
61
|
-
label="July 2014"
|
|
62
|
-
value="201407"
|
|
63
|
-
/>
|
|
64
|
-
<SingleSelectOption
|
|
65
|
-
key="201408"
|
|
66
|
-
label="August 2014"
|
|
67
|
-
value="201408"
|
|
68
|
-
/>
|
|
69
|
-
<SingleSelectOption
|
|
70
|
-
key="201409"
|
|
71
|
-
label="September 2014"
|
|
72
|
-
value="201409"
|
|
73
|
-
/>
|
|
74
|
-
<SingleSelectOption
|
|
75
|
-
key="201410"
|
|
76
|
-
label="October 2014"
|
|
77
|
-
value="201410"
|
|
78
|
-
/>
|
|
79
|
-
<SingleSelectOption
|
|
80
|
-
key="201411"
|
|
81
|
-
label="November 2014"
|
|
82
|
-
value="201411"
|
|
83
|
-
/>
|
|
84
|
-
<SingleSelectOption
|
|
85
|
-
key="201412"
|
|
86
|
-
label="December 2014"
|
|
87
|
-
value="201412"
|
|
88
|
-
/>
|
|
89
|
-
</SingleSelectField>
|
|
90
|
-
<style />
|
|
91
|
-
</div>
|
|
92
|
-
`;
|
package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
-
|
|
3
|
-
exports[`The Period Dimension component matches the snapshot 1`] = `
|
|
4
|
-
<PeriodTransfer
|
|
5
|
-
dataTest="period-dimension"
|
|
6
|
-
onSelect={[Function]}
|
|
7
|
-
periodsSettings={
|
|
8
|
-
Object {
|
|
9
|
-
"calendar": "gregory",
|
|
10
|
-
"locale": "en",
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
rightFooter={<React.Fragment />}
|
|
14
|
-
selectedItems={Array []}
|
|
15
|
-
/>
|
|
16
|
-
`;
|