@dhis2/analytics 29.4.3 → 29.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.
Files changed (33) hide show
  1. package/build/cjs/__demo__/PivotTable.event.stories.js +67 -2
  2. package/build/cjs/__demo__/data/event/eventou.data.json +123 -0
  3. package/build/cjs/__demo__/data/event/eventou.visualization.json +139 -0
  4. package/build/cjs/__demo__/data/event/eventstatus.data.hidena.json +122 -0
  5. package/build/cjs/__demo__/data/event/eventstatus.data.json +132 -0
  6. package/build/cjs/__demo__/data/event/eventstatus.data.org.json +117 -0
  7. package/build/cjs/__demo__/data/event/eventstatus.visualization.json +154 -0
  8. package/build/cjs/__demo__/data/event/integer.data.json +225 -39
  9. package/build/cjs/__demo__/data/event/integer.visualization.json +3 -1
  10. package/build/cjs/index.js +8 -0
  11. package/build/cjs/locales/en/translations.json +16 -0
  12. package/build/cjs/modules/dimensions.js +68 -0
  13. package/build/cjs/modules/eventVisualization/__tests__/eventVisualization.spec.js +42 -0
  14. package/build/cjs/modules/eventVisualization/eventVisualization.js +31 -0
  15. package/build/cjs/modules/response/event/__tests__/response.spec.js +23 -0
  16. package/build/cjs/modules/response/event/response.js +25 -3
  17. package/build/es/__demo__/PivotTable.event.stories.js +63 -1
  18. package/build/es/__demo__/data/event/eventou.data.json +123 -0
  19. package/build/es/__demo__/data/event/eventou.visualization.json +139 -0
  20. package/build/es/__demo__/data/event/eventstatus.data.hidena.json +122 -0
  21. package/build/es/__demo__/data/event/eventstatus.data.json +132 -0
  22. package/build/es/__demo__/data/event/eventstatus.data.org.json +117 -0
  23. package/build/es/__demo__/data/event/eventstatus.visualization.json +154 -0
  24. package/build/es/__demo__/data/event/integer.data.json +225 -39
  25. package/build/es/__demo__/data/event/integer.visualization.json +3 -1
  26. package/build/es/index.js +4 -0
  27. package/build/es/locales/en/translations.json +16 -0
  28. package/build/es/modules/dimensions.js +61 -0
  29. package/build/es/modules/eventVisualization/__tests__/eventVisualization.spec.js +40 -0
  30. package/build/es/modules/eventVisualization/eventVisualization.js +25 -0
  31. package/build/es/modules/response/event/__tests__/response.spec.js +24 -1
  32. package/build/es/modules/response/event/response.js +23 -2
  33. package/package.json +4 -1
@@ -112,7 +112,11 @@
112
112
  }
113
113
  },
114
114
  "dimensions": {
115
- "pe": ["202503", "202504", "202505"],
115
+ "pe": [
116
+ "202503",
117
+ "202504",
118
+ "202505"
119
+ ],
116
120
  "Zj7UnCAulEk.qrur9Dvnyt5": [
117
121
  "Zj7UnCAulEk.qrur9Dvnyt5_0",
118
122
  "Zj7UnCAulEk.qrur9Dvnyt5_1",
@@ -127,49 +131,231 @@
127
131
  "Zj7UnCAulEk.qrur9Dvnyt5_10",
128
132
  ""
129
133
  ],
130
- "ou": ["ImspTQPwCqd"]
134
+ "ou": [
135
+ "ImspTQPwCqd"
136
+ ]
131
137
  }
132
138
  },
133
139
  "rowContext": {},
134
140
  "width": 4,
