@dhis2/analytics 22.0.0-alpha.2 → 23.0.0-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.
Files changed (97) hide show
  1. package/build/cjs/__demo__/FileMenu.stories.js +9 -17
  2. package/build/cjs/__demo__/OpenFileDialog.stories.js +39 -6
  3. package/build/cjs/__fixtures__/fixtures.js +1 -0
  4. package/build/cjs/__fixtures__/json/api/analytics/enrollments.json +206 -0
  5. package/build/cjs/api/analytics/Analytics.js +6 -0
  6. package/build/cjs/api/analytics/AnalyticsEnrollments.js +48 -0
  7. package/build/cjs/api/analytics/__tests__/AnalyticsEnrollments.spec.js +50 -0
  8. package/build/cjs/api/analytics/__tests__/__snapshots__/AnalyticsEnrollments.spec.js.snap +3 -0
  9. package/build/cjs/components/CachedDataQueryProvider.js +70 -0
  10. package/build/cjs/components/FileMenu/FileMenu.js +3 -4
  11. package/build/cjs/components/FileMenu/__tests__/FileMenu.spec.js +3 -5
  12. package/build/cjs/components/FileMenu/utils.js +1 -1
  13. package/build/cjs/components/OpenFileDialog/CustomSelectOption.js +2 -2
  14. package/build/cjs/components/OpenFileDialog/OpenFileDialog.js +12 -8
  15. package/build/cjs/components/OpenFileDialog/OpenFileDialog.styles.js +2 -2
  16. package/build/cjs/components/OpenFileDialog/utils.js +37 -59
  17. package/build/cjs/index.js +14 -0
  18. package/build/cjs/locales/ar/translations.json +9 -0
  19. package/build/cjs/locales/ar_EG/translations.json +9 -0
  20. package/build/cjs/locales/ar_IQ/translations.json +9 -0
  21. package/build/cjs/locales/ckb/translations.json +9 -0
  22. package/build/cjs/locales/cs/translations.json +17 -8
  23. package/build/cjs/locales/da/translations.json +9 -0
  24. package/build/cjs/locales/en/translations.json +9 -7
  25. package/build/cjs/locales/es/translations.json +9 -0
  26. package/build/cjs/locales/fr/translations.json +9 -0
  27. package/build/cjs/locales/id/translations.json +9 -0
  28. package/build/cjs/locales/km/translations.json +9 -0
  29. package/build/cjs/locales/lo/translations.json +9 -0
  30. package/build/cjs/locales/my/translations.json +9 -0
  31. package/build/cjs/locales/nb/translations.json +9 -0
  32. package/build/cjs/locales/nl/translations.json +9 -0
  33. package/build/cjs/locales/prs/translations.json +9 -0
  34. package/build/cjs/locales/ps/translations.json +9 -0
  35. package/build/cjs/locales/pt/translations.json +9 -0
  36. package/build/cjs/locales/pt_BR/translations.json +9 -0
  37. package/build/cjs/locales/ru/translations.json +9 -0
  38. package/build/cjs/locales/sv/translations.json +9 -0
  39. package/build/cjs/locales/tet/translations.json +9 -0
  40. package/build/cjs/locales/tg/translations.json +9 -0
  41. package/build/cjs/locales/uk/translations.json +9 -0
  42. package/build/cjs/locales/ur/translations.json +9 -0
  43. package/build/cjs/locales/uz/translations.json +9 -0
  44. package/build/cjs/locales/uz_Latn/translations.json +9 -0
  45. package/build/cjs/locales/vi/translations.json +9 -0
  46. package/build/cjs/locales/zh/translations.json +10 -1
  47. package/build/cjs/locales/zh_CN/translations.json +9 -0
  48. package/build/cjs/modules/layoutUiRules/rules.js +5 -1
  49. package/build/es/__demo__/FileMenu.stories.js +9 -17
  50. package/build/es/__demo__/OpenFileDialog.stories.js +38 -6
  51. package/build/es/__fixtures__/fixtures.js +1 -0
  52. package/build/es/__fixtures__/json/api/analytics/enrollments.json +206 -0
  53. package/build/es/api/analytics/Analytics.js +5 -0
  54. package/build/es/api/analytics/AnalyticsEnrollments.js +38 -0
  55. package/build/es/api/analytics/__tests__/AnalyticsEnrollments.spec.js +40 -0
  56. package/build/es/api/analytics/__tests__/__snapshots__/AnalyticsEnrollments.spec.js.snap +3 -0
  57. package/build/es/components/CachedDataQueryProvider.js +50 -0
  58. package/build/es/components/FileMenu/FileMenu.js +3 -4
  59. package/build/es/components/FileMenu/__tests__/FileMenu.spec.js +3 -5
  60. package/build/es/components/FileMenu/utils.js +1 -1
  61. package/build/es/components/OpenFileDialog/CustomSelectOption.js +2 -2
  62. package/build/es/components/OpenFileDialog/OpenFileDialog.js +12 -8
  63. package/build/es/components/OpenFileDialog/OpenFileDialog.styles.js +2 -2
  64. package/build/es/components/OpenFileDialog/utils.js +35 -56
  65. package/build/es/index.js +2 -1
  66. package/build/es/locales/ar/translations.json +9 -0
  67. package/build/es/locales/ar_EG/translations.json +9 -0
  68. package/build/es/locales/ar_IQ/translations.json +9 -0
  69. package/build/es/locales/ckb/translations.json +9 -0
  70. package/build/es/locales/cs/translations.json +17 -8
  71. package/build/es/locales/da/translations.json +9 -0
  72. package/build/es/locales/en/translations.json +9 -7
  73. package/build/es/locales/es/translations.json +9 -0
  74. package/build/es/locales/fr/translations.json +9 -0
  75. package/build/es/locales/id/translations.json +9 -0
  76. package/build/es/locales/km/translations.json +9 -0
  77. package/build/es/locales/lo/translations.json +9 -0
  78. package/build/es/locales/my/translations.json +9 -0
  79. package/build/es/locales/nb/translations.json +9 -0
  80. package/build/es/locales/nl/translations.json +9 -0
  81. package/build/es/locales/prs/translations.json +9 -0
  82. package/build/es/locales/ps/translations.json +9 -0
  83. package/build/es/locales/pt/translations.json +9 -0
  84. package/build/es/locales/pt_BR/translations.json +9 -0
  85. package/build/es/locales/ru/translations.json +9 -0
  86. package/build/es/locales/sv/translations.json +9 -0
  87. package/build/es/locales/tet/translations.json +9 -0
  88. package/build/es/locales/tg/translations.json +9 -0
  89. package/build/es/locales/uk/translations.json +9 -0
  90. package/build/es/locales/ur/translations.json +9 -0
  91. package/build/es/locales/uz/translations.json +9 -0
  92. package/build/es/locales/uz_Latn/translations.json +9 -0
  93. package/build/es/locales/vi/translations.json +9 -0
  94. package/build/es/locales/zh/translations.json +10 -1
  95. package/build/es/locales/zh_CN/translations.json +9 -0
  96. package/build/es/modules/layoutUiRules/rules.js +6 -2
  97. package/package.json +2 -2
