@dhis2/analytics 11.0.15 → 11.0.20

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/CHANGELOG.md CHANGED
@@ -1,3 +1,38 @@
1
+ ## [11.0.20](https://github.com/dhis2/analytics/compare/v11.0.19...v11.0.20) (2021-09-15)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * add convertOuLevelsToUids (DHIS2-11016) ([#908](https://github.com/dhis2/analytics/issues/908)) ([#1045](https://github.com/dhis2/analytics/issues/1045)) ([7366f26](https://github.com/dhis2/analytics/commit/7366f26d88d467f3d70afdaf82958ffa6df43006))
7
+
8
+ ## [11.0.19](https://github.com/dhis2/analytics/compare/v11.0.18...v11.0.19) (2021-07-14)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * yoy x axis title and labels (DHIS2-11411) v35 ([#991](https://github.com/dhis2/analytics/issues/991)) ([5434289](https://github.com/dhis2/analytics/commit/54342894e05afa04e972584b946596231749f940))
14
+
15
+ ## [11.0.18](https://github.com/dhis2/analytics/compare/v11.0.17...v11.0.18) (2021-04-22)
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * paging of dynamic dimension items (DHIS2-10988) ([#903](https://github.com/dhis2/analytics/issues/903)) ([6f3295d](https://github.com/dhis2/analytics/commit/6f3295db7f76f21ba7b21cef67d185f7eb85f4b3))
21
+
22
+ ## [11.0.17](https://github.com/dhis2/analytics/compare/v11.0.16...v11.0.17) (2021-03-23)
23
+
24
+
25
+ ### Bug Fixes
26
+
27
+ * backport DHIS2-9829 ([#874](https://github.com/dhis2/analytics/issues/874)) ([6588b1d](https://github.com/dhis2/analytics/commit/6588b1d476725b6fb91b7e5eca8b2220f6701d45))
28
+
29
+ ## [11.0.16](https://github.com/dhis2/analytics/compare/v11.0.15...v11.0.16) (2020-10-20)
30
+
31
+
32
+ ### Bug Fixes
33
+
34
+ * dynamic min/max based on content of data values ([#635](https://github.com/dhis2/analytics/issues/635)) ([000cd18](https://github.com/dhis2/analytics/commit/000cd1896b90da5cda9fe3ff477f3d3a7a2ec799))
35
+
1
36
  ## [11.0.15](https://github.com/dhis2/analytics/compare/v11.0.14...v11.0.15) (2020-10-19)
2
37
 
3
38
 
package/build/cjs/lib.js CHANGED
@@ -23,6 +23,7 @@ var DeselectIcon = _interopDefault(require('@material-ui/icons/Close'));
23
23
  var sortBy = _interopDefault(require('lodash/sortBy'));
24
24
  var propTypes = _interopDefault(require('@dhis2/prop-types'));
25
25
  var d2UiOrgUnitDialog = require('@dhis2/d2-ui-org-unit-dialog');
26
+ var appRuntime = require('@dhis2/app-runtime');
26
27
  var styles$5 = require('@material-ui/core/styles');
27
28
  var LockIcon = _interopDefault(require('@material-ui/icons/Lock'));
28
29
  var Paper = _interopDefault(require('@material-ui/core/Paper'));
@@ -1353,9 +1354,11 @@ var enTranslations = {
1353
1354
  "Main dimensions": "",
1354
1355
  "Your dimensions": "",
1355
1356
  "Dimension recommended with selected data": "",
1357
+ "Nothing found": "",
1358
+ Search: Search$5,
1356
1359
  "No items selected": "",
1357
1360
  "Selected Items": "",
1358
- Search: Search$5,
1361
+ "Nothing found for {{searchTerm}}": "",
1359
1362
  "Selected Data": "",
1360
1363
  "Deselect All": "",
1361
1364
  "Select all": "",
@@ -7844,11 +7847,48 @@ const apiFetchRecommendedIds = (d2, dxIds, ouIds) => {
7844
7847
  const url = "/dimensions/recommendations?".concat(dimensions, "&fields=id");
7845
7848
  return d2.Api.getApi().get(url).then(response => response.dimensions.map(item => item.id)).catch(onError);
7846
7849
  };
7847
- const apiFetchItemsByDimension = (d2, dimensionId) => {
7848
- const fields = "fields=id,displayName~rename(name)";
7849
- const order = "order=displayName:asc";
7850
- const url = "dimensions/".concat(dimensionId, "/items?").concat(fields, "&").concat(order);
7851
- return d2.Api.getApi().get(url).then(response => response.items);
7850
+ const itemsByDimensionQuery = {
7851
+ resource: "dimensions",
7852
+ id: ({
7853
+ id: _id
7854
+ }) => "".concat(_id, "/items"),
7855
+ params: ({
7856
+ searchTerm,
7857
+ page
7858
+ }) => {
7859
+ const filters = [];
7860
+
7861
+ if (searchTerm) {
7862
+ filters.push("name:ilike:".concat(searchTerm));
7863
+ }
7864
+
7865
+ return {
7866
+ fields: 'id,displayName~rename(name)',
7867
+ order: 'displayName:asc',
7868
+ filter: filters,
7869
+ paging: true,
7870
+ page
7871
+ };
7872
+ }
7873
+ };
7874
+ const apiFetchItemsByDimension = async ({
7875
+ dataEngine,
7876
+ dimensionId,
7877
+ searchTerm,
7878
+ page
7879
+ }) => {
7880
+ const itemsByDimensionData = await dataEngine.query({
7881
+ itemsByDimensions: itemsByDimensionQuery
7882
+ }, {
7883
+ variables: {
7884
+ id: dimensionId,
7885
+ searchTerm,
7886
+ page
7887
+ },
7888
+ onError
7889
+ });
7890
+ const response = itemsByDimensionData.itemsByDimensions;
7891
+ return formatResponse(response.items, response.pager);
7852
7892
  };
7853
7893
  const apiFetchGroups = (d2, dataType, nameProp) => {
7854
7894
  // indicatorGroups does not support shortName
@@ -8107,6 +8147,11 @@ const fetchProgramIndicators = ({
8107
8147
  });
8108
8148
  };
8109
8149
 
8150
+ const formatResponse = (dimensionItems, pager) => ({
8151
+ dimensionItems,
8152
+ nextPage: pager.nextPage ? pager.page + 1 : null
8153
+ });
8154
+
8110
8155
  const DataIcon = () => {
8111
8156
  return /*#__PURE__*/React__default.createElement("svg", {
8112
8157
  width: "16px",
@@ -9422,8 +9467,8 @@ RelativePeriodFilter.propTypes = {
9422
9467
  onSelectFilter: PropTypes.func.isRequired
9423
9468
  };
9424
9469
 
9425
- const _defaultExport$c = [".filterContainer.jsx-1252227294{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:".concat(ui.spacers.dp12, ";margin-top:").concat(ui.spacers.dp8, ";}"), ".emptySelection.jsx-1252227294{text-align:center;font-size:14px;line-height:16px;margin:".concat(ui.spacers.dp24, " 0 0;color:").concat(ui.colors.grey700, ";}"), ".rightHeader.jsx-1252227294{font-size:14px;font-weight:400;}"];
9426
- _defaultExport$c.__hash = "1252227294";
9470
+ const _defaultExport$c = [".filterContainer.jsx-2645272461{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:".concat(ui.spacers.dp12, ";margin-top:").concat(ui.spacers.dp8, ";}"), ".emptyList.jsx-2645272461{text-align:center;font-size:14px;line-height:16px;margin:".concat(ui.spacers.dp24, " 0 0;color:").concat(ui.colors.grey700, ";}"), ".rightHeader.jsx-2645272461{font-size:14px;font-weight:400;}", ".leftHeader.jsx-2645272461{padding:".concat(ui.spacers.dp8, " 0;}")];
9471
+ _defaultExport$c.__hash = "2645272461";
9427
9472
 
9428
9473
  const _defaultExport$d = [".wrapper.jsx-1613747048:last-child{margin-bottom:".concat(ui.spacers.dp4, ";}"), ".chip.jsx-1613747048{display:inline-block;background:".concat(ui.colors.grey200, ";font-size:14px;line-height:16px;padding:2px ").concat(ui.spacers.dp8, " 2px ").concat(ui.spacers.dp4, ";margin-top:").concat(ui.spacers.dp4, ";margin-left:").concat(ui.spacers.dp8, ";border-radius:3px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}"), ".chip.jsx-1613747048:hover{background:".concat(ui.colors.grey300, ";}"), ".selected.jsx-1613747048{background:".concat(ui.theme.secondary100, ";color:").concat(ui.theme.secondary900, ";}"), ".selected.jsx-1613747048 .icon path{fill:".concat(ui.theme.secondary700, ";}"), ".selected.jsx-1613747048:hover{background:#c9edeb;}", ".highlighted.jsx-1613747048,.highlighted.jsx-1613747048:hover{background:".concat(ui.theme.secondary800, ";color:").concat(ui.colors.white, ";}"), ".highlighted.jsx-1613747048 .icon path{fill:".concat(ui.colors.white, ";}"), ".disabled.jsx-1613747048{opacity:0.3;cursor:not-allowed;}", ".icon.jsx-1613747048,.label.jsx-1613747048{line-height:18px;}", ".icon.jsx-1613747048{margin-right:".concat(ui.spacers.dp4, ";display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:text-bottom;}"), ".label.jsx-1613747048{font-size:14px;}"];
9429
9474
  _defaultExport$d.__hash = "1613747048";
@@ -9587,7 +9632,7 @@ class PeriodTransfer extends React.Component {
9587
9632
  });
9588
9633
 
9589
9634
  _defineProperty(this, "renderEmptySelection", () => /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("p", {
9590
- className: "jsx-".concat(_defaultExport$c.__hash) + " " + "emptySelection"
9635
+ className: "jsx-".concat(_defaultExport$c.__hash) + " " + "emptyList"
9591
9636
  }, i18n.t('No periods selected')), /*#__PURE__*/React__default.createElement(_JSXStyle, {
9592
9637
  id: _defaultExport$c.__hash
9593
9638
  }, _defaultExport$c)));
@@ -10055,54 +10100,173 @@ var GenericIcon = /*#__PURE__*/React__default.createElement("svg", {
10055
10100
  d: "M11,5 L11,11 L5,11 L5,5 L11,5 Z M10,6 L6,6 L6,10 L10,10 L10,6 Z"
10056
10101
  }));
10057
10102
 
10103
+ const useDebounce = (value, delay) => {
10104
+ const [debouncedValue, setDebouncedValue] = React.useState(value);
10105
+ React.useEffect(() => {
10106
+ const handler = setTimeout(() => {
10107
+ setDebouncedValue(value);
10108
+ }, delay);
10109
+ return () => {
10110
+ clearTimeout(handler);
10111
+ };
10112
+ }, [value, delay]);
10113
+ return debouncedValue;
10114
+ };
10115
+
10116
+ const LeftHeader = ({
10117
+ filter,
10118
+ setFilter
10119
+ }) => /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("div", {
10120
+ className: "jsx-".concat(_defaultExport$c.__hash) + " " + "leftHeader"
10121
+ }, /*#__PURE__*/React__default.createElement(ui.InputField, {
10122
+ value: filter,
10123
+ onChange: ({
10124
+ value
10125
+ }) => setFilter(value),
10126
+ placeholder: i18n.t('Search')
10127
+ })), /*#__PURE__*/React__default.createElement(_JSXStyle, {
10128
+ id: _defaultExport$c.__hash
10129
+ }, _defaultExport$c));
10130
+
10131
+ LeftHeader.propTypes = {
10132
+ filter: PropTypes.string,
10133
+ setFilter: PropTypes.func
10134
+ };
10135
+
10136
+ const EmptySelection = () => /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("p", {
10137
+ className: "jsx-".concat(_defaultExport$c.__hash) + " " + "emptyList"
10138
+ }, i18n.t('No items selected')), /*#__PURE__*/React__default.createElement(_JSXStyle, {
10139
+ id: _defaultExport$c.__hash
10140
+ }, _defaultExport$c));
10141
+
10142
+ const RightHeader = () => /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("p", {
10143
+ className: "jsx-".concat(_defaultExport$c.__hash) + " " + "rightHeader"
10144
+ }, i18n.t('Selected Items')), /*#__PURE__*/React__default.createElement(_JSXStyle, {
10145
+ id: _defaultExport$c.__hash
10146
+ }, _defaultExport$c));
10147
+
10148
+ const SourceEmptyPlaceholder = ({
10149
+ loading,
10150
+ filter,
10151
+ options,
10152
+ noItemsMessage
10153
+ }) => {
10154
+ let message = '';
10155
+
10156
+ if (!loading && !options.length && !filter) {
10157
+ message = noItemsMessage;
10158
+ } else if (!loading && !options.length && filter) {
10159
+ message = i18n.t('Nothing found for {{searchTerm}}', {
10160
+ searchTerm: filter
10161
+ });
10162
+ }
10163
+
10164
+ return message && /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("p", {
10165
+ className: "jsx-".concat(_defaultExport$c.__hash) + " " + "emptyList"
10166
+ }, message), /*#__PURE__*/React__default.createElement(_JSXStyle, {
10167
+ id: _defaultExport$c.__hash
10168
+ }, _defaultExport$c));
10169
+ };
10170
+
10171
+ SourceEmptyPlaceholder.propTypes = {
10172
+ filter: PropTypes.string,
10173
+ loading: PropTypes.bool,
10174
+ noItemsMessage: PropTypes.string,
10175
+ options: PropTypes.array
10176
+ };
10177
+
10058
10178
  const ItemSelector$1 = ({
10059
- allItems,
10179
+ initialSelected,
10180
+ noItemsMessage,
10181
+ onFetch,
10060
10182
  onSelect,
10061
- initialSelectedItemIds,
10062
- leftHeader,
10063
10183
  rightFooter
10064
10184
  }) => {
10065
- const [selectedItemIds, setSelectedItemIds] = React.useState(initialSelectedItemIds);
10185
+ const [state, setState] = React.useState({
10186
+ filter: '',
10187
+ selected: initialSelected,
10188
+ options: [],
10189
+ loading: true,
10190
+ nextPage: null
10191
+ });
10066
10192
 
10067
- const renderEmptySelection = () => /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("p", {
10068
- className: "jsx-".concat(_defaultExport$c.__hash) + " " + "emptySelection"
10069
- }, i18n.t('No items selected')), /*#__PURE__*/React__default.createElement(_JSXStyle, {
10070
- id: _defaultExport$c.__hash
10071
- }, _defaultExport$c));
10193
+ const setFilter = filter => setState(state => _objectSpread2(_objectSpread2({}, state), {}, {
10194
+ filter
10195
+ }));
10072
10196
 
10073
- const renderRightHeader = () => /*#__PURE__*/React__default.createElement(React__default.Fragment, null, /*#__PURE__*/React__default.createElement("p", {
10074
- className: "jsx-".concat(_defaultExport$c.__hash) + " " + "rightHeader"
10075
- }, i18n.t('Selected Items')), /*#__PURE__*/React__default.createElement(_JSXStyle, {
10076
- id: _defaultExport$c.__hash
10077
- }, _defaultExport$c));
10197
+ const setSelected = selected => setState(state => _objectSpread2(_objectSpread2({}, state), {}, {
10198
+ selected
10199
+ }));
10200
+
10201
+ const debouncedFilter = useDebounce(state.filter, 500);
10202
+
10203
+ const fetchItems = async page => {
10204
+ var _result$dimensionItem;
10078
10205
 
10206
+ setState(state => _objectSpread2(_objectSpread2({}, state), {}, {
10207
+ loading: true
10208
+ }));
10209
+ const result = await onFetch(page, state.filter);
10210
+ const newOptions = (_result$dimensionItem = result.dimensionItems) === null || _result$dimensionItem === void 0 ? void 0 : _result$dimensionItem.map(({
10211
+ id,
10212
+ name,
10213
+ disabled
10214
+ }) => ({
10215
+ label: name,
10216
+ value: id,
10217
+ disabled
10218
+ }));
10219
+ setState(state => _objectSpread2(_objectSpread2({}, state), {}, {
10220
+ loading: false,
10221
+ options: page > 1 ? [...state.options, ...newOptions] : newOptions,
10222
+ nextPage: result.nextPage
10223
+ }));
10224
+ };
10225
+
10226
+ React.useEffect(() => {
10227
+ fetchItems(1);
10228
+ }, [debouncedFilter]);
10229
+
10230
+ const _onChange = React.useCallback(newSelected => {
10231
+ const newSelectedWithLabel = newSelected.map(value => ({
10232
+ value,
10233
+ label: [...state.options, ...state.selected].find(item => item.value === value).label
10234
+ }));
10235
+ setSelected(newSelectedWithLabel);
10236
+ onSelect(newSelectedWithLabel);
10237
+ }, [state.options, state.selected]);
10238
+
10239
+ const onEndReached = React.useCallback(() => {
10240
+ if (state.nextPage) {
10241
+ fetchItems(state.nextPage);
10242
+ }
10243
+ }, [state.nextPage]);
10079
10244
  return /*#__PURE__*/React__default.createElement(ui.Transfer, {
10080
10245
  onChange: ({
10081
10246
  selected
10082
- }) => {
10083
- setSelectedItemIds(selected);
10084
- onSelect(selected);
10085
- },
10086
- selected: selectedItemIds,
10087
- leftHeader: leftHeader,
10088
- filterable: true,
10089
- filterPlaceholder: i18n.t('Search'),
10247
+ }) => _onChange(selected),
10248
+ selected: state.selected.map(item => item.value),
10249
+ options: [...state.options, ...state.selected],
10250
+ loading: state.loading,
10251
+ loadingPicked: state.loading,
10252
+ sourceEmptyPlaceholder: /*#__PURE__*/React__default.createElement(SourceEmptyPlaceholder, {
10253
+ loading: state.loading,
10254
+ filter: debouncedFilter,
10255
+ options: state.options,
10256
+ noItemsMessage: noItemsMessage
10257
+ }),
10258
+ onEndReached: onEndReached,
10259
+ leftHeader: /*#__PURE__*/React__default.createElement(LeftHeader, {
10260
+ filter: state.filter,
10261
+ setFilter: setFilter
10262
+ }),
10090
10263
  enableOrderChange: true,
10091
10264
  height: TRANSFER_HEIGHT,
10092
10265
  optionsWidth: TRANSFER_OPTIONS_WIDTH,
10093
10266
  selectedWidth: TRANSFER_SELECTED_WIDTH,
10094
- selectedEmptyComponent: renderEmptySelection(),
10095
- rightHeader: renderRightHeader(),
10267
+ selectedEmptyComponent: /*#__PURE__*/React__default.createElement(EmptySelection, null),
10268
+ rightHeader: /*#__PURE__*/React__default.createElement(RightHeader, null),
10096
10269
  rightFooter: rightFooter,
10097
- options: allItems.map(({
10098
- id,
10099
- name,
10100
- disabled
10101
- }) => ({
10102
- label: name,
10103
- value: id,
10104
- disabled
10105
- })),
10106
10270
  renderOption: props => /*#__PURE__*/React__default.createElement(TransferOption, _extends({}, props, {
10107
10271
  icon: GenericIcon
10108
10272
  }))
@@ -10110,61 +10274,54 @@ const ItemSelector$1 = ({
10110
10274
  };
10111
10275
 
10112
10276
  ItemSelector$1.propTypes = {
10113
- allItems: PropTypes.arrayOf(PropTypes.shape({
10114
- id: PropTypes.string,
10115
- name: PropTypes.string
10116
- })).isRequired,
10277
+ onFetch: PropTypes.func.isRequired,
10117
10278
  onSelect: PropTypes.func.isRequired,
10118
- initialSelectedItemIds: PropTypes.arrayOf(PropTypes.string),
10119
- leftHeader: PropTypes.node,
10279
+ initialSelected: PropTypes.arrayOf(PropTypes.exact({
10280
+ label: PropTypes.string.isRequired,
10281
+ value: PropTypes.string.isRequired
10282
+ })),
10283
+ noItemsMessage: PropTypes.string,
10120
10284
  rightFooter: PropTypes.node
10121
10285
  };
10122
10286
  ItemSelector$1.defaultProps = {
10123
- initialSelectedItemIds: []
10287
+ initialSelected: []
10124
10288
  };
10125
10289
 
10126
10290
  const DynamicDimension = ({
10127
- context,
10128
10291
  dimensionId,
10129
10292
  onSelect,
10130
10293
  selectedItems,
10131
10294
  rightFooter
10132
10295
  }) => {
10133
- const [items, setItems] = React.useState([]);
10134
- React.useEffect(() => {
10135
- if (!items || !items.length) {
10136
- getItems();
10137
- }
10138
- }, []);
10296
+ const dataEngine = appRuntime.useDataEngine();
10139
10297
 
10140
- const getItems = async () => setItems(await apiFetchItemsByDimension(context, dimensionId)); // TODO: refactor to use the data engine instead
10141
- // TODO: *** Once pagination is in use, check if there are items that are in selectedItems that needs to be added to the items list
10142
- // TODO: This needs to be refactored to use a loading spinner once Transfer supports it: https://jira.dhis2.org/browse/TECH-379
10143
-
10144
-
10145
- const onSelectItems = selectedItemIds => {
10146
- const formattedItems = selectedItemIds.map(id => ({
10147
- id,
10148
- name: items.find(item => item.id === id).name // TODO: Re: *** above, this won't work with pagination
10149
-
10150
- })); // TODO: fetch the name from somewhere else, as not all content in selectedItems might be present in the items list
10298
+ const fetchItems = (page, searchTerm) => apiFetchItemsByDimension({
10299
+ dataEngine,
10300
+ dimensionId,
10301
+ searchTerm,
10302
+ page
10303
+ });
10151
10304
 
10152
- onSelect({
10153
- dimensionId: dimensionId,
10154
- items: formattedItems
10155
- });
10156
- };
10305
+ const onSelectItems = selectedItem => onSelect({
10306
+ dimensionId: dimensionId,
10307
+ items: selectedItem.map(item => ({
10308
+ id: item.value,
10309
+ name: item.label
10310
+ }))
10311
+ });
10157
10312
 
10158
10313
  return /*#__PURE__*/React__default.createElement(ItemSelector$1, {
10314
+ initialSelected: selectedItems.map(item => ({
10315
+ value: item.id,
10316
+ label: item.name
10317
+ })),
10318
+ noItemsMessage: i18n.t('Nothing found'),
10319
+ onFetch: fetchItems,
10159
10320
  onSelect: onSelectItems,
10160
- allItems: items,
10161
- initialSelectedItemIds: selectedItems.map(item => item.id),
10162
- rightFooter: rightFooter // TODO: Pass in a func prop to fetch items, instead of fetching them on this level, to enable the loading spinner?
10163
-
10321
+ rightFooter: rightFooter
10164
10322
  });
10165
10323
  };
10166
10324
  DynamicDimension.propTypes = {
10167
- context: PropTypes.object.isRequired,
10168
10325
  dimensionId: PropTypes.string.isRequired,
10169
10326
  selectedItems: PropTypes.arrayOf(PropTypes.shape({
10170
10327
  id: PropTypes.string,
@@ -14008,6 +14165,67 @@ PivotTable.propTypes = {
14008
14165
  onToggleContextualMenu: PropTypes.func
14009
14166
  };
14010
14167
 
14168
+ const axisGetDimension = (axis, dimensionId) => AXIS.isValid(axis) && axis.find(dimension => dimensionIs(dimension, dimensionId));
14169
+
14170
+ const axisHasDimension = (axis, dimensionId) => Boolean(axisGetDimension(axis, dimensionId));
14171
+
14172
+ const layoutReplaceDimension = (layout, dimensionId, items) => {
14173
+ const axisId = DEFAULT_AXIS_IDS.find(a => axisHasDimension(layout[a], dimensionId));
14174
+
14175
+ if (!axisId) {
14176
+ return Object.assign({}, layout);
14177
+ }
14178
+
14179
+ const newAxisDimensions = layout[axisId].map(dimension => {
14180
+ if (dimensionIs(dimension, dimensionId)) {
14181
+ return Object.assign({}, dimension, {
14182
+ items
14183
+ });
14184
+ }
14185
+
14186
+ return dimension;
14187
+ });
14188
+ return Object.assign({}, layout, {
14189
+ [axisId]: newAxisDimensions
14190
+ });
14191
+ };
14192
+
14193
+ const layoutGetAllAxes = layout => [layout[AXIS_ID_COLUMNS], layout[AXIS_ID_ROWS], layout[AXIS_ID_FILTERS]];
14194
+
14195
+ const layoutGetAllDimensions = layout => layoutGetAllAxes(layout).reduce((allDimensions, axis) => {
14196
+ allDimensions.push(...axis);
14197
+ return allDimensions;
14198
+ }, []);
14199
+
14200
+ const layoutGetDimension = (layout, dimensionId) => layoutGetAllDimensions(layout).find(dimension => dimensionIs(dimension, dimensionId));
14201
+
14202
+ const isOuLevelIntId = id => ouIdHelper.hasLevelPrefix(id) ? Number.isInteger(parseInt(ouIdHelper.removePrefix(id), 10)) : false;
14203
+
14204
+ const replaceNumericOuLevelWithUid = ouLevels => item => {
14205
+ if (!isOuLevelIntId(item.id)) {
14206
+ return item;
14207
+ }
14208
+
14209
+ const ouIntId = parseInt(ouIdHelper.removePrefix(item.id), 10);
14210
+ const ouUid = ouLevels.find(l => parseInt(l.level, 10) === ouIntId).id;
14211
+ return Object.assign({}, item, {
14212
+ id: ouIdHelper.addLevelPrefix(ouUid)
14213
+ });
14214
+ };
14215
+
14216
+ const convertOuLevelsToUids = (ouLevels, layout) => {
14217
+ const ouDimension = layoutGetDimension(layout, DIMENSION_ID_ORGUNIT);
14218
+ const hasNumericOuLevels = ouDimension && dimensionGetItems(ouDimension).some(item => isOuLevelIntId(item.id));
14219
+
14220
+ if (hasNumericOuLevels) {
14221
+ const replaceNumericOuLevel = replaceNumericOuLevelWithUid(ouLevels);
14222
+ const updatedOuItems = dimensionGetItems(ouDimension).map(replaceNumericOuLevel);
14223
+ return layoutReplaceDimension(layout, DIMENSION_ID_ORGUNIT, updatedOuItems);
14224
+ }
14225
+
14226
+ return layout;
14227
+ };
14228
+
14011
14229
  const hasRelativeItems = (dimension, itemIds = []) => dimension === DIMENSION_ID_ASSIGNED_CATEGORIES || dimension === DIMENSION_ID_ORGUNIT && Array.isArray(itemIds) && itemIds.some(id => ouIdHelper.hasLevelPrefix(id) || ouIdHelper.hasGroupPrefix(id) || ['USER_ORGUNIT', 'USER_ORGUNIT_CHILDREN', 'USER_ORGUNIT_GRAND_CHILDREN'].includes(id)) || dimension === DIMENSION_ID_PERIOD && Array.isArray(itemIds) && itemIds.some(id => getRelativePeriodIds().includes(id));
14012
14230
 
14013
14231
  const LAYOUT = {
@@ -14027,13 +14245,6 @@ const layoutFilterDimensions = (layout, dimensionIds) => {
14027
14245
  return filteredLayout;
14028
14246
  };
14029
14247
 
14030
- const layoutGetAllAxes = layout => [layout[AXIS_ID_COLUMNS], layout[AXIS_ID_ROWS], layout[AXIS_ID_FILTERS]];
14031
-
14032
- const layoutGetAllDimensions = layout => layoutGetAllAxes(layout).reduce((allDimensions, axis) => {
14033
- allDimensions.push(...axis);
14034
- return allDimensions;
14035
- }, []);
14036
-
14037
14248
  const axisGetAllItems = axis => axis.reduce((allItems, dimension) => {
14038
14249
  allItems.push(...dimensionGetItems(dimension));
14039
14250
  return allItems;
@@ -14070,35 +14281,8 @@ const layoutGetAxisIdDimensionIdsObject = layout => DEFAULT_AXIS_IDS.reduce((obj
14070
14281
  return obj;
14071
14282
  }, {});
14072
14283
 
14073
- const layoutGetDimension = (layout, dimensionId) => layoutGetAllDimensions(layout).find(dimension => dimensionIs(dimension, dimensionId));
14074
-
14075
14284
  const layoutGetDimensionItems = (layout, dimensionId) => dimensionGetItems(layoutGetDimension(layout, dimensionId));
14076
14285
 
14077
- const axisGetDimension = (axis, dimensionId) => AXIS.isValid(axis) && axis.find(dimension => dimensionIs(dimension, dimensionId));
14078
-
14079
- const axisHasDimension = (axis, dimensionId) => Boolean(axisGetDimension(axis, dimensionId));
14080
-
14081
- const layoutReplaceDimension = (layout, dimensionId, items) => {
14082
- const axisId = DEFAULT_AXIS_IDS.find(a => axisHasDimension(layout[a], dimensionId));
14083
-
14084
- if (!axisId) {
14085
- return Object.assign({}, layout);
14086
- }
14087
-
14088
- const newAxisDimensions = layout[axisId].map(dimension => {
14089
- if (dimensionIs(dimension, dimensionId)) {
14090
- return Object.assign({}, dimension, {
14091
- items
14092
- });
14093
- }
14094
-
14095
- return dimension;
14096
- });
14097
- return Object.assign({}, layout, {
14098
- [axisId]: newAxisDimensions
14099
- });
14100
- };
14101
-
14102
14286
  const dimensionGetItemIds = dimension => dimensionGetItems(dimension).map(item => itemGetId(item));
14103
14287
 
14104
14288
  const layoutGetDimensionIdItemIdsObject = layout => layoutGetAllDimensions(layout).reduce((obj, dimension) => {
@@ -14957,9 +15141,19 @@ function getYearOnYear$1 (store, layout, extraOptions) {
14957
15141
  }, []);
14958
15142
  }
14959
15143
 
14960
- return {
14961
- categories
14962
- };
15144
+ const labelFontStyle = layout.fontStyle[FONT_STYLE_CATEGORY_AXIS_LABELS];
15145
+ return objectClean({
15146
+ categories,
15147
+ title: getAxisTitle(layout.domainAxisLabel, layout.fontStyle[FONT_STYLE_HORIZONTAL_AXIS_TITLE], FONT_STYLE_HORIZONTAL_AXIS_TITLE, layout.type),
15148
+ labels: labelFontStyle ? {
15149
+ style: {
15150
+ color: labelFontStyle[FONT_STYLE_OPTION_TEXT_COLOR],
15151
+ fontSize: "".concat(labelFontStyle[FONT_STYLE_OPTION_FONT_SIZE], "px"),
15152
+ fontWeight: labelFontStyle[FONT_STYLE_OPTION_BOLD] ? FONT_STYLE_OPTION_BOLD : 'normal',
15153
+ fontStyle: labelFontStyle[FONT_STYLE_OPTION_ITALIC] ? FONT_STYLE_OPTION_ITALIC : 'normal'
15154
+ }
15155
+ } : {}
15156
+ });
14963
15157
  }
14964
15158
 
14965
15159
  function getTwoCategory$1 (store, layout) {
@@ -15184,13 +15378,9 @@ function getPlotLineLabelStyle(fontStyle) {
15184
15378
  };
15185
15379
  }
15186
15380
 
15187
- function getMinValue(layout) {
15188
- return isNumeric(layout.rangeAxisMinValue) ? layout.rangeAxisMinValue : DEFAULT_MIN_VALUE;
15189
- }
15381
+ const getMinValue = (rangeAxisMinValue, dataValues) => isNumeric(rangeAxisMinValue) ? rangeAxisMinValue : (dataValues === null || dataValues === void 0 ? void 0 : dataValues.some(value => value < DEFAULT_MIN_VALUE)) ? undefined : DEFAULT_MIN_VALUE;
15190
15382
 
15191
- function getMaxValue(layout) {
15192
- return isNumeric(layout.rangeAxisMaxValue) ? layout.rangeAxisMaxValue : undefined;
15193
- }
15383
+ const getMaxValue = (rangeAxisMaxValue, dataValues) => isNumeric(rangeAxisMaxValue) ? rangeAxisMaxValue : (dataValues === null || dataValues === void 0 ? void 0 : dataValues.every(value => value < DEFAULT_MIN_VALUE)) ? DEFAULT_MIN_VALUE : undefined;
15194
15384
 
15195
15385
  function getSteps(layout) {
15196
15386
  return isNumeric(layout.rangeAxisSteps) ? layout.rangeAxisSteps : undefined;
@@ -15298,14 +15488,15 @@ function getDefault$3(layout, series, extraOptions) {
15298
15488
 
15299
15489
  const axes = [];
15300
15490
  const filteredSeries = (_layout$series = layout.series) === null || _layout$series === void 0 ? void 0 : _layout$series.filter(layoutSeriesItem => series.some(seriesItem => seriesItem.id === layoutSeriesItem.dimensionItem));
15491
+ const dataValues = series === null || series === void 0 ? void 0 : series.map(item => item.data).flat();
15301
15492
 
15302
15493
  if (isDualAxisType(layout.type) && hasCustomAxes(filteredSeries) && !axisHasRelativeItems(layout.columns)) {
15303
15494
  const axisIdsMap = getAxisIdsMap(layout.series, series);
15304
15495
  axes.push(...getMultipleAxes(extraOptions.multiAxisTheme, [...new Set(Object.keys(axisIdsMap))].sort((a, b) => a - b)));
15305
15496
  } else {
15306
15497
  axes.push(objectClean({
15307
- min: getMinValue(layout),
15308
- max: getMaxValue(layout),
15498
+ min: getMinValue(layout.rangeAxisMinValue, dataValues),
15499
+ max: getMaxValue(layout.rangeAxisMaxValue, dataValues),
15309
15500
  tickAmount: getSteps(layout),
15310
15501
  title: getAxisTitle(layout.rangeAxisLabel, layout.fontStyle[FONT_STYLE_VERTICAL_AXIS_TITLE], FONT_STYLE_VERTICAL_AXIS_TITLE, layout.type),
15311
15502
  plotLines: arrayClean([getTargetLine(layout), getBaseLine(layout)]),
@@ -16130,7 +16321,8 @@ const DEFAULT_TRENDLINE = {
16130
16321
  enabled: false,
16131
16322
  symbol: 'circle',
16132
16323
  radius: 2
16133
- }
16324
+ },
16325
+ zIndex: 1
16134
16326
  };
16135
16327
  const isRegressionIneligible = type => arrayContains([VIS_TYPE_GAUGE, VIS_TYPE_PIE], type);
16136
16328
  function addTrendLines (layout, series, isStacked) {
@@ -17165,6 +17357,7 @@ exports.axisHasPeriodDimension = axisHasPeriodDimension;
17165
17357
  exports.axisIsEmpty = axisIsEmpty;
17166
17358
  exports.canDimensionBeAddedToAxis = canDimensionBeAddedToAxisByVisType;
17167
17359
  exports.colorSets = colorSets;
17360
+ exports.convertOuLevelsToUids = convertOuLevelsToUids;
17168
17361
  exports.createVisualization = createVisualization;
17169
17362
  exports.defaultFontStyle = defaultFontStyle;
17170
17363
  exports.defaultVisType = defaultVisType;