135
141
  "rows": [
136
- ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202503", "47"],
137
- ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202505", "67"],
138
- ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202503", "55"],
139
- ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202503", "70"],
140
- ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202505", "61"],
141
- ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202505", "52"],
142
- ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202504", "54"],
143
- ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202505", "65"],
144
- ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202505", "54"],
145
- ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202503", "53"],
146
- ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202504", "45"],
147
- ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202503", "51"],
148
- ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202505", "51"],
149
- ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202504", "38"],
150
- ["Zj7UnCAulEk.qrur9Dvnyt5_2", "ImspTQPwCqd", "202503", "41"],
151
- ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202504", "44"],
152
- ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202504", "40"],
153
- ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202505", "41"],
154
- ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202504", "42"],
155
- ["Zj7UnCAulEk.qrur9Dvnyt5_9", "ImspTQPwCqd", "202503", "52"],
156
- ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202504", "55"],
157
- ["Zj7UnCAulEk.qrur9Dvnyt5_8", "ImspTQPwCqd", "202505", "43"],
158
- ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202504", "63"],
159
- ["Zj7UnCAulEk.qrur9Dvnyt5_6", "ImspTQPwCqd", "202504", "53"],
160
- ["Zj7UnCAulEk.qrur9Dvnyt5_4", "ImspTQPwCqd", "202503", "54"],
161
- ["Zj7UnCAulEk.qrur9Dvnyt5_10", "ImspTQPwCqd", "202504", "46"],
162
- ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202503", "44"],
163
- ["Zj7UnCAulEk.qrur9Dvnyt5_7", "ImspTQPwCqd", "202503", "47"],
164
- ["Zj7UnCAulEk.qrur9Dvnyt5_5", "ImspTQPwCqd", "202505", "46"],
165
- ["Zj7UnCAulEk.qrur9Dvnyt5_0", "ImspTQPwCqd", "202505", "50"],
166
- ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202504", "48"],
167
- ["Zj7UnCAulEk.qrur9Dvnyt5_1", "ImspTQPwCqd", "202505", "53"],
168
- ["Zj7UnCAulEk.qrur9Dvnyt5_3", "ImspTQPwCqd", "202503", "56"],
169
- ["", "ImspTQPwCqd", "202505", "5"],
170
- ["", "ImspTQPwCqd", "202504", "12"],
171
- ["", "ImspTQPwCqd", "202503", "10"]
142
+ [
143
+ "Zj7UnCAulEk.qrur9Dvnyt5_8",
144
+ "ImspTQPwCqd",
145
+ "202503",
146
+ "47"
147
+ ],
148
+ [
149
+ "Zj7UnCAulEk.qrur9Dvnyt5_3",
150
+ "ImspTQPwCqd",
151
+ "202505",
152
+ "67"
153
+ ],
154
+ [
155
+ "Zj7UnCAulEk.qrur9Dvnyt5_0",
156
+ "ImspTQPwCqd",
157
+ "202503",
158
+ "55"
159
+ ],
160
+ [
161
+ "Zj7UnCAulEk.qrur9Dvnyt5_5",
162
+ "ImspTQPwCqd",
163
+ "202503",
164
+ "70"
165
+ ],
166
+ [
167
+ "Zj7UnCAulEk.qrur9Dvnyt5_10",
168
+ "ImspTQPwCqd",
169
+ "202505",
170
+ "61"
171
+ ],
172
+ [
173
+ "Zj7UnCAulEk.qrur9Dvnyt5_7",
174
+ "ImspTQPwCqd",
175
+ "202505",
176
+ "52"
177
+ ],
178
+ [
179
+ "Zj7UnCAulEk.qrur9Dvnyt5_9",
180
+ "ImspTQPwCqd",
181
+ "202504",
182
+ "54"
183
+ ],
184
+ [
185
+ "Zj7UnCAulEk.qrur9Dvnyt5_6",
186
+ "ImspTQPwCqd",
187
+ "202505",
188
+ "65"
189
+ ],
190
+ [
191
+ "Zj7UnCAulEk.qrur9Dvnyt5_9",
192
+ "ImspTQPwCqd",
193
+ "202505",
194
+ "54"
195
+ ],
196
+ [
197
+ "Zj7UnCAulEk.qrur9Dvnyt5_6",
198
+ "ImspTQPwCqd",
199
+ "202503",
200
+ "53"
201
+ ],
202
+ [
203
+ "Zj7UnCAulEk.qrur9Dvnyt5_2",
204
+ "ImspTQPwCqd",
205
+ "202504",
206
+ "45"
207
+ ],
208
+ [
209
+ "Zj7UnCAulEk.qrur9Dvnyt5_10",
210
+ "ImspTQPwCqd",
211
+ "202503",
212
+ "51"
213
+ ],
214
+ [
215
+ "Zj7UnCAulEk.qrur9Dvnyt5_2",
216
+ "ImspTQPwCqd",
217
+ "202505",
218
+ "51"
219
+ ],
220
+ [
221
+ "Zj7UnCAulEk.qrur9Dvnyt5_3",
222
+ "ImspTQPwCqd",
223
+ "202504",
224
+ "38"
225
+ ],
226
+ [
227
+ "Zj7UnCAulEk.qrur9Dvnyt5_2",
228
+ "ImspTQPwCqd",
229
+ "202503",
230
+ "41"
231
+ ],
232
+ [
233
+ "Zj7UnCAulEk.qrur9Dvnyt5_8",
234
+ "ImspTQPwCqd",
235
+ "202504",
236
+ "44"
237
+ ],
238
+ [
239
+ "Zj7UnCAulEk.qrur9Dvnyt5_7",
240
+ "ImspTQPwCqd",
241
+ "202504",
242
+ "40"
243
+ ],
244
+ [
245
+ "Zj7UnCAulEk.qrur9Dvnyt5_4",
246
+ "ImspTQPwCqd",
247
+ "202505",
248
+ "41"
249
+ ],
250
+ [
251
+ "Zj7UnCAulEk.qrur9Dvnyt5_4",
252
+ "ImspTQPwCqd",
253
+ "202504",
254
+ "42"
255
+ ],
256
+ [
257
+ "Zj7UnCAulEk.qrur9Dvnyt5_9",
258
+ "ImspTQPwCqd",
259
+ "202503",
260
+ "52"
261
+ ],
262
+ [
263
+ "Zj7UnCAulEk.qrur9Dvnyt5_0",
264
+ "ImspTQPwCqd",
265
+ "202504",
266
+ "55"
267
+ ],
268
+ [
269
+ "Zj7UnCAulEk.qrur9Dvnyt5_8",
270
+ "ImspTQPwCqd",
271
+ "202505",
272
+ "43"
273
+ ],
274
+ [
275
+ "Zj7UnCAulEk.qrur9Dvnyt5_5",
276
+ "ImspTQPwCqd",
277
+ "202504",
278
+ "63"
279
+ ],
280
+ [
281
+ "Zj7UnCAulEk.qrur9Dvnyt5_6",
282
+ "ImspTQPwCqd",
283
+ "202504",
284
+ "53"
285
+ ],
286
+ [
287
+ "Zj7UnCAulEk.qrur9Dvnyt5_4",
288
+ "ImspTQPwCqd",
289
+ "202503",
290
+ "54"
291
+ ],
292
+ [
293
+ "Zj7UnCAulEk.qrur9Dvnyt5_10",
294
+ "ImspTQPwCqd",
295
+ "202504",
296
+ "46"
297
+ ],
298
+ [
299
+ "Zj7UnCAulEk.qrur9Dvnyt5_1",
300
+ "ImspTQPwCqd",
301
+ "202503",
302
+ "44"
303
+ ],
304
+ [
305
+ "Zj7UnCAulEk.qrur9Dvnyt5_7",
306
+ "ImspTQPwCqd",
307
+ "202503",
308
+ "47"
309
+ ],
310
+ [
311
+ "Zj7UnCAulEk.qrur9Dvnyt5_5",
312
+ "ImspTQPwCqd",
313
+ "202505",
314
+ "46"
315
+ ],
316
+ [
317
+ "Zj7UnCAulEk.qrur9Dvnyt5_0",
318
+ "ImspTQPwCqd",
319
+ "202505",
320
+ "50"
321
+ ],
322
+ [
323
+ "Zj7UnCAulEk.qrur9Dvnyt5_1",
324
+ "ImspTQPwCqd",
325
+ "202504",
326
+ "48"
327
+ ],
328
+ [
329
+ "Zj7UnCAulEk.qrur9Dvnyt5_1",
330
+ "ImspTQPwCqd",
331
+ "202505",
332
+ "53"
333
+ ],
334
+ [
335
+ "Zj7UnCAulEk.qrur9Dvnyt5_3",
336
+ "ImspTQPwCqd",
337
+ "202503",
338
+ "56"
339
+ ],
340
+ [
341
+ "",
342
+ "ImspTQPwCqd",
343
+ "202505",
344
+ "5"
345
+ ],
346
+ [
347
+ "",
348
+ "ImspTQPwCqd",
349
+ "202504",
350
+ "12"
351
+ ],
352
+ [
353
+ "",
354
+ "ImspTQPwCqd",
355
+ "202503",
356
+ "10"
357
+ ]
172
358
  ],
