@dhis2/analytics 20.7.0 → 21.0.0-alpha.4

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 (42) hide show
  1. package/build/cjs/__demo__/OrgUnitDimension.stories.js +104 -0
  2. package/build/cjs/api/organisationUnits.js +100 -46
  3. package/build/cjs/components/FileMenu/DeleteDialog.js +2 -2
  4. package/build/cjs/components/FileMenu/FileMenu.js +2 -2
  5. package/build/cjs/components/FileMenu/GetLinkDialog.js +2 -2
  6. package/build/cjs/components/FileMenu/RenameDialog.js +2 -2
  7. package/build/cjs/components/FileMenu/SaveAsDialog.js +2 -2
  8. package/build/cjs/components/OrgUnitDimension/OrgUnitDimension.js +223 -193
  9. package/build/cjs/components/OrgUnitDimension/styles/OrgUnitDimension.style.js +5 -2
  10. package/build/cjs/components/PeriodDimension/FixedPeriodSelect.js +2 -2
  11. package/build/cjs/components/TransferOption.js +2 -2
  12. package/build/cjs/index.js +22 -4
  13. package/build/cjs/locales/en/translations.json +14 -0
  14. package/build/cjs/modules/list.js +25 -0
  15. package/build/cjs/modules/ouIdHelper/index.js +7 -1
  16. package/build/cjs/modules/relativeItems/index.js +1 -1
  17. package/build/cjs/visualizations/util/__tests__/getFilterText.spec.js +1 -1
  18. package/build/cjs/visualizations/util/getFilterText.js +1 -9
  19. package/build/es/__demo__/OrgUnitDimension.stories.js +93 -0
  20. package/build/es/api/organisationUnits.js +93 -43
  21. package/build/es/components/FileMenu/DeleteDialog.js +1 -1
  22. package/build/es/components/FileMenu/FileMenu.js +1 -1
  23. package/build/es/components/FileMenu/GetLinkDialog.js +1 -1
  24. package/build/es/components/FileMenu/RenameDialog.js +1 -1
  25. package/build/es/components/FileMenu/SaveAsDialog.js +1 -1
  26. package/build/es/components/OrgUnitDimension/OrgUnitDimension.js +224 -196
  27. package/build/es/components/OrgUnitDimension/styles/OrgUnitDimension.style.js +3 -2
  28. package/build/es/components/PeriodDimension/FixedPeriodSelect.js +6 -6
  29. package/build/es/components/TransferOption.js +12 -12
  30. package/build/es/index.js +2 -2
  31. package/build/es/locales/en/translations.json +14 -0
  32. package/build/es/modules/list.js +13 -0
  33. package/build/es/modules/ouIdHelper/index.js +3 -0
  34. package/build/es/modules/relativeItems/index.js +2 -2
  35. package/build/es/visualizations/util/__tests__/getFilterText.spec.js +1 -1
  36. package/build/es/visualizations/util/getFilterText.js +2 -10
  37. package/package.json +3 -2
  38. package/CHANGELOG.md +0 -2763
  39. package/build/cjs/api/organisationUnits-dataEngine.js +0 -119
  40. package/build/cjs/components/OrgUnitDimension/__tests__/OrgUnitDimension.spec.js +0 -96
  41. package/build/es/api/organisationUnits-dataEngine.js +0 -96
  42. package/build/es/components/OrgUnitDimension/__tests__/OrgUnitDimension.spec.js +0 -86
@@ -3,15 +3,15 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = exports.defaultState = void 0;
6
+ exports.default = void 0;
7
7
 
8
8
  var _style = _interopRequireDefault(require("styled-jsx/style"));
9
9
 
10
- var _d2UiOrgUnitDialog = require("@dhis2/d2-ui-org-unit-dialog");
10
+ var _appRuntime = require("@dhis2/app-runtime");
11
11
 
12
12
  var _ui = require("@dhis2/ui");
13
13
 
14
- var _sortBy = _interopRequireDefault(require("lodash/sortBy"));
14
+ var _classnames = _interopRequireDefault(require("classnames"));
15
15
 
16
16
  var _propTypes = _interopRequireDefault(require("prop-types"));
17
17
 
@@ -19,6 +19,10 @@ var _react = _interopRequireWildcard(require("react"));
19
19
 
20
20
  var _organisationUnits = require("../../api/organisationUnits");
21
21
 
22
+ var _index = _interopRequireDefault(require("../../locales/index.js"));
23
+
24
+ var _list = require("../../modules/list");
25
+
22
26
  var _ouIdHelper = require("../../modules/ouIdHelper");
23
27
 
24
28
  var _predefinedDimensions = require("../../modules/predefinedDimensions");
@@ -31,213 +35,239 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
31
35
 
