@dhis2/analytics 999.9.9-TE-alpha.2 → 999.9.9-chip-alpha.1
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__/DimensionsPanel.stories.js +1 -0
- 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/api/analytics/utils.js +1 -3
- package/build/cjs/assets/DynamicDimensionIcon.js +12 -38
- package/build/cjs/components/AboutAOUnit/AboutAOUnit.js +1 -0
- package/build/cjs/components/AboutAOUnit/styles/AboutAOUnit.style.js +2 -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/DimensionsPanel/List/DimensionItem.js +44 -32
- package/build/cjs/components/DimensionsPanel/List/OptionsButton.js +7 -6
- package/build/cjs/components/DimensionsPanel/List/RecommendedIcon.js +1 -2
- package/build/cjs/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap +238 -361
- package/build/cjs/components/DimensionsPanel/List/styles/DimensionItem.style.js +5 -67
- package/build/cjs/components/DimensionsPanel/List/styles/DimensionList.style.js +2 -2
- package/build/cjs/components/DimensionsPanel/List/styles/RecommendedIcon.style.js +4 -4
- package/build/cjs/components/DimensionsPanel/styles/DimensionsPanel.style.js +1 -1
- package/build/cjs/components/Interpretations/InterpretationModal/InterpretationModal.js +20 -7
- package/build/cjs/components/Interpretations/InterpretationModal/InterpretationThread.js +16 -9
- package/build/cjs/components/Interpretations/InterpretationModal/index.js +8 -1
- package/build/cjs/components/Interpretations/InterpretationsUnit/InterpretationList.js +8 -2
- package/build/cjs/components/Interpretations/InterpretationsUnit/InterpretationsUnit.js +20 -6
- package/build/cjs/components/Interpretations/common/Interpretation/Interpretation.js +23 -3
- package/build/cjs/components/Interpretations/common/Interpretation/useLike.js +12 -2
- package/build/cjs/components/Interpretations/common/RichTextEditor/styles/RichTextEditor.style.js +2 -2
- 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/Toolbar/HoverMenuBar/HoverMenuDropdown.js +3 -1
- package/build/cjs/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +8 -0
- package/build/cjs/components/VisTypeIcon.js +6 -1
- package/build/cjs/index.js +104 -55
- package/build/cjs/locales/cs/translations.json +9 -3
- package/build/cjs/locales/en/translations.json +7 -2
- package/build/cjs/locales/es/translations.json +17 -11
- package/build/cjs/locales/es_419/translations.json +12 -6
- package/build/cjs/locales/fr/translations.json +10 -9
- package/build/cjs/locales/id/translations.json +5 -4
- package/build/cjs/locales/nl/translations.json +3 -2
- package/build/cjs/locales/pt/translations.json +10 -9
- package/build/cjs/locales/pt_BR/translations.json +19 -13
- package/build/cjs/locales/sv/translations.json +8 -2
- package/build/cjs/locales/vi/translations.json +11 -5
- package/build/cjs/locales/zh/translations.json +14 -9
- 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/layout/layoutGetDimensionIdItemIdsObject.js +1 -1
- 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/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +3 -2
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/index.js +3 -2
- package/build/es/__demo__/DimensionsPanel.stories.js +1 -0
- 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/api/analytics/utils.js +1 -3
- package/build/es/assets/DynamicDimensionIcon.js +12 -38
- package/build/es/components/AboutAOUnit/AboutAOUnit.js +1 -0
- package/build/es/components/AboutAOUnit/styles/AboutAOUnit.style.js +2 -2
- 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/DimensionsPanel/List/DimensionItem.js +45 -33
- package/build/es/components/DimensionsPanel/List/OptionsButton.js +7 -6
- package/build/es/components/DimensionsPanel/List/RecommendedIcon.js +1 -2
- package/build/es/components/DimensionsPanel/List/__tests__/__snapshots__/DimensionItem.spec.js.snap +238 -361
- package/build/es/components/DimensionsPanel/List/styles/DimensionItem.style.js +4 -66
- package/build/es/components/DimensionsPanel/List/styles/DimensionList.style.js +2 -2
- package/build/es/components/DimensionsPanel/List/styles/RecommendedIcon.style.js +4 -4
- package/build/es/components/DimensionsPanel/styles/DimensionsPanel.style.js +1 -1
- package/build/es/components/Interpretations/InterpretationModal/InterpretationModal.js +21 -8
- package/build/es/components/Interpretations/InterpretationModal/InterpretationThread.js +16 -9
- package/build/es/components/Interpretations/InterpretationModal/index.js +2 -1
- package/build/es/components/Interpretations/InterpretationsUnit/InterpretationList.js +8 -2
- package/build/es/components/Interpretations/InterpretationsUnit/InterpretationsUnit.js +20 -6
- package/build/es/components/Interpretations/common/Interpretation/Interpretation.js +24 -4
- package/build/es/components/Interpretations/common/Interpretation/useLike.js +12 -2
- package/build/es/components/Interpretations/common/RichTextEditor/styles/RichTextEditor.style.js +2 -2
- 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/Toolbar/HoverMenuBar/HoverMenuDropdown.js +3 -1
- package/build/es/components/Toolbar/HoverMenuBar/__tests__/HoverMenuDropdown.spec.js +8 -0
- package/build/es/components/VisTypeIcon.js +8 -3
- package/build/es/index.js +6 -6
- package/build/es/locales/cs/translations.json +9 -3
- package/build/es/locales/en/translations.json +7 -2
- package/build/es/locales/es/translations.json +17 -11
- package/build/es/locales/es_419/translations.json +12 -6
- package/build/es/locales/fr/translations.json +10 -9
- package/build/es/locales/id/translations.json +5 -4
- package/build/es/locales/nl/translations.json +3 -2
- package/build/es/locales/pt/translations.json +10 -9
- package/build/es/locales/pt_BR/translations.json +19 -13
- package/build/es/locales/sv/translations.json +8 -2
- package/build/es/locales/vi/translations.json +11 -5
- package/build/es/locales/zh/translations.json +14 -9
- 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/layout/layoutGetDimensionIdItemIdsObject.js +1 -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/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +3 -2
- package/build/es/visualizations/config/adapters/dhis_highcharts/title/index.js +3 -2
- package/package.json +6 -3
|
@@ -65,6 +65,7 @@ const onDimensionClick = () => alert('click');
|
|
|
65
65
|
return /*#__PURE__*/_react2.default.createElement(_DimensionsPanel.default, {
|
|
66
66
|
dimensions: [...fixedDimensions, ...dynamicDimensions],
|
|
67
67
|
onDimensionClick: onDimensionClick,
|
|
68
|
+
selectedIds: [_predefinedDimensions.DIMENSION_ID_DATA],
|
|
68
69
|
lockedDimension: dimension => dimension === _predefinedDimensions.DIMENSION_ID_DATA
|
|
69
70
|
});
|
|
70
71
|
});
|
|
@@ -93,6 +93,7 @@ var _default = function x() {
|
|
|
93
93
|
addFixture('/api/analytics/cluster', require('./json/api/analytics/cluster.json'));
|
|
94
94
|
addFixture('/api/analytics/response', require('./json/api/analytics/response.json'));
|
|
95
95
|
addFixture('/api/analytics/enrollments', require('./json/api/analytics/enrollments.json'));
|
|
96
|
+
addFixture('/api/analytics/outlierDetection', require('./json/api/analytics/outlierDetection.json'));
|
|
96
97
|
return {
|
|
97
98
|
get: getFixture,
|
|
98
99
|
add: addFixture
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
{
|
|
2
|
+
"headers": [
|
|
3
|
+
{
|
|
4
|
+
"name": "dxname",
|
|
5
|
+
"column": "Data name",
|
|
6
|
+
"valueType": "TEXT",
|
|
7
|
+
"type": "java.lang.String",
|
|
8
|
+
"hidden": false,
|
|
9
|
+
"meta": false
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "ouname",
|
|
13
|
+
"column": "Organisation unit name",
|
|
14
|
+
"valueType": "TEXT",
|
|
15
|
+
"type": "java.lang.String",
|
|
16
|
+
"hidden": false,
|
|
17
|
+
"meta": false
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "value",
|
|
21
|
+
"column": "Value",
|
|
22
|
+
"valueType": "NUMBER",
|
|
23
|
+
"type": "java.lang.Double",
|
|
24
|
+
"hidden": false,
|
|
25
|
+
"meta": false
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "absdev",
|
|
29
|
+
"column": "Absolute deviation",
|
|
30
|
+
"valueType": "NUMBER",
|
|
31
|
+
"type": "java.lang.Double",
|
|
32
|
+
"hidden": false,
|
|
33
|
+
"meta": false
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "modifiedzscore",
|
|
37
|
+
"column": "Modified zScore",
|
|
38
|
+
"valueType": "NUMBER",
|
|
39
|
+
"type": "java.lang.Double",
|
|
40
|
+
"hidden": false,
|
|
41
|
+
"meta": false
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "median",
|
|
45
|
+
"column": "Median",
|
|
46
|
+
"valueType": "NUMBER",
|
|
47
|
+
"type": "java.lang.Double",
|
|
48
|
+
"hidden": false,
|
|
49
|
+
"meta": false
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "lowerbound",
|
|
53
|
+
"column": "Lower boundary",
|
|
54
|
+
"valueType": "NUMBER",
|
|
55
|
+
"type": "java.lang.Double",
|
|
56
|
+
"hidden": false,
|
|
57
|
+
"meta": false
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "upperbound",
|
|
61
|
+
"column": "Upper boundary",
|
|
62
|
+
"valueType": "NUMBER",
|
|
63
|
+
"type": "java.lang.Double",
|
|
64
|
+
"hidden": false,
|
|
65
|
+
"meta": false
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"metaData": {
|
|
69
|
+
"maxResults": 100,
|
|
70
|
+
"count": 13,
|
|
71
|
+
"orderBy": "mean_abs_dev",
|
|
72
|
+
"threshold": 3.0,
|
|
73
|
+
"algorithm": "MOD_Z_SCORE"
|
|
74
|
+
},
|
|
75
|
+
"rowContext": {
|
|
76
|
+
|
|
77
|
+
},
|
|
78
|
+
"rows": [
|
|
79
|
+
[
|
|
80
|
+
"ANC 2nd visit",
|
|
81
|
+
"UMC (Urban Centre) Hospital",
|
|
82
|
+
"1669.0",
|
|
83
|
+
"920.0",
|
|
84
|
+
"3.902767295597484",
|
|
85
|
+
"749.0",
|
|
86
|
+
"-290.93013894085743",
|
|
87
|
+
"1788.9301389408574"
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
"ANC 1st visit",
|
|
91
|
+
"Charlotte CHP",
|
|
92
|
+
"49.0",
|
|
93
|
+
"39.0",
|
|
94
|
+
"7.515857142857143",
|
|
95
|
+
"10.0",
|
|
96
|
+
"-23.948490393535913",
|
|
97
|
+
"43.94849039353591"
|
|
98
|
+
],
|
|
99
|
+
[
|
|
100
|
+
"ANC 2nd visit",
|
|
101
|
+
"Charlotte CHP",
|
|
102
|
+
"40.0",
|
|
103
|
+
"33.0",
|
|
104
|
+
"22.258499999999998",
|
|
105
|
+
"7.0",
|
|
106
|
+
"-30.86489139031037",
|
|
107
|
+
"44.86489139031037"
|
|
108
|
+
],
|
|
109
|
+
[
|
|
110
|
+
"ANC 2nd visit",
|
|
111
|
+
"Wilberforce CHC",
|
|
112
|
+
"56.0",
|
|
113
|
+
"24.5",
|
|
114
|
+
"3.004590909090909",
|
|
115
|
+
"31.5",
|
|
116
|
+
"-1.3890179239210454",
|
|
117
|
+
"64.38901792392105"
|
|
118
|
+
],
|
|
119
|
+
[
|
|
120
|
+
"ANC 1st visit",
|
|
121
|
+
"Deep Eye water MCHP",
|
|
122
|
+
"40.0",
|
|
123
|
+
"16.0",
|
|
124
|
+
"3.5973333333333333",
|
|
125
|
+
"24.0",
|
|
126
|
+
"4.850913859925324",
|
|
127
|
+
"43.14908614007467"
|
|
128
|
+
],
|
|
129
|
+
[
|
|
130
|
+
"ANC 2nd visit",
|
|
131
|
+
"Lion for Lion Clinic",
|
|
132
|
+
"30.0",
|
|
133
|
+
"16.0",
|
|
134
|
+
"3.5973333333333333",
|
|
135
|
+
"14.0",
|
|
136
|
+
"-5.620896815302167",
|
|
137
|
+
"33.62089681530217"
|
|
138
|
+
],
|
|
139
|
+
[
|
|
140
|
+
"ANC 2nd visit",
|
|
141
|
+
"Deep Eye water MCHP",
|
|
142
|
+
"33.0",
|
|
143
|
+
"14.5",
|
|
144
|
+
"3.9121",
|
|
145
|
+
"18.5",
|
|
146
|
+
"-3.4245866551686603",
|
|
147
|
+
"40.42458665516866"
|
|
148
|
+
],
|
|
149
|
+
[
|
|
150
|
+
"ANC 2nd visit",
|
|
151
|
+
"Blessed Mokaka East Clinic",
|
|
152
|
+
"2.0",
|
|
153
|
+
"13.0",
|
|
154
|
+
"4.38425",
|
|
155
|
+
"15.0",
|
|
156
|
+
"-3.417043736713012",
|
|
157
|
+
"33.41704373671301"
|
|
158
|
+
],
|
|
159
|
+
[
|
|
160
|
+
"ANC 2nd visit",
|
|
161
|
+
"Malambay CHP",
|
|
162
|
+
"15.0",
|
|
163
|
+
"12.0",
|
|
164
|
+
"5.396",
|
|
165
|
+
"3.0",
|
|
166
|
+
"-13.770509831248425",
|
|
167
|
+
"19.770509831248425"
|
|
168
|
+
],
|
|
169
|
+
[
|
|
170
|
+
"ANC 2nd visit",
|
|
171
|
+
"Wellbody MCHP",
|
|
172
|
+
"20.0",
|
|
173
|
+
"10.0",
|
|
174
|
+
"3.3725",
|
|
175
|
+
"10.0",
|
|
176
|
+
"-10.999999999999996",
|
|
177
|
+
"30.999999999999996"
|
|
178
|
+
],
|
|
179
|
+
[
|
|
180
|
+
"ANC 1st visit",
|
|
181
|
+
"Blessed Mokaka East Clinic",
|
|
182
|
+
"26.0",
|
|
183
|
+
"10.0",
|
|
184
|
+
"4.496666666666667",
|
|
185
|
+
"16.0",
|
|
186
|
+
"1.6734512181055958",
|
|
187
|
+
"30.326548781894402"
|
|
188
|
+
],
|
|
189
|
+
[
|
|
190
|
+
"ANC 1st visit",
|
|
191
|
+
"Murray Town CHC",
|
|
192
|
+
"18.0",
|
|
193
|
+
"9.0",
|
|
194
|
+
"6.0705",
|
|
195
|
+
"9.0",
|
|
196
|
+
"-2.43571205496543",
|
|
197
|
+
"20.43571205496543"
|
|
198
|
+
],
|
|
199
|
+
[
|
|
200
|
+
"ANC 2nd visit",
|
|
201
|
+
"Thompson Bay MCHP",
|
|
202
|
+
"11.0",
|
|
203
|
+
"6.0",
|
|
204
|
+
"4.047",
|
|
205
|
+
"5.0",
|
|
206
|
+
"-2.038266127580332",
|
|
207
|
+
"12.038266127580332"
|
|
208
|
+
]
|
|
209
|
+
],
|
|
210
|
+
"headerWidth": 8,
|
|
211
|
+
"width": 8,
|
|
212
|
+
"height": 13
|
|
213
|
+
}
|
|
@@ -74,12 +74,38 @@ class AnalyticsAggregate extends _AnalyticsBase.default {
|
|
|
74
74
|
* .withStartDate('2017-10-01')
|
|
75
75
|
* .withEndDate('2017-10-31');
|
|
76
76
|
*
|
|
77
|
-
* analytics.aggregate.getDebugSql(req)
|
|
77
|
+
* analytics.aggregate.getDebugSql(req)
|
|
78
78
|
* .then(console.log);
|
|
79
79
|
*/
|
|
80
80
|
getDebugSql(req) {
|
|
81
81
|
return this.fetch(req.withPath('debug/sql'));
|
|
82
82
|
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @param {!AnalyticsRequest} req Request object
|
|
86
|
+
*
|
|
87
|
+
* @returns {Promise} Promise that resolves with the SQL statement used to query the database.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* const req = new analytics.request()
|
|
91
|
+
* .withParameters({
|
|
92
|
+
* dx: 'fbfJHSPpUQD,cYeuwXTCPkU',
|
|
93
|
+
* pe: 'THIS_YEAR',
|
|
94
|
+
* ou: 'USER_ORGUNIT,USER_ORGUNIT_CHILDREN',
|
|
95
|
+
* headers: 'dxname,pename,ouname,value,absdev,modifiedzscore,median,lowerbound,upperbound',
|
|
96
|
+
* algorithm: 'MODIFIED_Z_SCORE',
|
|
97
|
+
* maxResults: 100,
|
|
98
|
+
* threshold: 3,
|
|
99
|
+
orderBy: 'value',
|
|
100
|
+
sortOrder: 'desc',
|
|
101
|
+
* });
|
|
102
|
+
*
|
|
103
|
+
* analytics.aggregate.getOutliersData(req)
|
|
104
|
+
* .then(console.log);
|
|
105
|
+
*/
|
|
106
|
+
getOutliersData(req) {
|
|
107
|
+
return this.fetch(req.withPath('outlierDetection'));
|
|
108
|
+
}
|
|
83
109
|
}
|
|
84
110
|
var _default = AnalyticsAggregate;
|
|
85
111
|
exports.default = _default;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = void 0;
|
|
6
|
+
exports.generateDimensionStrings = exports.default = void 0;
|
|
7
7
|
var _sortBy = _interopRequireDefault(require("lodash/sortBy"));
|
|
8
8
|
var _AnalyticsRequest = _interopRequireDefault(require("./AnalyticsRequest.js"));
|
|
9
9
|
var _utils = require("./utils.js");
|
|
@@ -29,8 +29,8 @@ const analyticsQuery = {
|
|
|
29
29
|
parameters
|
|
30
30
|
} = _ref2;
|
|
31
31
|
return {
|
|
32
|
-
dimension: dimensions,
|
|
33
|
-
filter: filters,
|
|
32
|
+
dimension: dimensions.length ? dimensions : undefined,
|
|
33
|
+
filter: filters.length ? filters : undefined,
|
|
34
34
|
...parameters
|
|
35
35
|
};
|
|
36
36
|
}
|
|
@@ -56,8 +56,8 @@ const analyticsDataQuery = {
|
|
|
56
56
|
parameters
|
|
57
57
|
} = _ref4;
|
|
58
58
|
return {
|
|
59
|
-
dimension: dimensions,
|
|
60
|
-
filter: filters,
|
|
59
|
+
dimension: dimensions.length ? dimensions : undefined,
|
|
60
|
+
filter: filters.length ? filters : undefined,
|
|
61
61
|
...parameters,
|
|
62
62
|
skipMeta: true,
|
|
63
63
|
skipData: false
|
|
@@ -85,8 +85,8 @@ const analyticsMetaDataQuery = {
|
|
|
85
85
|
parameters
|
|
86
86
|
} = _ref6;
|
|
87
87
|
return {
|
|
88
|
-
dimension: dimensions,
|
|
89
|
-
filter: filters,
|
|
88
|
+
dimension: dimensions.length ? dimensions : undefined,
|
|
89
|
+
filter: filters.length ? filters : undefined,
|
|
90
90
|
...parameters,
|
|
91
91
|
skipMeta: false,
|
|
92
92
|
skipData: true,
|
|
@@ -126,6 +126,7 @@ const generateDimensionStrings = function () {
|
|
|
126
126
|
* @memberof module:analytics
|
|
127
127
|
* @abstract
|
|
128
128
|
*/
|
|
129
|
+
exports.generateDimensionStrings = generateDimensionStrings;
|
|
129
130
|
class AnalyticsBase {
|
|
130
131
|
constructor(dataEngine) {
|
|
131
132
|
this.dataEngine = dataEngine;
|
|
@@ -55,7 +55,7 @@ class AnalyticsRequestBase {
|
|
|
55
55
|
buildUrl(options) {
|
|
56
56
|
// at least 1 dimension is required
|
|
57
57
|
let dimensions = this.dimensions;
|
|
58
|
-
if (options && options.sorted) {
|
|
58
|
+
if (dimensions.length && options !== null && options !== void 0 && options.sorted) {
|
|
59
59
|
dimensions = (0, _sortBy.default)(dimensions, 'dimension');
|
|
60
60
|
}
|
|
61
61
|
const encodedDimensions = dimensions.map(_ref => {
|
|
@@ -65,7 +65,7 @@ class AnalyticsRequestBase {
|
|
|
65
65
|
} = _ref;
|
|
66
66
|
if (Array.isArray(items) && items.length) {
|
|
67
67
|
const encodedItems = items.map(_utils.customEncodeURIComponent);
|
|
68
|
-
if (options && options.sorted) {
|
|
68
|
+
if (options !== null && options !== void 0 && options.sorted) {
|
|
69
69
|
encodedItems.sort();
|
|
70
70
|
}
|
|
71
71
|
return `${dimension}:${encodedItems.join(';')}`;
|
|
@@ -73,7 +73,11 @@ class AnalyticsRequestBase {
|
|
|
73
73
|
return dimension;
|
|
74
74
|
});
|
|
75
75
|
const endPoint = [this.endPoint, this.path, this.program, this.trackedEntityType].filter(Boolean).join('/');
|
|
76
|
-
|
|
76
|
+
let url = `${endPoint}.${this.format}`;
|
|
77
|
+
if (encodedDimensions.length) {
|
|
78
|
+
url += `?dimension=${encodedDimensions.join('&dimension=')}`;
|
|
79
|
+
}
|
|
80
|
+
return url;
|
|
77
81
|
}
|
|
78
82
|
|
|
79
83
|
/**
|
|
@@ -91,7 +95,7 @@ class AnalyticsRequestBase {
|
|
|
91
95
|
*/
|
|
92
96
|
buildQuery(options) {
|
|
93
97
|
let filters = this.filters;
|
|
94
|
-
if (options && options.sorted) {
|
|
98
|
+
if (filters.length && options !== null && options !== void 0 && options.sorted) {
|
|
95
99
|
filters = (0, _sortBy.default)(filters, 'dimension');
|
|
96
100
|
}
|
|
97
101
|
const encodedFilters = filters.map(_ref2 => {
|
|
@@ -101,7 +105,7 @@ class AnalyticsRequestBase {
|
|
|
101
105
|
} = _ref2;
|
|
102
106
|
if (Array.isArray(items) && items.length) {
|
|
103
107
|
const encodedItems = items.map(_utils.customEncodeURIComponent);
|
|
104
|
-
if (options && options.sorted) {
|
|
108
|
+
if (options !== null && options !== void 0 && options.sorted) {
|
|
105
109
|
encodedItems.sort();
|
|
106
110
|
}
|
|
107
111
|
return `${dimension}:${encodedItems.join(';')}`;
|
|
@@ -58,7 +58,8 @@ class AnalyticsResponse {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
extractHeaders() {
|
|
61
|
-
|
|
61
|
+
// some endpoints (ie. outlierDetection) don't return dimensions in metaData
|
|
62
|
+
const dimensions = this.response.metaData.dimensions || {};
|
|
62
63
|
const headers = this.response.headers || [];
|
|
63
64
|
return headers.map((header, index) => new _AnalyticsResponseHeader.default(header, {
|
|
64
65
|
isPrefix: isPrefixHeader(header, dimensions[header.name]),
|
|
@@ -94,48 +95,50 @@ class AnalyticsResponse {
|
|
|
94
95
|
items
|
|
95
96
|
} = metaData;
|
|
96
97
|
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
// some endpoints (ie. outlierDetection) don't return dimensions or items
|
|
99
|
+
if (dimensions && items) {
|
|
100
|
+
this.headers.filter(header => !DEFAULT_COLLECT_IGNORE_HEADERS.includes(header.name)).forEach(header => {
|
|
101
|
+
let ids;
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
// create items
|
|
113
|
-
dimensions[header.name].forEach((prefixedId, index) => {
|
|
114
|
-
const id = ids[index];
|
|
115
|
-
const valueType = header.valueType;
|
|
116
|
-
const name = getNameByIdsByValueType(id, valueType);
|
|
117
|
-
items[prefixedId] = {
|
|
118
|
-
name
|
|
119
|
-
};
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
});
|
|
103
|
+
// collect row values
|
|
104
|
+
if (header.isCollect) {
|
|
105
|
+
ids = this.getSortedUniqueRowIdStringsByHeader(header);
|
|
106
|
+
dimensions[header.name] = ids;
|
|
107
|
+
} else {
|
|
108
|
+
ids = dimensions[header.name];
|
|
109
|
+
}
|
|
110
|
+
if (header.isPrefix) {
|
|
111
|
+
// create prefixed dimensions array
|
|
112
|
+
dimensions[header.name] = ids.map(id => getPrefixedId(id, header.name));
|
|
123
113
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
ouName = row[ouNameHeaderIndex];
|
|
134
|
-
items[ouId] = {
|
|
135
|
-
name: ouName
|
|
136
|
-
};
|
|
114
|
+
// create items
|
|
115
|
+
dimensions[header.name].forEach((prefixedId, index) => {
|
|
116
|
+
const id = ids[index];
|
|
117
|
+
const valueType = header.valueType;
|
|
118
|
+
const name = getNameByIdsByValueType(id, valueType);
|
|
119
|
+
items[prefixedId] = {
|
|
120
|
+
name
|
|
121
|
+
};
|
|
122
|
+
});
|
|
137
123
|
}
|
|
138
124
|
});
|
|
125
|
+
|
|
126
|
+
// for events, add items from 'ouname'
|
|
127
|
+
if (this.hasHeader(OUNAME) && this.hasHeader(OU)) {
|
|
128
|
+
const ouNameHeaderIndex = this.getHeader(OUNAME).getIndex();
|
|
129
|
+
const ouHeaderIndex = this.getHeader(OU).getIndex();
|
|
130
|
+
let ouId;
|
|
131
|
+
let ouName;
|
|
132
|
+
this.rows.forEach(row => {
|
|
133
|
+
ouId = row[ouHeaderIndex];
|
|
134
|
+
if (items[ouId] === undefined) {
|
|
135
|
+
ouName = row[ouNameHeaderIndex];
|
|
136
|
+
items[ouId] = {
|
|
137
|
+
name: ouName
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
139
142
|
}
|
|
140
143
|
return metaData;
|
|
141
144
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var _Analytics = _interopRequireDefault(require("../Analytics.js"));
|
|
4
4
|
var _AnalyticsAggregate = _interopRequireDefault(require("../AnalyticsAggregate.js"));
|
|
5
|
+
var _AnalyticsEnrollments = _interopRequireDefault(require("../AnalyticsEnrollments.js"));
|
|
5
6
|
var _AnalyticsEvents = _interopRequireDefault(require("../AnalyticsEvents.js"));
|
|
6
7
|
var _AnalyticsRequest = _interopRequireDefault(require("../AnalyticsRequest.js"));
|
|
7
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -10,6 +11,7 @@ describe('Analytics', () => {
|
|
|
10
11
|
beforeEach(() => {
|
|
11
12
|
analytics = new _Analytics.default({
|
|
12
13
|
aggregate: new _AnalyticsAggregate.default(),
|
|
14
|
+
enrollments: new _AnalyticsEnrollments.default(),
|
|
13
15
|
events: new _AnalyticsEvents.default(),
|
|
14
16
|
request: _AnalyticsRequest.default
|
|
15
17
|
});
|
|
@@ -23,6 +25,9 @@ describe('Analytics', () => {
|
|
|
23
25
|
it('should contain an instance of AnalyticsAggregate', () => {
|
|
24
26
|
expect(analytics.aggregate).toBeInstanceOf(_AnalyticsAggregate.default);
|
|
25
27
|
});
|
|
28
|
+
it('should contain an instance of AnalyticsEnrollments', () => {
|
|
29
|
+
expect(analytics.enrollments).toBeInstanceOf(_AnalyticsEnrollments.default);
|
|
30
|
+
});
|
|
26
31
|
it('should contain an instance of AnalyticsEvents', () => {
|
|
27
32
|
expect(analytics.events).toBeInstanceOf(_AnalyticsEvents.default);
|
|
28
33
|
});
|
|
@@ -87,4 +87,33 @@ describe('Analytics.aggregate', () => {
|
|
|
87
87
|
expect(data.height).toEqual(0);
|
|
88
88
|
}));
|
|
89
89
|
});
|
|
90
|
+
describe('.getOutliersData', () => {
|
|
91
|
+
beforeEach(() => {
|
|
92
|
+
aggregate = new _AnalyticsAggregate.default(new _DataEngine.default());
|
|
93
|
+
request = new _AnalyticsRequest.default();
|
|
94
|
+
request.withParameters({
|
|
95
|
+
dx: 'fbfJHSPpUQD,cYeuwXTCPkU',
|
|
96
|
+
pe: 'THIS_YEAR',
|
|
97
|
+
ou: 'at6UHUQatSo',
|
|
98
|
+
headers: 'dxname,pename,ouname,value,absdev,modifiedzscore,median,lowerbound,upperbound',
|
|
99
|
+
algorithm: 'MOD_Z_SCORE',
|
|
100
|
+
maxResults: 100,
|
|
101
|
+
threshold: 3
|
|
102
|
+
});
|
|
103
|
+
fixture = _fixtures.default.get('/api/analytics/outlierDetection');
|
|
104
|
+
dataEngineMock.query.mockReturnValue(Promise.resolve({
|
|
105
|
+
data: fixture
|
|
106
|
+
}));
|
|
107
|
+
});
|
|
108
|
+
it('should be a function', () => {
|
|
109
|
+
expect(aggregate.getOutliersData).toBeInstanceOf(Function);
|
|
110
|
+
});
|
|
111
|
+
it('should resolve a promise with data', () => aggregate.getOutliersData(request).then(data => {
|
|
112
|
+
expect(data.metaData.items).toEqual(fixture.metaData.items);
|
|
113
|
+
expect(data.metaData.dimensions).toEqual(fixture.metaData.dimensions);
|
|
114
|
+
expect(data.headers).toEqual(fixture.headers);
|
|
115
|
+
expect(data.width).toEqual(8);
|
|
116
|
+
expect(data.height).toEqual(13);
|
|
117
|
+
}));
|
|
118
|
+
});
|
|
90
119
|
});
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _AnalyticsBase =
|
|
4
|
-
function
|
|
3
|
+
var _AnalyticsBase = _interopRequireWildcard(require("../AnalyticsBase.js"));
|
|
4
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
5
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
5
6
|
let base;
|
|
6
7
|
describe('constructor', () => {
|
|
7
8
|
beforeEach(() => {
|
|
@@ -15,4 +16,37 @@ describe('constructor', () => {
|
|
|
15
16
|
base = new _AnalyticsBase.default(dataEngineMock);
|
|
16
17
|
expect(base.dataEngine).toBe(dataEngineMock);
|
|
17
18
|
});
|
|
19
|
+
});
|
|
20
|
+
describe('generateDimensionString', () => {
|
|
21
|
+
const tests = [{
|
|
22
|
+
input: [{
|
|
23
|
+
dimension: 'dim2',
|
|
24
|
+
items: ['item2', 'item1']
|
|
25
|
+
}, {
|
|
26
|
+
dimension: 'dim1',
|
|
27
|
+
items: ['item1']
|
|
28
|
+
}],
|
|
29
|
+
output: ['dim2:item2;item1', 'dim1:item1'],
|
|
30
|
+
outputSorted: ['dim1:item1', 'dim2:item1;item2']
|
|
31
|
+
}];
|
|
32
|
+
it('should return dimension strings correctly formatted', () => {
|
|
33
|
+
tests.forEach(_ref => {
|
|
34
|
+
let {
|
|
35
|
+
input,
|
|
36
|
+
output
|
|
37
|
+
} = _ref;
|
|
38
|
+
expect((0, _AnalyticsBase.generateDimensionStrings)(input)).toEqual(output);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
it('should return dimension strings correctly formatted and sorted', () => {
|
|
42
|
+
tests.forEach(_ref2 => {
|
|
43
|
+
let {
|
|
44
|
+
input,
|
|
45
|
+
outputSorted
|
|
46
|
+
} = _ref2;
|
|
47
|
+
expect((0, _AnalyticsBase.generateDimensionStrings)(input, {
|
|
48
|
+
sorted: true
|
|
49
|
+
})).toEqual(outputSorted);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
18
52
|
});
|
|
@@ -26,8 +26,6 @@ const formatDimension = _ref2 => {
|
|
|
26
26
|
programStageId,
|
|
27
27
|
dimension
|
|
28
28
|
} = _ref2;
|
|
29
|
-
return [
|
|
30
|
-
// XXX it would be clearer to have this consistent with what is sent in the request as for EVENT/ENROLLMENT
|
|
31
|
-
outputType === 'TRACKED_ENTITY_INSTANCE' ? programId : undefined, programStageId, dimension].filter(Boolean).join('.');
|
|
29
|
+
return [outputType === 'TRACKED_ENTITY_INSTANCE' ? programId : undefined, programStageId, dimension].filter(Boolean).join('.');
|
|
32
30
|
};
|
|
33
31
|
exports.formatDimension = formatDimension;
|
|
@@ -8,48 +8,22 @@ var _react = _interopRequireDefault(require("react"));
|
|
|
8
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
9
|
const DynamicDimensionIcon = () => {
|
|
10
10
|
return /*#__PURE__*/_react.default.createElement("svg", {
|
|
11
|
-
width: "16px",
|
|
12
|
-
height: "16px",
|
|
13
|
-
viewBox: "0 0 16 16",
|
|
14
|
-
version: "1.1",
|
|
15
|
-
xmlns: "http://www.w3.org/2000/svg"
|
|
16
|
-
}, /*#__PURE__*/_react.default.createElement("g", {
|
|
17
|
-
id: "Exp",
|
|
18
|
-
stroke: "none",
|
|
19
|
-
strokeWidth: "1",
|
|
20
|
-
fill: "none",
|
|
21
|
-
fillRule: "evenodd"
|
|
22
|
-
}, /*#__PURE__*/_react.default.createElement("g", {
|
|
23
|
-
id: "Artboard",
|
|
24
|
-
transform: "translate(-80.000000, -9.000000)"
|
|
25
|
-
}, /*#__PURE__*/_react.default.createElement("g", {
|
|
26
|
-
id: "icon_dimension_new",
|
|
27
|
-
transform: "translate(80.000000, 9.000000)"
|
|
28
|
-
}, /*#__PURE__*/_react.default.createElement("rect", {
|
|
29
|
-
id: "frame",
|
|
30
|
-
x: "0",
|
|
31
|
-
y: "0",
|
|
32
11
|
width: "16",
|
|
33
|
-
height: "16"
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
12
|
+
height: "16",
|
|
13
|
+
fill: "none",
|
|
14
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
15
|
+
}, /*#__PURE__*/_react.default.createElement("path", {
|
|
16
|
+
clipRule: "evenodd",
|
|
17
|
+
d: "m4.832 5.674 2.831-1.11a.913.913 0 0 1 .673 0l2.83 1.11a.548.548 0 0 1 .334.517V9.81a.548.548 0 0 1-.332.517l-2.831 1.11a.92.92 0 0 1-.673 0l-2.83-1.11a.548.548 0 0 1-.334-.517V6.19a.548.548 0 0 1 .332-.517Z",
|
|
18
|
+
stroke: "#212934",
|
|
38
19
|
strokeLinecap: "round",
|
|
39
20
|
strokeLinejoin: "round"
|
|
40
|
-
}, /*#__PURE__*/_react.default.createElement("path", {
|
|
41
|
-
d: "M0.33209728,1.1742111 L3.16308174,0.0641666694 C3.37911767,-0.0213888898 3.61963794,-0.0213888898 3.83567387,0.0641666694 L6.66665833,1.1742111 C6.87300668,1.26220739 7.00497003,1.467 6.99984343,1.69127776 L6.99984343,5.30887771 C7.00517859,5.53285411 6.87376309,5.73756106 6.66790272,5.82594437 L3.83691826,6.93629991 C3.62076407,7.02123336 3.38048032,7.02123336 3.16432613,6.93629991 L0.333341668,5.82594437 C0.126993317,5.73794808 -0.00497002591,5.53315547 0.000156574133,5.30887771 L0.000156574133,1.69127776 C-0.00517858533,1.46730136 0.126236906,1.26259441 0.33209728,1.1742111 Z",
|
|
42
|
-
id: "Shape"
|
|
43
|
-
}), /*#__PURE__*/_react.default.createElement("path", {
|
|
44
|
-
d: "M3.5,2.72795833 L0.322,1.48195833",
|
|
45
|
-
id: "Shape"
|
|
46
|
-
}), /*#__PURE__*/_react.default.createElement("path", {
|
|
47
|
-
d: "M3.5,2.72795833 L6.678,1.48195833",
|
|
48
|
-
id: "Shape"
|
|
49
21
|
}), /*#__PURE__*/_react.default.createElement("path", {
|
|
50
|
-
d: "
|
|
51
|
-
|
|
52
|
-
|
|
22
|
+
d: "M8 7.228 4.822 5.982M8 7.228l3.178-1.246M8 11.281V7.228",
|
|
23
|
+
stroke: "#212934",
|
|
24
|
+
strokeLinecap: "round",
|
|
25
|
+
strokeLinejoin: "round"
|
|
26
|
+
}));
|
|
53
27
|
};
|
|
54
28
|
var _default = DynamicDimensionIcon;
|
|
55
29
|
exports.default = _default;
|
|
@@ -156,6 +156,7 @@ const AboutAOUnit = /*#__PURE__*/(0, _react.forwardRef)((_ref3, ref) => {
|
|
|
156
156
|
className: `jsx-${_AboutAOUnitStyle.default.__hash}` + " " + "content"
|
|
157
157
|
}, /*#__PURE__*/_react.default.createElement("p", {
|
|
158
158
|
className: `jsx-${_AboutAOUnitStyle.default.__hash}` + " " + ((0, _classnames.default)('detailLine', {
|
|
159
|
+
description: true,
|
|
159
160
|
noDescription: !data.ao.displayDescription
|
|
160
161
|
}) || "")
|
|
161
162
|
}, data.ao.displayDescription ? /*#__PURE__*/_react.default.createElement(_d2UiRichText.Parser, null, data.ao.displayDescription) : _d2I18n.default.t('No description')), /*#__PURE__*/_react.default.createElement("div", {
|