@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.
- package/build/cjs/__demo__/FileMenu.stories.js +9 -17
- package/build/cjs/__demo__/OpenFileDialog.stories.js +39 -6
- package/build/cjs/__fixtures__/fixtures.js +1 -0
- package/build/cjs/__fixtures__/json/api/analytics/enrollments.json +206 -0
- package/build/cjs/api/analytics/Analytics.js +6 -0
- package/build/cjs/api/analytics/AnalyticsEnrollments.js +48 -0
- package/build/cjs/api/analytics/__tests__/AnalyticsEnrollments.spec.js +50 -0
- package/build/cjs/api/analytics/__tests__/__snapshots__/AnalyticsEnrollments.spec.js.snap +3 -0
- package/build/cjs/components/CachedDataQueryProvider.js +70 -0
- package/build/cjs/components/FileMenu/FileMenu.js +3 -4
- package/build/cjs/components/FileMenu/__tests__/FileMenu.spec.js +3 -5
- package/build/cjs/components/FileMenu/utils.js +1 -1
- package/build/cjs/components/OpenFileDialog/CustomSelectOption.js +2 -2
- package/build/cjs/components/OpenFileDialog/OpenFileDialog.js +12 -8
- package/build/cjs/components/OpenFileDialog/OpenFileDialog.styles.js +2 -2
- package/build/cjs/components/OpenFileDialog/utils.js +37 -59
- package/build/cjs/index.js +14 -0
- package/build/cjs/locales/ar/translations.json +9 -0
- package/build/cjs/locales/ar_EG/translations.json +9 -0
- package/build/cjs/locales/ar_IQ/translations.json +9 -0
- package/build/cjs/locales/ckb/translations.json +9 -0
- package/build/cjs/locales/cs/translations.json +17 -8
- package/build/cjs/locales/da/translations.json +9 -0
- package/build/cjs/locales/en/translations.json +9 -7
- package/build/cjs/locales/es/translations.json +9 -0
- package/build/cjs/locales/fr/translations.json +9 -0
- package/build/cjs/locales/id/translations.json +9 -0
- package/build/cjs/locales/km/translations.json +9 -0
- package/build/cjs/locales/lo/translations.json +9 -0
- package/build/cjs/locales/my/translations.json +9 -0
- package/build/cjs/locales/nb/translations.json +9 -0
- package/build/cjs/locales/nl/translations.json +9 -0
- package/build/cjs/locales/prs/translations.json +9 -0
- package/build/cjs/locales/ps/translations.json +9 -0
- package/build/cjs/locales/pt/translations.json +9 -0
- package/build/cjs/locales/pt_BR/translations.json +9 -0
- package/build/cjs/locales/ru/translations.json +9 -0
- package/build/cjs/locales/sv/translations.json +9 -0
- package/build/cjs/locales/tet/translations.json +9 -0
- package/build/cjs/locales/tg/translations.json +9 -0
- package/build/cjs/locales/uk/translations.json +9 -0
- package/build/cjs/locales/ur/translations.json +9 -0
- package/build/cjs/locales/uz/translations.json +9 -0
- package/build/cjs/locales/uz_Latn/translations.json +9 -0
- package/build/cjs/locales/vi/translations.json +9 -0
- package/build/cjs/locales/zh/translations.json +10 -1
- package/build/cjs/locales/zh_CN/translations.json +9 -0
- package/build/cjs/modules/layoutUiRules/rules.js +5 -1
- package/build/es/__demo__/FileMenu.stories.js +9 -17
- package/build/es/__demo__/OpenFileDialog.stories.js +38 -6
- package/build/es/__fixtures__/fixtures.js +1 -0
- package/build/es/__fixtures__/json/api/analytics/enrollments.json +206 -0
- package/build/es/api/analytics/Analytics.js +5 -0
- package/build/es/api/analytics/AnalyticsEnrollments.js +38 -0
- package/build/es/api/analytics/__tests__/AnalyticsEnrollments.spec.js +40 -0
- package/build/es/api/analytics/__tests__/__snapshots__/AnalyticsEnrollments.spec.js.snap +3 -0
- package/build/es/components/CachedDataQueryProvider.js +50 -0
- package/build/es/components/FileMenu/FileMenu.js +3 -4
- package/build/es/components/FileMenu/__tests__/FileMenu.spec.js +3 -5
- package/build/es/components/FileMenu/utils.js +1 -1
- package/build/es/components/OpenFileDialog/CustomSelectOption.js +2 -2
- package/build/es/components/OpenFileDialog/OpenFileDialog.js +12 -8
- package/build/es/components/OpenFileDialog/OpenFileDialog.styles.js +2 -2
- package/build/es/components/OpenFileDialog/utils.js +35 -56
- package/build/es/index.js +2 -1
- package/build/es/locales/ar/translations.json +9 -0
- package/build/es/locales/ar_EG/translations.json +9 -0
- package/build/es/locales/ar_IQ/translations.json +9 -0
- package/build/es/locales/ckb/translations.json +9 -0
- package/build/es/locales/cs/translations.json +17 -8
- package/build/es/locales/da/translations.json +9 -0
- package/build/es/locales/en/translations.json +9 -7
- package/build/es/locales/es/translations.json +9 -0
- package/build/es/locales/fr/translations.json +9 -0
- package/build/es/locales/id/translations.json +9 -0
- package/build/es/locales/km/translations.json +9 -0
- package/build/es/locales/lo/translations.json +9 -0
- package/build/es/locales/my/translations.json +9 -0
- package/build/es/locales/nb/translations.json +9 -0
- package/build/es/locales/nl/translations.json +9 -0
- package/build/es/locales/prs/translations.json +9 -0
- package/build/es/locales/ps/translations.json +9 -0
- package/build/es/locales/pt/translations.json +9 -0
- package/build/es/locales/pt_BR/translations.json +9 -0
- package/build/es/locales/ru/translations.json +9 -0
- package/build/es/locales/sv/translations.json +9 -0
- package/build/es/locales/tet/translations.json +9 -0
- package/build/es/locales/tg/translations.json +9 -0
- package/build/es/locales/uk/translations.json +9 -0
- package/build/es/locales/ur/translations.json +9 -0
- package/build/es/locales/uz/translations.json +9 -0
- package/build/es/locales/uz_Latn/translations.json +9 -0
- package/build/es/locales/vi/translations.json +9 -0
- package/build/es/locales/zh/translations.json +10 -1
- package/build/es/locales/zh_CN/translations.json +9 -0
- package/build/es/modules/layoutUiRules/rules.js +6 -2
- 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
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: "
|
|
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
|
-
|
|
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: "
|
|
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,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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
46
|
+
}, _CustomSelectOptionStyle.default)), insertDivider && /*#__PURE__*/_react.default.createElement(_ui.MenuDivider, {
|
|
47
47
|
dense: true
|
|
48
|
-
})
|
|
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
|
-
//
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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',
|