@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
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getHeaderByVis = void 0;
7
+ // vis: 'dimension' in EventVisualization columns/rows/filters
8
+ // dim: tracker analytics api dimension/filter id
9
+ // header: tracker analytics api header name (query endpoints)
10
+
11
+ const EVENT_DIMENSIONS = [{
12
+ vis: 'ou',
13
+ dim: 'ou',
14
+ header: 'ouname'
15
+ }, {
16
+ vis: 'eventDate',
17
+ dim: 'EVENT_DATE',
18
+ header: 'eventdate'
19
+ }, {
20
+ vis: 'enrollmentDate',
21
+ dim: 'ENROLLMENT_DATE',
22
+ header: 'enrollmentdate'
23
+ }, {
24
+ vis: 'scheduledDate',
25
+ dim: 'SCHEDULED_DATE',
26
+ header: 'scheduleddate'
27
+ }, {
28
+ vis: 'incidentDate',
29
+ dim: 'INCIDENT_DATE',
30
+ header: 'incidentdate'
31
+ }, {
32
+ vis: 'lastUpdated',
33
+ dim: 'LAST_UPDATED',
34
+ header: 'lastupdated'
35
+ }, {
36
+ vis: 'created',
37
+ dim: 'CREATED',
38
+ header: 'created'
39
+ }, {
40
+ vis: 'completed',
41
+ dim: 'COMPLETED',
42
+ header: 'completed'
43
+ }, {
44
+ vis: 'eventStatus',
45
+ dim: 'EVENT_STATUS',
46
+ header: 'eventstatus'
47
+ }, {
48
+ vis: 'programStatus',
49
+ dim: 'PROGRAM_STATUS',
50
+ header: 'programstatus'
51
+ }, {
52
+ vis: 'enrollmentOu',
53
+ dim: 'ENROLLMENT_OU',
54
+ header: 'enrollmentouname'
55
+ }, {
56
+ vis: 'createdBy',
57
+ dim: '',
58
+ header: 'createdbydisplayname'
59
+ }, {
60
+ vis: 'lastUpdatedBy',
61
+ dim: '',
62
+ header: 'lastupdatedbydisplayname'
63
+ }];
64
+ const getHeaderByVis = vis => {
65
+ var _EVENT_DIMENSIONS$fin;
66
+ return (_EVENT_DIMENSIONS$fin = EVENT_DIMENSIONS.find(d => d.vis === vis)) === null || _EVENT_DIMENSIONS$fin === void 0 ? void 0 : _EVENT_DIMENSIONS$fin.header;
67
+ };
68
+ exports.getHeaderByVis = getHeaderByVis;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ var _eventVisualization = require("../eventVisualization.js");
4
+ const testDim1 = {
5
+ dimension: 'eventDate',
6
+ programStage: {
7
+ id: 'A03MvHHogjR'
8
+ }
9
+ };
10
+ const testDim2 = {
11
+ dimension: 'enrollmentDate',
12
+ program: {
13
+ id: 'IpHINAT79UW'
14
+ }
15
+ };
16
+ const testDim3 = {
17
+ dimension: 'created'
18
+ };
19
+ const testAxis = [testDim1];
20
+ const testVis = {
21
+ columns: testAxis,
22
+ rows: [testDim2],
23
+ filters: [testDim3]
24
+ };
25
+ describe('eventVisualization', () => {
26
+ describe('transformEventVisualization', () => {
27
+ it('does not modify dimension, axis or vis', () => {
28
+ const newVis = (0, _eventVisualization.transformEventVisualization)(testVis);
29
+ expect(newVis).not.toBe(testVis);
30
+ expect(newVis.columns).not.toBe(testAxis);
31
+ expect(newVis.columns[0]).not.toBe(testDim1);
32
+ });
33
+ it('applies program stage to id', () => {
34
+ const newVis = (0, _eventVisualization.transformEventVisualization)(testVis);
35
+ expect(newVis.columns[0].dimension).toBe('A03MvHHogjR.eventdate');
36
+ });
37
+ it('applies program to id', () => {
38
+ const newVis = (0, _eventVisualization.transformEventVisualization)(testVis);
39
+ expect(newVis.rows[0].dimension).toBe('IpHINAT79UW.enrollmentdate');
40
+ });
41
+ });
42
+ });
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.transformEventVisualization = void 0;
7
+ var _dimensions = require("../dimensions.js");
8
+ var _layoutGetAllDimensions = require("../layout/layoutGetAllDimensions.js");
9
+ // Dimensions saved with program or program stage in an EventVisualization need
10
+ // transformation before we can pass them to the pivot table engine
11
+
12
+ const cloneAxis = axis => axis === null || axis === void 0 ? void 0 : axis.map(dim => ({
13
+ ...dim
14
+ }));
15
+ const transformEventVisualization = vis => {
16
+ // Do not modify the original visualization
17
+ const transformedVis = {
18
+ ...vis,
19
+ columns: cloneAxis(vis.columns),
20
+ rows: cloneAxis(vis.rows),
21
+ filters: cloneAxis(vis.filters)
22
+ };
23
+ (0, _layoutGetAllDimensions.layoutGetAllDimensions)(transformedVis).forEach(dim => {
24
+ var _dim$program$id, _dim$program, _dim$programStage;
25
+ const headerName = (0, _dimensions.getHeaderByVis)(dim.dimension);
26
+ 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;
27
+ dim.dimension = prefix ? `${prefix}.${headerName}` : headerName;
28
+ });
29
+ return transformedVis;
30
+ };
31
+ exports.transformEventVisualization = transformEventVisualization;
@@ -12,6 +12,9 @@ var _datetimeDataOrg = _interopRequireDefault(require("../../../../__demo__/data
12
12
  var _emailDataHidena = _interopRequireDefault(require("../../../../__demo__/data/event/email.data.hidena.json"));
13
13
  var _emailData = _interopRequireDefault(require("../../../../__demo__/data/event/email.data.json"));
14
14
  var _emailDataOrg = _interopRequireDefault(require("../../../../__demo__/data/event/email.data.org.json"));
15
+ var _eventstatusDataHidena = _interopRequireDefault(require("../../../../__demo__/data/event/eventstatus.data.hidena.json"));
16
+ var _eventstatusData = _interopRequireDefault(require("../../../../__demo__/data/event/eventstatus.data.json"));
17
+ var _eventstatusDataOrg = _interopRequireDefault(require("../../../../__demo__/data/event/eventstatus.data.org.json"));
15
18
  var _integerDataHidena = _interopRequireDefault(require("../../../../__demo__/data/event/integer.data.hidena.json"));
16
19
  var _integerData = _interopRequireDefault(require("../../../../__demo__/data/event/integer.data.json"));
17
20
  var _integerDataOrg = _interopRequireDefault(require("../../../../__demo__/data/event/integer.data.org.json"));
@@ -28,6 +31,16 @@ var _valueTypes = require("../../../valueTypes.js");
28
31
  var _response = require("../response.js");
29
32
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
30
33
  describe('response', () => {
34
+ describe('getItemFormatterByHeaderName', () => {
35
+ it('should return the correct formatter and format correctly', () => {
36
+ expect((0, _response.getItemFormatterByHeaderName)('eventstatus')('ACTIVE')).toBe('Active');
37
+ expect((0, _response.getItemFormatterByHeaderName)('eventstatus')('COMPLETED')).toBe('Completed');
38
+ expect((0, _response.getItemFormatterByHeaderName)('eventstatus')('SCHEDULE')).toBe('Scheduled');
39
+ expect((0, _response.getItemFormatterByHeaderName)('programstatus')('ACTIVE')).toBe('Active');
40
+ expect((0, _response.getItemFormatterByHeaderName)('programstatus')('COMPLETED')).toBe('Completed');
41
+ expect((0, _response.getItemFormatterByHeaderName)('programstatus')('CANCELLED')).toBe('Cancelled');
42
+ });
43
+ });
31
44
  describe('getItemFormatterByValueType', () => {
32
45
  it('should return the correct formatter and format correctly', () => {
33
46
  expect((0, _response.getItemFormatterByValueType)(_valueTypes.VALUE_TYPE_BOOLEAN)('1')).toBe('Yes');
@@ -121,5 +134,15 @@ describe('response', () => {
121
134
  })).toEqual(_yesonlyDataHidena.default);
122
135
  });
123
136
  });
137
+ describe('eventstatus', () => {
138
+ it('transforms response', () => {
139
+ expect((0, _response.transformResponse)(_eventstatusDataOrg.default)).toEqual(_eventstatusData.default);
140
+ });
141
+ it('transforms response and hides N/A data', () => {
142
+ expect((0, _response.transformResponse)(_eventstatusDataOrg.default, {
143
+ hideNaData: true
144
+ })).toEqual(_eventstatusDataHidena.default);
145
+ });
146
+ });
124
147
  });
125
148
  });