@@ -14,10 +14,10 @@ const configMock = {
14
14
  baseUrl: 'http://localhost:8080',
15
15
  apiVersion: 33
16
16
  };
17
- const d2Mock = {
18
- i18n: {
19
- getTranslation: string => string
20
- }
17
+ const user = {
18
+ displayName: 'John Traore',
19
+ id: 'xE7jOejl9FI',
20
+ username: 'admin'
21
21
  };
22
22
  const visObject = {
23
23
  lastUpdated: '2020-10-12T09:44:46.194',
@@ -38,16 +38,8 @@ const visObject = {
38
38
  write: true,
39
39
  manage: true
40
40
  },
41
- lastUpdatedBy: {
42
- displayName: 'John Traore',
43
- id: 'xE7jOejl9FI',
44
- username: 'admin'
45
- },
46
- user: {
47
- displayName: 'John Traore',
48
- id: 'xE7jOejl9FI',
49
- username: 'admin'
50
- },
41
+ lastUpdatedBy: user,
42
+ user,
51
43
  translations: [],
52
44
  userAccesses: [{
53
45
  access: 'rw------',
@@ -67,18 +59,18 @@ const visReadonlyObject = { ...visObject,
67
59
  }
68
60
  };
69
61
  (0, _react.storiesOf)('FileMenu', module).add('Simple', () => /*#__PURE__*/_react2.default.createElement(_FileMenu.FileMenu, {
70
- d2: d2Mock,
62
+ currentUser: user,
71
63
  fileType: "visualization"
72
64
  })).add('With AO', () => /*#__PURE__*/_react2.default.createElement(_appRuntime.Provider, {
73
65
  config: configMock
74
66
  }, /*#__PURE__*/_react2.default.createElement(_FileMenu.FileMenu, {
75
- d2: d2Mock,
67
+ currentUser: user,
76
68
  fileType: "visualization",
77
69
  fileObject: visObject
78
70
  }))).add('With readonly AO', () => /*#__PURE__*/_react2.default.createElement(_appRuntime.Provider, {
79
71
  config: configMock
80
72
  }, /*#__PURE__*/_react2.default.createElement(_FileMenu.FileMenu, {
81
- d2: d2Mock,
73
+ currentUser: user,
82
74
  fileType: "visualization",
83
75
  fileObject: visReadonlyObject
84
76
  })));
@@ -8,6 +8,8 @@ var _react2 = _interopRequireDefault(require("react"));
8
8
 
9
9
  var _OpenFileDialog = require("../components/OpenFileDialog/OpenFileDialog.js");
10
10
 
11
+ var _visTypes = require("../modules/visTypes.js");
12
+
11
13
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
14
 
13
15
  const configMock = {
@@ -22,17 +24,30 @@ const user = {
22
24
 
23
25
  const onFileSelect = id => alert("Opening ".concat(id));
24
26
 
25
- (0, _react.storiesOf)('OpenFileDialog', module).add('List of visualizations', () => /*#__PURE__*/_react2.default.createElement(_appRuntime.Provider, {
27
+ const filterVisTypesWithGroupsAndDivider = [{
28
+ type: _visTypes.VIS_TYPE_GROUP_ALL
29
+ }, {
30
+ type: _visTypes.VIS_TYPE_GROUP_CHARTS,
31
+ insertDivider: true
32
+ }, {
33
+ type: _visTypes.VIS_TYPE_PIVOT_TABLE
34
+ }, {
35
+ type: _visTypes.VIS_TYPE_COLUMN
36
+ }, {
37
+ type: _visTypes.VIS_TYPE_BAR
38
+ }];
39
+ (0, _react.storiesOf)('OpenFileDialog', module).add('List of visualizations with vis type filter and divider (no default vis type)', () => /*#__PURE__*/_react2.default.createElement(_appRuntime.Provider, {
26
40
  config: configMock
27
41
  }, /*#__PURE__*/_react2.default.createElement(_OpenFileDialog.OpenFileDialog, {
28
42
  type: "visualization",
43
+ filterVisTypes: filterVisTypesWithGroupsAndDivider,
29
44
  onClose: Function.prototype,
30
45
  onFileSelect: onFileSelect,
31
46
  onNew: Function.prototype,
32
47
  open: true,
33
48
  currentUser: user
34
49
  })));
35
- (0, _react.storiesOf)('OpenFileDialog', module).add('List of maps', () => /*#__PURE__*/_react2.default.createElement(_appRuntime.Provider, {
50
+ (0, _react.storiesOf)('OpenFileDialog', module).add('List of maps (no vis type filter)', () => /*#__PURE__*/_react2.default.createElement(_appRuntime.Provider, {
36
51
  config: configMock
37
52
  }, /*#__PURE__*/_react2.default.createElement(_OpenFileDialog.OpenFileDialog, {
38
53
  type: "map",
@@ -42,20 +57,38 @@ const onFileSelect = id => alert("Opening ".concat(id));
42
57
  open: true,
43
58
  currentUser: user
44
59
  })));
45
- (0, _react.storiesOf)('OpenFileDialog', module).add('List of event reports (Line list only)', () => /*#__PURE__*/_react2.default.createElement(_appRuntime.Provider, {
60
+ const filterVisTypesWithDisabled = [{
61
+ type: _visTypes.VIS_TYPE_PIVOT_TABLE,
62
+ disabled: true
63
+ }, {
64
+ type: _visTypes.VIS_TYPE_LINE_LIST
65
+ }];
66
+ (0, _react.storiesOf)('OpenFileDialog', module).add('List of event visualizations with vis type filter, disabled type and default vis type', () => /*#__PURE__*/_react2.default.createElement(_appRuntime.Provider, {
46
67
  config: configMock
47
68
  }, /*#__PURE__*/_react2.default.createElement(_OpenFileDialog.OpenFileDialog, {
48
- type: "eventReport",
69
+ type: "eventVisualization",
70
+ filterVisTypes: filterVisTypesWithDisabled,
71
+ defaultFilterVisType: _visTypes.VIS_TYPE_LINE_LIST,
49
72
  onClose: Function.prototype,
50
73
  onFileSelect: onFileSelect,
51
74
  onNew: Function.prototype,
52
75
  open: true,
53
76
  currentUser: user
54
77
  })));
55
- (0, _react.storiesOf)('OpenFileDialog', module).add('List of a supported type without custom titles/texts', () => /*#__PURE__*/_react2.default.createElement(_appRuntime.Provider, {
78
+ const filterVisTypesWithGroupDividerAndDisabled = [{
79
+ type: _visTypes.VIS_TYPE_GROUP_ALL
80
+ }, {
81
+ type: _visTypes.VIS_TYPE_BAR,
82
+ insertDivider: true
83
+ }, {
84
+ type: _visTypes.VIS_TYPE_COLUMN,
85
+ disabled: true
86
+ }];
87
+ (0, _react.storiesOf)('OpenFileDialog', module).add('List of visualizations with vis type filter with group type, divider and disabled option (no default vis type)', () => /*#__PURE__*/_react2.default.createElement(_appRuntime.Provider, {
56
88
  config: configMock
57
89
  }, /*#__PURE__*/_react2.default.createElement(_OpenFileDialog.OpenFileDialog, {
58
- type: "eventChart",
90
+ type: "visualization",
91
+ filterVisTypes: filterVisTypesWithGroupDividerAndDisabled,
59
92
  onClose: Function.prototype,
60
93
  onFileSelect: onFileSelect,
61
94
  onNew: Function.prototype,
@@ -98,6 +98,7 @@ var _default = function x() {
98
98
  addFixture('/api/analytics/query', require('./json/api/analytics/query.json'));
99
99
  addFixture('/api/analytics/cluster', require('./json/api/analytics/cluster.json'));
100
100
  addFixture('/api/analytics/response', require('./json/api/analytics/response.json'));
101
+ addFixture('/api/analytics/enrollments', require('./json/api/analytics/enrollments.json'));
101
102
  return {
102
103
  get: getFixture,
103
104
  add: addFixture
@@ -0,0 +1,206 @@
1
+ {
2
+ "headers": [
3
+ {
4
+ "name": "pi",
5
+ "column": "Enrollment",
6
+ "valueType": "TEXT",
7
+ "type": "java.lang.String",
8
+ "hidden": false,
9
+ "meta": true
10
+ },
11
+ {
12
+ "name": "tei",
13
+ "column": "Tracked entity instance",
14
+ "valueType": "TEXT",
15
+ "type": "java.lang.String",
16
+ "hidden": false,
17
+ "meta": true
18
+ },
19
+ {
20
+ "name": "enrollmentdate",
21
+ "column": "Enrollment date",
22
+ "valueType": "DATE",
23
+ "type": "java.util.Date",
24
+ "hidden": false,
25
+ "meta": true
26
+ },
27
+ {
28
+ "name": "incidentdate",
29
+ "column": "Incident date",
30
+ "valueType": "DATE",
31
+ "type": "java.util.Date",
32
+ "hidden": false,
33
+ "meta": true
34
+ },
35
+ {
36
+ "name": "geometry",
37
+ "column": "Geometry",
38
+ "valueType": "TEXT",
39
+ "type": "java.lang.String",
40
+ "hidden": false,
41
+ "meta": true
42
+ },
43
+ {
44
+ "name": "longitude",
45
+ "column": "Longitude",
46
+ "valueType": "NUMBER",
47
+ "type": "java.lang.Double",
48
+ "hidden": false,
49
+ "meta": true
50
+ },
51
+ {
52
+ "name": "latitude",
53
+ "column": "Latitude",
54
+ "valueType": "NUMBER",
55
+ "type": "java.lang.Double",
56
+ "hidden": false,
57
+ "meta": true
58
+ },
59
+ {
60
+ "name": "ouname",
61
+ "column": "Organisation unit name",
62
+ "valueType": "TEXT",
63
+ "type": "java.lang.String",
64
+ "hidden": false,
65
+ "meta": true
66
+ },
67
+ {
68
+ "name": "oucode",
69
+ "column": "Organisation unit code",
70
+ "valueType": "TEXT",
71
+ "type": "java.lang.String",
72
+ "hidden": false,
73
+ "meta": true
74
+ },
75
+ {
76
+ "name": "ou",
77
+ "column": "Organisation unit",
78
+ "valueType": "TEXT",
79
+ "type": "java.lang.String",
80
+ "hidden": false,
81
+ "meta": true
82
+ },
83
+ {
84
+ "name": "de0FEHSIoxh",
85
+ "column": "WHOMCH Chronic conditions",
86
+ "valueType": "BOOLEAN",
87
+ "type": "java.lang.Boolean",
88
+ "hidden": false,
89
+ "meta": true
90
+ },
91
+ {
92
+ "name": "sWoqcoByYmD",
93
+ "column": "WHOMCH Smoking",
94
+ "valueType": "BOOLEAN",
95
+ "type": "java.lang.Boolean",
96
+ "hidden": false,
97
+ "meta": true
98
+ }
99
+ ],
100
+ "metaData": {
101
+ "pager": {
102
+ "page": 2,
103
+ "total": 163,
104
+ "pageSize": 4,
105
+ "pageCount": 41
106
+ },
107
+ "items": {
108
+ "ImspTQPwCqd": {
109
+ "name": "Sierra Leone"
110
+ },
111
+ "PFDfvmGpsR3": {
112
+ "name": "Care at birth"
113
+ },
114
+ "bbKtnxRZKEP": {
115
+ "name": "Postpartum care visit"
116
+ },
117
+ "ou": {
118
+ "name": "Organisation unit"
119
+ },
120
+ "PUZaKR0Jh2k": {
121
+ "name": "Previous deliveries"
122
+ },
123
+ "edqlbukwRfQ": {
124
+ "name": "Antenatal care visit"
125
+ },
126
+ "WZbXY0S00lP": {
127
+ "name": "First antenatal care visit"
128
+ },
129
+ "sWoqcoByYmD": {
130
+ "name": "WHOMCH Smoking"
131
+ },
132
+ "WSGAb5XwJ3Y": {
133
+ "name": "WHO RMNCH Tracker"
134
+ },
135
+ "de0FEHSIoxh": {
136
+ "name": "WHOMCH Chronic conditions"
137
+ }
138
+ },
139
+ "dimensions": {
140
+ "pe": [],
141
+ "ou": ["ImspTQPwCqd"],
142
+ "sWoqcoByYmD": [],
143
+ "de0FEHSIoxh": []
144
+ }
145
+ },
146
+ "width": 12,
147
+ "rows": [
148
+ [
149
+ "A0cP533hIQv",
150
+ "to8G9jAprnx",
151
+ "2019-02-02 12:05:00.0",
152
+ "2019-02-02 12:05:00.0",
153
+ "",
154
+ "0.0",
155
+ "0.0",
156
+ "Tonkomba MCHP",
157
+ "OU_193264",
158
+ "xIMxph4NMP1",
159
+ "0",
160
+ "1"
161
+ ],
162
+ [
163
+ "ZqiUn2uXmBi",
164
+ "SJtv0WzoYki",
165
+ "2019-02-02 12:05:00.0",
166
+ "2019-02-02 12:05:00.0",
167
+ "",
168
+ "0.0",
169
+ "0.0",
170
+ "Mawoma MCHP",
171
+ "OU_254973",
172
+ "Srnpwq8jKbp",
173
+ "0",
174
+ "0"
175
+ ],
176
+ [
177
+ "lE747mUAtbz",
178
+ "PGzTv2A1xzn",
179
+ "2019-02-02 12:05:00.0",
180
+ "2019-02-02 12:05:00.0",
181
+ "",
182
+ "0.0",
183
+ "0.0",
184
+ "Kunsho CHP",
185
+ "OU_193254",
186
+ "tdhB1JXYBx2",
187
+ "",
188
+ "0"
189
+ ],
190
+ [
191
+ "nmcqu9QF8ow",
192
+ "pav3tGLjYuq",
193
+ "2019-02-03 12:05:00.0",
194
+ "2019-02-03 12:05:00.0",
195
+ "",
196
+ "0.0",
197
+ "0.0",
198
+ "Korbu MCHP",
199
+ "OU_678893",
200
+ "m73lWmo5BDG",
201
+ "",
202
+ "1"
203
+ ]
204
+ ],
205
+ "height": 4
206
+ }
@@ -7,6 +7,8 @@ exports.default = void 0;
7
7
 
8
8
  var _AnalyticsAggregate = _interopRequireDefault(require("./AnalyticsAggregate.js"));
9
9
 
10
+ var _AnalyticsEnrollments = _interopRequireDefault(require("./AnalyticsEnrollments.js"));
11
+
10
12
  var _AnalyticsEvents = _interopRequireDefault(require("./AnalyticsEvents.js"));
11
13
 
12
14
  var _AnalyticsRequest = _interopRequireDefault(require("./AnalyticsRequest.js"));
@@ -43,17 +45,20 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
43
45
  class Analytics {
44
46
  /**
45
47
  * @param {!module:analytics.AnalyticsAggregate} analyticsAggregate The AnalyticsAggregate instance
48
+ * @param {!module:analytics.AnalyticsEnrollments} analyticsEnrollments The AnalyticsEnrollments instance
46
49
  * @param {!module:analytics.AnalyticsEvents} analyticsEvents The AnalyticsEvents instance
47
50
  * @param {!module:analytics.AnalyticsRequest} analyticsRequest The AnalyticsRequest class
48
51
  * @param {!module:analytics.AnalyticsResponse} analyticsResponse The AnalyticsResponse class
49
52
  */
50
53
  constructor({
51
54
  aggregate,
55
+ enrollments,
52
56
  events,
53
57
  request,
54
58
  response
55
59
  }) {
56
60
  this.aggregate = aggregate;
61
+ this.enrollments = enrollments;
57
62
  this.events = events;
58
63
  this.request = request;
59
64
  this.response = response;
@@ -76,6 +81,7 @@ class Analytics {
76
81
  if (!Analytics.getAnalytics.analytics) {
77
82
  Analytics.getAnalytics.analytics = new Analytics({
78
83
  aggregate: new _AnalyticsAggregate.default(dataEngine),
84
+ enrollments: new _AnalyticsEnrollments.default(dataEngine),
79
85
  events: new _AnalyticsEvents.default(dataEngine),
80
86
  request: _AnalyticsRequest.default,
81
87
  response: _AnalyticsResponse.default
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _AnalyticsBase = _interopRequireDefault(require("./AnalyticsBase.js"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ /**
13
+ * @extends module:analytics.AnalyticsBase
14
+ *
15
+ * @description
16
+ * Analytics enrollments class used to request analytics enrollments data from Web API.
17
+ *
18
+ * @memberof module:analytics
19
+ *
20
+ * @see https://docs.dhis2.org/en/develop/using-the-api/dhis-core-version-236/analytics.html#webapi_enrollment_analytics
21
+ */
22
+ class AnalyticsEnrollments extends _AnalyticsBase.default {
23
+ /**
24
+ * @param {!AnalyticsRequest} req Request object
25
+ *
26
+ * @returns {Promise} Promise that resolves with the analytics query data from the api.
27
+ *
28
+ * @example
29
+ * const req = new analytics.request()
30
+ * .withProgram('eBAyeGv0exc')
31
+ * .addDataDimension(['Uvn6LCg7dVU','OdiHJayrsKo'])
32
+ * .addPeriodDimension('LAST_4_QUARTERS')
33
+ * .addOrgUnitDimension(['lc3eMKXaEfw','PMa2VCrupOd'])
34
+ * .addOrgUnitFilter('O6uvpzGd5pu')
35
+ * .withStartDate('2017-10-01')
36
+ * .withEndDate('2017-10-31');
37
+ *
38
+ * analytics.enrollments.getQuery(req)
39
+ * .then(console.log);
40
+ */
41
+ getQuery(req) {
42
+ return this.fetch(req.withPath('enrollments/query'));
43
+ }
44
+
45
+ }
46
+
47
+ var _default = AnalyticsEnrollments;
48
+ exports.default = _default;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ var _fixtures = _interopRequireDefault(require("../../../__fixtures__/fixtures.js"));
4
+
5
+ var _DataEngine = _interopRequireDefault(require("../__mocks__/DataEngine.js"));
6
+
7
+ var _AnalyticsEnrollments = _interopRequireDefault(require("../AnalyticsEnrollments.js"));
8
+
9
+ var _AnalyticsRequest = _interopRequireDefault(require("../AnalyticsRequest.js"));
10
+
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+
13
+ describe('analytics.enrollments', () => {
14
+ let enrollments;
15
+ let request;
16
+ let dataEngineMock;
17
+ let fixture;
18
+ beforeEach(() => {
19
+ dataEngineMock = new _DataEngine.default();
20
+
21
+ _DataEngine.default.mockClear();
22
+
23
+ enrollments = new _AnalyticsEnrollments.default();
24
+ });
25
+ it('should not be allowed to be called without new', () => {
26
+ expect(() => (0, _AnalyticsEnrollments.default)()).toThrowErrorMatchingSnapshot();
27
+ });
28
+ it('should use the dataEngine object when it is passed', () => {
29
+ const dataEngineMockObject = {};
30
+ enrollments = new _AnalyticsEnrollments.default(dataEngineMockObject);
31
+ expect(enrollments.dataEngine).toBe(dataEngineMockObject);
32
+ });
33
+ describe('.getQuery()', () => {
34
+ beforeEach(() => {
35
+ enrollments = new _AnalyticsEnrollments.default(new _DataEngine.default());
36
+ request = new _AnalyticsRequest.default().addOrgUnitDimension('ImspTQPwCqd').addDimension('WZbXY0S00lP.de0FEHSIoxh').addDimension('WZbXY0S00lP.sWoqcoByYmD').addPeriodFilter('LAST_MONTH').withProgram('WSGAb5XwJ3Y').withStage('WZbXY0S00lP').withAsc('ENROLLMENTDATE').withOuMode('DESCENDANTS').withColumns('w75KJ2mc4zz').withPage(1).withPageSize(10);
37
+ fixture = _fixtures.default.get('/api/analytics/enrollments');
38
+ dataEngineMock.query.mockReturnValue(Promise.resolve({
39
+ data: fixture
40
+ }));
41
+ });
42
+ it('should be a function', () => {
43
+ expect(enrollments.getQuery).toBeInstanceOf(Function);
44
+ });
45
+ it('should resolve a promise with data', () => enrollments.getQuery(request).then(data => {
46
+ expect(data.width).toEqual(fixture.width);
47
+ expect(data.height).toEqual(fixture.height);
48
+ }));
49
+ });
50
+ });
@@ -0,0 +1,3 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`analytics.enrollments should not be allowed to be called without new 1`] = `"Class constructor AnalyticsEnrollments cannot be invoked without 'new'"`;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useCachedDataQuery = exports.CachedDataQueryProvider = void 0;
7
+
8
+ var _appRuntime = require("@dhis2/app-runtime");
9
+
10
+ var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
11
+
12
+ var _ui = require("@dhis2/ui");
13
+
14
+ var _propTypes = _interopRequireDefault(require("prop-types"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
17
+
18
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
19
+
20
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (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; }
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ const CachedDataQueryCtx = /*#__PURE__*/(0, _react.createContext)({});
25
+
26
+ const CachedDataQueryProvider = ({
27
+ query,
28
+ dataTransformation,
29
+ children
30
+ }) => {
31
+ const {
32
+ data: rawData,
33
+ ...rest
34
+ } = (0, _appRuntime.useDataQuery)(query);
35
+ const {
36
+ error,
37
+ loading
38
+ } = rest;
39
+ const data = rawData && dataTransformation ? dataTransformation(rawData) : rawData;
40
+
41
+ if (loading) {
42
+ return /*#__PURE__*/_react.default.createElement(_ui.Layer, {
43
+ translucent: true
44
+ }, /*#__PURE__*/_react.default.createElement(_ui.CenteredContent, null, /*#__PURE__*/_react.default.createElement(_ui.CircularLoader, null)));
45
+ }
46
+
47
+ if (error) {
48
+ const fallbackMsg = _d2I18n.default.t('This app could not retrieve required data.');
49
+
50
+ return /*#__PURE__*/_react.default.createElement(_ui.NoticeBox, {
51
+ error: true,
52
+ title: _d2I18n.default.t('Network error')
53
+ }, error.message || fallbackMsg);
54
+ }
55
+
56
+ return /*#__PURE__*/_react.default.createElement(CachedDataQueryCtx.Provider, {
57
+ value: data
58
+ }, children);
59
+ };
60
+
61
+ exports.CachedDataQueryProvider = CachedDataQueryProvider;
62
+ CachedDataQueryProvider.propTypes = {
63
+ children: _propTypes.default.node.isRequired,
64
+ query: _propTypes.default.object.isRequired,
65
+ dataTransformation: _propTypes.default.func
66
+ };
67
+
68
+ const useCachedDataQuery = () => (0, _react.useContext)(CachedDataQueryCtx);
69
+
70
+ exports.useCachedDataQuery = useCachedDataQuery;
@@ -38,8 +38,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
38
38
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
39
 
40
40
  const FileMenu = ({
41
- d2,
42
- // to be removed as soon as TranslateDialog and FavoritesDialog are rewritten
41
+ currentUser,
43
42
  defaultFilterVisType,
44
43
  fileType,
45
44
  fileObject,
@@ -166,7 +165,7 @@ const FileMenu = ({
166
165
  onDialogClose();
167
166
  },
168
167
  onNew: onNew,
169
- currentUser: d2.currentUser
168
+ currentUser: currentUser
170
169
  }), menuIsOpen && /*#__PURE__*/_react.default.createElement(_ui.Layer, {
171
170
  onClick: toggleMenu,
172
171
  position: "fixed",
@@ -269,7 +268,7 @@ FileMenu.defaultProps = {
269
268
  onTranslate: Function.prototype
270
269
  };
271
270
  FileMenu.propTypes = {
272
- d2: _propTypes.default.object,
271
+ currentUser: _propTypes.default.object,
273
272
  defaultFilterVisType: _propTypes.default.string,
274
273
  fileObject: _propTypes.default.object,
275
274
  fileType: _propTypes.default.oneOf(_utils.supportedFileTypes),
@@ -46,11 +46,9 @@ describe('The FileMenu component ', () => {
46
46
  beforeEach(() => {
47
47
  shallowFileMenu = undefined;
48
48
  props = {
49
- d2: {
50
- currentUser: {
51
- id: 'u1',
52
- displayName: 'Test user'
53
- }
49
+ currentUser: {
50
+ id: 'u1',
51
+ displayName: 'Test user'
54
52
  },
55
53
  fileType: 'visualization',
56
54
  fileObject: undefined,
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.appPathFor = exports.endpointFromFileType = exports.supportedFileTypes = void 0;
7
- const supportedFileTypes = ['eventReport', 'visualization', 'map'];
7
+ const supportedFileTypes = ['eventReport', 'visualization', 'map', 'eventVisualization'];
8
8
  exports.supportedFileTypes = supportedFileTypes;
9
9
 
10
10
  const endpointFromFileType = fileType => {
@@ -43,9 +43,9 @@ const CustomSelectOptionItem = ({
43
43
  }) || "")
44
44
  }, label), /*#__PURE__*/_react.default.createElement(_style.default, {
45
45
  id: _CustomSelectOptionStyle.default.__hash
46
- }, _CustomSelectOptionStyle.default)), insertDivider ? /*#__PURE__*/_react.default.createElement(_ui.MenuDivider, {
46
+ }, _CustomSelectOptionStyle.default)), insertDivider && /*#__PURE__*/_react.default.createElement(_ui.MenuDivider, {
47
47
  dense: true
48
- }) : null);
48
+ }));
49
49
 
50
50
  const CustomSelectOption = props => props.disabled ? /*#__PURE__*/_react.default.createElement(_ui.Tooltip, {
51
51
  content: _d2I18n.default.t('Not supported by this app yet')
@@ -154,18 +154,22 @@ const OpenFileDialog = ({
154
154
  refetch({
155
155
  page,
156
156
  sortField,
157
- sortDirection
157
+ sortDirection,
158
+ filters: formatFilters()
158
159
  });
159
160
  }
160
161
  }, [open, page, sortField, sortDirection]);
161
162
  (0, _react.useEffect)(() => {
162
- // reset pagination when filters are applied/changed
163
- setPage(1);
164
- refetch({
165
- sortField,
166
- sortDirection,
167
- filters: formatFilters()
168
- });
163
+ // avoid fetching data when the dialog is first rendered (hidden)
164
+ if (open) {
165
+ // reset pagination when filters are applied/changed
166
+ setPage(1);
167
+ refetch({
168
+ sortField,
169
+ sortDirection,
170
+ filters: formatFilters()
171
+ });
172
+ }
169
173
  }, [filters]);
170
174
  const headers = [{
171
175
  field: 'displayName',