@dhis2/analytics 22.0.0-alpha.3 → 23.0.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 (102) hide show
  1. package/CHANGELOG.md +3009 -0
  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 +4 -10
  10. package/build/cjs/components/FileMenu/FileMenu.js +6 -0
  11. package/build/cjs/components/OpenFileDialog/CustomSelectOption.js +18 -4
  12. package/build/cjs/components/OpenFileDialog/FileList.js +5 -5
  13. package/build/cjs/components/OpenFileDialog/OpenFileDialog.js +26 -21
  14. package/build/cjs/components/OpenFileDialog/OpenFileDialog.styles.js +2 -2
  15. package/build/cjs/components/OpenFileDialog/VisTypeFilter.js +17 -16
  16. package/build/cjs/components/OpenFileDialog/utils.js +33 -74
  17. package/build/cjs/index.js +16 -4
  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 +9 -0
  23. package/build/cjs/locales/da/translations.json +9 -0
  24. package/build/cjs/locales/en/translations.json +3 -21
  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/cjs/modules/visTypes.js +14 -21
  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 +4 -10
  58. package/build/es/components/FileMenu/FileMenu.js +6 -0
  59. package/build/es/components/OpenFileDialog/CustomSelectOption.js +17 -4
  60. package/build/es/components/OpenFileDialog/FileList.js +5 -5
  61. package/build/es/components/OpenFileDialog/OpenFileDialog.js +27 -23
  62. package/build/es/components/OpenFileDialog/OpenFileDialog.styles.js +2 -2
  63. package/build/es/components/OpenFileDialog/VisTypeFilter.js +18 -14
  64. package/build/es/components/OpenFileDialog/utils.js +32 -71
  65. package/build/es/index.js +1 -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 +9 -0
  71. package/build/es/locales/da/translations.json +9 -0
  72. package/build/es/locales/en/translations.json +3 -21
  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/build/es/modules/visTypes.js +10 -19
  98. package/package.json +2 -2
  99. package/build/cjs/components/OpenFileDialog/styles/FileList.style.js +0 -10
  100. package/build/cjs/visualizations/package-lock.json +0 -1788
  101. package/build/es/components/OpenFileDialog/styles/FileList.style.js +0 -3
  102. package/build/es/visualizations/package-lock.json +0 -1788
@@ -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'"`;
@@ -34,20 +34,14 @@ const CachedDataQueryProvider = ({
34
34
  } = (0, _appRuntime.useDataQuery)(query);
35
35
  const {
36
36
  error,
37
- loading,
38
- fetching
37
+ loading
39
38
  } = rest;
40
39
  const data = rawData && dataTransformation ? dataTransformation(rawData) : rawData;
41
- /*
42
- * Render loader only when data is unavailable
43
- */
44
40
 
45
- if (loading || fetching) {
46
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ui.Layer, {
41
+ if (loading) {
42
+ return /*#__PURE__*/_react.default.createElement(_ui.Layer, {
47
43
  translucent: true
48
- }, /*#__PURE__*/_react.default.createElement(_ui.CenteredContent, null, /*#__PURE__*/_react.default.createElement(_ui.CircularLoader, null))), !loading && /*#__PURE__*/_react.default.createElement(CachedDataQueryCtx.Provider, {
49
- value: data
50
- }, children));
44
+ }, /*#__PURE__*/_react.default.createElement(_ui.CenteredContent, null, /*#__PURE__*/_react.default.createElement(_ui.CircularLoader, null)));
51
45
  }
52
46
 