@@ -3,13 +3,18 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.transformResponse = exports.getItemFormatterByValueType = exports.UNSUPPORTED_VALUE_TYPES = exports.PREFIX_SEPARATOR = exports.NA_VALUE_ITEM = exports.NA_VALUE = void 0;
6
+ exports.transformResponse = exports.getItemFormatterByValueType = exports.getItemFormatterByHeaderName = exports.getItemFormatter = exports.UNSUPPORTED_VALUE_TYPES = exports.PREFIX_SEPARATOR = exports.NA_VALUE_ITEM = exports.NA_VALUE = void 0;
7
7
  var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
8
8
  var _predefinedDimensions = require("../../predefinedDimensions.js");
9
9
  var _valueTypes = require("../../valueTypes.js");
10
10
  var _default = require("./default.js");
11
11
  var _optionSet = require("./optionSet.js");
12
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ // Responses coming from these endpoints need transformation
14
+ // before we can pass it to the pivot table engine:
15
+ // - analytics/events/aggregate
16
+ // - analytics/enrollments/aggregate
17
+
13
18
  const PREFIX_SEPARATOR = exports.PREFIX_SEPARATOR = '_';
14
19
  const NA_VALUE = exports.NA_VALUE = '';
15
20
  const NA_VALUE_ITEM = exports.NA_VALUE_ITEM = {
@@ -22,6 +27,20 @@ const NA_VALUE_ITEM = exports.NA_VALUE_ITEM = {
22
27
  }
23
28
  };
