@dhis2/analytics 26.4.1 → 26.6.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.
Files changed (89) hide show
  1. package/build/cjs/__fixtures__/fixtures.js +1 -0
  2. package/build/cjs/__fixtures__/json/api/analytics/outlierDetection.json +213 -0
  3. package/build/cjs/api/analytics/Analytics.js +7 -0
  4. package/build/cjs/api/analytics/AnalyticsAggregate.js +27 -1
  5. package/build/cjs/api/analytics/AnalyticsBase.js +32 -13
  6. package/build/cjs/api/analytics/AnalyticsRequest.js +33 -10
  7. package/build/cjs/api/analytics/AnalyticsRequestBase.js +12 -6
  8. package/build/cjs/api/analytics/AnalyticsRequestPropertiesMixin.js +19 -0
  9. package/build/cjs/api/analytics/AnalyticsResponse.js +42 -39
  10. package/build/cjs/api/analytics/AnalyticsTrackedEntities.js +31 -0
  11. package/build/cjs/api/analytics/__tests__/Analytics.spec.js +5 -0
  12. package/build/cjs/api/analytics/__tests__/AnalyticsAggregate.spec.js +29 -0
  13. package/build/cjs/api/analytics/__tests__/AnalyticsBase.spec.js +36 -2
  14. package/build/cjs/api/analytics/utils.js +21 -2
  15. package/build/cjs/components/DataDimension/DataDimension.js +31 -7
  16. package/build/cjs/components/DataDimension/DataTypeSelector.js +29 -8
  17. package/build/cjs/components/DataDimension/GroupSelector.js +7 -7
  18. package/build/cjs/components/DataDimension/ItemSelector.js +79 -61
  19. package/build/cjs/components/PeriodDimension/PeriodDimension.js +5 -2
  20. package/build/cjs/components/PeriodDimension/PeriodTransfer.js +64 -31
  21. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +1 -1
  22. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +1 -12
  23. package/build/cjs/components/VisTypeIcon.js +6 -1
  24. package/build/cjs/index.js +43 -1
  25. package/build/cjs/locales/en/translations.json +5 -1
  26. package/build/cjs/modules/__tests__/getAdaptedUiLayoutByType.spec.js +15 -0
  27. package/build/cjs/modules/axis.js +4 -0
  28. package/build/cjs/modules/getAdaptedUiLayoutByType.js +9 -0
  29. package/build/cjs/modules/layout/axisGetDimensionIds.js +1 -1
  30. package/build/cjs/modules/layout/dimension.js +9 -2
  31. package/build/cjs/modules/layout/dimensionCreate.js +3 -0
  32. package/build/cjs/modules/layout/dimensionGetId.js +9 -3
  33. package/build/cjs/modules/layout/layoutFilterDimensions.js +1 -1
  34. package/build/cjs/modules/layout/layoutGetAxisIdDimensionIdsObject.js +1 -1
  35. package/build/cjs/modules/layout/layoutGetDimensionIdItemIdsObject.js +1 -1
  36. package/build/cjs/modules/layout/layoutHasDynamicDimension.js +1 -1
  37. package/build/cjs/modules/layoutTypes.js +4 -2
  38. package/build/cjs/modules/layoutUiRules/__tests__/rules.spec.js +13 -1
  39. package/build/cjs/modules/layoutUiRules/index.js +12 -0
  40. package/build/cjs/modules/layoutUiRules/rules.js +22 -2
  41. package/build/cjs/modules/layoutUiRules/rulesHelper.js +4 -2
  42. package/build/cjs/modules/layoutUiRules/rulesUtils.js +7 -2
  43. package/build/cjs/modules/visTypeToLayoutType.js +2 -1
  44. package/build/cjs/modules/visTypes.js +9 -3
  45. package/build/es/__fixtures__/fixtures.js +1 -0
  46. package/build/es/__fixtures__/json/api/analytics/outlierDetection.json +213 -0
  47. package/build/es/api/analytics/Analytics.js +7 -0
  48. package/build/es/api/analytics/AnalyticsAggregate.js +27 -1
  49. package/build/es/api/analytics/AnalyticsBase.js +31 -13
  50. package/build/es/api/analytics/AnalyticsRequest.js +33 -10
  51. package/build/es/api/analytics/AnalyticsRequestBase.js +12 -6
  52. package/build/es/api/analytics/AnalyticsRequestPropertiesMixin.js +19 -0
  53. package/build/es/api/analytics/AnalyticsResponse.js +42 -39
  54. package/build/es/api/analytics/AnalyticsTrackedEntities.js +24 -0
  55. package/build/es/api/analytics/__tests__/Analytics.spec.js +5 -0
  56. package/build/es/api/analytics/__tests__/AnalyticsAggregate.spec.js +29 -0
  57. package/build/es/api/analytics/__tests__/AnalyticsBase.spec.js +34 -1
  58. package/build/es/api/analytics/utils.js +18 -1
  59. package/build/es/components/DataDimension/DataDimension.js +27 -6
  60. package/build/es/components/DataDimension/DataTypeSelector.js +30 -9
  61. package/build/es/components/DataDimension/GroupSelector.js +7 -7
  62. package/build/es/components/DataDimension/ItemSelector.js +80 -62
  63. package/build/es/components/PeriodDimension/PeriodDimension.js +5 -2
  64. package/build/es/components/PeriodDimension/PeriodTransfer.js +65 -32
  65. package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +1 -1
  66. package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +1 -12
  67. package/build/es/components/VisTypeIcon.js +8 -3
  68. package/build/es/index.js +4 -4
  69. package/build/es/locales/en/translations.json +5 -1
  70. package/build/es/modules/__tests__/getAdaptedUiLayoutByType.spec.js +16 -1
  71. package/build/es/modules/axis.js +5 -1
  72. package/build/es/modules/getAdaptedUiLayoutByType.js +10 -1
  73. package/build/es/modules/layout/axisGetDimensionIds.js +1 -1
  74. package/build/es/modules/layout/dimension.js +7 -1
  75. package/build/es/modules/layout/dimensionCreate.js +4 -1
  76. package/build/es/modules/layout/dimensionGetId.js +10 -4
  77. package/build/es/modules/layout/layoutFilterDimensions.js +1 -1
  78. package/build/es/modules/layout/layoutGetAxisIdDimensionIdsObject.js +1 -1
  79. package/build/es/modules/layout/layoutGetDimensionIdItemIdsObject.js +1 -1
  80. package/build/es/modules/layout/layoutHasDynamicDimension.js +1 -1
  81. package/build/es/modules/layoutTypes.js +2 -1
  82. package/build/es/modules/layoutUiRules/__tests__/rules.spec.js +14 -2
  83. package/build/es/modules/layoutUiRules/index.js +2 -2
  84. package/build/es/modules/layoutUiRules/rules.js +22 -3
  85. package/build/es/modules/layoutUiRules/rulesHelper.js +3 -2
  86. package/build/es/modules/layoutUiRules/rulesUtils.js +6 -2
  87. package/build/es/modules/visTypeToLayoutType.js +4 -3
  88. package/build/es/modules/visTypes.js +7 -3
  89. package/package.json +6 -3