53
47
  if (error) {
@@ -39,8 +39,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
39
39
 
40
40
  const FileMenu = ({
41
41
  currentUser,
42
+ defaultFilterVisType,
42
43
  fileType,
43
44
  fileObject,
45
+ filterVisTypes,
44
46
  onNew,
45
47
  onOpen,
46
48
  onSave,
@@ -155,6 +157,8 @@ const FileMenu = ({
155
157
  }, _index.default.t('File'))), /*#__PURE__*/_react.default.createElement(_OpenFileDialog.OpenFileDialog, {
156
158
  open: currentDialog === 'open',
157
159
  type: fileType,
160
+ filterVisTypes: filterVisTypes,
161
+ defaultFilterVisType: defaultFilterVisType,
158
162
  onClose: onDialogClose,
159
163
  onFileSelect: id => {
160
164
  onOpen(id);
@@ -265,8 +269,10 @@ FileMenu.defaultProps = {
265
269
  };
266
270
  FileMenu.propTypes = {
267
271
  currentUser: _propTypes.default.object,
272
+ defaultFilterVisType: _propTypes.default.string,
268
273
  fileObject: _propTypes.default.object,
269
274
  fileType: _propTypes.default.oneOf(_utils.supportedFileTypes),
275
+ filterVisTypes: _propTypes.default.array,
270
276
  onDelete: _propTypes.default.func,
271
277
  onError: _propTypes.default.func,
272
278
  onNew: _propTypes.default.func,
@@ -7,6 +7,10 @@ exports.default = exports.CustomSelectOption = void 0;
7
7
 
8
8
  var _style = _interopRequireDefault(require("styled-jsx/style"));
9
9
 
10
+ var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
11
+
12
+ var _ui = require("@dhis2/ui");
13
+
10
14
  var _classnames = _interopRequireDefault(require("classnames"));
11
15
 
12
16
  var _propTypes = _interopRequireDefault(require("prop-types"));
@@ -17,14 +21,15 @@ var _CustomSelectOptionStyle = _interopRequireDefault(require("./styles/CustomSe
17
21
 
18
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
23
 
20
- const CustomSelectOption = ({
24
+ const CustomSelectOptionItem = ({
21
25
  value,
22
26
  label,
23
27
  icon,
28
+ insertDivider,
24
29
  onClick,
25
30
  active,
26
31
  disabled
27
- }) => /*#__PURE__*/_react.default.createElement("div", {
32
+ }) => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
28
33
  onClick: e => onClick({}, e),
29
34
  "data-value": value,
30
35
  "data-label": label,
@@ -33,10 +38,18 @@ const CustomSelectOption = ({
33
38
  disabled
34
39
  }) || "")
35
40
  }, icon, /*#__PURE__*/_react.default.createElement("span", {
36
- className: "jsx-".concat(_CustomSelectOptionStyle.default.__hash) + " " + "label"
41
+ className: "jsx-".concat(_CustomSelectOptionStyle.default.__hash) + " " + ((0, _classnames.default)({
42
+ label: icon
43
+ }) || "")
37
44
  }, label), /*#__PURE__*/_react.default.createElement(_style.default, {
38
45
  id: _CustomSelectOptionStyle.default.__hash
39
- }, _CustomSelectOptionStyle.default));
46
+ }, _CustomSelectOptionStyle.default)), insertDivider && /*#__PURE__*/_react.default.createElement(_ui.MenuDivider, {
47
+ dense: true
48
+ }));
49
+
50
+ const CustomSelectOption = props => props.disabled ? /*#__PURE__*/_react.default.createElement(_ui.Tooltip, {
51
+ content: _d2I18n.default.t('Not supported by this app yet')
52
+ }, /*#__PURE__*/_react.default.createElement(CustomSelectOptionItem, props)) : /*#__PURE__*/_react.default.createElement(CustomSelectOptionItem, props);
40
53
 
41
54
  exports.CustomSelectOption = CustomSelectOption;
42
55
  CustomSelectOption.propTypes = {
@@ -47,5 +60,6 @@ CustomSelectOption.propTypes = {
47
60
  disabled: _propTypes.default.bool,
48
61
  onClick: _propTypes.default.func
49
62
  };
63
+ CustomSelectOptionItem.propTypes = CustomSelectOption.propTypes;
50
64
  var _default = CustomSelectOption;
51
65
  exports.default = _default;
@@ -18,14 +18,14 @@ var _DateField = require("./DateField.js");
18
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
19
 
20
20
  const FileList = ({
21
- type,
22
21
  data,
23
- onSelect
22
+ onSelect,
23
+ showVisTypeColumn
24
24
  }) => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, data.map(visualization => /*#__PURE__*/_react.default.createElement(_ui.DataTableRow, {
25
25
  key: visualization.id
26
26
  }, /*#__PURE__*/_react.default.createElement(_ui.DataTableCell, {
27
27
  onClick: () => onSelect(visualization.id)
28
- }, visualization.displayName), type === 'visualization' && /*#__PURE__*/_react.default.createElement(_ui.DataTableCell, {
28
+ }, visualization.displayName), showVisTypeColumn && /*#__PURE__*/_react.default.createElement(_ui.DataTableCell, {
29
29
  align: "center"
30
30
  }, /*#__PURE__*/_react.default.createElement(_VisTypeIcon.VisTypeIcon, {
31
31
  type: visualization.type,
@@ -46,8 +46,8 @@ FileList.propTypes = {
46
46
  lastUpdated: _propTypes.default.string.isRequired,
47
47
  type: _propTypes.default.string
48
48
  })).isRequired,
49
- type: _propTypes.default.string.isRequired,
50
- onSelect: _propTypes.default.func.isRequired
49
+ onSelect: _propTypes.default.func.isRequired,
50
+ showVisTypeColumn: _propTypes.default.bool
51
51
  };
52
52
  var _default = FileList;
53
53
  exports.default = _default;