173
359
  "height": 267,
174
360
  "headerWidth": 4
175
- }
361
+ }
@@ -87,7 +87,9 @@
87
87
  {
88
88
  "parent": "COLUMN",
89
89
  "dimension": "ou",
90
- "values": ["ImspTQPwCqd"]
90
+ "values": [
91
+ "ImspTQPwCqd"
92
+ ]
91
93
  }
92
94
  ],
93
95
  "legacy": true,
package/build/es/index.js CHANGED
@@ -141,6 +141,10 @@ export { renderValue as formatValue } from './modules/renderValue.js';
141
141
 
142
142
  export { transformResponse as transformEventAggregateResponse } from './modules/response/event/response.js';
143
143
 
144
+ // Modules: eventVisualization
145
+
146
+ export { transformEventVisualization } from './modules/eventVisualization/eventVisualization.js';
147
+
144
148
  // Utils: colorSets
145
149
  export { COLOR_SET_DEFAULT, COLOR_SET_BASIC, COLOR_SET_EXTENDED, COLOR_SET_BRIGHT, COLOR_SET_DARK, COLOR_SET_GRAY, COLOR_SET_COLOR_BLIND, COLOR_SET_PATTERNS, colorSets } from './visualizations/util/colors/colorSets.js';
146
150
 