24
29
  const UNSUPPORTED_VALUE_TYPES = exports.UNSUPPORTED_VALUE_TYPES = [_valueTypes.VALUE_TYPE_COORDINATE, _valueTypes.VALUE_TYPE_GEOJSON, _valueTypes.VALUE_TYPE_FILE_RESOURCE, _valueTypes.VALUE_TYPE_IMAGE, _valueTypes.VALUE_TYPE_MULTI_TEXT, _valueTypes.VALUE_TYPE_REFERENCE];
30
+ const STATUSES = {
31
+ ACTIVE: _d2I18n.default.t('Active'),
32
+ COMPLETED: _d2I18n.default.t('Completed'),
33
+ SCHEDULE: _d2I18n.default.t('Scheduled'),
34
+ CANCELLED: _d2I18n.default.t('Cancelled')
35
+ };
36
+ const formatStatus = value => STATUSES[value] || value;
37
+ const getItemFormatter = ({
38
+ name,
39
+ valueType
40
+ }) => getItemFormatterByHeaderName(name) || getItemFormatterByValueType(valueType);
41
+ exports.getItemFormatter = getItemFormatter;
42
+ const getItemFormatterByHeaderName = name => name.endsWith('eventstatus') || name.endsWith('programstatus') ? formatStatus : undefined;
43
+ exports.getItemFormatterByHeaderName = getItemFormatterByHeaderName;
25
44
  const getItemFormatterByValueType = valueType => {
26
45
  switch (valueType) {
27
46
  case _valueTypes.VALUE_TYPE_AGE:
@@ -39,6 +58,9 @@ const getItemFormatterByValueType = valueType => {
39
58
  }
40
59
  };
41
60
  exports.getItemFormatterByValueType = getItemFormatterByValueType;
61
+ const EXCLUDED_HEADER_NAMES = new Set([_predefinedDimensions.DIMENSION_ID_PERIOD, _predefinedDimensions.DIMENSION_ID_ORGUNIT, 'lastupdated', 'created', 'completed']);
62
+ const EXCLUDED_HEADER_SUFFIXES = ['.eventdate', '.enrollmentdate', '.scheduleddate', '.incidentdate', '.ou'];
63
+ const isIncludedHeader = header => Boolean(header.meta) && !EXCLUDED_HEADER_NAMES.has(header.name) && !EXCLUDED_HEADER_SUFFIXES.some(suffix => header.name.endsWith(suffix));
42
64
  const transformResponse = (response, {
43
65
  hideNaData = false
44
66
  } = {}) => {
@@ -62,7 +84,7 @@ const transformResponse = (response, {
62
84
  const metaHeaders = response.headers.map((header, index) => ({
63
85
  ...header,
64
86
  index
65
- })).filter(header => Boolean(header.meta) && ![_predefinedDimensions.DIMENSION_ID_PERIOD, _predefinedDimensions.DIMENSION_ID_ORGUNIT].includes(header.name));
87
+ })).filter(isIncludedHeader);
66
88
 
67
89
  // Legendsets use uids and do not need transformation
68
90
  // Skip unsupported value types
@@ -74,7 +96,7 @@ const transformResponse = (response, {
74
96
  transformedResponse = (0, _optionSet.applyOptionSetHandler)(transformedResponse, header.index);
75
97
  } else {
76
98
  transformedResponse = (0, _default.applyDefaultHandler)(transformedResponse, header.index, {
77
- itemFormatter: getItemFormatterByValueType(header.valueType)
99
+ itemFormatter: getItemFormatter(header)
78
100
  });
79
101
  }
80
102
  }
@@ -13,6 +13,11 @@ import datetimeVisualization from './data/event/datetime.visualization.json';
13
13
  import emailDataHideNa from './data/event/email.data.hidena.json';
14
14
  import emailData from './data/event/email.data.json';
15
15
  import emailVisualization from './data/event/email.visualization.json';
16
+ import eventouData from './data/event/eventou.data.json';
17
+ import eventouVisualization from './data/event/eventou.visualization.json';
18
+ import eventstatusDataHideNa from './data/event/eventstatus.data.hidena.json';
19
+ import eventstatusData from './data/event/eventstatus.data.json';
20
+ import eventstatusVisualization from './data/event/eventstatus.visualization.json';
16
21
  import integerDataHideNa from './data/event/integer.data.hidena.json';
17
22
  import integerData from './data/event/integer.data.json';
18
23
  import integerVisualization from './data/event/integer.visualization.json';
@@ -411,4 +416,61 @@ export const Yesonly = (_, {
411
416
  visualization: visualization
412
417
  }));
