@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.
Files changed (41) hide show
  1. package/build/cjs/api/analytics/AnalyticsRequest.js +4 -4
  2. package/build/cjs/components/DataDimension/Calculation/CalculationModal.js +6 -3
  3. package/build/cjs/components/DataDimension/Calculation/DataElementSelector.js +8 -2
  4. package/build/cjs/components/DataDimension/Calculation/DndContext.js +4 -4
  5. package/build/cjs/components/DataDimension/Calculation/styles/DataElementSelector.style.js +2 -2
  6. package/build/cjs/components/DataDimension/DataDimension.js +14 -3
  7. package/build/cjs/components/DataDimension/Info/DataElementOperandInfo.js +1 -1
  8. package/build/cjs/components/DataDimension/ItemOptionsSelector/ItemOptionsSelector.js +9 -4
  9. package/build/cjs/components/DataDimension/ItemSelector/ItemSelector.js +13 -5
  10. package/build/cjs/components/RichText/Editor/Editor.js +2 -2
  11. package/build/cjs/locales/index.js +86 -41
  12. package/build/cjs/modules/legends.js +1 -1
  13. package/build/cjs/modules/pivotTable/applyLegendSet.js +4 -4
  14. package/build/cjs/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/index.js +3 -3
  15. package/build/cjs/visualizations/config/adapters/dhis_highcharts/index.js +2 -2
  16. package/build/cjs/visualizations/config/adapters/dhis_highcharts/series/index.js +1 -1
  17. package/build/cjs/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +3 -3
  18. package/build/cjs/visualizations/config/adapters/dhis_highcharts/title/index.js +3 -3
  19. package/build/cjs/visualizations/config/generators/highcharts/index.js +2 -2
  20. package/build/cjs/visualizations/store/adapters/dhis_highcharts/yearOnYear.js +1 -1
  21. package/build/es/api/analytics/AnalyticsRequest.js +4 -4
  22. package/build/es/components/DataDimension/Calculation/CalculationModal.js +6 -3
  23. package/build/es/components/DataDimension/Calculation/DataElementSelector.js +8 -2
  24. package/build/es/components/DataDimension/Calculation/DndContext.js +4 -4
  25. package/build/es/components/DataDimension/Calculation/styles/DataElementSelector.style.js +2 -2
  26. package/build/es/components/DataDimension/DataDimension.js +14 -3
  27. package/build/es/components/DataDimension/Info/DataElementOperandInfo.js +1 -1
  28. package/build/es/components/DataDimension/ItemOptionsSelector/ItemOptionsSelector.js +9 -4
  29. package/build/es/components/DataDimension/ItemSelector/ItemSelector.js +13 -5
  30. package/build/es/components/RichText/Editor/Editor.js +2 -2
  31. package/build/es/locales/index.js +86 -41
  32. package/build/es/modules/legends.js +1 -1
  33. package/build/es/modules/pivotTable/applyLegendSet.js +4 -4
  34. package/build/es/visualizations/config/adapters/dhis_highcharts/events/loadCustomSVG/singleValue/index.js +3 -3
  35. package/build/es/visualizations/config/adapters/dhis_highcharts/index.js +2 -2
  36. package/build/es/visualizations/config/adapters/dhis_highcharts/series/index.js +1 -1
  37. package/build/es/visualizations/config/adapters/dhis_highcharts/subtitle/index.js +3 -3
  38. package/build/es/visualizations/config/adapters/dhis_highcharts/title/index.js +3 -3
  39. package/build/es/visualizations/config/generators/highcharts/index.js +2 -2
  40. package/build/es/visualizations/store/adapters/dhis_highcharts/yearOnYear.js +1 -1
  41. 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, _d$repetition$indexes;
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$indexes = _d$repetition.indexes) !== null && _d$repetition$indexes !== void 0 && _d$repetition$indexes.length) {
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, _f$repetition$indexes;
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$indexes = _f$repetition.indexes) !== null && _f$repetition$indexes !== void 0 && _f$repetition$indexes.length) {
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$current$so, _over$data$current2, _over$data$current3;
123
- if (!(over !== null && over !== void 0 && over.id) || (over === null || over === void 0 ? void 0 : (_over$data = over.data) === null || _over$data === void 0 ? void 0 : (_over$data$current = _over$data.current) === null || _over$data$current === void 0 ? void 0 : (_over$data$current$so = _over$data$current.sortable) === null || _over$data$current$so === void 0 ? void 0 : _over$data$current$so.containerId) === OPTIONS_PANEL || !active.data.current) {
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$current2 = over.data.current) === null || _over$data$current2 === void 0 ? void 0 : _over$data$current2.sortable.containerId) || over.id,
140
- index: (_over$data$current3 = over.data.current) === null || _over$data$current3 === void 0 ? void 0 : _over$data$current3.sortable.index
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-4262244129{position:relative;}", `.dimension-list-scrollbox.jsx-4262244129{position:relative;width:100%;height:337px;overflow:hidden;overflow-y:auto;border:1px solid ${colors.grey400};}`, `.dimension-list-scroller.jsx-4262244129{position:relative;min-height:1px;padding:0 ${spacers.dp4};}`, ".dimension-list-scroller.loading.jsx-4262244129{-webkit-filter:blur(2px);filter:blur(2px);}", ".scroll-detector.jsx-4262244129{boxsizing:border-box;width:100%;height:100px;position:absolute;bottom:0;left:0;z-index:-1;}", ".dimension-list-overlay.jsx-4262244129{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-4262244129{padding:${spacers.dp8};border:1px solid ${colors.grey400};border-bottom:0;}`, `.selector-wrapper.jsx-4262244129{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:${spacers.dp4};}`, `.sub-header.jsx-4262244129{font-size:14px;font-weight:normal;margin:0 0 ${spacers.dp4};}`, `.group-select.jsx-4262244129{width:50%;margin-top:${spacers.dp4};}`, `.empty-list.jsx-4262244129{text-align:center;font-size:14px;line-height:16px;margin:${spacers.dp24} 0 0;color:${colors.grey700};}`];
3
- _defaultExport.__hash = "4262244129";
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 ? void 0 : _result$dimensionItem.forEach(item => {
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: true,
185
- height: TRANSFER_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 ? void 0 : _result$dimensionItem.forEach(item => {
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: true,
338
- height: TRANSFER_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 ? void 0 : _textareaRef$current.focus();
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 ? void 0 : _textareaRef$current2.setSelectionRange(caretPosRef.current, caretPosRef.current);
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
- i18n.addResources('ar', namespace, arTranslations);
53
- i18n.addResources('ar_EG', namespace, ar_EGTranslations);
54
- i18n.addResources('ar_IQ', namespace, ar_IQTranslations);
55
- i18n.addResources('bn', namespace, bnTranslations);
56
- i18n.addResources('ckb', namespace, ckbTranslations);
57
- i18n.addResources('cs', namespace, csTranslations);
58
- i18n.addResources('da', namespace, daTranslations);
59
- i18n.addResources('en', namespace, enTranslations);
60
- i18n.addResources('en_US', namespace, en_USTranslations);
61
- i18n.addResources('es', namespace, esTranslations);
62
- i18n.addResources('es_419', namespace, es_419Translations);
63
- i18n.addResources('fr', namespace, frTranslations);
64
- i18n.addResources('hi_IN', namespace, hi_INTranslations);
65
- i18n.addResources('id', namespace, idTranslations);
66
- i18n.addResources('km', namespace, kmTranslations);
67
- i18n.addResources('lo', namespace, loTranslations);
68
- i18n.addResources('my', namespace, myTranslations);
69
- i18n.addResources('nb', namespace, nbTranslations);
70
- i18n.addResources('ne', namespace, neTranslations);
71
- i18n.addResources('nl', namespace, nlTranslations);
72
- i18n.addResources('or', namespace, orTranslations);
73
- i18n.addResources('prs', namespace, prsTranslations);
74
- i18n.addResources('ps', namespace, psTranslations);
75
- i18n.addResources('pt', namespace, ptTranslations);
76
- i18n.addResources('pt_BR', namespace, pt_BRTranslations);
77
- i18n.addResources('ro', namespace, roTranslations);
78
- i18n.addResources('ru', namespace, ruTranslations);
79
- i18n.addResources('si', namespace, siTranslations);
80
- i18n.addResources('sv', namespace, svTranslations);
81
- i18n.addResources('tet', namespace, tetTranslations);
82
- i18n.addResources('tg', namespace, tgTranslations);
83
- i18n.addResources('th', namespace, thTranslations);
84
- i18n.addResources('uk', namespace, ukTranslations);
85
- i18n.addResources('ur', namespace, urTranslations);
86
- i18n.addResources('uz_Cyrl', namespace, uz_CyrlTranslations);
87
- i18n.addResources('uz_Latn', namespace, uz_LatnTranslations);
88
- i18n.addResources('uz_UZ_Cyrl', namespace, uz_UZ_CyrlTranslations);
89
- i18n.addResources('uz_UZ_Latn', namespace, uz_UZ_LatnTranslations);
90
- i18n.addResources('vi', namespace, viTranslations);
91
- i18n.addResources('zh', namespace, zhTranslations);
92
- i18n.addResources('zh_CN', namespace, zh_CNTranslations);
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 ? 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
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, _engine$visualization3;
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 ? void 0 : (_engine$visualization3 = _engine$visualization2.set) === null || _engine$visualization3 === void 0 ? void 0 : _engine$visualization3.id;
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$visualization4;
21
+ var _engine$visualization3;
22
22
  const style = {};
23
- switch ((_engine$visualization4 = engine.visualization.legend) === null || _engine$visualization4 === void 0 ? void 0 : _engine$visualization4.style) {
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 ? void 0 : subTextElement.attr(styles.subText);
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 ? void 0 : iconElement.attr('visibility', 'visible');
37
- subTextElement === null || subTextElement === void 0 ? void 0 : subTextElement.attr('visibility', 'visible');
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, _layout$seriesKey2$la, _config$xAxis;
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 ? void 0 : (_layout$seriesKey2$la = _layout$seriesKey2.label) === null || _layout$seriesKey2$la === void 0 ? void 0 : _layout$seriesKey2$la.fontStyle,
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 ? void 0 : _series.forEach(seriesObj => {
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, _layout$fontStyle$FON;
73
- const defaultColor = defaultFontStyle === null || defaultFontStyle === void 0 ? 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 ? void 0 : (_layout$fontStyle = layout.fontStyle) === null || _layout$fontStyle === void 0 ? void 0 : (_layout$fontStyle$FON = _layout$fontStyle[FONT_STYLE_VISUALIZATION_SUBTITLE]) === null || _layout$fontStyle$FON === void 0 ? void 0 : _layout$fontStyle$FON[FONT_STYLE_OPTION_TEXT_COLOR];
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, _layout$fontStyle$FON;
80
- const defaultColor = defaultFontStyle === null || defaultFontStyle === void 0 ? 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 ? void 0 : (_layout$fontStyle = layout.fontStyle) === null || _layout$fontStyle === void 0 ? void 0 : (_layout$fontStyle$FON = _layout$fontStyle[FONT_STYLE_VISUALIZATION_TITLE]) === null || _layout$fontStyle$FON === void 0 ? void 0 : _layout$fontStyle$FON[FONT_STYLE_OPTION_TEXT_COLOR];
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, _this$options$legendS2;
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$legendS2 = _this$options$legendS.legends) !== null && _this$options$legendS2 !== void 0 && _this$options$legendS2.length) {
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 ? void 0 : (_extraOptions$xAxisLa = extraOptions.xAxisLabels) === null || _extraOptions$xAxisLa === void 0 ? void 0 : _extraOptions$xAxisLa.length) || 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.3",
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.6.4",
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",