@dhis2/analytics 26.4.1 → 26.5.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/__fixtures__/fixtures.js +1 -0
- package/build/cjs/__fixtures__/json/api/analytics/outlierDetection.json +213 -0
- package/build/cjs/api/analytics/AnalyticsAggregate.js +27 -1
- package/build/cjs/api/analytics/AnalyticsBase.js +8 -7
- package/build/cjs/api/analytics/AnalyticsRequestBase.js +9 -5
- package/build/cjs/api/analytics/AnalyticsResponse.js +42 -39
- package/build/cjs/api/analytics/__tests__/Analytics.spec.js +5 -0
- package/build/cjs/api/analytics/__tests__/AnalyticsAggregate.spec.js +29 -0
- package/build/cjs/api/analytics/__tests__/AnalyticsBase.spec.js +36 -2
- package/build/cjs/components/DataDimension/DataDimension.js +31 -7
- package/build/cjs/components/DataDimension/DataTypeSelector.js +29 -8
- package/build/cjs/components/DataDimension/GroupSelector.js +7 -7
- package/build/cjs/components/DataDimension/ItemSelector.js +79 -61
- package/build/cjs/components/PeriodDimension/PeriodDimension.js +5 -2
- package/build/cjs/components/PeriodDimension/PeriodTransfer.js +64 -31
- package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +1 -1
- package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +1 -12
- package/build/cjs/components/VisTypeIcon.js +6 -1
- package/build/cjs/index.js +43 -1
- package/build/cjs/locales/en/translations.json +5 -1
- package/build/cjs/modules/__tests__/getAdaptedUiLayoutByType.spec.js +15 -0
- package/build/cjs/modules/axis.js +4 -0
- package/build/cjs/modules/getAdaptedUiLayoutByType.js +9 -0
- package/build/cjs/modules/layoutTypes.js +4 -2
- package/build/cjs/modules/layoutUiRules/__tests__/rules.spec.js +13 -1
- package/build/cjs/modules/layoutUiRules/index.js +12 -0
- package/build/cjs/modules/layoutUiRules/rules.js +22 -2
- package/build/cjs/modules/layoutUiRules/rulesHelper.js +4 -2
- package/build/cjs/modules/layoutUiRules/rulesUtils.js +7 -2
- package/build/cjs/modules/visTypeToLayoutType.js +2 -1
- package/build/cjs/modules/visTypes.js +9 -3
- package/build/es/__fixtures__/fixtures.js +1 -0
- package/build/es/__fixtures__/json/api/analytics/outlierDetection.json +213 -0
- package/build/es/api/analytics/AnalyticsAggregate.js +27 -1
- package/build/es/api/analytics/AnalyticsBase.js +7 -7
- package/build/es/api/analytics/AnalyticsRequestBase.js +9 -5
- package/build/es/api/analytics/AnalyticsResponse.js +42 -39
- package/build/es/api/analytics/__tests__/Analytics.spec.js +5 -0
- package/build/es/api/analytics/__tests__/AnalyticsAggregate.spec.js +29 -0
- package/build/es/api/analytics/__tests__/AnalyticsBase.spec.js +34 -1
- package/build/es/components/DataDimension/DataDimension.js +27 -6
- package/build/es/components/DataDimension/DataTypeSelector.js +30 -9
- package/build/es/components/DataDimension/GroupSelector.js +7 -7
- package/build/es/components/DataDimension/ItemSelector.js +80 -62
- package/build/es/components/PeriodDimension/PeriodDimension.js +5 -2
- package/build/es/components/PeriodDimension/PeriodTransfer.js +65 -32
- package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +1 -1
- package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +1 -12
- package/build/es/components/VisTypeIcon.js +8 -3
- package/build/es/index.js +4 -4
- package/build/es/locales/en/translations.json +5 -1
- package/build/es/modules/__tests__/getAdaptedUiLayoutByType.spec.js +16 -1
- package/build/es/modules/axis.js +5 -1
- package/build/es/modules/getAdaptedUiLayoutByType.js +10 -1
- package/build/es/modules/layoutTypes.js +2 -1
- package/build/es/modules/layoutUiRules/__tests__/rules.spec.js +14 -2
- package/build/es/modules/layoutUiRules/index.js +2 -2
- package/build/es/modules/layoutUiRules/rules.js +22 -3
- package/build/es/modules/layoutUiRules/rulesHelper.js +3 -2
- package/build/es/modules/layoutUiRules/rulesUtils.js +6 -2
- package/build/es/modules/visTypeToLayoutType.js +4 -3
- package/build/es/modules/visTypes.js +7 -3
- package/package.json +6 -3
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"Drag items here, or double click in the list, to start building a calculation formula": "Drag items here, or double click in the list, to start building a calculation formula",
|
|
45
45
|
"Math operators": "Math operators",
|
|
46
46
|
"Data Type": "Data Type",
|
|
47
|
+
"Only {{dataType}} can be used in {{visType}}": "Only {{dataType}} can be used in {{visType}}",
|
|
47
48
|
"All types": "All types",
|
|
48
49
|
"Disaggregation": "Disaggregation",
|
|
49
50
|
"No data": "No data",
|
|
@@ -54,10 +55,12 @@
|
|
|
54
55
|
"No data sets found": "No data sets found",
|
|
55
56
|
"No event data items found": "No event data items found",
|
|
56
57
|
"No program indicators found": "No program indicators found",
|
|
58
|
+
"No calculations found": "No calculations found",
|
|
57
59
|
"No indicators found for \"{{- searchTerm}}\"": "No indicators found for \"{{- searchTerm}}\"",
|
|
58
60
|
"No data sets found for \"{{- searchTerm}}\"": "No data sets found for \"{{- searchTerm}}\"",
|
|
59
61
|
"No event data items found for \"{{- searchTerm}}\"": "No event data items found for \"{{- searchTerm}}\"",
|
|
60
62
|
"No program indicators found for \"{{- searchTerm}}\"": "No program indicators found for \"{{- searchTerm}}\"",
|
|
63
|
+
"No calculations found for \"{{- searchTerm}}\"": "No calculations found for \"{{- searchTerm}}\"",
|
|
61
64
|
"Nothing found for \"{{- searchTerm}}\"": "Nothing found for \"{{- searchTerm}}\"",
|
|
62
65
|
"Calculation": "Calculation",
|
|
63
66
|
"Metric type": "Metric type",
|
|
@@ -201,9 +204,9 @@
|
|
|
201
204
|
"Year": "Year",
|
|
202
205
|
"Select year": "Select year",
|
|
203
206
|
"Period": "Period",
|
|
207
|
+
"Selected Periods": "Selected Periods",
|
|
204
208
|
"Relative periods": "Relative periods",
|
|
205
209
|
"Fixed periods": "Fixed periods",
|
|
206
|
-
"Selected Periods": "Selected Periods",
|
|
207
210
|
"No periods selected": "No periods selected",
|
|
208
211
|
"Daily": "Daily",
|
|
209
212
|
"Weekly": "Weekly",
|
|
@@ -371,6 +374,7 @@
|
|
|
371
374
|
"Radar": "Radar",
|
|
372
375
|
"Scatter": "Scatter",
|
|
373
376
|
"Single value": "Single value",
|
|
377
|
+
"Outlier table": "Outlier table",
|
|
374
378
|
"All charts": "All charts",
|
|
375
379
|
"{{seriesName}} (trend)": "{{seriesName}} (trend)",
|
|
376
380
|
"Trend": "Trend",
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { getAdaptedUiLayoutByType } from '../getAdaptedUiLayoutByType.js';
|
|
2
2
|
import { AXIS_ID_COLUMNS, AXIS_ID_ROWS, AXIS_ID_FILTERS } from '../layout/axis.js';
|
|
3
3
|
import { DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT } from '../predefinedDimensions.js';
|
|
4
|
-
import { VIS_TYPE_COLUMN, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_BAR, VIS_TYPE_PIE, VIS_TYPE_SINGLE_VALUE } from '../visTypes.js';
|
|
4
|
+
import { VIS_TYPE_COLUMN, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_BAR, VIS_TYPE_PIE, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_OUTLIER_TABLE } from '../visTypes.js';
|
|
5
5
|
const someId = 'someId';
|
|
6
6
|
const otherId = 'otherId';
|
|
7
|
+
const thirdId = 'thirdId';
|
|
7
8
|
describe('getAdaptedUiLayoutByType', () => {
|
|
8
9
|
it('column: moves all extra dimensions in columns and rows to filters', () => {
|
|
9
10
|
const initialState = {
|
|
@@ -107,6 +108,20 @@ describe('getAdaptedUiLayoutByType', () => {
|
|
|
107
108
|
};
|
|
108
109
|
expect(actualState).toEqual(expectedState);
|
|
109
110
|
});
|
|
111
|
+
it('outlier table: removes all dimensions but dx,pe,ou which are moved to columns', () => {
|
|
112
|
+
const initialState = {
|
|
113
|
+
[AXIS_ID_COLUMNS]: [DIMENSION_ID_DATA, someId],
|
|
114
|
+
[AXIS_ID_ROWS]: [DIMENSION_ID_PERIOD, otherId],
|
|
115
|
+
[AXIS_ID_FILTERS]: [DIMENSION_ID_ORGUNIT, thirdId]
|
|
116
|
+
};
|
|
117
|
+
const actualState = getAdaptedUiLayoutByType(initialState, VIS_TYPE_OUTLIER_TABLE);
|
|
118
|
+
const expectedState = {
|
|
119
|
+
[AXIS_ID_COLUMNS]: [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT],
|
|
120
|
+
[AXIS_ID_ROWS]: [],
|
|
121
|
+
[AXIS_ID_FILTERS]: []
|
|
122
|
+
};
|
|
123
|
+
expect(actualState).toEqual(expectedState);
|
|
124
|
+
});
|
|
110
125
|
it('pivot -> sv with dimension strings', () => {
|
|
111
126
|
const initialLayout = {
|
|
112
127
|
[AXIS_ID_COLUMNS]: [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD],
|
package/build/es/modules/axis.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import i18n from '../locales/index.js';
|
|
2
2
|
import { AXIS_ID_COLUMNS, AXIS_ID_ROWS, AXIS_ID_FILTERS } from './layout/axis.js';
|
|
3
|
-
import { LAYOUT_TYPE_DEFAULT, LAYOUT_TYPE_PIE, LAYOUT_TYPE_YEAR_OVER_YEAR, LAYOUT_TYPE_PIVOT_TABLE, LAYOUT_TYPE_SCATTER, LAYOUT_TYPE_LINE_LIST } from './layoutTypes.js';
|
|
3
|
+
import { LAYOUT_TYPE_DEFAULT, LAYOUT_TYPE_PIE, LAYOUT_TYPE_YEAR_OVER_YEAR, LAYOUT_TYPE_PIVOT_TABLE, LAYOUT_TYPE_SCATTER, LAYOUT_TYPE_LINE_LIST, LAYOUT_TYPE_OUTLIER_TABLE } from './layoutTypes.js';
|
|
4
4
|
const getAxisNamesByLayoutType = layoutType => {
|
|
5
5
|
switch (layoutType) {
|
|
6
6
|
case LAYOUT_TYPE_DEFAULT:
|
|
@@ -28,6 +28,10 @@ const getAxisNamesByLayoutType = layoutType => {
|
|
|
28
28
|
[AXIS_ID_ROWS]: i18n.t('Points'),
|
|
29
29
|
[AXIS_ID_FILTERS]: i18n.t('Filter')
|
|
30
30
|
};
|
|
31
|
+
case LAYOUT_TYPE_OUTLIER_TABLE:
|
|
32
|
+
return {
|
|
33
|
+
[AXIS_ID_COLUMNS]: i18n.t('Columns')
|
|
34
|
+
};
|
|
31
35
|
}
|
|
32
36
|
};
|
|
33
37
|
export const getAxisNameByLayoutType = (axisId, layoutType) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import isObject from 'lodash/isObject';
|
|
2
2
|
import { AXIS_ID_COLUMNS, AXIS_ID_ROWS, AXIS_ID_FILTERS } from './layout/axis.js';
|
|
3
3
|
import { DIMENSION_ID_DATA, DIMENSION_ID_ORGUNIT, DIMENSION_ID_PERIOD } from './predefinedDimensions.js';
|
|
4
|
-
import { VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_PIE, VIS_TYPE_GAUGE, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, isTwoCategoryChartType } from './visTypes.js';
|
|
4
|
+
import { VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_PIE, VIS_TYPE_GAUGE, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_OUTLIER_TABLE, isTwoCategoryChartType } from './visTypes.js';
|
|
5
5
|
export const getAdaptedUiLayoutByType = (layout, type) => {
|
|
6
6
|
var _layout$rows;
|
|
7
7
|
if (isTwoCategoryChartType(type) && ((_layout$rows = layout.rows) === null || _layout$rows === void 0 ? void 0 : _layout$rows.length) > 1) {
|
|
@@ -26,6 +26,8 @@ export const getAdaptedUiLayoutByType = (layout, type) => {
|
|
|
26
26
|
return layout;
|
|
27
27
|
case VIS_TYPE_SCATTER:
|
|
28
28
|
return getScatterLayout(layout);
|
|
29
|
+
case VIS_TYPE_OUTLIER_TABLE:
|
|
30
|
+
return getOutlierTableLayout(layout);
|
|
29
31
|
default:
|
|
30
32
|
return getDefaultLayout(layout);
|
|
31
33
|
}
|
|
@@ -99,6 +101,13 @@ const getSingleValueLayout = layout => {
|
|
|
99
101
|
};
|
|
100
102
|
};
|
|
101
103
|
|
|
104
|
+
// Transform from ui.layout to outlier table layout format
|
|
105
|
+
const getOutlierTableLayout = () => ({
|
|
106
|
+
[AXIS_ID_COLUMNS]: [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT],
|
|
107
|
+
[AXIS_ID_ROWS]: [],
|
|
108
|
+
[AXIS_ID_FILTERS]: []
|
|
109
|
+
});
|
|
110
|
+
|
|
102
111
|
/**
|
|
103
112
|
*
|
|
104
113
|
* @param {string|object} dimension
|
|
@@ -4,4 +4,5 @@ export const LAYOUT_TYPE_SINGLE_VALUE = 'LAYOUT_TYPE_SINGLE_VALUE';
|
|
|
4
4
|
export const LAYOUT_TYPE_YEAR_OVER_YEAR = 'LAYOUT_TYPE_YEAR_OVER_YEAR';
|
|
5
5
|
export const LAYOUT_TYPE_PIVOT_TABLE = 'LAYOUT_TYPE_PIVOT_TABLE';
|
|
6
6
|
export const LAYOUT_TYPE_SCATTER = 'LAYOUT_TYPE_SCATTER';
|
|
7
|
-
export const LAYOUT_TYPE_LINE_LIST = 'LAYOUT_TYPE_LINE_LIST';
|
|
7
|
+
export const LAYOUT_TYPE_LINE_LIST = 'LAYOUT_TYPE_LINE_LIST';
|
|
8
|
+
export const LAYOUT_TYPE_OUTLIER_TABLE = 'LAYOUT_TYPE_OUTLIER_TABLE';
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { ALL_AXIS_IDS } from '../../layout/axis.js';
|
|
2
|
-
import { DIMENSION_ID_DATA, DIMENSION_ID_ORGUNIT, DIMENSION_ID_PERIOD } from '../../predefinedDimensions.js';
|
|
2
|
+
import { DIMENSION_ID_DATA, DIMENSION_ID_ORGUNIT, DIMENSION_ID_PERIOD, DIMENSION_ID_ASSIGNED_CATEGORIES } from '../../predefinedDimensions.js';
|
|
3
3
|
import { testResourceRules, testResourceRequiredProps, testResourceAllRuleProps } from '../rules.js';
|
|
4
4
|
|
|
5
5
|
// Consts
|
|
6
|
+
const validDims = [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT];
|
|
6
7
|
const lockableDims = [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT];
|
|
7
|
-
const disallowableDims = [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD];
|
|
8
|
+
const disallowableDims = [DIMENSION_ID_DATA, DIMENSION_ID_PERIOD, DIMENSION_ID_ASSIGNED_CATEGORIES];
|
|
8
9
|
|
|
9
10
|
// Helper fns
|
|
10
11
|
const allArrayItemsAreValid = (allItems, validItems) => allItems.every(value => validItems.includes(value));
|
|
11
12
|
const allArrayItemsAreValidAxisIds = array => allArrayItemsAreValid(array, ALL_AXIS_IDS);
|
|
13
|
+
const allArrayItemsAreValidDimensionIds = array => allArrayItemsAreValid(array, validDims);
|
|
12
14
|
const onlyRulesWithProp = ruleProp => testResourceRules.filter(rule => rule[ruleProp]);
|
|
13
15
|
|
|
14
16
|
// Partial tests
|
|
@@ -18,6 +20,9 @@ const testPropHasKeysAndValues = ruleProp => it('has keys and values', () => {
|
|
|
18
20
|
const testPropIsArray = ruleProp => it('is an array', () => {
|
|
19
21
|
expect(onlyRulesWithProp(ruleProp).every(rule => Array.isArray(rule[ruleProp]))).toBe(true);
|
|
20
22
|
});
|
|
23
|
+
const testKeysAreValidDimensionIds = ruleProp => it('keys should be valid dimension ids', () => {
|
|
24
|
+
expect(onlyRulesWithProp(ruleProp).every(rule => allArrayItemsAreValidDimensionIds(Object.keys(rule[ruleProp])))).toBe(true);
|
|
25
|
+
});
|
|
21
26
|
const testKeysAreValidAxisIds = ruleProp => it('keys should be valid axis ids', () => {
|
|
22
27
|
expect(onlyRulesWithProp(ruleProp).every(rule => allArrayItemsAreValidAxisIds(Object.keys(rule[ruleProp])))).toBe(true);
|
|
23
28
|
});
|
|
@@ -56,6 +61,13 @@ describe("verify each rule's ", () => {
|
|
|
56
61
|
testNoValuesNegative(ruleProp);
|
|
57
62
|
});
|
|
58
63
|
});
|
|
64
|
+
describe('MAX_ITEMS_PER_DIM', () => {
|
|
65
|
+
const ruleProp = testResourceAllRuleProps['MAX_ITEMS_PER_DIM'];
|
|
66
|
+
testPropHasKeysAndValues(ruleProp);
|
|
67
|
+
testKeysAreValidDimensionIds(ruleProp);
|
|
68
|
+
testNoValuesZero(ruleProp);
|
|
69
|
+
testNoValuesNegative(ruleProp);
|
|
70
|
+
});
|
|
59
71
|
describe('AVAILABLE_AXES', () => {
|
|
60
72
|
const ruleProp = testResourceAllRuleProps['AVAILABLE_AXES'];
|
|
61
73
|
testPropIsArray(ruleProp);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { getAvailableAxesByVisType as getAvailableAxes, getDisallowedDimsByVisType as getDisallowedDimensions, getAxisMaxNumberOfItemsByVisType as getAxisMaxNumberOfItems, getAxisMaxNumberOfDimsByVisType as getAxisMaxNumberOfDimensions, getAxisMinNumberOfDimsByVisType as getAxisMinNumberOfDimensions, getAxisPerLockedDimByVisType as getAxisPerLockedDimension, getAllLockedDimIdsByVisType as getAllLockedDimensionIds } from './rulesHelper.js';
|
|
2
|
-
export { hasAxisTooManyItemsByVisType as hasAxisTooManyItems, isDimensionLockedByVisType as isDimensionLocked, isAxisFullByVisType as isAxisFull, canDimensionBeAddedToAxisByVisType as canDimensionBeAddedToAxis, getTransferableDimensionPerAxisByVisType as getTransferableDimension } from './rulesUtils.js';
|
|
1
|
+
export { getAvailableAxesByVisType as getAvailableAxes, getDisallowedDimsByVisType as getDisallowedDimensions, getAxisMaxNumberOfItemsByVisType as getAxisMaxNumberOfItems, getAxisMaxNumberOfDimsByVisType as getAxisMaxNumberOfDimensions, getAxisMinNumberOfDimsByVisType as getAxisMinNumberOfDimensions, getAxisPerLockedDimByVisType as getAxisPerLockedDimension, getAllLockedDimIdsByVisType as getAllLockedDimensionIds, getDimMaxNumberOfItemsByVisType as getDimensionMaxNumberOfItems } from './rulesHelper.js';
|
|
2
|
+
export { hasAxisTooManyItemsByVisType as hasAxisTooManyItems, hasDimensionTooManyItemsByVisType as hasDimensionTooManyItems, isDimensionLockedByVisType as isDimensionLocked, isAxisFullByVisType as isAxisFull, canDimensionBeAddedToAxisByVisType as canDimensionBeAddedToAxis, getTransferableDimensionPerAxisByVisType as getTransferableDimension } from './rulesUtils.js';
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { AXIS_ID_COLUMNS, AXIS_ID_ROWS, AXIS_ID_FILTERS } from '../layout/axis.js';
|
|
2
|
-
import { DIMENSION_ID_PERIOD, DIMENSION_ID_DATA, DIMENSION_ID_ORGUNIT } from '../predefinedDimensions.js';
|
|
3
|
-
import { VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_PIE, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_LINE_LIST } from '../visTypes.js';
|
|
2
|
+
import { DIMENSION_ID_PERIOD, DIMENSION_ID_DATA, DIMENSION_ID_ORGUNIT, DIMENSION_ID_ASSIGNED_CATEGORIES } from '../predefinedDimensions.js';
|
|
3
|
+
import { VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_PIE, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_LINE_LIST, VIS_TYPE_OUTLIER_TABLE } from '../visTypes.js';
|
|
4
4
|
const RULE_PROP_AVAILABLE_AXES = 'availableAxes',
|
|
5
5
|
RULE_PROP_MAX_DIMS_PER_AXIS = 'maxNumberOfDimsPerAxis',
|
|
6
6
|
RULE_PROP_MIN_DIMS_PER_AXIS = 'minNumberOfDimsPerAxis',
|
|
7
7
|
RULE_PROP_MAX_ITEMS_PER_AXIS = 'maxNumberOfItemsPerAxis',
|
|
8
|
+
RULE_PROP_MAX_ITEMS_PER_DIM = 'maxNumberOfItemsPerDim',
|
|
8
9
|
RULE_PROP_DISALLOWED_DIMS = 'disallowedDims',
|
|
9
10
|
RULE_PROP_LOCKED_DIMS = 'lockedDims';
|
|
10
11
|
const defaultRules = {
|
|
@@ -82,6 +83,21 @@ const scatterRules = {
|
|
|
82
83
|
const lineListRules = {
|
|
83
84
|
[RULE_PROP_AVAILABLE_AXES]: [AXIS_ID_COLUMNS, AXIS_ID_FILTERS]
|
|
84
85
|
};
|
|
86
|
+
const outlierTableRules = {
|
|
87
|
+
[RULE_PROP_AVAILABLE_AXES]: [AXIS_ID_COLUMNS],
|
|
88
|
+
[RULE_PROP_MIN_DIMS_PER_AXIS]: {
|
|
89
|
+
[AXIS_ID_COLUMNS]: 3
|
|
90
|
+
},
|
|
91
|
+
[RULE_PROP_MAX_ITEMS_PER_DIM]: {
|
|
92
|
+
[DIMENSION_ID_PERIOD]: 1
|
|
93
|
+
},
|
|
94
|
+
[RULE_PROP_LOCKED_DIMS]: {
|
|
95
|
+
[DIMENSION_ID_DATA]: AXIS_ID_COLUMNS,
|
|
96
|
+
[DIMENSION_ID_PERIOD]: AXIS_ID_COLUMNS,
|
|
97
|
+
[DIMENSION_ID_ORGUNIT]: AXIS_ID_COLUMNS
|
|
98
|
+
},
|
|
99
|
+
[RULE_PROP_DISALLOWED_DIMS]: [DIMENSION_ID_ASSIGNED_CATEGORIES]
|
|
100
|
+
};
|
|
85
101
|
const visTypeToRules = {
|
|
86
102
|
[VIS_TYPE_COLUMN]: defaultRules,
|
|
87
103
|
[VIS_TYPE_STACKED_COLUMN]: defaultRules,
|
|
@@ -98,7 +114,8 @@ const visTypeToRules = {
|
|
|
98
114
|
[VIS_TYPE_YEAR_OVER_YEAR_COLUMN]: yearOverYearRules,
|
|
99
115
|
[VIS_TYPE_PIVOT_TABLE]: pivotTableRules,
|
|
100
116
|
[VIS_TYPE_SCATTER]: scatterRules,
|
|
101
|
-
[VIS_TYPE_LINE_LIST]: lineListRules
|
|
117
|
+
[VIS_TYPE_LINE_LIST]: lineListRules,
|
|
118
|
+
[VIS_TYPE_OUTLIER_TABLE]: outlierTableRules
|
|
102
119
|
};
|
|
103
120
|
const getRulesByVisType = visType => {
|
|
104
121
|
const rules = visTypeToRules[visType];
|
|
@@ -113,6 +130,7 @@ const getRulesByVisType = visType => {
|
|
|
113
130
|
export const getAvailableAxesByVisType = visType => getRulesByVisType(visType)[RULE_PROP_AVAILABLE_AXES] || [];
|
|
114
131
|
export const getMaxNumberOfDimsPerAxisByVisType = visType => getRulesByVisType(visType)[RULE_PROP_MAX_DIMS_PER_AXIS] || {};
|
|
115
132
|
export const getMinNumberOfDimsPerAxisByVisType = visType => getRulesByVisType(visType)[RULE_PROP_MIN_DIMS_PER_AXIS] || {};
|
|
133
|
+
export const getMaxNumberOfItemsPerDimByVisType = visType => getRulesByVisType(visType)[RULE_PROP_MAX_ITEMS_PER_DIM] || {};
|
|
116
134
|
export const getMaxNumberOfItemsPerAxisByVisType = visType => getRulesByVisType(visType)[RULE_PROP_MAX_ITEMS_PER_AXIS] || {};
|
|
117
135
|
export const getDisallowedDimsByVisType = visType => getRulesByVisType(visType)[RULE_PROP_DISALLOWED_DIMS] || [];
|
|
118
136
|
export const getLockedDimsByVisType = visType => getRulesByVisType(visType)[RULE_PROP_LOCKED_DIMS] || {};
|
|
@@ -126,6 +144,7 @@ export const testResourceAllRuleProps = {
|
|
|
126
144
|
MAX_DIMS_PER_AXIS: RULE_PROP_MAX_DIMS_PER_AXIS,
|
|
127
145
|
MIN_DIMS_PER_AXIS: RULE_PROP_MIN_DIMS_PER_AXIS,
|
|
128
146
|
MAX_ITEMS_PER_AXIS: RULE_PROP_MAX_ITEMS_PER_AXIS,
|
|
147
|
+
MAX_ITEMS_PER_DIM: RULE_PROP_MAX_ITEMS_PER_DIM,
|
|
129
148
|
DISALLOWED_DIMS: RULE_PROP_DISALLOWED_DIMS,
|
|
130
149
|
LOCKED_DIMS: RULE_PROP_LOCKED_DIMS
|
|
131
150
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getMaxNumberOfItemsPerAxisByVisType, getMaxNumberOfDimsPerAxisByVisType, getMinNumberOfDimsPerAxisByVisType, getLockedDimsByVisType } from './rules.js';
|
|
1
|
+
import { getMaxNumberOfItemsPerDimByVisType, getMaxNumberOfItemsPerAxisByVisType, getMaxNumberOfDimsPerAxisByVisType, getMinNumberOfDimsPerAxisByVisType, getLockedDimsByVisType } from './rules.js';
|
|
2
2
|
|
|
3
3
|
// Selectors
|
|
4
4
|
|
|
@@ -7,4 +7,5 @@ export const getAxisMaxNumberOfItemsByVisType = (visType, axisId) => getMaxNumbe
|
|
|
7
7
|
export const getAxisMaxNumberOfDimsByVisType = (visType, axisId) => getMaxNumberOfDimsPerAxisByVisType(visType)[axisId];
|
|
8
8
|
export const getAxisMinNumberOfDimsByVisType = (visType, axisId) => getMinNumberOfDimsPerAxisByVisType(visType)[axisId];
|
|
9
9
|
export const getAxisPerLockedDimByVisType = (visType, dimensionId) => getLockedDimsByVisType(visType)[dimensionId];
|
|
10
|
-
export const getAllLockedDimIdsByVisType = visType => Object.keys(getLockedDimsByVisType(visType));
|
|
10
|
+
export const getAllLockedDimIdsByVisType = visType => Object.keys(getLockedDimsByVisType(visType));
|
|
11
|
+
export const getDimMaxNumberOfItemsByVisType = (visType, dimensionId) => getMaxNumberOfItemsPerDimByVisType(visType)[dimensionId];
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { getLockedDimsByVisType } from './rules.js';
|
|
2
|
-
import { getAxisMaxNumberOfDimsByVisType, getAxisMaxNumberOfItemsByVisType, getAllLockedDimIdsByVisType } from './rulesHelper.js';
|
|
2
|
+
import { getAxisMaxNumberOfDimsByVisType, getAxisMaxNumberOfItemsByVisType, getDimMaxNumberOfItemsByVisType, getAllLockedDimIdsByVisType } from './rulesHelper.js';
|
|
3
3
|
export const hasAxisTooManyItemsByVisType = (visType, axisId, numberOfItems) => {
|
|
4
4
|
const maxNumberOfItemsPerAxis = getAxisMaxNumberOfItemsByVisType(visType, axisId);
|
|
5
|
-
return maxNumberOfItemsPerAxis
|
|
5
|
+
return maxNumberOfItemsPerAxis && numberOfItems > maxNumberOfItemsPerAxis;
|
|
6
|
+
};
|
|
7
|
+
export const hasDimensionTooManyItemsByVisType = (visType, dimensionId, numberOfItems) => {
|
|
8
|
+
const maxNumberOfItemsPerDimension = getDimMaxNumberOfItemsByVisType(visType, dimensionId);
|
|
9
|
+
return maxNumberOfItemsPerDimension && numberOfItems > maxNumberOfItemsPerDimension;
|
|
6
10
|
};
|
|
7
11
|
export const isDimensionLockedByVisType = (visType, dimensionId) => getAllLockedDimIdsByVisType(visType).includes(dimensionId);
|
|
8
12
|
export const isAxisFullByVisType = (visType, axisId, axisDimensionsCount) => axisDimensionsCount >= getAxisMaxNumberOfDimsByVisType(visType, axisId);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { LAYOUT_TYPE_DEFAULT, LAYOUT_TYPE_PIE, LAYOUT_TYPE_YEAR_OVER_YEAR, LAYOUT_TYPE_PIVOT_TABLE, LAYOUT_TYPE_SCATTER, LAYOUT_TYPE_LINE_LIST } from './layoutTypes.js';
|
|
2
|
-
import { VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_LINE_LIST } from './visTypes.js';
|
|
1
|
+
import { LAYOUT_TYPE_DEFAULT, LAYOUT_TYPE_PIE, LAYOUT_TYPE_YEAR_OVER_YEAR, LAYOUT_TYPE_PIVOT_TABLE, LAYOUT_TYPE_SCATTER, LAYOUT_TYPE_LINE_LIST, LAYOUT_TYPE_OUTLIER_TABLE } from './layoutTypes.js';
|
|
2
|
+
import { VIS_TYPE_COLUMN, VIS_TYPE_STACKED_COLUMN, VIS_TYPE_BAR, VIS_TYPE_STACKED_BAR, VIS_TYPE_LINE, VIS_TYPE_AREA, VIS_TYPE_STACKED_AREA, VIS_TYPE_PIE, VIS_TYPE_RADAR, VIS_TYPE_GAUGE, VIS_TYPE_YEAR_OVER_YEAR_LINE, VIS_TYPE_YEAR_OVER_YEAR_COLUMN, VIS_TYPE_SINGLE_VALUE, VIS_TYPE_PIVOT_TABLE, VIS_TYPE_SCATTER, VIS_TYPE_LINE_LIST, VIS_TYPE_OUTLIER_TABLE } from './visTypes.js';
|
|
3
3
|
const visTypeToLayoutType = {
|
|
4
4
|
[VIS_TYPE_COLUMN]: LAYOUT_TYPE_DEFAULT,
|
|
5
5
|
[VIS_TYPE_STACKED_COLUMN]: LAYOUT_TYPE_DEFAULT,
|
|
@@ -16,6 +16,7 @@ const visTypeToLayoutType = {
|
|
|
16
16
|
[VIS_TYPE_SINGLE_VALUE]: LAYOUT_TYPE_PIE,
|
|
17
17
|
[VIS_TYPE_PIVOT_TABLE]: LAYOUT_TYPE_PIVOT_TABLE,
|
|
18
18
|
[VIS_TYPE_SCATTER]: LAYOUT_TYPE_SCATTER,
|
|
19
|
-
[VIS_TYPE_LINE_LIST]: LAYOUT_TYPE_LINE_LIST
|
|
19
|
+
[VIS_TYPE_LINE_LIST]: LAYOUT_TYPE_LINE_LIST,
|
|
20
|
+
[VIS_TYPE_OUTLIER_TABLE]: LAYOUT_TYPE_OUTLIER_TABLE
|
|
20
21
|
};
|
|
21
22
|
export const getLayoutTypeByVisType = visType => visTypeToLayoutType[visType];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IconVisualizationArea24, IconVisualizationAreaStacked24, IconVisualizationBar24, IconVisualizationBarStacked24, IconVisualizationColumn24, IconVisualizationColumnMulti24, IconVisualizationColumnStacked24, IconVisualizationGauge24, IconVisualizationLine24, IconVisualizationLinelist24, IconVisualizationLineMulti24, IconVisualizationOutlierTable24, IconVisualizationPie24, IconVisualizationPivotTable24, IconVisualizationRadar24, IconVisualizationScatter24, IconVisualizationSingleValue24 } from '@dhis2/ui';
|
|
2
2
|
import i18n from '../locales/index.js';
|
|
3
3
|
export const VIS_TYPE_PIVOT_TABLE = 'PIVOT_TABLE';
|
|
4
4
|
export const VIS_TYPE_AREA = 'AREA';
|
|
@@ -19,6 +19,7 @@ export const VIS_TYPE_SINGLE_VALUE = 'SINGLE_VALUE';
|
|
|
19
19
|
export const VIS_TYPE_BUBBLE = 'BUBBLE';
|
|
20
20
|
export const VIS_TYPE_GROUP_ALL = 'ALL';
|
|
21
21
|
export const VIS_TYPE_GROUP_CHARTS = 'CHARTS';
|
|
22
|
+
export const VIS_TYPE_OUTLIER_TABLE = 'OUTLIER_TABLE';
|
|
22
23
|
export const visTypeDisplayNames = {
|
|
23
24
|
[VIS_TYPE_PIVOT_TABLE]: i18n.t('Pivot table'),
|
|
24
25
|
[VIS_TYPE_AREA]: i18n.t('Area'),
|
|
@@ -36,11 +37,12 @@ export const visTypeDisplayNames = {
|
|
|
36
37
|
[VIS_TYPE_RADAR]: i18n.t('Radar'),
|
|
37
38
|
[VIS_TYPE_SCATTER]: i18n.t('Scatter'),
|
|
38
39
|
[VIS_TYPE_SINGLE_VALUE]: i18n.t('Single value'),
|
|
40
|
+
[VIS_TYPE_OUTLIER_TABLE]: i18n.t('Outlier table'),
|
|
39
41
|
[VIS_TYPE_GROUP_ALL]: i18n.t('All types'),
|
|
40
42
|
[VIS_TYPE_GROUP_CHARTS]: i18n.t('All charts')
|
|
41
43
|
};
|
|
42
44
|
export const visTypeIcons = {
|
|
43
|
-
[VIS_TYPE_PIVOT_TABLE]:
|
|
45
|
+
[VIS_TYPE_PIVOT_TABLE]: IconVisualizationPivotTable24,
|
|
44
46
|
[VIS_TYPE_AREA]: IconVisualizationArea24,
|
|
45
47
|
[VIS_TYPE_STACKED_AREA]: IconVisualizationAreaStacked24,
|
|
46
48
|
[VIS_TYPE_BAR]: IconVisualizationBar24,
|
|
@@ -55,7 +57,8 @@ export const visTypeIcons = {
|
|
|
55
57
|
[VIS_TYPE_PIE]: IconVisualizationPie24,
|
|
56
58
|
[VIS_TYPE_RADAR]: IconVisualizationRadar24,
|
|
57
59
|
[VIS_TYPE_SCATTER]: IconVisualizationScatter24,
|
|
58
|
-
[VIS_TYPE_SINGLE_VALUE]: IconVisualizationSingleValue24
|
|
60
|
+
[VIS_TYPE_SINGLE_VALUE]: IconVisualizationSingleValue24,
|
|
61
|
+
[VIS_TYPE_OUTLIER_TABLE]: IconVisualizationOutlierTable24
|
|
59
62
|
};
|
|
60
63
|
export const getDisplayNameByVisType = visType => {
|
|
61
64
|
const displayName = visTypeDisplayNames[visType];
|
|
@@ -78,6 +81,7 @@ export const isYearOverYear = type => yearOverYearTypes.includes(type);
|
|
|
78
81
|
export const isDualAxisType = type => dualAxisTypes.includes(type);
|
|
79
82
|
export const isMultiType = type => multiTypeTypes.includes(type);
|
|
80
83
|
export const isSingleValue = type => type === VIS_TYPE_SINGLE_VALUE;
|
|
84
|
+
export const isOutlierTable = type => type === VIS_TYPE_OUTLIER_TABLE;
|
|
81
85
|
export const isTwoCategoryChartType = type => twoCategoryChartTypes.includes(type);
|
|
82
86
|
export const isVerticalType = type => verticalTypes.includes(type);
|
|
83
87
|
export const isLegendSetType = type => legendSetTypes.includes(type);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dhis2/analytics",
|
|
3
|
-
"version": "26.
|
|
3
|
+
"version": "26.5.0",
|
|
4
4
|
"main": "./build/cjs/index.js",
|
|
5
5
|
"module": "./build/es/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"@dhis2/cli-app-scripts": "^9.0.1",
|
|
36
36
|
"@dhis2/cli-style": "^10.4.1",
|
|
37
37
|
"@dhis2/d2-i18n": "^1.1.0",
|
|
38
|
-
"@dhis2/ui": "^
|
|
38
|
+
"@dhis2/ui": "^9.2.0",
|
|
39
39
|
"@sambego/storybook-state": "^2.0.1",
|
|
40
40
|
"@storybook/addons": "^6.5.16",
|
|
41
41
|
"@storybook/preset-create-react-app": "^3.1.7",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"peerDependencies": {
|
|
53
53
|
"@dhis2/app-runtime": "^3",
|
|
54
54
|
"@dhis2/d2-i18n": "^1.1",
|
|
55
|
-
"@dhis2/ui": "^
|
|
55
|
+
"@dhis2/ui": "^9.2.0",
|
|
56
56
|
"prop-types": "^15",
|
|
57
57
|
"react": "^16.3",
|
|
58
58
|
"react-dom": "^16.3",
|
|
@@ -75,6 +75,9 @@
|
|
|
75
75
|
"react-beautiful-dnd": "^10.1.1",
|
|
76
76
|
"resize-observer-polyfill": "^1.5.1"
|
|
77
77
|
},
|
|
78
|
+
"resolutions": {
|
|
79
|
+
"@dhis2/ui": "^9.2.0"
|
|
80
|
+
},
|
|
78
81
|
"files": [
|
|
79
82
|
"build"
|
|
80
83
|
]
|