@@ -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
+ }
@@ -9,6 +9,7 @@ var _AnalyticsEnrollments = _interopRequireDefault(require("./AnalyticsEnrollmen
9
9
  var _AnalyticsEvents = _interopRequireDefault(require("./AnalyticsEvents.js"));
10
10
  var _AnalyticsRequest = _interopRequireDefault(require("./AnalyticsRequest.js"));
11
11
  var _AnalyticsResponse = _interopRequireDefault(require("./AnalyticsResponse.js"));
12
+ var _AnalyticsTrackedEntities = _interopRequireDefault(require("./AnalyticsTrackedEntities.js"));
12
13
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
14
  /**
14
15
  * @module analytics
@@ -19,6 +20,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
19
20
  * Analytics class used to request analytics data from Web API.
20
21
  *
21
22
  * @requires analytics.AnalyticsAggregate
23
+ * @requires analytics.AnalyticsTrackedEntities
24
+ * @requires analytics.AnalyticsEnrollments
22
25
  * @requires analytics.AnalyticsEvents
23
26
  * @requires analytics.AnalyticsRequest
24
27
  * @requires analytics.AnalyticsResponse
@@ -38,6 +41,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
38
41
  class Analytics {
39
42
  /**
40
43
  * @param {!module:analytics.AnalyticsAggregate} analyticsAggregate The AnalyticsAggregate instance
44
+ * @param {!module:analytics.AnalyticsTrackedEntities} analyticsTrackedEntities The AnalyticsTrackedEntities instance
41
45
  * @param {!module:analytics.AnalyticsEnrollments} analyticsEnrollments The AnalyticsEnrollments instance
42
46
  * @param {!module:analytics.AnalyticsEvents} analyticsEvents The AnalyticsEvents instance
43
47
  * @param {!module:analytics.AnalyticsRequest} analyticsRequest The AnalyticsRequest class
@@ -46,12 +50,14 @@ class Analytics {
46
50
  constructor(_ref) {
47
51
  let {
48
52
  aggregate,
53
+ trackedEntities,
49
54
  enrollments,
50
55
  events,
51
56
  request,
52
57
  response
53
58
  } = _ref;
54
59
  this.aggregate = aggregate;
60
+ this.trackedEntities = trackedEntities;
55
61
  this.enrollments = enrollments;
56
62
  this.events = events;
57
63
  this.request = request;
@@ -74,6 +80,7 @@ class Analytics {
74
80
  if (!Analytics.getAnalytics.analytics) {
75
81
  Analytics.getAnalytics.analytics = new Analytics({
76
82
  aggregate: new _AnalyticsAggregate.default(dataEngine),
83
+ trackedEntities: new _AnalyticsTrackedEntities.default(dataEngine),
77
84
  enrollments: new _AnalyticsEnrollments.default(dataEngine),
78
85
  events: new _AnalyticsEvents.default(dataEngine),
79
86
  request: _AnalyticsRequest.default,
@@ -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,18 +3,24 @@
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
+ var _utils = require("./utils.js");
9
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
11
  const analyticsQuery = {
11
12
  resource: 'analytics',
12
13
  id: _ref => {
13
14
  let {
14
15
  path,
15
- program
16
+ program,
17
+ trackedEntityType
16
18
  } = _ref;
17
- return [path, program].filter(Boolean).join('/');
19
+ return (0, _utils.formatRequestPath)({
20
+ path,
21
+ program,
22
+ trackedEntityType
23
+ });
18
24
  },
19
25
  params: _ref2 => {
20
26
  let {
@@ -23,8 +29,8 @@ const analyticsQuery = {
23
29
  parameters
24
30
  } = _ref2;
25
31
  return {
26
- dimension: dimensions,
27
- filter: filters,
32
+ dimension: dimensions.length ? dimensions : undefined,
33
+ filter: filters.length ? filters : undefined,
28
34
  ...parameters
29
35
  };
30
36
  }
@@ -34,9 +40,14 @@ const analyticsDataQuery = {
34
40
  id: _ref3 => {
35
41
  let {
36
42
  path,
37
- program
43
+ program,
44
+ trackedEntityType
38
45
  } = _ref3;
39
- return [path, program].filter(Boolean).join('/');
46
+ return (0, _utils.formatRequestPath)({
47
+ path,
48
+ program,
49
+ trackedEntityType
50
+ });
40
51
  },
41
52
  params: _ref4 => {
42
53
  let {
@@ -45,8 +56,8 @@ const analyticsDataQuery = {
45
56
  parameters
46
57
  } = _ref4;
47
58
  return {
48
- dimension: dimensions,
49
- filter: filters,
59
+ dimension: dimensions.length ? dimensions : undefined,
60
+ filter: filters.length ? filters : undefined,
50
61
  ...parameters,
51
62
  skipMeta: true,
52
63
  skipData: false
@@ -58,9 +69,14 @@ const analyticsMetaDataQuery = {
58
69
  id: _ref5 => {
59
70
  let {
60
71
  path,
61
- program
72
+ program,
73
+ trackedEntityType
62
74
  } = _ref5;
63
- return [path, program].filter(Boolean).join('/');
75
+ return (0, _utils.formatRequestPath)({
76
+ path,
77
+ program,
78
+ trackedEntityType
79
+ });
64
80
  },
65
81
  params: _ref6 => {
66
82
  let {
@@ -69,8 +85,8 @@ const analyticsMetaDataQuery = {
69
85
  parameters
70
86
  } = _ref6;
71
87
  return {
72
- dimension: dimensions,
73
- filter: filters,
88
+ dimension: dimensions.length ? dimensions : undefined,
89
+ filter: filters.length ? filters : undefined,
74
90
  ...parameters,
75
91
  skipMeta: false,
76
92
  skipData: true,
@@ -110,6 +126,7 @@ const generateDimensionStrings = function () {
110
126
  * @memberof module:analytics
111
127
  * @abstract
112
128
  */
129
+ exports.generateDimensionStrings = generateDimensionStrings;
113
130
  class AnalyticsBase {
114
131
  constructor(dataEngine) {
115
132
  this.dataEngine = dataEngine;
@@ -152,6 +169,7 @@ class AnalyticsBase {
152
169
  variables: {
153
170
  path: req.path,
154
171
  program: req.program,
172
+ trackedEntityType: req.trackedEntityType,
155
173
  dimensions: generateDimensionStrings(req.dimensions),
156
174
  filters: generateDimensionStrings(req.filters),
157
175
  parameters: req.parameters,
@@ -194,6 +212,7 @@ class AnalyticsBase {
194
212
  variables: {
195
213
  path: req.path,
196
214
  program: req.program,
215
+ trackedEntityType: req.trackedEntityType,
197
216
  dimensions: generateDimensionStrings(req.dimensions, options),
198
217
  filters: generateDimensionStrings(req.filters, options),
199
218
  parameters: req.parameters
@@ -10,6 +10,7 @@ var _AnalyticsRequestBase = _interopRequireDefault(require("./AnalyticsRequestBa
10
10
  var _AnalyticsRequestDimensionsMixin = _interopRequireDefault(require("./AnalyticsRequestDimensionsMixin.js"));
11
11
  var _AnalyticsRequestFiltersMixin = _interopRequireDefault(require("./AnalyticsRequestFiltersMixin.js"));
12
12
  var _AnalyticsRequestPropertiesMixin = _interopRequireDefault(require("./AnalyticsRequestPropertiesMixin.js"));
13
+ var _utils = require("./utils.js");
13
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
15
  /**
15
16
  * @description
@@ -47,6 +48,7 @@ class AnalyticsRequest extends (0, _AnalyticsRequestDimensionsMixin.default)((0,
47
48
  fromVisualization(visualization) {
48
49
  let passFilterAsDimension = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
49
50
  let request = this;
51
+ const outputType = visualization.outputType;
50
52
 
51
53
  // extract dimensions from visualization
52
54
  const columns = visualization.columns || [];
@@ -57,19 +59,28 @@ class AnalyticsRequest extends (0, _AnalyticsRequestDimensionsMixin.default)((0,
57
59
  if ((_d$legendSet = d.legendSet) !== null && _d$legendSet !== void 0 && _d$legendSet.id) {
58
60
  dimension += `-${d.legendSet.id}`;
59
61
  }
60
- if ((_d$programStage = d.programStage) !== null && _d$programStage !== void 0 && _d$programStage.id) {
61
- dimension = `${d.programStage.id}.${dimension}`;
62
- }
63
62
  if (d.filter) {
64
63
  dimension += `:${d.filter}`;
65
64
  }
65
+ const programStageId = (_d$programStage = d.programStage) === null || _d$programStage === void 0 ? void 0 : _d$programStage.id;
66
66
  if ((_d$repetition = d.repetition) !== null && _d$repetition !== void 0 && (_d$repetition$indexes = _d$repetition.indexes) !== null && _d$repetition$indexes !== void 0 && _d$repetition$indexes.length) {
67
67
  d.repetition.indexes.forEach(index => {
68
- request = request.addDimension(dimension.replace(/\./, `[${index}].`));
68
+ var _d$program;
69
+ request = request.addDimension((0, _utils.formatDimension)({
70
+ programId: (_d$program = d.program) === null || _d$program === void 0 ? void 0 : _d$program.id,
71
+ programStageId: `${programStageId}[${index}]`,
72
+ dimension,
73
+ outputType
74
+ }));
69
75
  });
70
76
  } else {
71
- var _d$items;
72
- request = request.addDimension(dimension, (_d$items = d.items) === null || _d$items === void 0 ? void 0 : _d$items.map(item => item.id));
77
+ var _d$program2, _d$items;
78
+ request = request.addDimension((0, _utils.formatDimension)({
79
+ programId: (_d$program2 = d.program) === null || _d$program2 === void 0 ? void 0 : _d$program2.id,
80
+ programStageId,
81
+ dimension,
82
+ outputType
83
+ }), (_d$items = d.items) === null || _d$items === void 0 ? void 0 : _d$items.map(item => item.id));
73
84
  }
74
85
  });
75
86
 
@@ -84,17 +95,29 @@ class AnalyticsRequest extends (0, _AnalyticsRequestDimensionsMixin.default)((0,
84
95
  request = request.addDimension(f.dimension, (_f$items = f.items) === null || _f$items === void 0 ? void 0 : _f$items.map(item => item.id));
85
96
  } else {
86
97
  var _f$programStage, _f$repetition, _f$repetition$indexes;
87
- let filterString = (_f$programStage = f.programStage) !== null && _f$programStage !== void 0 && _f$programStage.id ? `${f.programStage.id}.${f.dimension}` : f.dimension;
98
+ let filterString = f.dimension;
88
99
  if (f.filter) {
89
100
  filterString += `:${f.filter}`;
90
101
  }
102
+ const programStageId = (_f$programStage = f.programStage) === null || _f$programStage === void 0 ? void 0 : _f$programStage.id;
91
103
  if ((_f$repetition = f.repetition) !== null && _f$repetition !== void 0 && (_f$repetition$indexes = _f$repetition.indexes) !== null && _f$repetition$indexes !== void 0 && _f$repetition$indexes.length) {
92
104
  f.repetition.indexes.forEach(index => {
93
- request = request.addFilter(filterString.replace(/\./, `[${index}].`));
105
+ var _f$program;
106
+ request = request.addFilter((0, _utils.formatDimension)({
107
+ programId: (_f$program = f.program) === null || _f$program === void 0 ? void 0 : _f$program.id,
108
+ programStageId: `${programStageId}[${index}]`,
109
+ dimension: filterString,
110
+ outputType
111
+ }));
94
112
  });
95
113
  } else {
96
- var _f$items2;
97
- request = request.addFilter(filterString, (_f$items2 = f.items) === null || _f$items2 === void 0 ? void 0 : _f$items2.map(item => item.id));
114
+ var _f$program2, _f$items2;
115
+ request = request.addFilter((0, _utils.formatDimension)({
116
+ programId: (_f$program2 = f.program) === null || _f$program2 === void 0 ? void 0 : _f$program2.id,
117
+ programStageId,
118
+ dimension: filterString,
119
+ outputType
120
+ }), (_f$items2 = f.items) === null || _f$items2 === void 0 ? void 0 : _f$items2.map(item => item.id));
98
121
  }
99
122
  }
100
123
  });
@@ -24,6 +24,7 @@ class AnalyticsRequestBase {
24
24
  format = 'json',
25
25
  path,
26
26
  program,
27
+ trackedEntityType,
27
28
  dimensions = [],
28
29
  filters = [],
29
30
  parameters = {}
@@ -32,6 +33,7 @@ class AnalyticsRequestBase {
32
33
  this.format = format.toLowerCase();
33
34
  this.path = path;
34
35
  this.program = program;
36
+ this.trackedEntityType = trackedEntityType;
35
37
  this.dimensions = dimensions;
36
38
  this.filters = filters;
37
39
  this.parameters = {
@@ -53,7 +55,7 @@ class AnalyticsRequestBase {
53
55
  buildUrl(options) {
54
56
  // at least 1 dimension is required
55
57
  let dimensions = this.dimensions;
56
- if (options && options.sorted) {
58
+ if (dimensions.length && options !== null && options !== void 0 && options.sorted) {
57
59
  dimensions = (0, _sortBy.default)(dimensions, 'dimension');
58
60
  }
59
61
  const encodedDimensions = dimensions.map(_ref => {
@@ -63,15 +65,19 @@ class AnalyticsRequestBase {
63
65
  } = _ref;
64
66
  if (Array.isArray(items) && items.length) {
65
67
  const encodedItems = items.map(_utils.customEncodeURIComponent);
66
- if (options && options.sorted) {
68
+ if (options !== null && options !== void 0 && options.sorted) {
67
69
  encodedItems.sort();
68
70
  }
69
71
  return `${dimension}:${encodedItems.join(';')}`;
70
72
  }
71
73
  return dimension;
72
74
  });
73
- const endPoint = [this.endPoint, this.path, this.program].filter(e => !!e).join('/');
74
- return `${endPoint}.${this.format}?dimension=${encodedDimensions.join('&dimension=')}`;
75
+ const endPoint = [this.endPoint, this.path, this.program, this.trackedEntityType].filter(Boolean).join('/');
76
+ let url = `${endPoint}.${this.format}`;
77
+ if (encodedDimensions.length) {
78
+ url += `?dimension=${encodedDimensions.join('&dimension=')}`;
79
+ }
80
+ return url;
75
81
  }
76
82
 
77
83
  /**
@@ -89,7 +95,7 @@ class AnalyticsRequestBase {
89
95
  */
90
96
  buildQuery(options) {
91
97
  let filters = this.filters;
92
- if (options && options.sorted) {
98
+ if (filters.length && options !== null && options !== void 0 && options.sorted) {
93
99
  filters = (0, _sortBy.default)(filters, 'dimension');
94
100
  }
95
101
  const encodedFilters = filters.map(_ref2 => {
@@ -99,7 +105,7 @@ class AnalyticsRequestBase {
99
105
  } = _ref2;
100
106
  if (Array.isArray(items) && items.length) {
101
107
  const encodedItems = items.map(_utils.customEncodeURIComponent);
102
- if (options && options.sorted) {
108
+ if (options !== null && options !== void 0 && options.sorted) {
103
109
  encodedItems.sort();
104
110
  }
105
111
  return `${dimension}:${encodedItems.join(';')}`;
@@ -497,6 +497,25 @@ class extends base {
497
497
  return new _AnalyticsRequest.default(this);
498
498
  }
499
499
 
500
+ /**
501
+ * Sets the tracked entity type for the request.
502
+ * It appends the tracked entity type id to the request's path.
503
+ *
504
+ * @param {!String} trackedEntityType The tracked entity type id
505
+ *
506
+ * @returns {AnalyticsRequest} A new instance of the class for chaining purposes
507
+ *
508
+ * @example
509
+ * const req = new analytics.request()
510
+ * .withTrackedEntityType('nEenWmSyUEp');
511
+ */
512
+ withTrackedEntityType(trackedEntityType) {
513
+ if (trackedEntityType) {
514
+ this.trackedEntityType = trackedEntityType;
515
+ }
516
+ return new _AnalyticsRequest.default(this);
517
+ }
518
+
500
519
  /**
501
520
  * Sets the program for the request.
502
521
  * It appends the program id to the request's path.