413
418
  };
414
- Yesonly.storyName = 'Yesonly';
419
+ Yesonly.storyName = 'Yesonly';
420
+ export const EventstatusNA = (_, {
421
+ pivotTableOptions
422
+ }) => {
423
+ const visualization = {
424
+ ...eventstatusVisualization,
425
+ ...visualizationReset,
426
+ ...pivotTableOptions
427
+ };
428
+ return /*#__PURE__*/React.createElement("div", {
429
+ style: {
430
+ width: 800,
431
+ height: 600
432
+ }
433
+ }, /*#__PURE__*/React.createElement(PivotTable, {
434
+ data: eventstatusData,
435
+ visualization: visualization
436
+ }));
437
+ };
438
+ EventstatusNA.storyName = 'Eventstatus N/A';
439
+ export const Eventstatus = (_, {
440
+ pivotTableOptions
441
+ }) => {
442
+ const visualization = {
443
+ ...eventstatusVisualization,
444
+ ...visualizationReset,
445
+ ...pivotTableOptions
446
+ };
447
+ return /*#__PURE__*/React.createElement("div", {
448
+ style: {
449
+ width: 800,
450
+ height: 600
451
+ }
452
+ }, /*#__PURE__*/React.createElement(PivotTable, {
453
+ data: eventstatusDataHideNa,
454
+ visualization: visualization
455
+ }));
456
+ };
457
+ Eventstatus.storyName = 'Eventstatus';
458
+ export const Eventou = (_, {
459
+ pivotTableOptions
460
+ }) => {
461
+ const visualization = {
462
+ ...eventouVisualization,
463
+ ...visualizationReset,
464
+ ...pivotTableOptions
465
+ };
466
+ return /*#__PURE__*/React.createElement("div", {
467
+ style: {
468
+ width: 800,
469
+ height: 600
470
+ }
471
+ }, /*#__PURE__*/React.createElement(PivotTable, {
472
+ data: eventouData,
473
+ visualization: visualization
474
+ }));
475
+ };
476
+ Eventou.storyName = 'Event orgunit';
@@ -0,0 +1,123 @@
1
+ {
2
+ "headers": [
3
+ {
4
+ "name": "A03MvHHogjR.ou",
5
+ "column": "Organisation unit",
6
+ "valueType": "ORGANISATION_UNIT",
7
+ "type": "org.hisp.dhis.organisationunit.OrganisationUnit",
8
+ "hidden": false,
9
+ "meta": true
10
+ },
11
+ {
12
+ "name": "A03MvHHogjR.eventdate",
13
+ "column": "Report date",
14
+ "valueType": "DATE",
15
+ "type": "java.time.LocalDate",
16
+ "hidden": false,
17
+ "meta": true
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
+ "metaData": {
29
+ "items": {
30
+ "202510": {
31
+ "name": "202510"
32
+ },
33
+ "202511": {
34
+ "name": "202511"
35
+ },
36
+ "202512": {
37
+ "name": "202512"
38
+ },
39
+ "202601": {
40
+ "name": "202601"
41
+ },
42
+ "202602": {
43
+ "name": "202602"
44
+ },
45
+ "202603": {
46
+ "name": "202603"
47
+ },
48
+ "IpHINAT79UW": {
49
+ "name": "Child Programme"
50
+ },
51
+ "ZzYYXq4fJie": {
52
+ "name": "Baby Postnatal"
53
+ },
54
+ "USER_ORGUNIT": {
55
+ "organisationUnits": [
56
+ "ImspTQPwCqd"
57
+ ]
58
+ },
59
+ "A03MvHHogjR.ou": {
60
+ "name": "Organisation unit"
61
+ },
62
+ "ImspTQPwCqd": {
63
+ "name": "Sierra Leone"
64
+ },
65
+ "A03MvHHogjR.eventdate": {
66
+ "name": "Report date"
67
+ },
68
+ "A03MvHHogjR": {
69
+ "name": "Birth"
70
+ }
71
+ },
72
+ "dimensions": {
73
+ "A03MvHHogjR.eventdate": [
74
+ "202510",
75
+ "202511",
76
+ "202512",
77
+ "202601",
78
+ "202602",
79
+ "202603"
80
+ ],
81
+ "pe": [],
82
+ "A03MvHHogjR.ou": [
83
+ "ImspTQPwCqd"
84
+ ]
85
+ }
86
+ },
87
+ "rowContext": {},
88
+ "width": 3,
89
+ "rows": [
90
+ [
91
+ "ImspTQPwCqd",
92
+ "202510",
93
+ "973"
94
+ ],
95
+ [
96
+ "ImspTQPwCqd",
97
+ "202511",
98
+ "932"
99
+ ],
100
+ [
101
+ "ImspTQPwCqd",
102
+ "202512",
103
+ "858"
104
+ ],
105
+ [
106
+ "ImspTQPwCqd",
107
+ "202601",
108
+ "694"
109
+ ],
110
+ [
111
+ "ImspTQPwCqd",
112
+ "202602",
113
+ "629"
114
+ ],
115
+ [
116
+ "ImspTQPwCqd",
117
+ "202603",
118
+ "694"
119
+ ]
120
+ ],
121
+ "headerWidth": 3,
122
+ "height": 6
123
+ }
@@ -0,0 +1,139 @@
1
+ {
2
+ "name": "Event orgunit",
3
+ "created": "2025-07-02T10:27:50.483",
4
+ "lastUpdated": "2025-07-02T10:27:50.483",
5
+ "translations": [],
6
+ "createdBy": {
7
+ "id": "xE7jOejl9FI",
8
+ "code": null,
9
+ "name": "John Traore",
10
+ "displayName": "John Traore",
11
+ "username": "admin"
12
+ },
13
+ "favorites": [],
14
+ "lastUpdatedBy": {
15
+ "id": "xE7jOejl9FI",
16
+ "code": null,
17
+ "name": "John Traore",
18
+ "displayName": "John Traore",
19
+ "username": "admin"
20
+ },
21
+ "sharing": {
22
+ "owner": "xE7jOejl9FI",
23
+ "external": false,
24
+ "users": {},
25
+ "userGroups": {},
26
+ "public": "rw------"
27
+ },
28
+ "regressionType": "NONE",
29
+ "displayDensity": "NORMAL",
30
+ "fontSize": "NORMAL",
31
+ "sortOrder": 0,
32
+ "topLimit": 0,
33
+ "hideEmptyRows": false,
34
+ "showHierarchy": false,
35
+ "completedOnly": false,
36
+ "skipRounding": false,
37
+ "dataDimensionItems": [],
38
+ "dataElementGroupSetDimensions": [],
39
+ "organisationUnitGroupSetDimensions": [],
40
+ "categoryDimensions": [],
41
+ "categoryOptionGroupSetDimensions": [],
42
+ "attributeDimensions": [],
43
+ "programIndicatorDimensions": [],
44
+ "subscribers": [],
45
+ "digitGroupSeparator": "SPACE",
46
+ "hideEmptyRowItems": "NONE",
47
+ "hideLegend": false,
48
+ "noSpaceBetweenColumns": false,
49
+ "cumulativeValues": false,
50
+ "percentStackedValues": false,
51
+ "showData": false,
52
+ "colTotals": true,
53
+ "rowTotals": true,
54
+ "rowSubTotals": true,
55
+ "colSubTotals": true,
56
+ "hideTitle": false,
57
+ "hideSubtitle": false,
58
+ "showDimensionLabels": true,
59
+ "interpretations": [],
60
+ "program": {
61
+ "enrollmentDateLabel": "Date of enrollment",
62
+ "incidentDateLabel": "Date of birth",
63
+ "id": "IpHINAT79UW",
64
+ "name": "Child Programme"
65
+ },
66
+ "programStage": {
67
+ "executionDateLabel": "Report date",
68
+ "id": "A03MvHHogjR",
69
+ "name": "Birth"
70
+ },
71
+ "dataType": "AGGREGATED_VALUES",
72
+ "outputType": "EVENT",
73
+ "collapseDataDimensions": false,
74
+ "hideNaData": false,
75
+ "simpleDimensions": [
76
+ {
77
+ "parent": "COLUMN",
78
+ "dimension": "ou",
79
+ "values": [
80
+ "ImspTQPwCqd"
81
+ ]
82
+ }
83
+ ],
84
+ "legacy": true,
85
+ "type": "PIVOT_TABLE",
86
+ "filters": [],
87
+ "parentGraphMap": {
88
+ "ImspTQPwCqd": ""
89
+ },
90
+ "columns": [
91
+ {
92
+ "items": [
93
+ {
94
+ "name": "Sierra Leone",
95
+ "id": "ImspTQPwCqd"
96
+ }
97
+ ],
98
+ "dimension": "A03MvHHogjR.ou",
99
+ "programStage": {
100
+ "id": "A03MvHHogjR"
101
+ }
102
+ }
103
+ ],
104
+ "rows": [
105
+ {
106
+ "items": [
107
+ {
108
+ "dimensionItemType": "PERIOD",
109
+ "id": "LAST_6_MONTHS"
110
+ }
111
+ ],
112
+ "dimension": "A03MvHHogjR.eventdate",
113
+ "programStage": {
114
+ "id": "A03MvHHogjR"
115
+ }
116
+ }
117
+ ],
118
+ "displayName": "Event orgunit",
119
+ "access": {
120
+ "manage": true,
121
+ "externalize": true,
122
+ "write": true,
123
+ "read": true,
124
+ "update": true,
125
+ "delete": true
126
+ },
127
+ "user": {
128
+ "id": "xE7jOejl9FI",
129
+ "code": null,
130
+ "name": "John Traore",
131
+ "displayName": "John Traore",
132
+ "username": "admin"
133
+ },
134
+ "favorite": false,
135
+ "subscribed": false,
136
+ "displayFormName": "Event orgunit",
137
+ "id": "xLPn5T11Vd4",
138
+ "attributeValues": []
139
+ }