@@ -9,6 +9,8 @@
9
9
  "Last updated {{time}}": "Last updated {{time}}",
10
10
  "Created {{time}} by {{author}}": "Created {{time}} by {{author}}",
11
11
  "Created {{time}}": "Created {{time}}",
12
+ "Viewed {{count}} times": "Viewed 1 time",
13
+ "Viewed {{count}} times_plural": "Viewed {{count}} times",
12
14
  "Notifications": "Notifications",
13
15
  "You're subscribed and getting updates about new interpretations.": "You're subscribed and getting updates about new interpretations.",
14
16
  "Unsubscribe": "Unsubscribe",
@@ -185,6 +187,8 @@
185
187
  "Error loading interpretations": "Error loading interpretations",
186
188
  "Could not load interpretations": "Could not load interpretations",
187
189
  "Reply": "Reply",
190
+ "{{count}} replies": "{{count}} reply",
191
+ "{{count}} replies_plural": "{{count}} replies",
188
192
  "View replies": "View replies",
189
193
  "Unlike": "Unlike",
190
194
  "Like": "Like",
@@ -234,6 +238,12 @@
234
238
  "No line lists found. Try adjusting your search or filter options to find what you're looking for.": "No line lists found. Try adjusting your search or filter options to find what you're looking for.",
235
239
  "New line list": "New line list",
