@dhis2/analytics 29.3.3 → 29.4.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/api/analytics/AnalyticsRequest.js +4 -4
- package/build/cjs/components/DataDimension/Calculation/CalculationModal.js +6 -3
- package/build/cjs/components/DataDimension/Calculation/DataElementSelector.js +8 -2
- package/build/cjs/components/DataDimension/Calculation/DndContext.js +4 -4
- package/build/cjs/components/DataDimension/Calculation/styles/DataElementSelector.style.js +2 -2
- package/build/cjs/components/DataDimension/DataDimension.js +14 -3
- package/build/cjs/components/DataDimension/Info/DataElementOperandInfo.js +1 -1
- package/build/cjs/components/DataDimension/ItemOptionsSelector/ItemOptionsSelector.js +9 -4
- package/build/cjs/components/DataDimension/ItemSelector/ItemSelector.js +13 -5
- package/build/cjs/components/RichText/Editor/Editor.js +2 -2
- package/build/cjs/locales/index.js +86 -41
- package/build/cjs/modules/legends.js +1 -1
- package/build/cjs/modules/pivotTable/applyLegendSet.js +4 -4
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/index.js +3 -3
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/index.js +2 -2
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/series/index.js +1 -1
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +3 -3
- package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/index.js +3 -3
- package/build/cjs/visualizations/config/generators/highcharts/index.js +2 -2
- package/build/cjs/visualizations/store/adapters/dhis_highcharts/yearOnYear.js +1 -1
- package/build/es/api/analytics/AnalyticsRequest.js +4 -4
- package/build/es/components/DataDimension/Calculation/CalculationModal.js +6 -3
- package/build/es/components/DataDimension/Calculation/DataElementSelector.js +8 -2
- package/build/es/components/DataDimension/Calculation/DndContext.js +4 -4
- package/build/es/components/DataDimension/Calculation/styles/DataElementSelector.style.js +2 -2
- package/build/es/components/DataDimension/DataDimension.js +14 -3
- package/build/es/components/DataDimension/Info/DataElementOperandInfo.js +1 -1
- package/build/es/components/DataDimension/ItemOptionsSelector/ItemOptionsSelector.js +9 -4
- package/build/es/components/DataDimension/ItemSelector/ItemSelector.js +13 -5
- package/build/es/components/RichText/Editor/Editor.js +2 -2
- package/build/es/locales/index.js +86 -41
- package/build/es/modules/legends.js +1 -1
- package/build/es/modules/pivotTable/applyLegendSet.js +4 -4
- package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/index.js +3 -3
- package/build/es/visualizations/config/adapters/dhis_highcharts/index.js +2 -2
- package/build/es/visualizations/config/adapters/dhis_highcharts/series/index.js +1 -1
- package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +3 -3
- package/build/es/visualizations/config/adapters/dhis_highcharts/title/index.js +3 -3
- package/build/es/visualizations/config/generators/highcharts/index.js +2 -2
- package/build/es/visualizations/store/adapters/dhis_highcharts/yearOnYear.js +1 -1
- package/package.json +2 -2
|
@@ -47,7 +47,7 @@ class AnalyticsRequest extends AnalyticsRequestDimensionsMixin(AnalyticsRequestF
|
|
|
47
47
|
const columns = visualization.columns || [];
|
|
48
48
|
const rows = visualization.rows || [];
|
|
49
49
|
columns.concat(rows).forEach(d => {
|
|
50
|
-
var _d$legendSet, _d$programStage, _d$repetition
|
|
50
|
+
var _d$legendSet, _d$programStage, _d$repetition;
|
|
51
51
|
let dimension = d.dimension;
|
|
52
52
|
if ((_d$legendSet = d.legendSet) !== null && _d$legendSet !== void 0 && _d$legendSet.id) {
|
|
53
53
|
dimension += `-${d.legendSet.id}`;
|
|
@@ -56,7 +56,7 @@ class AnalyticsRequest extends AnalyticsRequestDimensionsMixin(AnalyticsRequestF
|
|
|
56
56
|
dimension += `:${d.filter}`;
|
|
57
57
|
}
|
|
58
58
|
const programStageId = (_d$programStage = d.programStage) === null || _d$programStage === void 0 ? void 0 : _d$programStage.id;
|
|
59
|
-
if ((_d$repetition = d.repetition) !== null && _d$repetition !== void 0 && (_d$repetition
|
|
59
|
+
if ((_d$repetition = d.repetition) !== null && _d$repetition !== void 0 && (_d$repetition = _d$repetition.indexes) !== null && _d$repetition !== void 0 && _d$repetition.length) {
|
|
60
60
|
d.repetition.indexes.forEach(index => {
|
|
61
61
|
var _d$program;
|
|
62
62
|
request = request.addDimension(formatDimension({
|
|
@@ -87,13 +87,13 @@ class AnalyticsRequest extends AnalyticsRequestDimensionsMixin(AnalyticsRequestF
|
|
|
87
87
|
var _f$items;
|
|
88
88
|
request = request.addDimension(f.dimension, (_f$items = f.items) === null || _f$items === void 0 ? void 0 : _f$items.map(item => item.id));
|
|
89
89
|
} else {
|
|
90
|
-
var _f$programStage, _f$repetition
|
|
90
|
+
var _f$programStage, _f$repetition;
|
|
91
91
|
let filterString = f.dimension;
|
|
92
92
|
if (f.filter) {
|
|
93
93
|
filterString += `:${f.filter}`;
|
|
94
94
|
}
|
|
95
95
|
const programStageId = (_f$programStage = f.programStage) === null || _f$programStage === void 0 ? void 0 : _f$programStage.id;
|
|
96
|
-
if ((_f$repetition = f.repetition) !== null && _f$repetition !== void 0 && (_f$repetition
|
|
96
|
+
if ((_f$repetition = f.repetition) !== null && _f$repetition !== void 0 && (_f$repetition = _f$repetition.indexes) !== null && _f$repetition !== void 0 && _f$repetition.length) {
|
|
97
97
|
f.repetition.indexes.forEach(index => {
|
|
98
98
|
var _f$program;
|
|
99
99
|
request = request.addFilter(formatDimension({
|
|
@@ -21,7 +21,8 @@ const CalculationModal = ({
|
|
|
21
21
|
onSave,
|
|
22
22
|
onClose,
|
|
23
23
|
onDelete,
|
|
24
|
-
displayNameProp
|
|
24
|
+
displayNameProp,
|
|
25
|
+
height
|
|
25
26
|
}) => {
|
|
26
27
|
const {
|
|
27
28
|
show: showError
|
|
@@ -269,7 +270,8 @@ const CalculationModal = ({
|
|
|
269
270
|
className: `jsx-${styles.__hash}` + " " + "left-section"
|
|
270
271
|
}, /*#__PURE__*/React.createElement(DataElementSelector, {
|
|
271
272
|
displayNameProp: displayNameProp,
|
|
272
|
-
onDoubleClick: addItem
|
|
273
|
+
onDoubleClick: addItem,
|
|
274
|
+
height: height
|
|
273
275
|
}), /*#__PURE__*/React.createElement(MathOperatorSelector, {
|
|
274
276
|
onDoubleClick: addItem
|
|
275
277
|
})), /*#__PURE__*/React.createElement("div", {
|
|
@@ -370,6 +372,7 @@ CalculationModal.propTypes = {
|
|
|
370
372
|
expression: PropTypes.string,
|
|
371
373
|
id: PropTypes.string,
|
|
372
374
|
name: PropTypes.string
|
|
373
|
-
})
|
|
375
|
+
}),
|
|
376
|
+
height: PropTypes.string
|
|
374
377
|
};
|
|
375
378
|
export default CalculationModal;
|
|
@@ -11,6 +11,7 @@ import i18n from '../../../locales/index.js';
|
|
|
11
11
|
import { TOTALS, DETAIL, DIMENSION_TYPE_ALL, DIMENSION_TYPE_DATA_ELEMENT, dataTypeMap as dataTypes } from '../../../modules/dataTypes.js';
|
|
12
12
|
import DataElementOption from './DataElementOption.js';
|
|
13
13
|
import styles from './styles/DataElementSelector.style.js';
|
|
14
|
+
const SCROLLBOX_HEIGHT = '337px';
|
|
14
15
|
const getOptions = () => ({
|
|
15
16
|
[TOTALS]: i18n.t('Totals only'),
|
|
16
17
|
[DETAIL]: i18n.t('Details only')
|
|
@@ -89,7 +90,8 @@ DisaggregationSelector.propTypes = {
|
|
|
89
90
|
};
|
|
90
91
|
const DataElementSelector = ({
|
|
91
92
|
displayNameProp,
|
|
92
|
-
onDoubleClick
|
|
93
|
+
onDoubleClick,
|
|
94
|
+
height = SCROLLBOX_HEIGHT
|
|
93
95
|
}) => {
|
|
94
96
|
const dataEngine = useDataEngine();
|
|
95
97
|
const [searchTerm, setSearchTerm] = useState('');
|
|
@@ -215,6 +217,9 @@ const DataElementSelector = ({
|
|
|
215
217
|
className: `jsx-${styles.__hash}` + " " + "dimension-list-overlay"
|
|
216
218
|
}, /*#__PURE__*/React.createElement(CircularLoader, null)), /*#__PURE__*/React.createElement("div", {
|
|
217
219
|
ref: rootRef,
|
|
220
|
+
style: {
|
|
221
|
+
height
|
|
222
|
+
},
|
|
218
223
|
onScroll: () => {
|
|
219
224
|
if (isSorting) {
|
|
220
225
|
rootRef.current.scrollTo({
|
|
@@ -251,6 +256,7 @@ const DataElementSelector = ({
|
|
|
251
256
|
};
|
|
252
257
|
DataElementSelector.propTypes = {
|
|
253
258
|
displayNameProp: PropTypes.string.isRequired,
|
|
254
|
-
onDoubleClick: PropTypes.func.isRequired
|
|
259
|
+
onDoubleClick: PropTypes.func.isRequired,
|
|
260
|
+
height: PropTypes.string
|
|
255
261
|
};
|
|
256
262
|
export default DataElementSelector;
|
|
@@ -119,8 +119,8 @@ const OuterDndContext = ({
|
|
|
119
119
|
active,
|
|
120
120
|
over
|
|
121
121
|
}) => {
|
|
122
|
-
var _over$data, _over$data$current, _over$data$
|
|
123
|
-
if (!(over !== null && over !== void 0 && over.id) || (over === null || over === void 0
|
|
122
|
+
var _over$data, _over$data$current, _over$data$current2;
|
|
123
|
+
if (!(over !== null && over !== void 0 && over.id) || (over === null || over === void 0 || (_over$data = over.data) === null || _over$data === void 0 || (_over$data = _over$data.current) === null || _over$data === void 0 || (_over$data = _over$data.sortable) === null || _over$data === void 0 ? void 0 : _over$data.containerId) === OPTIONS_PANEL || !active.data.current) {
|
|
124
124
|
// dropped over non-droppable or over options panel
|
|
125
125
|
handleDragCancel();
|
|
126
126
|
return;
|
|
@@ -136,8 +136,8 @@ const OuterDndContext = ({
|
|
|
136
136
|
}
|
|
137
137
|
};
|
|
138
138
|
const destination = {
|
|
139
|
-
containerId: ((_over$data$
|
|
140
|
-
index: (_over$data$
|
|
139
|
+
containerId: ((_over$data$current = over.data.current) === null || _over$data$current === void 0 ? void 0 : _over$data$current.sortable.containerId) || over.id,
|
|
140
|
+
index: (_over$data$current2 = over.data.current) === null || _over$data$current2 === void 0 ? void 0 : _over$data$current2.sortable.index
|
|
141
141
|
};
|
|
142
142
|
onDragEnd({
|
|
143
143
|
item,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { colors, spacers } from '@dhis2/ui';
|
|
2
|
-
const _defaultExport = [".dimension-list-container.jsx-
|
|
3
|
-
_defaultExport.__hash = "
|
|
2
|
+
const _defaultExport = [".dimension-list-container.jsx-1805862671{position:relative;}", `.dimension-list-scrollbox.jsx-1805862671{position:relative;width:100%;overflow:hidden;overflow-y:auto;border:1px solid ${colors.grey400};}`, `.dimension-list-scroller.jsx-1805862671{position:relative;min-height:1px;padding:0 ${spacers.dp4};}`, ".dimension-list-scroller.loading.jsx-1805862671{-webkit-filter:blur(2px);filter:blur(2px);}", ".scroll-detector.jsx-1805862671{boxsizing:border-box;width:100%;height:100px;position:absolute;bottom:0;left:0;z-index:-1;}", ".dimension-list-overlay.jsx-1805862671{position:absolute;width:100%;height:100%;z-index:2;top:0;left:0;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;}", `.filter-wrapper.jsx-1805862671{padding:${spacers.dp8};border:1px solid ${colors.grey400};border-bottom:0;}`, `.selector-wrapper.jsx-1805862671{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:${spacers.dp4};}`, `.sub-header.jsx-1805862671{font-size:14px;font-weight:normal;margin:0 0 ${spacers.dp4};}`, `.group-select.jsx-1805862671{width:50%;margin-top:${spacers.dp4};}`, `.empty-list.jsx-1805862671{text-align:center;font-size:14px;line-height:16px;margin:${spacers.dp24} 0 0;color:${colors.grey700};}`];
|
|
3
|
+
_defaultExport.__hash = "1805862671";
|
|
4
4
|
export default _defaultExport;
|
|
@@ -17,7 +17,10 @@ const DataDimension = ({
|
|
|
17
17
|
enabledDataTypes,
|
|
18
18
|
infoBoxMessage,
|
|
19
19
|
onCalculationSave,
|
|
20
|
-
visType
|
|
20
|
+
visType,
|
|
21
|
+
height,
|
|
22
|
+
heightCalculation,
|
|
23
|
+
maxSelections
|
|
21
24
|
}) => {
|
|
22
25
|
const {
|
|
23
26
|
serverVersion
|
|
@@ -93,7 +96,10 @@ const DataDimension = ({
|
|
|
93
96
|
setCurrentCalculation: setCurrentCalculation,
|
|
94
97
|
infoDataItem: infoDataItem,
|
|
95
98
|
setInfoDataItem: setInfoDataItem,
|
|
96
|
-
onEditClick: onEditClick
|
|
99
|
+
onEditClick: onEditClick,
|
|
100
|
+
height: height,
|
|
101
|
+
heightCalculation: heightCalculation,
|
|
102
|
+
maxSelections: maxSelections
|
|
97
103
|
}), currentDataItem && /*#__PURE__*/React.createElement(ItemOptionsSelector, _extends({}, currentDataItem, {
|
|
98
104
|
selectedItems: selectedItems,
|
|
99
105
|
onSelect: onSelectItems,
|
|
@@ -103,7 +109,9 @@ const DataDimension = ({
|
|
|
103
109
|
infoDataItem: infoDataItem,
|
|
104
110
|
setInfoDataItem: setInfoDataItem,
|
|
105
111
|
onClose: () => setCurrentDataItem(),
|
|
106
|
-
onEditClick: onEditClick
|
|
112
|
+
onEditClick: onEditClick,
|
|
113
|
+
height: height,
|
|
114
|
+
maxSelections: maxSelections
|
|
107
115
|
})), infoDataItem && /*#__PURE__*/React.createElement(InfoPopover, {
|
|
108
116
|
dataTest: 'data-dimension-info',
|
|
109
117
|
item: infoDataItem,
|
|
@@ -124,7 +132,10 @@ DataDimension.propTypes = {
|
|
|
124
132
|
onSelect: PropTypes.func.isRequired,
|
|
125
133
|
currentUser: PropTypes.object,
|
|
126
134
|
enabledDataTypes: PropTypes.array,
|
|
135
|
+
height: PropTypes.string,
|
|
136
|
+
heightCalculation: PropTypes.string,
|
|
127
137
|
infoBoxMessage: PropTypes.string,
|
|
138
|
+
maxSelections: PropTypes.number,
|
|
128
139
|
visType: PropTypes.string,
|
|
129
140
|
onCalculationSave: PropTypes.func
|
|
130
141
|
};
|
|
@@ -44,7 +44,7 @@ export const DataElementOperandInfo = ({
|
|
|
44
44
|
const dataElementOperand = dataElementOperands.dataElementOperands[0]
|
|
45
45
|
|
|
46
46
|
// copy some common fields from dataElement
|
|
47
|
-
|
|
47
|
+
;
|
|
48
48
|
['code', 'created', 'createdBy', 'displayDescription', 'lastUpdated'].forEach(key => dataElementOperand[key] = dataElementOperand.dataElement[key]);
|
|
49
49
|
|
|
50
50
|
// inject href as it is not returned from the API
|
|
@@ -39,7 +39,9 @@ export const ItemOptionsSelector = ({
|
|
|
39
39
|
onEditClick,
|
|
40
40
|
onSelect,
|
|
41
41
|
onClose,
|
|
42
|
-
dataTest
|
|
42
|
+
dataTest,
|
|
43
|
+
height = TRANSFER_HEIGHT,
|
|
44
|
+
maxSelections
|
|
43
45
|
}) => {
|
|
44
46
|
var _state$filter;
|
|
45
47
|
const [state, setState] = useState({
|
|
@@ -70,7 +72,7 @@ export const ItemOptionsSelector = ({
|
|
|
70
72
|
searchTerm: state.searchTerm
|
|
71
73
|
});
|
|
72
74
|
const newOptions = [];
|
|
73
|
-
(_result$dimensionItem = result.dimensionItems) === null || _result$dimensionItem === void 0
|
|
75
|
+
(_result$dimensionItem = result.dimensionItems) === null || _result$dimensionItem === void 0 || _result$dimensionItem.forEach(item => {
|
|
74
76
|
newOptions.push({
|
|
75
77
|
label: item.name,
|
|
76
78
|
value: item.id,
|
|
@@ -181,8 +183,8 @@ export const ItemOptionsSelector = ({
|
|
|
181
183
|
rightHeader: /*#__PURE__*/React.createElement("p", {
|
|
182
184
|
className: `jsx-${styles.__hash} jsx-${itemOptionSelectorStyles.__hash}` + " " + "rightHeader"
|
|
183
185
|
}, i18n.t('Selected items')),
|
|
184
|
-
enableOrderChange:
|
|
185
|
-
height:
|
|
186
|
+
enableOrderChange: !maxSelections || maxSelections > 1,
|
|
187
|
+
height: height,
|
|
186
188
|
optionsWidth: TRANSFER_OPTIONS_WIDTH,
|
|
187
189
|
selectedWidth: TRANSFER_SELECTED_WIDTH,
|
|
188
190
|
selectedEmptyComponent: /*#__PURE__*/React.createElement(SelectedEmptyPlaceholder, null),
|
|
@@ -207,6 +209,7 @@ export const ItemOptionsSelector = ({
|
|
|
207
209
|
/* eslint-enable react/prop-types */
|
|
208
210
|
}));
|
|
209
211
|
},
|
|
212
|
+
maxSelections: maxSelections,
|
|
210
213
|
dataTest: `${dataTest}-option-view-mode-transfer`
|
|
211
214
|
}), /*#__PURE__*/React.createElement(_JSXStyle, {
|
|
212
215
|
id: styles.__hash
|
|
@@ -222,8 +225,10 @@ ItemOptionsSelector.propTypes = {
|
|
|
222
225
|
onClose: PropTypes.func.isRequired,
|
|
223
226
|
onSelect: PropTypes.func.isRequired,
|
|
224
227
|
dataTest: PropTypes.string,
|
|
228
|
+
height: PropTypes.string,
|
|
225
229
|
infoDataItem: PropTypes.object,
|
|
226
230
|
itemsRef: PropTypes.object,
|
|
231
|
+
maxSelections: PropTypes.number,
|
|
227
232
|
selectedItems: PropTypes.arrayOf(PropTypes.exact({
|
|
228
233
|
label: PropTypes.string.isRequired,
|
|
229
234
|
value: PropTypes.string.isRequired,
|
|
@@ -106,7 +106,10 @@ const ItemSelector = ({
|
|
|
106
106
|
onEDISave,
|
|
107
107
|
onEditClick,
|
|
108
108
|
isOptionViewMode,
|
|
109
|
-
supportsEDI
|
|
109
|
+
supportsEDI,
|
|
110
|
+
height = TRANSFER_HEIGHT,
|
|
111
|
+
heightCalculation,
|
|
112
|
+
maxSelections
|
|
110
113
|
}) => {
|
|
111
114
|
const [state, setState] = useState({
|
|
112
115
|
searchTerm: '',
|
|
@@ -141,7 +144,7 @@ const ItemSelector = ({
|
|
|
141
144
|
searchTerm: state.searchTerm
|
|
142
145
|
});
|
|
143
146
|
const newOptions = [];
|
|
144
|
-
(_result$dimensionItem = result.dimensionItems) === null || _result$dimensionItem === void 0
|
|
147
|
+
(_result$dimensionItem = result.dimensionItems) === null || _result$dimensionItem === void 0 || _result$dimensionItem.forEach(item => {
|
|
145
148
|
if (item.dimensionItemType === REPORTING_RATE) {
|
|
146
149
|
if (state.filter.subGroup && state.filter.subGroup !== DIMENSION_TYPE_ALL) {
|
|
147
150
|
const metric = DATA_SETS_CONSTANTS.find(item => item.id === state.filter.subGroup);
|
|
@@ -334,8 +337,8 @@ const ItemSelector = ({
|
|
|
334
337
|
onClick: () => setCurrentCalculation({}),
|
|
335
338
|
small: true
|
|
336
339
|
}, i18n.t('Calculation'))) : undefined,
|
|
337
|
-
enableOrderChange:
|
|
338
|
-
height:
|
|
340
|
+
enableOrderChange: !maxSelections || maxSelections > 1,
|
|
341
|
+
height: height,
|
|
339
342
|
optionsWidth: TRANSFER_OPTIONS_WIDTH,
|
|
340
343
|
selectedWidth: TRANSFER_SELECTED_WIDTH,
|
|
341
344
|
selectedEmptyComponent: /*#__PURE__*/React.createElement(SelectedEmptyPlaceholder, null),
|
|
@@ -362,13 +365,15 @@ const ItemSelector = ({
|
|
|
362
365
|
})
|
|
363
366
|
/* eslint-enable react/prop-types */
|
|
364
367
|
})),
|
|
368
|
+
maxSelections: maxSelections,
|
|
365
369
|
dataTest: `${dataTest}-transfer`
|
|
366
370
|
}), currentCalculation && supportsEDI && /*#__PURE__*/React.createElement(CalculationModal, {
|
|
367
371
|
calculation: currentCalculation,
|
|
368
372
|
onSave: onSaveCalculation,
|
|
369
373
|
onClose: () => setCurrentCalculation(),
|
|
370
374
|
onDelete: onDeleteCalculation,
|
|
371
|
-
displayNameProp: displayNameProp
|
|
375
|
+
displayNameProp: displayNameProp,
|
|
376
|
+
height: heightCalculation
|
|
372
377
|
}), /*#__PURE__*/React.createElement(_JSXStyle, {
|
|
373
378
|
id: styles.__hash
|
|
374
379
|
}, styles));
|
|
@@ -379,10 +384,13 @@ ItemSelector.propTypes = {
|
|
|
379
384
|
currentCalculation: PropTypes.object,
|
|
380
385
|
dataTest: PropTypes.string,
|
|
381
386
|
dataTypes: PropTypes.array,
|
|
387
|
+
height: PropTypes.string,
|
|
388
|
+
heightCalculation: PropTypes.string,
|
|
382
389
|
infoBoxMessage: PropTypes.string,
|
|
383
390
|
infoDataItem: PropTypes.object,
|
|
384
391
|
isOptionViewMode: PropTypes.bool,
|
|
385
392
|
itemsRef: PropTypes.object,
|
|
393
|
+
maxSelections: PropTypes.number,
|
|
386
394
|
noItemsMessage: PropTypes.string,
|
|
387
395
|
rightFooter: PropTypes.node,
|
|
388
396
|
selectedItems: PropTypes.arrayOf(PropTypes.exact({
|
|
@@ -181,13 +181,13 @@ export const Editor = /*#__PURE__*/forwardRef(({
|
|
|
181
181
|
useEffect(() => {
|
|
182
182
|
if (initialFocus) {
|
|
183
183
|
var _textareaRef$current;
|
|
184
|
-
(_textareaRef$current = textareaRef.current) === null || _textareaRef$current === void 0
|
|
184
|
+
(_textareaRef$current = textareaRef.current) === null || _textareaRef$current === void 0 || _textareaRef$current.focus();
|
|
185
185
|
}
|
|
186
186
|
}, [initialFocus, textareaRef]);
|
|
187
187
|
useEffect(() => {
|
|
188
188
|
if (caretPosRef.current) {
|
|
189
189
|
var _textareaRef$current2;
|
|
190
|
-
(_textareaRef$current2 = textareaRef.current) === null || _textareaRef$current2 === void 0
|
|
190
|
+
(_textareaRef$current2 = textareaRef.current) === null || _textareaRef$current2 === void 0 || _textareaRef$current2.setSelectionRange(caretPosRef.current, caretPosRef.current);
|
|
191
191
|
caretPosRef.current = undefined;
|
|
192
192
|
}
|
|
193
193
|
}, [value, textareaRef]);
|
|
@@ -49,45 +49,90 @@ import viTranslations from './vi/translations.json';
|
|
|
49
49
|
import zhTranslations from './zh/translations.json';
|
|
50
50
|
import zh_CNTranslations from './zh_CN/translations.json';
|
|
51
51
|
const namespace = 'default';
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
i18n.
|
|
57
|
-
i18n.
|
|
58
|
-
i18n.
|
|
59
|
-
i18n.
|
|
60
|
-
i18n.
|
|
61
|
-
i18n.
|
|
62
|
-
i18n.
|
|
63
|
-
i18n.
|
|
64
|
-
i18n.
|
|
65
|
-
i18n.
|
|
66
|
-
i18n.
|
|
67
|
-
i18n.
|
|
68
|
-
i18n.
|
|
69
|
-
i18n.
|
|
70
|
-
i18n.
|
|
71
|
-
i18n.
|
|
72
|
-
i18n.
|
|
73
|
-
i18n.
|
|
74
|
-
i18n.
|
|
75
|
-
i18n.
|
|
76
|
-
i18n.
|
|
77
|
-
i18n.
|
|
78
|
-
i18n.
|
|
79
|
-
i18n.
|
|
80
|
-
i18n.
|
|
81
|
-
i18n.
|
|
82
|
-
i18n.
|
|
83
|
-
i18n.
|
|
84
|
-
i18n.
|
|
85
|
-
i18n.
|
|
86
|
-
i18n.
|
|
87
|
-
i18n.
|
|
88
|
-
i18n.
|
|
89
|
-
i18n.
|
|
90
|
-
i18n.
|
|
91
|
-
i18n.
|
|
92
|
-
i18n.
|
|
52
|
+
|
|
53
|
+
// Use 'deep' = true and 'overwrite' = false to add to, but not overwrite,
|
|
54
|
+
// custom translations from the datastore (added by the app adapter)
|
|
55
|
+
|
|
56
|
+
i18n.addResourceBundle('ar', namespace, arTranslations, true, false);
|
|
57
|
+
i18n.addResourceBundle('ar', namespace, arTranslations, true, false);
|
|
58
|
+
i18n.addResourceBundle('ar_EG', namespace, ar_EGTranslations, true, false);
|
|
59
|
+
i18n.addResourceBundle('ar-EG', namespace, ar_EGTranslations, true, false);
|
|
60
|
+
i18n.addResourceBundle('ar_IQ', namespace, ar_IQTranslations, true, false);
|
|
61
|
+
i18n.addResourceBundle('ar-IQ', namespace, ar_IQTranslations, true, false);
|
|
62
|
+
i18n.addResourceBundle('bn', namespace, bnTranslations, true, false);
|
|
63
|
+
i18n.addResourceBundle('bn', namespace, bnTranslations, true, false);
|
|
64
|
+
i18n.addResourceBundle('ckb', namespace, ckbTranslations, true, false);
|
|
65
|
+
i18n.addResourceBundle('ckb', namespace, ckbTranslations, true, false);
|
|
66
|
+
i18n.addResourceBundle('cs', namespace, csTranslations, true, false);
|
|
67
|
+
i18n.addResourceBundle('cs', namespace, csTranslations, true, false);
|
|
68
|
+
i18n.addResourceBundle('da', namespace, daTranslations, true, false);
|
|
69
|
+
i18n.addResourceBundle('da', namespace, daTranslations, true, false);
|
|
70
|
+
i18n.addResourceBundle('en', namespace, enTranslations, true, false);
|
|
71
|
+
i18n.addResourceBundle('en', namespace, enTranslations, true, false);
|
|
72
|
+
i18n.addResourceBundle('en_US', namespace, en_USTranslations, true, false);
|
|
73
|
+
i18n.addResourceBundle('en-US', namespace, en_USTranslations, true, false);
|
|
74
|
+
i18n.addResourceBundle('es', namespace, esTranslations, true, false);
|
|
75
|
+
i18n.addResourceBundle('es', namespace, esTranslations, true, false);
|
|
76
|
+
i18n.addResourceBundle('es_419', namespace, es_419Translations, true, false);
|
|
77
|
+
i18n.addResourceBundle('es-419', namespace, es_419Translations, true, false);
|
|
78
|
+
i18n.addResourceBundle('fr', namespace, frTranslations, true, false);
|
|
79
|
+
i18n.addResourceBundle('fr', namespace, frTranslations, true, false);
|
|
80
|
+
i18n.addResourceBundle('hi_IN', namespace, hi_INTranslations, true, false);
|
|
81
|
+
i18n.addResourceBundle('hi-IN', namespace, hi_INTranslations, true, false);
|
|
82
|
+
i18n.addResourceBundle('id', namespace, idTranslations, true, false);
|
|
83
|
+
i18n.addResourceBundle('id', namespace, idTranslations, true, false);
|
|
84
|
+
i18n.addResourceBundle('km', namespace, kmTranslations, true, false);
|
|
85
|
+
i18n.addResourceBundle('km', namespace, kmTranslations, true, false);
|
|
86
|
+
i18n.addResourceBundle('lo', namespace, loTranslations, true, false);
|
|
87
|
+
i18n.addResourceBundle('lo', namespace, loTranslations, true, false);
|
|
88
|
+
i18n.addResourceBundle('my', namespace, myTranslations, true, false);
|
|
89
|
+
i18n.addResourceBundle('my', namespace, myTranslations, true, false);
|
|
90
|
+
i18n.addResourceBundle('nb', namespace, nbTranslations, true, false);
|
|
91
|
+
i18n.addResourceBundle('nb', namespace, nbTranslations, true, false);
|
|
92
|
+
i18n.addResourceBundle('ne', namespace, neTranslations, true, false);
|
|
93
|
+
i18n.addResourceBundle('ne', namespace, neTranslations, true, false);
|
|
94
|
+
i18n.addResourceBundle('nl', namespace, nlTranslations, true, false);
|
|
95
|
+
i18n.addResourceBundle('nl', namespace, nlTranslations, true, false);
|
|
96
|
+
i18n.addResourceBundle('or', namespace, orTranslations, true, false);
|
|
97
|
+
i18n.addResourceBundle('or', namespace, orTranslations, true, false);
|
|
98
|
+
i18n.addResourceBundle('prs', namespace, prsTranslations, true, false);
|
|
99
|
+
i18n.addResourceBundle('prs', namespace, prsTranslations, true, false);
|
|
100
|
+
i18n.addResourceBundle('ps', namespace, psTranslations, true, false);
|
|
101
|
+
i18n.addResourceBundle('ps', namespace, psTranslations, true, false);
|
|
102
|
+
i18n.addResourceBundle('pt', namespace, ptTranslations, true, false);
|
|
103
|
+
i18n.addResourceBundle('pt', namespace, ptTranslations, true, false);
|
|
104
|
+
i18n.addResourceBundle('pt_BR', namespace, pt_BRTranslations, true, false);
|
|
105
|
+
i18n.addResourceBundle('pt-BR', namespace, pt_BRTranslations, true, false);
|
|
106
|
+
i18n.addResourceBundle('ro', namespace, roTranslations, true, false);
|
|
107
|
+
i18n.addResourceBundle('ro', namespace, roTranslations, true, false);
|
|
108
|
+
i18n.addResourceBundle('ru', namespace, ruTranslations, true, false);
|
|
109
|
+
i18n.addResourceBundle('ru', namespace, ruTranslations, true, false);
|
|
110
|
+
i18n.addResourceBundle('si', namespace, siTranslations, true, false);
|
|
111
|
+
i18n.addResourceBundle('si', namespace, siTranslations, true, false);
|
|
112
|
+
i18n.addResourceBundle('sv', namespace, svTranslations, true, false);
|
|
113
|
+
i18n.addResourceBundle('sv', namespace, svTranslations, true, false);
|
|
114
|
+
i18n.addResourceBundle('tet', namespace, tetTranslations, true, false);
|
|
115
|
+
i18n.addResourceBundle('tet', namespace, tetTranslations, true, false);
|
|
116
|
+
i18n.addResourceBundle('tg', namespace, tgTranslations, true, false);
|
|
117
|
+
i18n.addResourceBundle('tg', namespace, tgTranslations, true, false);
|
|
118
|
+
i18n.addResourceBundle('th', namespace, thTranslations, true, false);
|
|
119
|
+
i18n.addResourceBundle('th', namespace, thTranslations, true, false);
|
|
120
|
+
i18n.addResourceBundle('uk', namespace, ukTranslations, true, false);
|
|
121
|
+
i18n.addResourceBundle('uk', namespace, ukTranslations, true, false);
|
|
122
|
+
i18n.addResourceBundle('ur', namespace, urTranslations, true, false);
|
|
123
|
+
i18n.addResourceBundle('ur', namespace, urTranslations, true, false);
|
|
124
|
+
i18n.addResourceBundle('uz_Cyrl', namespace, uz_CyrlTranslations, true, false);
|
|
125
|
+
i18n.addResourceBundle('uz-Cyrl', namespace, uz_CyrlTranslations, true, false);
|
|
126
|
+
i18n.addResourceBundle('uz_Latn', namespace, uz_LatnTranslations, true, false);
|
|
127
|
+
i18n.addResourceBundle('uz-Latn', namespace, uz_LatnTranslations, true, false);
|
|
128
|
+
i18n.addResourceBundle('uz_UZ_Cyrl', namespace, uz_UZ_CyrlTranslations, true, false);
|
|
129
|
+
i18n.addResourceBundle('uz-Cyrl-UZ', namespace, uz_UZ_CyrlTranslations, true, false);
|
|
130
|
+
i18n.addResourceBundle('uz_UZ_Latn', namespace, uz_UZ_LatnTranslations, true, false);
|
|
131
|
+
i18n.addResourceBundle('uz-Latn-UZ', namespace, uz_UZ_LatnTranslations, true, false);
|
|
132
|
+
i18n.addResourceBundle('vi', namespace, viTranslations, true, false);
|
|
133
|
+
i18n.addResourceBundle('vi', namespace, viTranslations, true, false);
|
|
134
|
+
i18n.addResourceBundle('zh', namespace, zhTranslations, true, false);
|
|
135
|
+
i18n.addResourceBundle('zh', namespace, zhTranslations, true, false);
|
|
136
|
+
i18n.addResourceBundle('zh_CN', namespace, zh_CNTranslations, true, false);
|
|
137
|
+
i18n.addResourceBundle('zh-CN', namespace, zh_CNTranslations, true, false);
|
|
93
138
|
export default i18n;
|
|
@@ -4,7 +4,7 @@ export const LEGEND_DISPLAY_STYLE_FILL = 'FILL';
|
|
|
4
4
|
export const LEGEND_DISPLAY_STYLE_TEXT = 'TEXT';
|
|
5
5
|
export const getLegendByValueFromLegendSet = (legendSet, value) => {
|
|
6
6
|
var _legendSet$legends;
|
|
7
|
-
return Number.isInteger(parseInt(value)) ? legendSet === null || legendSet === void 0
|
|
7
|
+
return Number.isInteger(parseInt(value)) ? legendSet === null || legendSet === void 0 || (_legendSet$legends = legendSet.legends) === null || _legendSet$legends === void 0 ? void 0 : _legendSet$legends.find(legend => value >= legend.startValue && value < legend.endValue // TODO: Confirm inclusive/exclusive bounds
|
|
8
8
|
) : null;
|
|
9
9
|
};
|
|
10
10
|
export const getColorByValueFromLegendSet = (legendSet, value) => {
|
|
@@ -2,7 +2,7 @@ import { colors } from '@dhis2/ui';
|
|
|
2
2
|
import { getColorByValueFromLegendSet, LEGEND_DISPLAY_STRATEGY_BY_DATA_ITEM, LEGEND_DISPLAY_STRATEGY_FIXED, LEGEND_DISPLAY_STYLE_TEXT, LEGEND_DISPLAY_STYLE_FILL } from '../legends.js';
|
|
3
3
|
import { isColorBright } from './isColorBright.js';
|
|
4
4
|
const getLegendSet = (engine, dxDimension) => {
|
|
5
|
-
var _engine$visualization, _engine$visualization2
|
|
5
|
+
var _engine$visualization, _engine$visualization2;
|
|
6
6
|
let legendSetId;
|
|
7
7
|
switch ((_engine$visualization = engine.visualization.legend) === null || _engine$visualization === void 0 ? void 0 : _engine$visualization.strategy) {
|
|
8
8
|
case LEGEND_DISPLAY_STRATEGY_BY_DATA_ITEM:
|
|
@@ -12,15 +12,15 @@ const getLegendSet = (engine, dxDimension) => {
|
|
|
12
12
|
break;
|
|
13
13
|
case LEGEND_DISPLAY_STRATEGY_FIXED:
|
|
14
14
|
default:
|
|
15
|
-
legendSetId = (_engine$visualization2 = engine.visualization.legend) === null || _engine$visualization2 === void 0
|
|
15
|
+
legendSetId = (_engine$visualization2 = engine.visualization.legend) === null || _engine$visualization2 === void 0 || (_engine$visualization2 = _engine$visualization2.set) === null || _engine$visualization2 === void 0 ? void 0 : _engine$visualization2.id;
|
|
16
16
|
break;
|
|
17
17
|
}
|
|
18
18
|
return engine.legendSets[legendSetId];
|
|
19
19
|
};
|
|
20
20
|
const buildStyleObject = (legendColor, engine) => {
|
|
21
|
-
var _engine$
|
|
21
|
+
var _engine$visualization3;
|
|
22
22
|
const style = {};
|
|
23
|
-
switch ((_engine$
|
|
23
|
+
switch ((_engine$visualization3 = engine.visualization.legend) === null || _engine$visualization3 === void 0 ? void 0 : _engine$visualization3.style) {
|
|
24
24
|
case LEGEND_DISPLAY_STYLE_TEXT:
|
|
25
25
|
style.color = legendColor;
|
|
26
26
|
break;
|
|
@@ -28,11 +28,11 @@ export default function loadSingleValueSVG() {
|
|
|
28
28
|
while (!fitsWithinContainer && dynamicStyles.hasNext()) {
|
|
29
29
|
styles = dynamicStyles.next();
|
|
30
30
|
valueElement.attr(styles.value);
|
|
31
|
-
subTextElement === null || subTextElement === void 0
|
|
31
|
+
subTextElement === null || subTextElement === void 0 || subTextElement.attr(styles.subText);
|
|
32
32
|
fitsWithinContainer = checkIfFitsWithinContainer(getAvailableSpace.call(this, styles.spacing.valueTop), valueElement, subTextElement, icon, subText, styles.spacing);
|
|
33
33
|
}
|
|
34
34
|
positionElements.call(this, valueElement, subTextElement, iconElement, styles.spacing);
|
|
35
35
|
valueElement.attr('visibility', 'visible');
|
|
36
|
-
iconElement === null || iconElement === void 0
|
|
37
|
-
subTextElement === null || subTextElement === void 0
|
|
36
|
+
iconElement === null || iconElement === void 0 || iconElement.attr('visibility', 'visible');
|
|
37
|
+
subTextElement === null || subTextElement === void 0 || subTextElement.attr('visibility', 'visible');
|
|
38
38
|
}
|
|
@@ -40,7 +40,7 @@ export default function ({
|
|
|
40
40
|
extraConfig,
|
|
41
41
|
extraOptions
|
|
42
42
|
}) {
|
|
43
|
-
var _layout$legend, _layout$seriesKey, _layout$seriesKey2,
|
|
43
|
+
var _layout$legend, _layout$seriesKey, _layout$seriesKey2, _config$xAxis;
|
|
44
44
|
const _layout = getTransformedLayout(layout);
|
|
45
45
|
const _extraOptions = getTransformedExtraOptions(extraOptions);
|
|
46
46
|
const stacked = isStacked(_layout.type);
|
|
@@ -83,7 +83,7 @@ export default function ({
|
|
|
83
83
|
// legend
|
|
84
84
|
legend: getLegend({
|
|
85
85
|
isHidden: (_layout$seriesKey = _layout.seriesKey) === null || _layout$seriesKey === void 0 ? void 0 : _layout$seriesKey.hidden,
|
|
86
|
-
fontStyle: (_layout$seriesKey2 = _layout.seriesKey) === null || _layout$seriesKey2 === void 0
|
|
86
|
+
fontStyle: (_layout$seriesKey2 = _layout.seriesKey) === null || _layout$seriesKey2 === void 0 || (_layout$seriesKey2 = _layout$seriesKey2.label) === null || _layout$seriesKey2 === void 0 ? void 0 : _layout$seriesKey2.fontStyle,
|
|
87
87
|
visType: _layout.type,
|
|
88
88
|
dashboard: _extraOptions.dashboard
|
|
89
89
|
}),
|
|
@@ -185,7 +185,7 @@ export default function ({
|
|
|
185
185
|
displayStrategy
|
|
186
186
|
});
|
|
187
187
|
}
|
|
188
|
-
(_series = series) === null || _series === void 0
|
|
188
|
+
(_series = series) === null || _series === void 0 || _series.forEach(seriesObj => {
|
|
189
189
|
// animation
|
|
190
190
|
seriesObj.animation = extraOptions.dashboard ? false : {
|
|
191
191
|
duration: getAnimation(extraOptions.animation, DEFAULT_ANIMATION_DURATION)
|
|
@@ -69,9 +69,9 @@ export default function subtitle(series, layout, metaData, extraOptions) {
|
|
|
69
69
|
switch (layout.type) {
|
|
70
70
|
case VIS_TYPE_SINGLE_VALUE:
|
|
71
71
|
{
|
|
72
|
-
var _defaultFontStyle$FON, _layout$fontStyle
|
|
73
|
-
const defaultColor = defaultFontStyle === null || defaultFontStyle === void 0
|
|
74
|
-
const customColor = layout === null || layout === void 0
|
|
72
|
+
var _defaultFontStyle$FON, _layout$fontStyle;
|
|
73
|
+
const defaultColor = defaultFontStyle === null || defaultFontStyle === void 0 || (_defaultFontStyle$FON = defaultFontStyle[FONT_STYLE_VISUALIZATION_SUBTITLE]) === null || _defaultFontStyle$FON === void 0 ? void 0 : _defaultFontStyle$FON[FONT_STYLE_OPTION_TEXT_COLOR];
|
|
74
|
+
const customColor = layout === null || layout === void 0 || (_layout$fontStyle = layout.fontStyle) === null || _layout$fontStyle === void 0 || (_layout$fontStyle = _layout$fontStyle[FONT_STYLE_VISUALIZATION_SUBTITLE]) === null || _layout$fontStyle === void 0 ? void 0 : _layout$fontStyle[FONT_STYLE_OPTION_TEXT_COLOR];
|
|
75
75
|
subtitle.style.color = getSingleValueSubtitleColor(customColor, defaultColor, series[0], legendOptions, legendSets);
|
|
76
76
|
if (dashboard) {
|
|
77
77
|
// Single value subtitle text should be multiline
|
|
@@ -76,9 +76,9 @@ export default function (layout, metaData, extraOptions, series) {
|
|
|
76
76
|
switch (layout.type) {
|
|
77
77
|
case VIS_TYPE_SINGLE_VALUE:
|
|
78
78
|
{
|
|
79
|
-
var _defaultFontStyle$FON, _layout$fontStyle
|
|
80
|
-
const defaultColor = defaultFontStyle === null || defaultFontStyle === void 0
|
|
81
|
-
const customColor = layout === null || layout === void 0
|
|
79
|
+
var _defaultFontStyle$FON, _layout$fontStyle;
|
|
80
|
+
const defaultColor = defaultFontStyle === null || defaultFontStyle === void 0 || (_defaultFontStyle$FON = defaultFontStyle[FONT_STYLE_VISUALIZATION_TITLE]) === null || _defaultFontStyle$FON === void 0 ? void 0 : _defaultFontStyle$FON[FONT_STYLE_OPTION_TEXT_COLOR];
|
|
81
|
+
const customColor = layout === null || layout === void 0 || (_layout$fontStyle = layout.fontStyle) === null || _layout$fontStyle === void 0 || (_layout$fontStyle = _layout$fontStyle[FONT_STYLE_VISUALIZATION_TITLE]) === null || _layout$fontStyle === void 0 ? void 0 : _layout$fontStyle[FONT_STYLE_OPTION_TEXT_COLOR];
|
|
82
82
|
title.style.color = getSingleValueTitleColor(customColor, defaultColor, series[0], legendOptions, legendSets);
|
|
83
83
|
if (dashboard) {
|
|
84
84
|
// TODO: is this always what we want?
|
|
@@ -34,9 +34,9 @@ H.patterns.forEach((pattern, i) => {
|
|
|
34
34
|
function drawLegendSymbolWrap() {
|
|
35
35
|
const pick = H.pick;
|
|
36
36
|
H.wrap(H.seriesTypes.column.prototype, 'drawLegendSymbol', function (proceed, legend, item) {
|
|
37
|
-
var _this$options$legendS
|
|
37
|
+
var _this$options$legendS;
|
|
38
38
|
const legendItem = item.legendItem;
|
|
39
|
-
if ((_this$options$legendS = this.options.legendSet) !== null && _this$options$legendS !== void 0 && (_this$options$
|
|
39
|
+
if ((_this$options$legendS = this.options.legendSet) !== null && _this$options$legendS !== void 0 && (_this$options$legendS = _this$options$legendS.legends) !== null && _this$options$legendS !== void 0 && _this$options$legendS.length) {
|
|
40
40
|
const ys = legend.baseline - legend.symbolHeight + 1,
|
|
41
41
|
// y start
|
|
42
42
|
x = legend.symbolWidth / 2 > 8 ? legend.symbolWidth / 2 : 8,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export default function (acc, series, categories, idValueMap, metaData, extraOptions) {
|
|
2
2
|
var _extraOptions$xAxisLa;
|
|
3
3
|
const seriesData = Array.from({
|
|
4
|
-
length: (extraOptions === null || extraOptions === void 0
|
|
4
|
+
length: (extraOptions === null || extraOptions === void 0 || (_extraOptions$xAxisLa = extraOptions.xAxisLabels) === null || _extraOptions$xAxisLa === void 0 ? void 0 : _extraOptions$xAxisLa.length) || 0
|
|
5
5
|
}, () => null);
|
|
6
6
|
categories[0].forEach(categoryItemId => {
|
|
7
7
|
const position = extraOptions.periodKeyAxisIndexMap[categoryItemId];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dhis2/analytics",
|
|
3
|
-
"version": "29.
|
|
3
|
+
"version": "29.4.1",
|
|
4
4
|
"main": "./build/cjs/index.js",
|
|
5
5
|
"module": "./build/es/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@dhis2/app-runtime": "^3.14.1",
|
|
34
|
-
"@dhis2/cli-app-scripts": "^12.
|
|
34
|
+
"@dhis2/cli-app-scripts": "^12.11.0",
|
|
35
35
|
"@dhis2/cli-style": "^10.7.9",
|
|
36
36
|
"@dhis2/d2-i18n": "^1.1.0",
|
|
37
37
|
"@dhis2/ui": "^10.12.7",
|