32
36
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
37
 
34
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
35
-
36
- const defaultState = {
37
- root: undefined,
38
- roots: undefined,
39
- // use "selected" property for cloning org units while user org unit(s) is (are) selected
40
- selected: [],
41
- ouLevels: [],
42
- ouGroups: [],
43
- showOrgUnitsTree: true
44
- };
45
- exports.defaultState = defaultState;
46
-
47
- class OrgUnitDimension extends _react.Component {
48
- constructor(props) {
49
- super(props);
50
-
51
- _defineProperty(this, "showOrgUnitsTree", () => {
52
- this.setState({
53
- showOrgUnitsTree: true
54
- });
55
- });
56
-
57
- _defineProperty(this, "hideOrgUnitsTree", () => {
58
- this.setState({
59
- showOrgUnitsTree: false
38
+ const DYNAMIC_ORG_UNITS = [_ouIdHelper.USER_ORG_UNIT, _ouIdHelper.USER_ORG_UNIT_CHILDREN, _ouIdHelper.USER_ORG_UNIT_GRANDCHILDREN];
39
+
40
+ const OrgUnitDimension = ({
41
+ roots,
42
+ selected,
43
+ onSelect
44
+ }) => {
45
+ const [ouLevels, setOuLevels] = (0, _react.useState)([]);
46
+ const [ouGroups, setOuGroups] = (0, _react.useState)([]);
47
+ const dataEngine = (0, _appRuntime.useDataEngine)();
48
+
49
+ const onSelectItems = selectedItem => {
50
+ const {
51
+ id,
52
+ checked,
53
+ displayName,
54
+ path
55
+ } = selectedItem;
56
+ let result = [...selected];
57
+
58
+ if (checked && DYNAMIC_ORG_UNITS.includes(id)) {
59
+ result = [...result.filter(item => DYNAMIC_ORG_UNITS.includes(item.id) || _ouIdHelper.ouIdHelper.hasLevelPrefix(item.id) || _ouIdHelper.ouIdHelper.hasGroupPrefix(item.id)), {
60
+ id,
61
+ displayName
62
+ }];
63
+ } else if (checked) {
64
+ result.push({
65
+ id,
66
+ path,
67
+ name: displayName
60
68
  });
61
- });
62
-
63
- _defineProperty(this, "getUserOrgUnitsFromIds", ids => {
64
- return _d2UiOrgUnitDialog.userOrgUnits.filter(ou => ids.includes(ou.id));
65
- });
66
-
67
- _defineProperty(this, "onLevelChange", event => {
68
- const levelIds = event.target.value.filter(id => !!id);
69
- this.props.onSelect({
70
- dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
71
- items: [...this.props.ouItems.filter(ou => !_ouIdHelper.ouIdHelper.hasLevelPrefix(ou.id)), ...levelIds.map(id => {
72
- const levelOu = this.state.ouLevels.find(ou => ou.id === id);
73
- return { ...levelOu,
74
- id: _ouIdHelper.ouIdHelper.addLevelPrefix(levelOu.id)
75
- };
76
- })]
77
- });
78
- });
79
-
80
- _defineProperty(this, "onGroupChange", event => {
81
- const groupIds = event.target.value.filter(id => !!id);
82
- this.props.onSelect({
83
- dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
84
- items: [...this.props.ouItems.filter(ou => !_ouIdHelper.ouIdHelper.hasGroupPrefix(ou.id)), ...groupIds.map(id => {
85
- const groupOu = this.state.ouGroups.find(ou => ou.id === id);
86
- return { ...groupOu,
87
- id: _ouIdHelper.ouIdHelper.addGroupPrefix(id)
88
- };
89
- })]
90
- });
91
- });
69
+ } else {
70
+ result = [...result.filter(item => item.id !== id)];
71
+ }
92
72
 
93
- _defineProperty(this, "onDeselectAllClick", () => this.props.onDeselect({
73
+ onSelect({
94
74
  dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
95
- itemIdsToRemove: this.props.ouItems.map(ou => ou.id)
96
- }));
97
-
98
- _defineProperty(this, "loadOrgUnitTree", (d2, displayNameProperty) => {
99
- (0, _organisationUnits.apiFetchOrganisationUnits)(d2, displayNameProperty).then(rootLevel => rootLevel.toArray()).then(roots => {
100
- this.setState({
101
- roots,
102
- root: roots[0]
103
- });
104
- });
75
+ items: result
105
76
  });
106
-
107
- _defineProperty(this, "loadOrgUnitGroups", (d2, displayNameProperty) => {
108
- (0, _organisationUnits.apiFetchOrganisationUnitGroups)(d2, displayNameProperty).then(organisationUnitGroups => this.setState({
109
- ouGroups: organisationUnitGroups
110
- }));
77
+ };
78
+
79
+ const clearSelection = () => onSelect({
80
+ dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
81
+ items: []
82
+ });
83
+
84
+ (0, _react.useEffect)(() => {
85
+ const doFetchOuLevels = async () => {
86
+ const result = await (0, _organisationUnits.apiFetchOrganisationUnitLevels)(dataEngine);
87
+ result.sort((a, b) => a.level > b.level ? 1 : -1);
88
+ setOuLevels(result);
89
+ };
90
+
91
+ const doFetchOuGroups = async () => {
92
+ const result = await (0, _organisationUnits.apiFetchOrganisationUnitGroups)(dataEngine);
93
+ setOuGroups(result);
94
+ };
95
+
96
+ doFetchOuLevels();
97
+ doFetchOuGroups();
98
+ }, [dataEngine]);
99
+
100
+ const onLevelChange = ids => {
101
+ const items = ids.map(id => ({
102
+ id: _ouIdHelper.ouIdHelper.addLevelPrefix(id),
103
+ name: ouLevels.find(level => level.id === id).displayName
104
+ }));
105
+ onSelect({
106
+ dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
107
+ items: [...selected.filter(ou => !_ouIdHelper.ouIdHelper.hasLevelPrefix(ou.id)), ...items]
111
108
  });
109
+ };
112
110
 
113
- _defineProperty(this, "loadOrgUnitLevels", d2 => {
114
- (0, _organisationUnits.apiFetchOrganisationUnitLevels)(d2).then(organisationUnitLevels => this.setState({
115
- ouLevels: (0, _sortBy.default)(organisationUnitLevels, ['level'])
116
- }));
111
+ const onGroupChange = ids => {
112
+ const items = ids.map(id => ({
113
+ id: _ouIdHelper.ouIdHelper.addGroupPrefix(id),
114
+ name: ouGroups.find(group => group.id === id).displayName
115
+ }));
116
+ onSelect({
117
+ dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
118
+ items: [...selected.filter(ou => !_ouIdHelper.ouIdHelper.hasGroupPrefix(ou.id)), ...items]
117
119
  });
120
+ };
121
+
122
+ const getSummary = () => {
123
+ let summary;
124
+
125
+ if (selected.length) {
126
+ const numberOfOrgUnits = selected.filter(item => !DYNAMIC_ORG_UNITS.includes(item.id) && !_ouIdHelper.ouIdHelper.hasLevelPrefix(item.id) && !_ouIdHelper.ouIdHelper.hasGroupPrefix(item.id)).length;
127
+ const numberOfLevels = selected.filter(item => _ouIdHelper.ouIdHelper.hasLevelPrefix(item.id)).length;
128
+ const numberOfGroups = selected.filter(item => _ouIdHelper.ouIdHelper.hasGroupPrefix(item.id)).length;
129
+ const userOrgUnits = selected.filter(item => DYNAMIC_ORG_UNITS.includes(item.id));
130
+ const parts = [];
131
+
132
+ if (numberOfOrgUnits) {
133
+ parts.push(_index.default.t('{{count}} org units', {
134
+ count: numberOfOrgUnits,
135
+ defaultValue: '{{count}} org unit',
136
+ defaultValue_plural: '{{count}} org units'
137
+ }));
138
+ }
118
139
 
119
- _defineProperty(this, "handleOrgUnitClick", (event, orgUnit) => {
120
- const selected = this.props.ouItems;
121
-
122
- if (selected.some(ou => ou.path === orgUnit.path)) {
123
- this.props.onDeselect({
124
- dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
125
- itemIdsToRemove: [orgUnit.id]
126
- });
127
- } else {
128
- this.props.onSelect({
129
- dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
130
- items: [...selected, { ...orgUnit,
131
- name: orgUnit.name || orgUnit.displayName
132
- }]
133
- });
140
+ if (numberOfLevels) {
141
+ parts.push(_index.default.t('{{count}} levels', {
142
+ count: numberOfLevels,
143
+ defaultValue: '{{count}} level',
144
+ defaultValue_plural: '{{count}} levels'
145
+ }));
134
146
  }
135
- });
136
147
 
137
- _defineProperty(this, "handleUserOrgUnitClick", (event, checked) => {
138
- if (checked) {
139
- if (!this.state.selected.length) {
140
- this.setState({
141
- selected: this.props.ouItems.slice()
142
- });
143
- }
144
-
145
- this.props.onSelect({
146
- dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
147
- items: [...this.props.ouItems.filter(ou => this.userOrgUnitIds.includes(ou.id)), _d2UiOrgUnitDialog.userOrgUnits.find(ou => ou.id === event.target.name)]
148
- });
149
- } else {
150
- if (this.props.ouItems.length === 1 && this.state.selected.length > 0) {
151
- this.props.onSelect({
152
- dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
153
- items: this.state.selected
154
- });
155
- } else {
156
- this.props.onDeselect({
157
- dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
158
- itemIdsToRemove: [event.target.name]
159
- });
160
- }
148
+ if (numberOfGroups) {
149
+ parts.push(_index.default.t('{{count}} groups', {
150
+ count: numberOfGroups,
151
+ defaultValue: '{{count}} group',
152
+ defaultValue_plural: '{{count}} groups'
153
+ }));
161
154
  }
162
- });
163
155
 
164
- _defineProperty(this, "handleMultipleOrgUnitsSelect", orgUnits => {
165
- const selected = this.props.ouItems;
166
- this.props.onSelect({
167
- dimensionId: _predefinedDimensions.DIMENSION_ID_ORGUNIT,
168
- items: [...selected, ...orgUnits.reduce((obj, ou) => {
169
- // avoid duplicates when clicking "Select children" multiple times
170
- if (!selected.find(i => i.id === ou.id)) {
171
- obj.push({ ...ou,
172
- name: ou.name || ou.displayName
173
- });
174
- }
175
-
176
- return obj;
177
- }, [])]
156
+ userOrgUnits.forEach(orgUnit => {
157
+ parts.push(orgUnit.name || orgUnit.displayName);
178
158
  });
179
- });
180
-
181
- _defineProperty(this, "render", () => {
182
- const ids = this.props.ouItems.map(ou => ou.id);
183
- const selected = this.props.ouItems.filter(ou => !this.userOrgUnitIds.includes(ou.id) && !_ouIdHelper.ouIdHelper.hasLevelPrefix(ou.id) && !_ouIdHelper.ouIdHelper.hasGroupPrefix(ou.id));
184
- const userOrgUnits = this.getUserOrgUnitsFromIds(ids);
185
- const level = ids.filter(_ouIdHelper.ouIdHelper.hasLevelPrefix).map(_ouIdHelper.ouIdHelper.removePrefix);
186
- const group = ids.filter(_ouIdHelper.ouIdHelper.hasGroupPrefix).map(_ouIdHelper.ouIdHelper.removePrefix);
187
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, this.state.root && this.state.showOrgUnitsTree && /*#__PURE__*/_react.default.createElement(_d2UiOrgUnitDialog.OrgUnitSelector, {
188
- d2: this.props.d2,
189
- root: this.state.root,
190
- roots: this.state.roots,
191
- selected: selected,
192
- userOrgUnits: userOrgUnits,
193
- level: level,
194
- group: group,
195
- levelOptions: this.state.ouLevels,
196
- groupOptions: this.state.ouGroups,
197
- onLevelChange: this.onLevelChange,
198
- onGroupChange: this.onGroupChange,
199
- onDeselectAllClick: this.onDeselectAllClick,
200
- handleUserOrgUnitClick: this.handleUserOrgUnitClick,
201
- handleOrgUnitClick: this.handleOrgUnitClick,
202
- handleMultipleOrgUnitsSelect: this.handleMultipleOrgUnitsSelect,
203
- checkboxColor: "secondary",
204
- deselectAllTooltipFontColor: _ui.colors.grey900,
205
- deselectAllTooltipBackgroundColor: _ui.colors.grey300,
206
- displayNameProperty: this.props.displayNameProperty,
207
- isUserDataViewFallback: true
208
- }), !this.state.root && /*#__PURE__*/_react.default.createElement("div", {
209
- className: "jsx-".concat(_OrgUnitDimension.default.__hash) + " " + "loader"
210
- }, /*#__PURE__*/_react.default.createElement(_ui.CircularLoader, null)), /*#__PURE__*/_react.default.createElement(_style.default, {
211
- id: _OrgUnitDimension.default.__hash
212
- }, _OrgUnitDimension.default));
213
- });
214
-
215
- this.state = defaultState;
216
- this.userOrgUnitIds = _d2UiOrgUnitDialog.userOrgUnits.map(ou => ou.id);
217
- this.loadOrgUnitTree(props.d2, props.displayNameProperty);
218
- this.loadOrgUnitGroups(props.d2, props.displayNameProperty);
219
- this.loadOrgUnitLevels(props.d2);
220
- }
221
-
222
- componentDidUpdate(prevProps) {
223
- const previousId = prevProps.current ? prevProps.current.id : null;
224
- const currentId = this.props.current ? this.props.current.id : null; // remount org units selector component to ensure
225
- // only selected org units are expanded
226
-
227
- if (previousId !== currentId) {
228
- this.hideOrgUnitsTree();
229
- setTimeout(this.showOrgUnitsTree, 0);
159
+ summary = _index.default.t('Selected: {{commaSeparatedListOfOrganisationUnits}}', {
160
+ keySeparator: '>',
161
+ nsSeparator: '|',
162
+ commaSeparatedListOfOrganisationUnits: (0, _list.formatList)(parts)
163
+ });
164
+ } else {
165
+ summary = _index.default.t('Nothing selected');
230
166
  }
231
- }
232
167
 
233
- }
168
+ return summary;
169
+ };
170
+
171
+ return /*#__PURE__*/_react.default.createElement("div", {
172
+ className: "jsx-".concat(_OrgUnitDimension.default.__hash) + " " + "container"
173
+ }, /*#__PURE__*/_react.default.createElement("div", {
174
+ className: "jsx-".concat(_OrgUnitDimension.default.__hash) + " " + "userOrgUnitsWrapper"
175
+ }, /*#__PURE__*/_react.default.createElement(_ui.Checkbox, {
176
+ label: _index.default.t('User organisation unit'),
177
+ checked: selected.some(item => item.id === _ouIdHelper.USER_ORG_UNIT),
178
+ onChange: ({
179
+ checked
180
+ }) => onSelectItems({
181
+ id: _ouIdHelper.USER_ORG_UNIT,
182
+ checked,
183
+ displayName: _index.default.t('User organisation unit')
184
+ }),
185
+ dense: true
186
+ }), /*#__PURE__*/_react.default.createElement(_ui.Checkbox, {
187
+ label: _index.default.t('User sub-units'),
188
+ checked: selected.some(item => item.id === _ouIdHelper.USER_ORG_UNIT_CHILDREN),
189
+ onChange: ({
190
+ checked
191
+ }) => onSelectItems({
192
+ id: _ouIdHelper.USER_ORG_UNIT_CHILDREN,
193
+ checked,
194
+ displayName: _index.default.t('User sub-units')
195
+ }),
196
+ dense: true
197
+ }), /*#__PURE__*/_react.default.createElement(_ui.Checkbox, {
198
+ label: _index.default.t('User sub-x2-units'),
199
+ checked: selected.some(item => item.id === _ouIdHelper.USER_ORG_UNIT_GRANDCHILDREN),
200
+ onChange: ({
201
+ checked
202
+ }) => onSelectItems({
203
+ id: _ouIdHelper.USER_ORG_UNIT_GRANDCHILDREN,
204
+ checked,
205
+ displayName: _index.default.t('User sub-x2-units')
206
+ }),
207
+ dense: true
208
+ })), /*#__PURE__*/_react.default.createElement("div", {
209
+ className: "jsx-".concat(_OrgUnitDimension.default.__hash) + " " + ((0, _classnames.default)('orgUnitTreeWrapper', {
210
+ disabled: selected.some(item => DYNAMIC_ORG_UNITS.includes(item.id))
211
+ }) || "")
212
+ }, /*#__PURE__*/_react.default.createElement(_ui.OrganisationUnitTree, {
213
+ roots: roots,
214
+ initiallyExpanded: [...(roots.length === 1 ? ["/".concat(roots[0])] : []), ...selected.filter(item => !DYNAMIC_ORG_UNITS.includes(item.id) && !_ouIdHelper.ouIdHelper.hasLevelPrefix(item.id) && !_ouIdHelper.ouIdHelper.hasGroupPrefix(item.id)).map(item => item.path.substring(0, item.path.lastIndexOf('/'))).filter(path => path)],
215
+ selected: selected.filter(item => !DYNAMIC_ORG_UNITS.includes(item.id) && !_ouIdHelper.ouIdHelper.hasLevelPrefix(item.id) && !_ouIdHelper.ouIdHelper.hasGroupPrefix(item.id)).map(item => item.path),
216
+ onChange: onSelectItems,
217
+ dataTest: 'org-unit-tree'
218
+ })), /*#__PURE__*/_react.default.createElement("div", {
219
+ className: "jsx-".concat(_OrgUnitDimension.default.__hash) + " " + "selectsWrapper"
220
+ }, /*#__PURE__*/_react.default.createElement(_ui.MultiSelect, {
221
+ selected: ouLevels.length ? selected.filter(item => _ouIdHelper.ouIdHelper.hasLevelPrefix(item.id)).map(item => _ouIdHelper.ouIdHelper.removePrefix(item.id)) : [],
222
+ onChange: ({
223
+ selected
224
+ }) => onLevelChange(selected),
225
+ placeholder: _index.default.t('Select a level'),
226
+ loading: !ouLevels.length,
227
+ dense: true,
228
+ dataTest: 'org-unit-level-select'
229
+ }, ouLevels.map(level => /*#__PURE__*/_react.default.createElement(_ui.MultiSelectOption, {
230
+ key: level.id,
231
+ value: level.id,
232
+ label: level.displayName,
233
+ dataTest: "org-unit-level-select-option-".concat(level.id)
234
+ }))), /*#__PURE__*/_react.default.createElement(_ui.MultiSelect, {
235
+ selected: ouGroups.length ? selected.filter(item => _ouIdHelper.ouIdHelper.hasGroupPrefix(item.id)).map(item => _ouIdHelper.ouIdHelper.removePrefix(item.id)) : [],
236
+ onChange: ({
237
+ selected
238
+ }) => onGroupChange(selected),
239
+ placeholder: _index.default.t('Select a group'),
240
+ loading: !ouGroups.length,
241
+ dense: true,
242
+ dataTest: 'org-unit-group-select'
243
+ }, ouGroups.map(group => /*#__PURE__*/_react.default.createElement(_ui.MultiSelectOption, {
244
+ key: group.id,
245
+ value: group.id,
246
+ label: group.displayName,
247
+ dataTest: "org-unit-group-select-option-".concat(group.id)
248
+ })))), /*#__PURE__*/_react.default.createElement("div", {
249
+ className: "jsx-".concat(_OrgUnitDimension.default.__hash) + " " + "summaryWrapper"
250
+ }, /*#__PURE__*/_react.default.createElement("span", {
251
+ className: "jsx-".concat(_OrgUnitDimension.default.__hash) + " " + "summaryText"
252
+ }, getSummary()), /*#__PURE__*/_react.default.createElement("div", {
253
+ className: "jsx-".concat(_OrgUnitDimension.default.__hash) + " " + "deselectButton"
254
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
255
+ secondary: true,
256
+ small: true,
257
+ onClick: clearSelection,
258
+ disabled: !selected.length
259
+ }, _index.default.t('Deselect all')))), /*#__PURE__*/_react.default.createElement(_style.default, {
260
+ id: _OrgUnitDimension.default.__hash
261
+ }, _OrgUnitDimension.default));
262
+ };
234
263
 
235
264
  OrgUnitDimension.propTypes = {
236
- current: _propTypes.default.object,
237
- d2: _propTypes.default.object,
238
- displayNameProperty: _propTypes.default.string,
239
- ouItems: _propTypes.default.array,
240
- onDeselect: _propTypes.default.func,
265
+ roots: _propTypes.default.arrayOf(_propTypes.default.string),
266
+ selected: _propTypes.default.arrayOf(_propTypes.default.shape({
267
+ id: _propTypes.default.string.isRequired,
268
+ name: _propTypes.default.string.isRequired,
269
+ path: _propTypes.default.string
270
+ })),
241
271
  onSelect: _propTypes.default.func
242
272
  };
243
273
  var _default = OrgUnitDimension;
@@ -4,7 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- const _defaultExport = [".loader.jsx-3308394077{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-height:100px;}"];
8
- _defaultExport.__hash = "3308394077";
7
+
8
+ var _ui = require("@dhis2/ui");
9
+
10
+ const _defaultExport = [".container.jsx-3879278432{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}", ".orgUnitTreeWrapper.jsx-3879278432{height:382px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;overflow:auto;}", ".orgUnitTreeWrapper.jsx-3879278432>*{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}", ".disabled.jsx-3879278432{cursor:not-allowed;opacity:0.5;}", ".disabled.jsx-3879278432>*{pointer-events:none;}", ".userOrgUnitsWrapper.jsx-3879278432{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background:".concat(_ui.colors.grey200, ";padding:").concat(_ui.spacers.dp8, " ").concat(_ui.spacers.dp8, " ").concat(_ui.spacers.dp8, " ").concat(_ui.spacers.dp24, ";margin-bottom:").concat(_ui.spacers.dp12, ";}"), ".userOrgUnitsWrapper.jsx-3879278432>*{margin-right:".concat(_ui.spacers.dp48, ";}"), ".selectsWrapper.jsx-3879278432{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;gap:".concat(_ui.spacers.dp8, ";margin-top:").concat(_ui.spacers.dp12, ";}"), ".selectsWrapper.jsx-3879278432>*{width:50%;}", ".summaryWrapper.jsx-3879278432{margin-top:".concat(_ui.spacers.dp8, ";}"), ".summaryText.jsx-3879278432{font-size:14px;line-height:18px;color:".concat(_ui.colors.grey700, ";}"), ".deselectButton.jsx-3879278432{display:inline-block;margin-left:".concat(_ui.spacers.dp8, ";}")];
11
+ _defaultExport.__hash = "3879278432";
9
12
  var _default = _defaultExport;
10
13
  exports.default = _default;
@@ -7,10 +7,10 @@ exports.default = void 0;
7
7
 
8
8
  var _style = _interopRequireDefault(require("styled-jsx/style"));
9
9
 
10
- var _propTypes = _interopRequireDefault(require("@dhis2/prop-types"));
11
-
12
10
  var _ui = require("@dhis2/ui");
13
11
 
12
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
+
14
14
  var _react = _interopRequireWildcard(require("react"));
15
15
 
16
16
  var _index = _interopRequireDefault(require("../../locales/index.js"));
@@ -7,12 +7,12 @@ exports.TransferOption = void 0;
7
7
 
8
8
  var _style = _interopRequireDefault(require("styled-jsx/style"));
9
9
 
10
- var _propTypes = _interopRequireDefault(require("@dhis2/prop-types"));
11
-
12
10
  var _ui = require("@dhis2/ui");
13
11
 
14
12
  var _classnames = _interopRequireDefault(require("classnames"));
15
13
 
14
+ var _propTypes = _interopRequireDefault(require("prop-types"));
15
+
16
16
  var _react = _interopRequireDefault(require("react"));
17
17
 
18
18
  var _TransferOption = _interopRequireDefault(require("./styles/TransferOption.style"));
@@ -114,19 +114,19 @@ Object.defineProperty(exports, "apiFetchRecommendedIds", {
114
114
  Object.defineProperty(exports, "apiFetchOrganisationUnitLevels", {
115
115
  enumerable: true,
116
116
  get: function () {
117
- return _organisationUnitsDataEngine.apiFetchOrganisationUnitLevels;
117
+ return _organisationUnits.apiFetchOrganisationUnitLevels;
118
118
  }
119
119
  });
120
120
  Object.defineProperty(exports, "apiFetchOrganisationUnitRoots", {
121
121
  enumerable: true,
122
122
  get: function () {
123
- return _organisationUnitsDataEngine.apiFetchOrganisationUnitRoots;
123
+ return _organisationUnits.apiFetchOrganisationUnitRoots;
124
124
  }
125
125
  });
126
126
  Object.defineProperty(exports, "apiFetchOrganisationUnit", {
127
127
  enumerable: true,
128
128
  get: function () {
129
- return _organisationUnitsDataEngine.apiFetchOrganisationUnit;
129
+ return _organisationUnits.apiFetchOrganisationUnit;
130
130
  }
131
131
  });
132
132
  Object.defineProperty(exports, "getAxisName", {
@@ -219,6 +219,24 @@ Object.defineProperty(exports, "ouIdHelper", {
219
219
  return _ouIdHelper.ouIdHelper;
220
220
  }
221
221
  });
222
+ Object.defineProperty(exports, "USER_ORG_UNIT", {
223
+ enumerable: true,
224
+ get: function () {
225
+ return _ouIdHelper.USER_ORG_UNIT;
226
+ }
227
+ });
228
+ Object.defineProperty(exports, "USER_ORG_UNIT_CHILDREN", {
229
+ enumerable: true,
230
+ get: function () {
231
+ return _ouIdHelper.USER_ORG_UNIT_CHILDREN;
232
+ }
233
+ });
234
+ Object.defineProperty(exports, "USER_ORG_UNIT_GRANDCHILDREN", {
235
+ enumerable: true,
236
+ get: function () {
237
+ return _ouIdHelper.USER_ORG_UNIT_GRANDCHILDREN;
238
+ }
239
+ });
222
240
  Object.defineProperty(exports, "convertOuLevelsToUids", {
223
241
  enumerable: true,
224
242
  get: function () {
@@ -1154,7 +1172,7 @@ var _Analytics = _interopRequireDefault(require("./api/analytics/Analytics"));
1154
1172
 
1155
1173
  var _dimensions = require("./api/dimensions");
1156
1174
 
1157
- var _organisationUnitsDataEngine = require("./api/organisationUnits-dataEngine");
1175
+ var _organisationUnits = require("./api/organisationUnits");
1158
1176
 
1159
1177
  var _axis = require("./modules/axis");
1160
1178
 
@@ -118,6 +118,20 @@
118
118
  "Options": "Options",
119
119
  "Hide": "Hide",
120
120
  "Update": "Update",
121
+ "{{count}} org units": "{{count}} org unit",
122
+ "{{count}} org units_plural": "{{count}} org units",
123
+ "{{count}} levels": "{{count}} level",
124
+ "{{count}} levels_plural": "{{count}} levels",
125
+ "{{count}} groups": "{{count}} group",
126
+ "{{count}} groups_plural": "{{count}} groups",
127
+ "Selected: {{commaSeparatedListOfOrganisationUnits}}": "Selected: {{commaSeparatedListOfOrganisationUnits}}",
128
+ "Nothing selected": "Nothing selected",
129
+ "User organisation unit": "User organisation unit",
130
+ "User sub-units": "User sub-units",
131
+ "User sub-x2-units": "User sub-x2-units",
132
+ "Select a level": "Select a level",
133
+ "Select a group": "Select a group",
134
+ "Deselect all": "Deselect all",
121
135
  "Period type": "Period type",
122
136
  "Year": "Year",
123
137
  "Select year": "Select year",
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.formatList = void 0;
7
+
8
+ var _index = _interopRequireDefault(require("../locales/index.js"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ const formatList = items => {
13
+ // Wrap Intl.ListFormat in try/catch as DHIS2 locales are not always ISO 639 compliant
14
+ try {
15
+ const formatter = new Intl.ListFormat(_index.default.language, {
16
+ style: 'long',
17
+ type: 'conjunction'
18
+ });
19
+ return formatter.format(items);
20
+ } catch (error) {
21
+ return items.join(', ');
22
+ }
23
+ };
24
+
25
+ exports.formatList = formatList;
@@ -3,9 +3,15 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ouIdHelper = void 0;
6
+ exports.ouIdHelper = exports.USER_ORG_UNIT_GRANDCHILDREN = exports.USER_ORG_UNIT_CHILDREN = exports.USER_ORG_UNIT = void 0;
7
7
  const LEVEL_ID_PREFIX = 'LEVEL';
8
8
  const GROUP_ID_PREFIX = 'OU_GROUP';
9
+ const USER_ORG_UNIT = 'USER_ORGUNIT';
10
+ exports.USER_ORG_UNIT = USER_ORG_UNIT;
11
+ const USER_ORG_UNIT_CHILDREN = 'USER_ORGUNIT_CHILDREN';
12
+ exports.USER_ORG_UNIT_CHILDREN = USER_ORG_UNIT_CHILDREN;
13
+ const USER_ORG_UNIT_GRANDCHILDREN = 'USER_ORGUNIT_GRANDCHILDREN';
14
+ exports.USER_ORG_UNIT_GRANDCHILDREN = USER_ORG_UNIT_GRANDCHILDREN;
9
15
 
10
16
  const hasGroupPrefix = id => id.substr(0, GROUP_ID_PREFIX.length) === GROUP_ID_PREFIX;
11
17
 
@@ -11,6 +11,6 @@ var _ouIdHelper = require("../ouIdHelper");
11
11
 
12
12
  var _predefinedDimensions = require("../predefinedDimensions");
13
13
 
14
- const hasRelativeItems = (dimension, itemIds = []) => dimension === _predefinedDimensions.DIMENSION_ID_ASSIGNED_CATEGORIES || dimension === _predefinedDimensions.DIMENSION_ID_ORGUNIT && Array.isArray(itemIds) && itemIds.some(id => _ouIdHelper.ouIdHelper.hasLevelPrefix(id) || _ouIdHelper.ouIdHelper.hasGroupPrefix(id) || ['USER_ORGUNIT', 'USER_ORGUNIT_CHILDREN', 'USER_ORGUNIT_GRAND_CHILDREN'].includes(id)) || dimension === _predefinedDimensions.DIMENSION_ID_PERIOD && Array.isArray(itemIds) && itemIds.some(id => (0, _relativePeriods.getRelativePeriodIds)().includes(id));
14
+ const hasRelativeItems = (dimension, itemIds = []) => dimension === _predefinedDimensions.DIMENSION_ID_ASSIGNED_CATEGORIES || dimension === _predefinedDimensions.DIMENSION_ID_ORGUNIT && Array.isArray(itemIds) && itemIds.some(id => _ouIdHelper.ouIdHelper.hasLevelPrefix(id) || _ouIdHelper.ouIdHelper.hasGroupPrefix(id) || [_ouIdHelper.USER_ORG_UNIT, _ouIdHelper.USER_ORG_UNIT_CHILDREN, _ouIdHelper.USER_ORG_UNIT_GRANDCHILDREN].includes(id)) || dimension === _predefinedDimensions.DIMENSION_ID_PERIOD && Array.isArray(itemIds) && itemIds.some(id => (0, _relativePeriods.getRelativePeriodIds)().includes(id));
15
15
 
16
16
  exports.hasRelativeItems = hasRelativeItems;
@@ -133,7 +133,7 @@ describe('getFilterText', () => {
133
133
  name: '02 of 2018',
134
134
  uid: '_201802_'
135
135
  };
136
- expect((0, _getFilterText.default)(filters, metaData)).toEqual('Clinics, Hospital - Last 2 months');
136
+ expect((0, _getFilterText.default)(filters, metaData)).toEqual('Clinics, Hospital - 01 of 2018, 02 of 2018');
137
137
  });
138
138
  });
139
139
  });