236
240
  "Hide": "Hide",
241
+ "{{count}} org units": "{{count}} org unit",
242
+ "{{count}} org units_plural": "{{count}} org units",
243
+ "{{count}} levels": "{{count}} level",
244
+ "{{count}} levels_plural": "{{count}} levels",
245
+ "{{count}} groups": "{{count}} group",
246
+ "{{count}} groups_plural": "{{count}} groups",
237
247
  "Selected: {{commaSeparatedListOfOrganisationUnits}}": "Selected: {{commaSeparatedListOfOrganisationUnits}}",
238
248
  "Nothing selected": "Nothing selected",
239
249
  "User organisation unit": "User organisation unit",
@@ -416,6 +426,10 @@
416
426
  "Organisation unit": "Organisation unit",
417
427
  "Assigned Categories": "Assigned Categories",
418
428
  "No value": "No value",
429
+ "Active": "Active",
430
+ "Completed": "Completed",
431
+ "Scheduled": "Scheduled",
432
+ "Cancelled": "Cancelled",
419
433
  "Text": "Text",
420
434
  "Long text": "Long text",
421
435
  "Multi text": "Multi text",
@@ -468,5 +482,7 @@
468
482
  "Target": "Target",
469
483
  "Base": "Base",
470
484
  "Axis {{axisId}}": "Axis {{axisId}}",
485
+ "{{count}} items": "{{count}} item",
486
+ "{{count}} items_plural": "{{count}} items",
471
487
  "Reset zoom": "Reset zoom"
472
488
  }
