@dhis2/analytics 20.6.3 → 21.0.0-alpha.2
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__/Filter.stories.js +2 -2
- package/build/cjs/__demo__/FixedPeriodSelect.stories.js +2 -2
- package/build/cjs/__demo__/OpenFileDialog.stories.js +1 -1
- package/build/cjs/__demo__/OrgUnitDimension.stories.js +95 -0
- package/build/cjs/__demo__/PivotTable.stories.js +2 -2
- package/build/cjs/api/analytics/AnalyticsBase.js +1 -1
- package/build/cjs/api/analytics/AnalyticsRequest.js +1 -1
- package/build/cjs/api/analytics/AnalyticsRequestBase.js +3 -3
- package/build/cjs/api/analytics/AnalyticsRequestPropertiesMixin.js +7 -7
- package/build/cjs/api/analytics/AnalyticsResponse.js +2 -2
- package/build/cjs/api/analytics/__tests__/AnalyticsAggregate.spec.js +11 -1
- package/build/cjs/api/analytics/__tests__/AnalyticsRequest.spec.js +9 -9
- package/build/cjs/api/analytics/__tests__/AnalyticsRequestBase.spec.js +4 -4
- package/build/cjs/api/analytics/utils.js +1 -1
- package/build/cjs/api/dimensions.js +37 -37
- package/build/cjs/api/organisationUnits.js +100 -46
- package/build/cjs/components/DataDimension/DataTypesSelector.js +3 -3
- package/build/cjs/components/DataDimension/DetailSelector.js +2 -2
- package/build/cjs/components/DataDimension/GroupSelector.js +9 -9
- package/build/cjs/components/DataDimension/ItemSelector.js +19 -19
- package/build/cjs/components/DataDimension/MetricSelector.js +3 -3
- package/build/cjs/components/DataDimension/styles/DataTypesSelector.style.js +1 -1
- package/build/cjs/components/DataDimension/styles/DetailSelector.style.js +1 -1
- package/build/cjs/components/DataDimension/styles/GroupSelector.style.js +1 -1
- package/build/cjs/components/DataDimension/styles/MetricSelector.style.js +1 -1
- package/build/cjs/components/DimensionMenu.js +10 -10
- package/build/cjs/components/DimensionsPanel/DimensionsPanel.js +2 -2
- package/build/cjs/components/DimensionsPanel/List/DimensionItem.js +5 -5
- package/build/cjs/components/DimensionsPanel/List/DimensionLabel.js +2 -2
- package/build/cjs/components/DimensionsPanel/List/DimensionList.js +10 -10
- package/build/cjs/components/DimensionsPanel/List/styles/DimensionList.style.js +1 -1
- package/build/cjs/components/DimensionsPanel/styles/DimensionsPanel.style.js +1 -1
- package/build/cjs/components/DynamicDimension/DynamicDimension.js +4 -4
- package/build/cjs/components/DynamicDimension/ItemSelector.js +8 -8
- package/build/cjs/components/DynamicDimension/styles/DynamicDimension.style.js +1 -1
- package/build/cjs/components/FileMenu/DeleteDialog.js +4 -4
- package/build/cjs/components/FileMenu/FileMenu.js +7 -7
- package/build/cjs/components/FileMenu/FileMenu.styles.js +1 -1
- package/build/cjs/components/FileMenu/GetLinkDialog.js +3 -3
- package/build/cjs/components/FileMenu/RenameDialog.js +4 -4
- package/build/cjs/components/FileMenu/SaveAsDialog.js +4 -4
- package/build/cjs/components/FileMenu/__tests__/DeleteDialog.spec.js +1 -1
- package/build/cjs/components/FileMenu/__tests__/RenameDialog.spec.js +1 -1
- package/build/cjs/components/FileMenu/__tests__/SaveAsDialog.spec.js +1 -1
- package/build/cjs/components/FileMenu/utils.js +3 -3
- package/build/cjs/components/Filter/Filter.js +1 -1
- package/build/cjs/components/Filter/styles/Filter.style.js +1 -1
- package/build/cjs/components/LegendKey/LegendKey.js +9 -9
- package/build/cjs/components/LegendKey/styles/LegendKey.style.js +1 -1
- package/build/cjs/components/OpenFileDialog/CustomSelectOption.js +2 -2
- package/build/cjs/components/OpenFileDialog/OpenFileDialog.js +21 -21
- package/build/cjs/components/OpenFileDialog/OpenFileDialog.styles.js +1 -1
- package/build/cjs/components/OpenFileDialog/styles/CustomSelectOption.style.js +1 -1
- package/build/cjs/components/Options/VisualizationOptions.js +2 -2
- package/build/cjs/components/Options/styles/VisualizationOptions.style.js +10 -10
- package/build/cjs/components/OrgUnitDimension/OrgUnitDimension.js +168 -203
- package/build/cjs/components/OrgUnitDimension/OrgUnitDimensionOld.js +244 -0
- package/build/cjs/components/OrgUnitDimension/styles/OrgUnitDimension.style.js +5 -2
- package/build/cjs/components/PeriodDimension/FixedPeriodFilter.js +5 -5
- package/build/cjs/components/PeriodDimension/FixedPeriodSelect.js +6 -6
- package/build/cjs/components/PeriodDimension/PeriodTransfer.js +11 -11
- package/build/cjs/components/PeriodDimension/RelativePeriodFilter.js +2 -2
- package/build/cjs/components/PeriodDimension/styles/FixedPeriodSelect.style.js +1 -1
- package/build/cjs/components/PeriodDimension/styles/PeriodFilter.style.js +1 -1
- package/build/cjs/components/PeriodDimension/utils/fixedPeriods.js +49 -49
- package/build/cjs/components/PivotTable/PivotTable.js +2 -2
- package/build/cjs/components/PivotTable/PivotTableCell.js +3 -3
- package/build/cjs/components/PivotTable/PivotTableColumnHeaderCell.js +2 -2
- package/build/cjs/components/PivotTable/PivotTableContainer.js +2 -2
- package/build/cjs/components/PivotTable/PivotTableEngineContext.js +2 -2
- package/build/cjs/components/PivotTable/PivotTableSortIcon.js +2 -2
- package/build/cjs/components/PivotTable/PivotTableTitleRow.js +4 -4
- package/build/cjs/components/PivotTable/PivotTableValueCell.js +2 -2
- package/build/cjs/components/PivotTable/styles/PivotTable.style.js +3 -3
- package/build/cjs/components/TransferOption.js +7 -7
- package/build/cjs/components/styles/DimensionSelector.style.js +1 -1
- package/build/cjs/components/styles/TransferOption.style.js +1 -1
- package/build/cjs/index.js +6 -6
- package/build/cjs/locales/en/translations.json +5 -0
- package/build/cjs/locales/ru/translations.json +1 -1
- package/build/cjs/locales/zh/translations.json +7 -7
- package/build/cjs/modules/axis.js +1 -1
- package/build/cjs/modules/layoutUiRules/rules.js +1 -1
- package/build/cjs/modules/ouIdHelper/index.js +9 -3
- package/build/cjs/modules/pivotTable/PivotTableEngine.js +3 -3
- package/build/cjs/modules/pivotTable/measureText.js +1 -1
- package/build/cjs/modules/relativeItems/index.js +1 -1
- package/build/cjs/modules/visTypes.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/addTrendLines.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/axis.js +2 -2
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/getAxisTitle.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/index.js +2 -2
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/legend.js +19 -8
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/legendSet.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/plotOptions.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/index.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/scatter.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/xAxis/index.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/yAxis/gauge.js +3 -3
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/yAxis/index.js +2 -2
- package/build/cjs/visualizations/config/generators/dhis/singleValue.js +5 -5
- package/build/cjs/visualizations/config/index.js +3 -3
- package/build/cjs/visualizations/store/adapters/dhis_dhis/index.js +1 -1
- package/build/cjs/visualizations/store/adapters/dhis_highcharts/index.js +1 -1
- package/build/cjs/visualizations/store/adapters/dhis_highcharts/twoCategory.js +1 -1
- package/build/cjs/visualizations/store/index.js +2 -2
- package/build/cjs/visualizations/util/axisId.js +1 -1
- package/build/cjs/visualizations/util/getFilterText.js +3 -3
- package/build/es/__demo__/OpenFileDialog.stories.js +1 -1
- package/build/es/__demo__/OrgUnitDimension.stories.js +84 -0
- package/build/es/api/analytics/AnalyticsBase.js +1 -1
- package/build/es/api/analytics/AnalyticsRequest.js +1 -1
- package/build/es/api/analytics/AnalyticsRequestBase.js +3 -3
- package/build/es/api/analytics/AnalyticsRequestPropertiesMixin.js +7 -7
- package/build/es/api/analytics/AnalyticsResponse.js +2 -2
- package/build/es/api/analytics/__tests__/AnalyticsAggregate.spec.js +11 -1
- package/build/es/api/analytics/__tests__/AnalyticsRequest.spec.js +9 -9
- package/build/es/api/analytics/__tests__/AnalyticsRequestBase.spec.js +4 -4
- package/build/es/api/analytics/utils.js +1 -1
- package/build/es/api/dimensions.js +39 -39
- package/build/es/api/organisationUnits.js +93 -43
- package/build/es/components/DataDimension/DataTypesSelector.js +3 -3
- package/build/es/components/DataDimension/DetailSelector.js +2 -2
- package/build/es/components/DataDimension/GroupSelector.js +7 -7
- package/build/es/components/DataDimension/ItemSelector.js +17 -17
- package/build/es/components/DataDimension/MetricSelector.js +3 -3
- package/build/es/components/DataDimension/styles/DataTypesSelector.style.js +1 -1
- package/build/es/components/DataDimension/styles/DetailSelector.style.js +1 -1
- package/build/es/components/DataDimension/styles/GroupSelector.style.js +1 -1
- package/build/es/components/DataDimension/styles/MetricSelector.style.js +1 -1
- package/build/es/components/DimensionMenu.js +10 -10
- package/build/es/components/DimensionsPanel/List/DimensionItem.js +3 -3
- package/build/es/components/DimensionsPanel/List/DimensionList.js +8 -8
- package/build/es/components/DimensionsPanel/List/styles/DimensionList.style.js +1 -1
- package/build/es/components/DimensionsPanel/styles/DimensionsPanel.style.js +1 -1
- package/build/es/components/DynamicDimension/DynamicDimension.js +4 -4
- package/build/es/components/DynamicDimension/ItemSelector.js +6 -6
- package/build/es/components/DynamicDimension/styles/DynamicDimension.style.js +1 -1
- package/build/es/components/FileMenu/DeleteDialog.js +1 -1
- package/build/es/components/FileMenu/FileMenu.js +4 -4
- package/build/es/components/FileMenu/FileMenu.styles.js +1 -1
- package/build/es/components/FileMenu/GetLinkDialog.js +2 -2
- package/build/es/components/FileMenu/RenameDialog.js +1 -1
- package/build/es/components/FileMenu/SaveAsDialog.js +1 -1
- package/build/es/components/FileMenu/__tests__/DeleteDialog.spec.js +1 -1
- package/build/es/components/FileMenu/__tests__/RenameDialog.spec.js +1 -1
- package/build/es/components/FileMenu/__tests__/SaveAsDialog.spec.js +1 -1
- package/build/es/components/FileMenu/utils.js +3 -3
- package/build/es/components/Filter/Filter.js +1 -1
- package/build/es/components/Filter/styles/Filter.style.js +1 -1
- package/build/es/components/LegendKey/LegendKey.js +9 -9
- package/build/es/components/LegendKey/styles/LegendKey.style.js +1 -1
- package/build/es/components/OpenFileDialog/CustomSelectOption.js +2 -2
- package/build/es/components/OpenFileDialog/OpenFileDialog.js +19 -19
- package/build/es/components/OpenFileDialog/OpenFileDialog.styles.js +1 -1
- package/build/es/components/OpenFileDialog/styles/CustomSelectOption.style.js +1 -1
- package/build/es/components/Options/styles/VisualizationOptions.style.js +10 -10
- package/build/es/components/OrgUnitDimension/OrgUnitDimension.js +168 -204
- package/build/es/components/OrgUnitDimension/OrgUnitDimensionOld.js +220 -0
- package/build/es/components/OrgUnitDimension/styles/OrgUnitDimension.style.js +3 -2
- package/build/es/components/PeriodDimension/FixedPeriodFilter.js +5 -5
- package/build/es/components/PeriodDimension/FixedPeriodSelect.js +3 -3
- package/build/es/components/PeriodDimension/PeriodTransfer.js +9 -9
- package/build/es/components/PeriodDimension/RelativePeriodFilter.js +2 -2
- package/build/es/components/PeriodDimension/styles/FixedPeriodSelect.style.js +1 -1
- package/build/es/components/PeriodDimension/styles/PeriodFilter.style.js +1 -1
- package/build/es/components/PeriodDimension/utils/fixedPeriods.js +49 -49
- package/build/es/components/PivotTable/PivotTableCell.js +3 -3
- package/build/es/components/PivotTable/PivotTableColumnHeaderCell.js +2 -2
- package/build/es/components/PivotTable/PivotTableContainer.js +2 -2
- package/build/es/components/PivotTable/PivotTableSortIcon.js +2 -2
- package/build/es/components/PivotTable/PivotTableTitleRow.js +2 -2
- package/build/es/components/PivotTable/styles/PivotTable.style.js +3 -3
- package/build/es/components/TransferOption.js +6 -6
- package/build/es/components/styles/DimensionSelector.style.js +1 -1
- package/build/es/components/styles/TransferOption.style.js +1 -1
- package/build/es/index.js +1 -1
- package/build/es/locales/en/translations.json +5 -0
- package/build/es/locales/ru/translations.json +1 -1
- package/build/es/locales/zh/translations.json +7 -7
- package/build/es/modules/axis.js +1 -1
- package/build/es/modules/layoutUiRules/rules.js +1 -1
- package/build/es/modules/ouIdHelper/index.js +5 -2
- package/build/es/modules/pivotTable/PivotTableEngine.js +3 -3
- package/build/es/modules/pivotTable/measureText.js +1 -1
- package/build/es/modules/relativeItems/index.js +2 -2
- package/build/es/modules/visTypes.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/addTrendLines.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/axis.js +2 -2
- package/build/es/visualizations/config/adapters/dhis_highcharts/getAxisTitle.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/legend.js +19 -8
- package/build/es/visualizations/config/adapters/dhis_highcharts/legendSet.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/plotOptions.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/title/index.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/title/scatter.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/xAxis/index.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/yAxis/gauge.js +3 -3
- package/build/es/visualizations/config/adapters/dhis_highcharts/yAxis/index.js +2 -2
- package/build/es/visualizations/config/generators/dhis/singleValue.js +5 -5
- package/build/es/visualizations/config/index.js +3 -3
- package/build/es/visualizations/store/adapters/dhis_dhis/index.js +1 -1
- package/build/es/visualizations/store/adapters/dhis_highcharts/index.js +1 -1
- package/build/es/visualizations/store/adapters/dhis_highcharts/twoCategory.js +1 -1
- package/build/es/visualizations/store/index.js +2 -2
- package/build/es/visualizations/util/axisId.js +1 -1
- package/build/es/visualizations/util/getFilterText.js +3 -3
- package/package.json +2 -1
- package/CHANGELOG.md +0 -2742
- package/build/cjs/api/organisationUnits-dataEngine.js +0 -119
- package/build/cjs/components/OrgUnitDimension/__tests__/OrgUnitDimension.spec.js +0 -96
- package/build/es/api/organisationUnits-dataEngine.js +0 -96
- package/build/es/components/OrgUnitDimension/__tests__/OrgUnitDimension.spec.js +0 -86
|
@@ -34,15 +34,15 @@ function _default({
|
|
|
34
34
|
const _generator = _generators.default[outputFormat];
|
|
35
35
|
|
|
36
36
|
if (_validator === _validators.default.noValidation) {
|
|
37
|
-
onWarning(
|
|
37
|
+
onWarning(`No validation implementation for config input format "${inputFormat}"`);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
if (!_adapter) {
|
|
41
|
-
onError(
|
|
41
|
+
onError(`No config tranformation implementation for format "${inputFormat}" to format "${outputFormat}"`);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
if (!_generator) {
|
|
45
|
-
onError(
|
|
45
|
+
onError(`No visualization implementation for format ${outputFormat}`);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
const DEFAULT_EXTRA_OPTIONS = {
|
|
@@ -41,7 +41,7 @@ function getDefault(acc, seriesIds, categoryIds, idValueMap, metaData) {
|
|
|
41
41
|
seriesIds.forEach(seriesId => {
|
|
42
42
|
const serieData = [];
|
|
43
43
|
categoryIds.forEach(categoryId => {
|
|
44
|
-
const value = idValueMap.get(
|
|
44
|
+
const value = idValueMap.get(`${seriesId}-${categoryId}`); // DHIS2-1261: 0 is a valid value
|
|
45
45
|
// undefined value means the key was not found within the rows
|
|
46
46
|
// in that case null is returned as value in the serie
|
|
47
47
|
|
|
@@ -56,7 +56,7 @@ function getDefault(acc, series, categories, idValueMap, metaData) {
|
|
|
56
56
|
series[0].forEach(serieItemId => {
|
|
57
57
|
const serieData = [];
|
|
58
58
|
categories[0].forEach(categoryItemId => {
|
|
59
|
-
const value = idValueMap.get(
|
|
59
|
+
const value = idValueMap.get(`${serieItemId}-${categoryItemId}`); // DHIS2-1261: 0 is a valid value
|
|
60
60
|
// undefined value means the key was not found within the rows
|
|
61
61
|
// in that case null is returned as value in the serie
|
|
62
62
|
// this is to keep the correct indexes for the values within the serie array
|
|
@@ -16,7 +16,7 @@ function _default(acc, series, categories, idValueMap, metaData) {
|
|
|
16
16
|
categories[0].forEach(category1ItemId => {
|
|
17
17
|
const groupData = [];
|
|
18
18
|
categories[1].forEach(category2ItemId => {
|
|
19
|
-
const value = idValueMap.get(
|
|
19
|
+
const value = idValueMap.get(`${seriesItemId}-${category1ItemId}-${category2ItemId}`);
|
|
20
20
|
groupData.push(value === undefined ? null : parseFloat(value));
|
|
21
21
|
});
|
|
22
22
|
groupedData.push(groupData);
|
|
@@ -25,11 +25,11 @@ function _default({
|
|
|
25
25
|
const _adapter = _adapters.default[inputFormat + '_' + outputFormat];
|
|
26
26
|
|
|
27
27
|
if (_validator === _validators.default.noValidation) {
|
|
28
|
-
warning(
|
|
28
|
+
warning(`Validation not supported for data input format "${inputFormat}"`);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
if (!_adapter) {
|
|
32
|
-
error(
|
|
32
|
+
error(`Data tranformation from "${inputFormat}" to "${outputFormat}" is not supported`);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
this.data = data;
|
|
@@ -6,6 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.getAxisStringFromId = void 0;
|
|
7
7
|
const AXIS_ID_PREFIX = 'AXIS_';
|
|
8
8
|
|
|
9
|
-
const getAxisStringFromId = id =>
|
|
9
|
+
const getAxisStringFromId = id => `${AXIS_ID_PREFIX}${id}`;
|
|
10
10
|
|
|
11
11
|
exports.getAxisStringFromId = getAxisStringFromId;
|
|
@@ -54,9 +54,9 @@ function _default(filters, metaData) {
|
|
|
54
54
|
} // otherwise use the values directly
|
|
55
55
|
// this is a temporary fix to avoid app crashing when using filters with data items in EV
|
|
56
56
|
else {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
sectionParts.push(metaData.items[filter.dimension].name + ': ' + filterItems.join(', '));
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
titleFragments.push(sectionParts.join(', '));
|
|
@@ -12,7 +12,7 @@ const user = {
|
|
|
12
12
|
username: 'admin'
|
|
13
13
|
};
|
|
14
14
|
|
|
15
|
-
const onFileSelect = id => alert(
|
|
15
|
+
const onFileSelect = id => alert(`Opening ${id}`);
|
|
16
16
|
|
|
17
17
|
storiesOf('OpenFileDialog', module).add('List of visualizations', () => /*#__PURE__*/React.createElement(Provider, {
|
|
18
18
|
config: configMock
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { DataProvider } from '@dhis2/app-runtime';
|
|
2
|
+
import { storiesOf } from '@storybook/react';
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
import OrgUnitDimension from '../components/OrgUnitDimension/OrgUnitDimension';
|
|
5
|
+
|
|
6
|
+
const Wrapper = story => /*#__PURE__*/React.createElement(DataProvider, {
|
|
7
|
+
baseUrl: "http://localhost:8080/",
|
|
8
|
+
apiVersion: ""
|
|
9
|
+
}, story());
|
|
10
|
+
|
|
11
|
+
const rootOrgUnit = 'ImspTQPwCqd'; // Sierra Leone
|
|
12
|
+
|
|
13
|
+
storiesOf('OrgUnitDimension', module).addDecorator(Wrapper).add('None selected', () => {
|
|
14
|
+
const [selected, setSelected] = useState([]);
|
|
15
|
+
return /*#__PURE__*/React.createElement(OrgUnitDimension, {
|
|
16
|
+
selected: selected,
|
|
17
|
+
onSelect: response => setSelected(response.items),
|
|
18
|
+
root: rootOrgUnit
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
storiesOf('OrgUnitDimension', module).addDecorator(Wrapper).add('Root selected', () => {
|
|
22
|
+
const [selected, setSelected] = useState([{
|
|
23
|
+
id: 'ImspTQPwCqd',
|
|
24
|
+
path: '/ImspTQPwCqd',
|
|
25
|
+
name: 'Sierra Leone'
|
|
26
|
+
}]);
|
|
27
|
+
return /*#__PURE__*/React.createElement(OrgUnitDimension, {
|
|
28
|
+
selected: selected,
|
|
29
|
+
onSelect: response => setSelected(response.items),
|
|
30
|
+
root: rootOrgUnit
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
storiesOf('OrgUnitDimension', module).addDecorator(Wrapper).add('Single level 2 child selected', () => {
|
|
34
|
+
const [selected, setSelected] = useState([{
|
|
35
|
+
id: 'fdc6uOvgoji',
|
|
36
|
+
path: '/ImspTQPwCqd/fdc6uOvgoji',
|
|
37
|
+
name: 'Bombali'
|
|
38
|
+
}]);
|
|
39
|
+
return /*#__PURE__*/React.createElement(OrgUnitDimension, {
|
|
40
|
+
selected: selected,
|
|
41
|
+
onSelect: response => setSelected(response.items),
|
|
42
|
+
root: rootOrgUnit
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
storiesOf('OrgUnitDimension', module).addDecorator(Wrapper).add('Multiple level 2 children selected', () => {
|
|
46
|
+
const [selected, setSelected] = useState([{
|
|
47
|
+
id: 'O6uvpzGd5pu',
|
|
48
|
+
path: '/ImspTQPwCqd/O6uvpzGd5pu',
|
|
49
|
+
name: 'Bo'
|
|
50
|
+
}, {
|
|
51
|
+
id: 'fdc6uOvgoji',
|
|
52
|
+
path: '/ImspTQPwCqd/fdc6uOvgoji',
|
|
53
|
+
name: 'Bombali'
|
|
54
|
+
}, {
|
|
55
|
+
id: 'lc3eMKXaEfw',
|
|
56
|
+
path: '/ImspTQPwCqd/lc3eMKXaEfw',
|
|
57
|
+
name: 'Bonthe'
|
|
58
|
+
}]);
|
|
59
|
+
return /*#__PURE__*/React.createElement(OrgUnitDimension, {
|
|
60
|
+
selected: selected,
|
|
61
|
+
onSelect: response => setSelected(response.items),
|
|
62
|
+
root: rootOrgUnit
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
storiesOf('OrgUnitDimension', module).addDecorator(Wrapper).add('Multiple selected across different levels', () => {
|
|
66
|
+
const [selected, setSelected] = useState([{
|
|
67
|
+
id: 'fdc6uOvgoji',
|
|
68
|
+
path: '/ImspTQPwCqd/fdc6uOvgoji',
|
|
69
|
+
name: 'Bombali'
|
|
70
|
+
}, {
|
|
71
|
+
id: 'KKkLOTpMXGV',
|
|
72
|
+
path: '/ImspTQPwCqd/fdc6uOvgoji/KKkLOTpMXGV',
|
|
73
|
+
name: 'Bombali Sebora'
|
|
74
|
+
}, {
|
|
75
|
+
id: 'GQcsUZf81vP',
|
|
76
|
+
path: '/ImspTQPwCqd/fdc6uOvgoji/KKkLOTpMXGV/GQcsUZf81vP',
|
|
77
|
+
name: 'Govt. Hosp. Makeni'
|
|
78
|
+
}]);
|
|
79
|
+
return /*#__PURE__*/React.createElement(OrgUnitDimension, {
|
|
80
|
+
selected: selected,
|
|
81
|
+
onSelect: response => setSelected(response.items),
|
|
82
|
+
root: rootOrgUnit
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -46,7 +46,7 @@ class AnalyticsRequest extends AnalyticsRequestDimensionsMixin(AnalyticsRequestF
|
|
|
46
46
|
let dimension = d.dimension;
|
|
47
47
|
|
|
48
48
|
if (d.filter) {
|
|
49
|
-
dimension +=
|
|
49
|
+
dimension += `:${d.filter}`;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
request = request.addDimension(dimension, d.items.map(item => item.id));
|
|
@@ -62,13 +62,13 @@ class AnalyticsRequestBase {
|
|
|
62
62
|
encodedItems.sort();
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
return
|
|
65
|
+
return `${dimension}:${encodedItems.join(';')}`;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
return dimension;
|
|
69
69
|
});
|
|
70
70
|
const endPoint = [this.endPoint, this.path, this.program].filter(e => !!e).join('/');
|
|
71
|
-
return
|
|
71
|
+
return `${endPoint}.${this.format}?dimension=${encodedDimensions.join('&dimension=')}`;
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
74
|
* @private
|
|
@@ -103,7 +103,7 @@ class AnalyticsRequestBase {
|
|
|
103
103
|
encodedItems.sort();
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
-
return
|
|
106
|
+
return `${dimension}:${encodedItems.join(';')}`;
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
return dimension;
|
|
@@ -97,7 +97,7 @@ class extends base {
|
|
|
97
97
|
if (aggregationTypes.has(aggregationType)) {
|
|
98
98
|
this.parameters.aggregationType = aggregationType;
|
|
99
99
|
} else if (aggregationType !== 'DEFAULT') {
|
|
100
|
-
console.warn(
|
|
100
|
+
console.warn(`analytics.request.withAggregationType(): "${value}" not listed as possible value`);
|
|
101
101
|
this.parameters.aggregationType = value;
|
|
102
102
|
}
|
|
103
103
|
|
|
@@ -333,7 +333,7 @@ class extends base {
|
|
|
333
333
|
if (displayProperties.has(displayProperty)) {
|
|
334
334
|
this.parameters.displayProperty = displayProperty;
|
|
335
335
|
} else {
|
|
336
|
-
console.warn(
|
|
336
|
+
console.warn(`analytics.request.withDisplayProperty(): "${value}" not listed as possible value`);
|
|
337
337
|
this.parameters.displayProperty = value;
|
|
338
338
|
}
|
|
339
339
|
|
|
@@ -580,7 +580,7 @@ class extends base {
|
|
|
580
580
|
if (eventStatuses.has(eventStatus)) {
|
|
581
581
|
this.parameters.eventStatus = eventStatus;
|
|
582
582
|
} else {
|
|
583
|
-
console.warn(
|
|
583
|
+
console.warn(`analytics.request.withEventStatus(): "${value}" not listed as possible value`);
|
|
584
584
|
this.parameters.eventStatus = value;
|
|
585
585
|
}
|
|
586
586
|
|
|
@@ -606,7 +606,7 @@ class extends base {
|
|
|
606
606
|
if (programStatuses.has(programStatus)) {
|
|
607
607
|
this.parameters.programStatus = programStatus;
|
|
608
608
|
} else {
|
|
609
|
-
console.warn(
|
|
609
|
+
console.warn(`analytics.request.withProgramStatus(): "${value}" not listed as possible value`);
|
|
610
610
|
this.parameters.programStatus = value;
|
|
611
611
|
}
|
|
612
612
|
|
|
@@ -632,7 +632,7 @@ class extends base {
|
|
|
632
632
|
if (ouModes.has(ouMode)) {
|
|
633
633
|
this.parameters.ouMode = ouMode;
|
|
634
634
|
} else {
|
|
635
|
-
console.warn(
|
|
635
|
+
console.warn(`analytics.request.withOuMode(): "${value}" not listed as possible value`);
|
|
636
636
|
this.parameters.ouMode = value;
|
|
637
637
|
}
|
|
638
638
|
|
|
@@ -770,7 +770,7 @@ class extends base {
|
|
|
770
770
|
if (sortOrders.has(sortOrder)) {
|
|
771
771
|
this.parameters.sortOrder = sortOrder;
|
|
772
772
|
} else {
|
|
773
|
-
console.warn(
|
|
773
|
+
console.warn(`analytics.request.withSortOrder(): "${value}" not listed as possible value`);
|
|
774
774
|
this.parameters.sortOrder = value;
|
|
775
775
|
}
|
|
776
776
|
|
|
@@ -817,7 +817,7 @@ class extends base {
|
|
|
817
817
|
if (outputTypes.has(type)) {
|
|
818
818
|
this.parameters.outputType = type;
|
|
819
819
|
} else {
|
|
820
|
-
console.warn(
|
|
820
|
+
console.warn(`analytics.request.withOutputType(): "${value}" not listed as possible value`);
|
|
821
821
|
this.parameters.outputType = value;
|
|
822
822
|
}
|
|
823
823
|
|
|
@@ -14,7 +14,7 @@ const getParseMiddleware = type => {
|
|
|
14
14
|
switch (type) {
|
|
15
15
|
case 'STRING':
|
|
16
16
|
case 'TEXT':
|
|
17
|
-
return value =>
|
|
17
|
+
return value => `${value}`;
|
|
18
18
|
|
|
19
19
|
case 'INTEGER':
|
|
20
20
|
case 'NUMBER':
|
|
@@ -41,7 +41,7 @@ const isCollectHeader = (header, dimensions) => {
|
|
|
41
41
|
return Boolean(Array.isArray(dimensions) && dimensions.length === 0);
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
const getPrefixedId = (id, prefix) =>
|
|
44
|
+
const getPrefixedId = (id, prefix) => `${prefix || ''} ${id}`;
|
|
45
45
|
|
|
46
46
|
const getNameByIdsByValueType = (id, valueType) => {
|
|
47
47
|
if (valueType === 'BOOLEAN') {
|
|
@@ -2,7 +2,17 @@ import fixtures from '../../../__fixtures__/fixtures';
|
|
|
2
2
|
import DataEngineMock from '../__mocks__/DataEngine';
|
|
3
3
|
import AnalyticsAggregate from '../AnalyticsAggregate';
|
|
4
4
|
import AnalyticsRequest from '../AnalyticsRequest';
|
|
5
|
-
const debugSqlFixture =
|
|
5
|
+
const debugSqlFixture = `select de.name as de_name, de.uid as de_uid, de.dataelementid as de_id, pe.startdate as
|
|
6
|
+
start_date, pe.enddate as end_date, pt.name as pt_name, ou.name as ou_name, ou.uid as ou_uid, ou.organisationunitid as
|
|
7
|
+
ou_id, coc.name as coc_name, coc.uid as coc_uid, coc.categoryoptioncomboid as coc_id, aoc.name as aoc_name, aoc.uid as
|
|
8
|
+
aoc_uid, aoc.categoryoptioncomboid as aoc_id, dv.value as datavalue from datavalue dv inner join dataelement de on
|
|
9
|
+
dv.dataelementid = de.dataelementid inner join period pe on dv.periodid = pe.periodid inner join periodtype pt on
|
|
10
|
+
pe.periodtypeid = pt.periodtypeid inner join organisationunit ou on dv.sourceid = ou.organisationunitid inner join
|
|
11
|
+
categoryoptioncombo coc on dv.categoryoptioncomboid = coc.categoryoptioncomboid inner join categoryoptioncombo aoc on
|
|
12
|
+
dv.attributeoptioncomboid = aoc.categoryoptioncomboid where dv.dataelementid in (359596,359597) and ((pe.startdate >=
|
|
13
|
+
'2016-01-01' and pe.enddate <= '2016-03-31') or (pe.startdate >= '2016-04-01' and pe.enddate <= '2016-06-30') ) and
|
|
14
|
+
((dv.sourceid in (select organisationunitid from _orgunitstructure where idlevel2 = 264)) ) and dv.deleted is false
|
|
15
|
+
limit 100000`;
|
|
6
16
|
describe('Analytics.aggregate', () => {
|
|
7
17
|
let aggregate;
|
|
8
18
|
let request;
|
|
@@ -3,7 +3,7 @@ import AnalyticsRequest from '../AnalyticsRequest';
|
|
|
3
3
|
let request;
|
|
4
4
|
let expectedParameters;
|
|
5
5
|
|
|
6
|
-
const getFuncName = parameter =>
|
|
6
|
+
const getFuncName = parameter => `with${parameter.charAt(0).toUpperCase()}${parameter.slice(1)}`;
|
|
7
7
|
|
|
8
8
|
describe('AnalyticsRequest', () => {
|
|
9
9
|
beforeEach(() => {
|
|
@@ -234,12 +234,12 @@ describe('AnalyticsRequest', () => {
|
|
|
234
234
|
;
|
|
235
235
|
['aggregateData', 'coordinatesOnly', 'collapseDataDimensions', 'hideEmptyRows', 'hideEmptyColumns', 'hierarchyMeta', 'ignoreLimit', 'includeClusterPoints', 'includeNumDen', 'showHierarchy', 'skipData', 'skipMeta', 'skipRounding', 'tableLayout', 'includeMetadataDetails'].forEach(parameter => {
|
|
236
236
|
const funcName = getFuncName(parameter);
|
|
237
|
-
it(
|
|
237
|
+
it(`should add the ${parameter} parameter with default value`, () => {
|
|
238
238
|
request[funcName]();
|
|
239
239
|
expectedParameters[parameter] = true;
|
|
240
240
|
expect(request.parameters).toEqual(expectedParameters);
|
|
241
241
|
});
|
|
242
|
-
it(
|
|
242
|
+
it(`should replace the ${parameter} parameter on subsequent calls with the specified value`, () => {
|
|
243
243
|
request[funcName](false);
|
|
244
244
|
expectedParameters[parameter] = false;
|
|
245
245
|
expect(request.parameters).toEqual(expectedParameters);
|
|
@@ -255,18 +255,18 @@ describe('AnalyticsRequest', () => {
|
|
|
255
255
|
'stage', 'startDate', 'userOrgUnit', 'value' // XXX
|
|
256
256
|
].forEach(parameter => {
|
|
257
257
|
const funcName = getFuncName(parameter);
|
|
258
|
-
it(
|
|
258
|
+
it(`should add the ${parameter} parameter with the specified value`, () => {
|
|
259
259
|
request[funcName]('test');
|
|
260
260
|
expectedParameters[parameter] = 'test';
|
|
261
261
|
expect(request.parameters).toEqual(expectedParameters);
|
|
262
262
|
});
|
|
263
|
-
it(
|
|
263
|
+
it(`should replace the ${parameter} parameter on subsequent calls with the specified value`, () => {
|
|
264
264
|
request = request[funcName]('test');
|
|
265
265
|
request[funcName]('test2');
|
|
266
266
|
expectedParameters[parameter] = 'test2';
|
|
267
267
|
expect(request.parameters).toEqual(expectedParameters);
|
|
268
268
|
});
|
|
269
|
-
it(
|
|
269
|
+
it(`should not replace the ${parameter} parameter when called without passing a value`, () => {
|
|
270
270
|
request = request[funcName]('test');
|
|
271
271
|
request[funcName]();
|
|
272
272
|
expectedParameters[parameter] = 'test';
|
|
@@ -282,17 +282,17 @@ describe('AnalyticsRequest', () => {
|
|
|
282
282
|
Object.entries(params).forEach(([key, value]) => {
|
|
283
283
|
const parameter = key;
|
|
284
284
|
const funcName = getFuncName(parameter);
|
|
285
|
-
it(
|
|
285
|
+
it(`should add the ${parameter} parameter with the default value`, () => {
|
|
286
286
|
request[funcName]();
|
|
287
287
|
expectedParameters[parameter] = value;
|
|
288
288
|
expect(request.parameters).toEqual(expectedParameters);
|
|
289
289
|
});
|
|
290
|
-
it(
|
|
290
|
+
it(`should add the ${parameter} parameter with the specified value`, () => {
|
|
291
291
|
request[funcName](10);
|
|
292
292
|
expectedParameters[parameter] = 10;
|
|
293
293
|
expect(request.parameters).toEqual(expectedParameters);
|
|
294
294
|
});
|
|
295
|
-
it(
|
|
295
|
+
it(`should replace the ${parameter} parameter on subsequent calls with the specified value`, () => {
|
|
296
296
|
request = request[funcName](10);
|
|
297
297
|
request[funcName](20);
|
|
298
298
|
expectedParameters[parameter] = 20;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import AnalyticsRequestBase from '../AnalyticsRequestBase';
|
|
2
2
|
import { customEncodeURIComponent } from '../utils';
|
|
3
3
|
jest.mock('../utils', () => ({
|
|
4
|
-
customEncodeURIComponent: jest.fn(x =>
|
|
4
|
+
customEncodeURIComponent: jest.fn(x => `<${x}>`)
|
|
5
5
|
}));
|
|
6
6
|
const endPoint = 'foo';
|
|
7
7
|
const path = 'bar';
|
|
8
8
|
const program = 'census';
|
|
9
9
|
const format = 'json';
|
|
10
|
-
const basePath =
|
|
10
|
+
const basePath = `${endPoint}/${path}/${program}.${format}`;
|
|
11
11
|
const dimensions = [{
|
|
12
12
|
dimension: 'ou',
|
|
13
13
|
items: ['mars', 'earth']
|
|
@@ -44,7 +44,7 @@ describe('AnalyticsRequestBase', () => {
|
|
|
44
44
|
});
|
|
45
45
|
const url = request.buildUrl();
|
|
46
46
|
expect(customEncodeURIComponent).toHaveBeenCalledTimes(4);
|
|
47
|
-
expect(url).toBe(
|
|
47
|
+
expect(url).toBe(`${basePath}?dimension=ou:<mars>;<earth>&dimension=dx:<population>&dimension=question&dimension=answer:<42>`);
|
|
48
48
|
});
|
|
49
49
|
it('Should build a URL with sorted dimension parameters when options.sorted=true', () => {
|
|
50
50
|
const request = buildRequest({
|
|
@@ -54,7 +54,7 @@ describe('AnalyticsRequestBase', () => {
|
|
|
54
54
|
sorted: true
|
|
55
55
|
});
|
|
56
56
|
expect(customEncodeURIComponent).toHaveBeenCalledTimes(4);
|
|
57
|
-
expect(url).toBe(
|
|
57
|
+
expect(url).toBe(`${basePath}?dimension=answer:<42>&dimension=dx:<population>&dimension=ou:<earth>;<mars>&dimension=question`);
|
|
58
58
|
});
|
|
59
59
|
it('Should not choke on a null or empty filter array', () => {
|
|
60
60
|
const request = buildRequest();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Define our very own special list of characters that we don't want to encode in the URI
|
|
2
2
|
const whitelistURI = ',&$=/;:';
|
|
3
3
|
const whitelistURICodes = whitelistURI.split('').map(c => encodeURIComponent(c));
|
|
4
|
-
const whitelistRegExp = new RegExp(
|
|
4
|
+
const whitelistRegExp = new RegExp(`(?:${whitelistURICodes.join('|')})`, 'g');
|
|
5
5
|
export const customEncodeURIComponent = uri => encodeURIComponent(uri).replace(whitelistRegExp, decodeURIComponent);
|