@@ -0,0 +1,61 @@
1
+ // vis: 'dimension' in EventVisualization columns/rows/filters
2
+ // dim: tracker analytics api dimension/filter id
3
+ // header: tracker analytics api header name (query endpoints)
4
+
5
+ const EVENT_DIMENSIONS = [{
6
+ vis: 'ou',
7
+ dim: 'ou',
8
+ header: 'ouname'
9
+ }, {
10
+ vis: 'eventDate',
11
+ dim: 'EVENT_DATE',
12
+ header: 'eventdate'
13
+ }, {
14
+ vis: 'enrollmentDate',
15
+ dim: 'ENROLLMENT_DATE',
16
+ header: 'enrollmentdate'
17
+ }, {
18
+ vis: 'scheduledDate',
19
+ dim: 'SCHEDULED_DATE',
20
+ header: 'scheduleddate'
21
+ }, {
22
+ vis: 'incidentDate',
23
+ dim: 'INCIDENT_DATE',
24
+ header: 'incidentdate'
25
+ }, {
26
+ vis: 'lastUpdated',
27
+ dim: 'LAST_UPDATED',
28
+ header: 'lastupdated'
29
+ }, {
30
+ vis: 'created',
31
+ dim: 'CREATED',
32
+ header: 'created'
33
+ }, {
34
+ vis: 'completed',
35
+ dim: 'COMPLETED',
36
+ header: 'completed'
37
+ }, {
38
+ vis: 'eventStatus',
39
+ dim: 'EVENT_STATUS',
40
+ header: 'eventstatus'
41
+ }, {
42
+ vis: 'programStatus',
43
+ dim: 'PROGRAM_STATUS',
44
+ header: 'programstatus'
45
+ }, {
46
+ vis: 'enrollmentOu',
47
+ dim: 'ENROLLMENT_OU',
48
+ header: 'enrollmentouname'
49
+ }, {
50
+ vis: 'createdBy',
51
+ dim: '',
52
+ header: 'createdbydisplayname'
53
+ }, {
54
+ vis: 'lastUpdatedBy',
55
+ dim: '',
56
+ header: 'lastupdatedbydisplayname'
57
+ }];
58
+ export const getHeaderByVis = vis => {
59
+ var _EVENT_DIMENSIONS$fin;
60
+ return (_EVENT_DIMENSIONS$fin = EVENT_DIMENSIONS.find(d => d.vis === vis)) === null || _EVENT_DIMENSIONS$fin === void 0 ? void 0 : _EVENT_DIMENSIONS$fin.header;
61
+ };
@@ -0,0 +1,40 @@
1
+ import { transformEventVisualization } from '../eventVisualization.js';
2
+ const testDim1 = {
3
+ dimension: 'eventDate',
4
+ programStage: {
5
+ id: 'A03MvHHogjR'
6
+ }
7
+ };
8
+ const testDim2 = {
9
+ dimension: 'enrollmentDate',
10
+ program: {
11
+ id: 'IpHINAT79UW'
12
+ }
13
+ };
14
+ const testDim3 = {
15
+ dimension: 'created'
16
+ };
17
+ const testAxis = [testDim1];
18
+ const testVis = {
19
+ columns: testAxis,
20
+ rows: [testDim2],
21
+ filters: [testDim3]
22
+ };
23
+ describe('eventVisualization', () => {
24
+ describe('transformEventVisualization', () => {
25
+ it('does not modify dimension, axis or vis', () => {
26
+ const newVis = transformEventVisualization(testVis);
27
+ expect(newVis).not.toBe(testVis);
28
+ expect(newVis.columns).not.toBe(testAxis);
29
+ expect(newVis.columns[0]).not.toBe(testDim1);
30
+ });
31
+ it('applies program stage to id', () => {
32
+ const newVis = transformEventVisualization(testVis);
33
+ expect(newVis.columns[0].dimension).toBe('A03MvHHogjR.eventdate');
34
+ });
35
+ it('applies program to id', () => {
36
+ const newVis = transformEventVisualization(testVis);
37
+ expect(newVis.rows[0].dimension).toBe('IpHINAT79UW.enrollmentdate');
38
+ });
39
+ });
40
+ });
@@ -0,0 +1,25 @@
1
+ import { getHeaderByVis } from '../dimensions.js';
2
+ import { layoutGetAllDimensions } from '../layout/layoutGetAllDimensions.js';
3
+
4
+ // Dimensions saved with program or program stage in an EventVisualization need
5
+ // transformation before we can pass them to the pivot table engine
6
+
7
+ const cloneAxis = axis => axis === null || axis === void 0 ? void 0 : axis.map(dim => ({
8
+ ...dim
9
+ }));
10
+ export const transformEventVisualization = vis => {
11
+ // Do not modify the original visualization
12
+ const transformedVis = {
13
+ ...vis,
14
+ columns: cloneAxis(vis.columns),
15
+ rows: cloneAxis(vis.rows),
16
+ filters: cloneAxis(vis.filters)
17
+ };
18
+ layoutGetAllDimensions(transformedVis).forEach(dim => {
19
+ var _dim$program$id, _dim$program, _dim$programStage;
20
+ const headerName = getHeaderByVis(dim.dimension);
21
+ const prefix = (_dim$program$id = (_dim$program = dim.program) === null || _dim$program === void 0 ? void 0 : _dim$program.id) !== null && _dim$program$id !== void 0 ? _dim$program$id : (_dim$programStage = dim.programStage) === null || _dim$programStage === void 0 ? void 0 : _dim$programStage.id;
22
+ dim.dimension = prefix ? `${prefix}.${headerName}` : headerName;
23
+ });
24
+ return transformedVis;
25
+ };
@@ -10,6 +10,9 @@ import responseDatetimeOrg from '../../../../__demo__/data/event/datetime.data.o
10
10
  import responseTextHideNa from '../../../../__demo__/data/event/email.data.hidena.json';
11
11
  import responseText from '../../../../__demo__/data/event/email.data.json';
12
12
  import responseTextOrg from '../../../../__demo__/data/event/email.data.org.json';
13
+ import responseEventstatusHideNa from '../../../../__demo__/data/event/eventstatus.data.hidena.json';
14
+ import responseEventstatus from '../../../../__demo__/data/event/eventstatus.data.json';
15
+ import responseEventstatusOrg from '../../../../__demo__/data/event/eventstatus.data.org.json';
13
16
  import responseNumericHideNa from '../../../../__demo__/data/event/integer.data.hidena.json';
14
17
  import responseNumeric from '../../../../__demo__/data/event/integer.data.json';
15
18
  import responseNumericOrg from '../../../../__demo__/data/event/integer.data.org.json';
@@ -23,8 +26,18 @@ import responseYesOnlyHideNa from '../../../../__demo__/data/event/yesonly.data.
23
26
  import responseYesOnly from '../../../../__demo__/data/event/yesonly.data.json';
24
27
  import responseYesOnlyOrg from '../../../../__demo__/data/event/yesonly.data.org.json';
25
28
  import { VALUE_TYPE_AGE, VALUE_TYPE_BOOLEAN, VALUE_TYPE_DATE, VALUE_TYPE_DATETIME, VALUE_TYPE_PERCENTAGE, VALUE_TYPE_TRUE_ONLY } from '../../../valueTypes.js';
26
- import { getItemFormatterByValueType, transformResponse } from '../response.js';
29
+ import { getItemFormatterByHeaderName, getItemFormatterByValueType, transformResponse } from '../response.js';
27
30
  describe('response', () => {
31
+ describe('getItemFormatterByHeaderName', () => {
32
+ it('should return the correct formatter and format correctly', () => {
33
+ expect(getItemFormatterByHeaderName('eventstatus')('ACTIVE')).toBe('Active');
34
+ expect(getItemFormatterByHeaderName('eventstatus')('COMPLETED')).toBe('Completed');
35
+ expect(getItemFormatterByHeaderName('eventstatus')('SCHEDULE')).toBe('Scheduled');
36
+ expect(getItemFormatterByHeaderName('programstatus')('ACTIVE')).toBe('Active');
37
+ expect(getItemFormatterByHeaderName('programstatus')('COMPLETED')).toBe('Completed');
38
+ expect(getItemFormatterByHeaderName('programstatus')('CANCELLED')).toBe('Cancelled');
39
+ });
40
+ });
28
41
  describe('getItemFormatterByValueType', () => {
29
42
  it('should return the correct formatter and format correctly', () => {
30
43
  expect(getItemFormatterByValueType(VALUE_TYPE_BOOLEAN)('1')).toBe('Yes');
@@ -118,5 +131,15 @@ describe('response', () => {
118
131
  })).toEqual(responseYesOnlyHideNa);
119
132
  });
120
133
  });
134
+ describe('eventstatus', () => {
135
+ it('transforms response', () => {
136
+ expect(transformResponse(responseEventstatusOrg)).toEqual(responseEventstatus);
137
+ });
138
+ it('transforms response and hides N/A data', () => {
139
+ expect(transformResponse(responseEventstatusOrg, {
140
+ hideNaData: true
141
+ })).toEqual(responseEventstatusHideNa);
142
+ });
143
+ });
121
144
  });
122
145
  });
@@ -3,6 +3,12 @@ import { DIMENSION_ID_ORGUNIT, DIMENSION_ID_PERIOD } from '../../predefinedDimen
3
3
  import { VALUE_TYPE_AGE, VALUE_TYPE_BOOLEAN, VALUE_TYPE_COORDINATE, VALUE_TYPE_DATE, VALUE_TYPE_DATETIME, VALUE_TYPE_FILE_RESOURCE, VALUE_TYPE_GEOJSON, VALUE_TYPE_IMAGE, VALUE_TYPE_MULTI_TEXT, VALUE_TYPE_PERCENTAGE, VALUE_TYPE_REFERENCE, VALUE_TYPE_TRUE_ONLY } from '../../valueTypes.js';
4
4
  import { applyDefaultHandler } from './default.js';
5
5
  import { applyOptionSetHandler } from './optionSet.js';
6
+
7
+ // Responses coming from these endpoints need transformation
8
+ // before we can pass it to the pivot table engine:
9
+ // - analytics/events/aggregate
10
+ // - analytics/enrollments/aggregate
11
+
6
12
  export const PREFIX_SEPARATOR = '_';
7
13
  export const NA_VALUE = '';
8
14
  export const NA_VALUE_ITEM = {
@@ -15,6 +21,18 @@ export const NA_VALUE_ITEM = {
15
21
  }
16
22
  };
17
23
  export const UNSUPPORTED_VALUE_TYPES = [VALUE_TYPE_COORDINATE, VALUE_TYPE_GEOJSON, VALUE_TYPE_FILE_RESOURCE, VALUE_TYPE_IMAGE, VALUE_TYPE_MULTI_TEXT, VALUE_TYPE_REFERENCE];
24
+ const STATUSES = {
25
+ ACTIVE: i18n.t('Active'),
26
+ COMPLETED: i18n.t('Completed'),
27
+ SCHEDULE: i18n.t('Scheduled'),
28
+ CANCELLED: i18n.t('Cancelled')
29
+ };
30
+ const formatStatus = value => STATUSES[value] || value;
31
+ export const getItemFormatter = ({
32
+ name,
33
+ valueType
34
+ }) => getItemFormatterByHeaderName(name) || getItemFormatterByValueType(valueType);
35
+ export const getItemFormatterByHeaderName = name => name.endsWith('eventstatus') || name.endsWith('programstatus') ? formatStatus : undefined;
18
36
  export const getItemFormatterByValueType = valueType => {
19
37
  switch (valueType) {
20
38
  case VALUE_TYPE_AGE:
@@ -31,6 +49,9 @@ export const getItemFormatterByValueType = valueType => {
31
49
  return undefined;
32
50
  }
33
51
  };
52
+ const EXCLUDED_HEADER_NAMES = new Set([DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT, 'lastupdated', 'created', 'completed']);
53
+ const EXCLUDED_HEADER_SUFFIXES = ['.eventdate', '.enrollmentdate', '.scheduleddate', '.incidentdate', '.ou'];
54
+ const isIncludedHeader = header => Boolean(header.meta) && !EXCLUDED_HEADER_NAMES.has(header.name) && !EXCLUDED_HEADER_SUFFIXES.some(suffix => header.name.endsWith(suffix));
34
55
  export const transformResponse = (response, {
35
56
  hideNaData = false
36
57
  } = {}) => {
@@ -54,7 +75,7 @@ export const transformResponse = (response, {
54
75
  const metaHeaders = response.headers.map((header, index) => ({
55
76
  ...header,
56
77
  index
57
- })).filter(header => Boolean(header.meta) && ![DIMENSION_ID_PERIOD, DIMENSION_ID_ORGUNIT].includes(header.name));
78
+ })).filter(isIncludedHeader);
58
79
 
59
80
  // Legendsets use uids and do not need transformation
60
81
  // Skip unsupported value types
@@ -66,7 +87,7 @@ export const transformResponse = (response, {
66
87
  transformedResponse = applyOptionSetHandler(transformedResponse, header.index);
67
88
  } else {
68
89
  transformedResponse = applyDefaultHandler(transformedResponse, header.index, {
69
- itemFormatter: getItemFormatterByValueType(header.valueType)
90
+ itemFormatter: getItemFormatter(header)
70
91
  });
71
92
  }
72
93
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dhis2/analytics",
3
- "version": "29.4.3",
3
+ "version": "29.5.0",
4
4
  "main": "./build/cjs/index.js",
5
5
  "module": "./build/es/index.js",
6
6
  "exports": {
@@ -79,5 +79,8 @@
79
79
  "files": [
80
80
  "build"
81
81
  ],
82
+ "resolutions": {
83
+ "i18next": "^23.0.0"
84
+ },
82
85
  "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
83
86
  }