@dhis2/analytics 26.4.1 → 26.6.0

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 (89) hide show
  1. package/build/cjs/__fixtures__/fixtures.js +1 -0
  2. package/build/cjs/__fixtures__/json/api/analytics/outlierDetection.json +213 -0
  3. package/build/cjs/api/analytics/Analytics.js +7 -0
  4. package/build/cjs/api/analytics/AnalyticsAggregate.js +27 -1
  5. package/build/cjs/api/analytics/AnalyticsBase.js +32 -13
  6. package/build/cjs/api/analytics/AnalyticsRequest.js +33 -10
  7. package/build/cjs/api/analytics/AnalyticsRequestBase.js +12 -6
  8. package/build/cjs/api/analytics/AnalyticsRequestPropertiesMixin.js +19 -0
  9. package/build/cjs/api/analytics/AnalyticsResponse.js +42 -39
  10. package/build/cjs/api/analytics/AnalyticsTrackedEntities.js +31 -0
  11. package/build/cjs/api/analytics/__tests__/Analytics.spec.js +5 -0
  12. package/build/cjs/api/analytics/__tests__/AnalyticsAggregate.spec.js +29 -0
  13. package/build/cjs/api/analytics/__tests__/AnalyticsBase.spec.js +36 -2
  14. package/build/cjs/api/analytics/utils.js +21 -2
  15. package/build/cjs/components/DataDimension/DataDimension.js +31 -7
  16. package/build/cjs/components/DataDimension/DataTypeSelector.js +29 -8
  17. package/build/cjs/components/DataDimension/GroupSelector.js +7 -7
  18. package/build/cjs/components/DataDimension/ItemSelector.js +79 -61
  19. package/build/cjs/components/PeriodDimension/PeriodDimension.js +5 -2
  20. package/build/cjs/components/PeriodDimension/PeriodTransfer.js +64 -31
  21. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +1 -1
  22. package/build/cjs/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +1 -12
  23. package/build/cjs/components/VisTypeIcon.js +6 -1
  24. package/build/cjs/index.js +43 -1
  25. package/build/cjs/locales/en/translations.json +5 -1
  26. package/build/cjs/modules/__tests__/getAdaptedUiLayoutByType.spec.js +15 -0
  27. package/build/cjs/modules/axis.js +4 -0
  28. package/build/cjs/modules/getAdaptedUiLayoutByType.js +9 -0
  29. package/build/cjs/modules/layout/axisGetDimensionIds.js +1 -1
  30. package/build/cjs/modules/layout/dimension.js +9 -2
  31. package/build/cjs/modules/layout/dimensionCreate.js +3 -0
  32. package/build/cjs/modules/layout/dimensionGetId.js +9 -3
  33. package/build/cjs/modules/layout/layoutFilterDimensions.js +1 -1
  34. package/build/cjs/modules/layout/layoutGetAxisIdDimensionIdsObject.js +1 -1
  35. package/build/cjs/modules/layout/layoutGetDimensionIdItemIdsObject.js +1 -1
  36. package/build/cjs/modules/layout/layoutHasDynamicDimension.js +1 -1
  37. package/build/cjs/modules/layoutTypes.js +4 -2
  38. package/build/cjs/modules/layoutUiRules/__tests__/rules.spec.js +13 -1
  39. package/build/cjs/modules/layoutUiRules/index.js +12 -0
  40. package/build/cjs/modules/layoutUiRules/rules.js +22 -2
  41. package/build/cjs/modules/layoutUiRules/rulesHelper.js +4 -2
  42. package/build/cjs/modules/layoutUiRules/rulesUtils.js +7 -2
  43. package/build/cjs/modules/visTypeToLayoutType.js +2 -1
  44. package/build/cjs/modules/visTypes.js +9 -3
  45. package/build/es/__fixtures__/fixtures.js +1 -0
  46. package/build/es/__fixtures__/json/api/analytics/outlierDetection.json +213 -0
  47. package/build/es/api/analytics/Analytics.js +7 -0
  48. package/build/es/api/analytics/AnalyticsAggregate.js +27 -1
  49. package/build/es/api/analytics/AnalyticsBase.js +31 -13
  50. package/build/es/api/analytics/AnalyticsRequest.js +33 -10
  51. package/build/es/api/analytics/AnalyticsRequestBase.js +12 -6
  52. package/build/es/api/analytics/AnalyticsRequestPropertiesMixin.js +19 -0
  53. package/build/es/api/analytics/AnalyticsResponse.js +42 -39
  54. package/build/es/api/analytics/AnalyticsTrackedEntities.js +24 -0
  55. package/build/es/api/analytics/__tests__/Analytics.spec.js +5 -0
  56. package/build/es/api/analytics/__tests__/AnalyticsAggregate.spec.js +29 -0
  57. package/build/es/api/analytics/__tests__/AnalyticsBase.spec.js +34 -1
  58. package/build/es/api/analytics/utils.js +18 -1
  59. package/build/es/components/DataDimension/DataDimension.js +27 -6
  60. package/build/es/components/DataDimension/DataTypeSelector.js +30 -9
  61. package/build/es/components/DataDimension/GroupSelector.js +7 -7
  62. package/build/es/components/DataDimension/ItemSelector.js +80 -62
  63. package/build/es/components/PeriodDimension/PeriodDimension.js +5 -2
  64. package/build/es/components/PeriodDimension/PeriodTransfer.js +65 -32
  65. package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodDimension.spec.js.snap +1 -1
  66. package/build/es/components/PeriodDimension/__tests__/__snapshots__/PeriodSelector.spec.js.snap +1 -12
  67. package/build/es/components/VisTypeIcon.js +8 -3
  68. package/build/es/index.js +4 -4
  69. package/build/es/locales/en/translations.json +5 -1
  70. package/build/es/modules/__tests__/getAdaptedUiLayoutByType.spec.js +16 -1
  71. package/build/es/modules/axis.js +5 -1
  72. package/build/es/modules/getAdaptedUiLayoutByType.js +10 -1
  73. package/build/es/modules/layout/axisGetDimensionIds.js +1 -1
  74. package/build/es/modules/layout/dimension.js +7 -1
  75. package/build/es/modules/layout/dimensionCreate.js +4 -1
  76. package/build/es/modules/layout/dimensionGetId.js +10 -4
  77. package/build/es/modules/layout/layoutFilterDimensions.js +1 -1
  78. package/build/es/modules/layout/layoutGetAxisIdDimensionIdsObject.js +1 -1
  79. package/build/es/modules/layout/layoutGetDimensionIdItemIdsObject.js +1 -1
  80. package/build/es/modules/layout/layoutHasDynamicDimension.js +1 -1
  81. package/build/es/modules/layoutTypes.js +2 -1
  82. package/build/es/modules/layoutUiRules/__tests__/rules.spec.js +14 -2
  83. package/build/es/modules/layoutUiRules/index.js +2 -2
  84. package/build/es/modules/layoutUiRules/rules.js +22 -3
  85. package/build/es/modules/layoutUiRules/rulesHelper.js +3 -2
  86. package/build/es/modules/layoutUiRules/rulesUtils.js +6 -2
  87. package/build/es/modules/visTypeToLayoutType.js +4 -3
  88. package/build/es/modules/visTypes.js +7 -3
  89. package/package.json +6 -3
@@ -30,14 +30,14 @@ const LeftHeader = _ref => {
30
30
  searchTerm,
31
31
  setSearchTerm,
32
32
  dataType,
33
+ dataTypes,
33
34
  setDataType,
34
35
  group,
35
36
  setGroup,
36
37
  subGroup,
37
38
  setSubGroup,
38
39
  displayNameProp,
39
- dataTest,
40
- supportsEDI
40
+ dataTest
41
41
  } = _ref;
42
42
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
43
43
  className: `jsx-${_DimensionSelectorStyle.default.__hash}` + " " + "leftHeader"
@@ -58,8 +58,8 @@ const LeftHeader = _ref => {
58
58
  currentDataType: dataType,
59
59
  onChange: setDataType,
60
60
  dataTest: `${dataTest}-data-types-select-field`,
61
- includeCalculations: supportsEDI
62
- }), _dataTypes.dataTypeMap[dataType] && dataType !== _dataTypes.DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM && /*#__PURE__*/_react.default.createElement(_GroupSelector.default, {
61
+ dataTypes: dataTypes
62
+ }), ![_dataTypes.DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM, _dataTypes.DIMENSION_TYPE_ALL].includes(dataType) && /*#__PURE__*/_react.default.createElement(_GroupSelector.default, {
63
63
  dataType: dataType,
64
64
  displayNameProp: displayNameProp,
65
65
  currentGroup: group,
@@ -74,6 +74,7 @@ const LeftHeader = _ref => {
74
74
  LeftHeader.propTypes = {
75
75
  dataTest: _propTypes.default.string,
76
76
  dataType: _propTypes.default.string,
77
+ dataTypes: _propTypes.default.array,
77
78
  displayNameProp: _propTypes.default.string,
78
79
  group: _propTypes.default.string,
79
80
  searchTerm: _propTypes.default.string,
@@ -81,8 +82,7 @@ LeftHeader.propTypes = {
81
82
  setGroup: _propTypes.default.func,
82
83
  setSearchTerm: _propTypes.default.func,
83
84
  setSubGroup: _propTypes.default.func,
84
- subGroup: _propTypes.default.string,
85
- supportsEDI: _propTypes.default.bool
85
+ subGroup: _propTypes.default.string
86
86
  };
87
87
  const EmptySelection = () => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("p", {
88
88
  className: `jsx-${_DimensionSelectorStyle.default.__hash}` + " " + "emptyList"
@@ -91,22 +91,22 @@ const EmptySelection = () => /*#__PURE__*/_react.default.createElement(_react.de
91
91
  }, _DimensionSelectorStyle.default));
92
92
  const RightHeader = _ref3 => {
93
93
  let {
94
- infoText
94
+ infoBoxMessage
95
95
  } = _ref3;
96
96
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("p", {
97
97
  className: `jsx-${_DimensionSelectorStyle.default.__hash}` + " " + "rightHeader"
98
- }, _index.default.t('Selected Items')), infoText && /*#__PURE__*/_react.default.createElement("div", {
98
+ }, _index.default.t('Selected Items')), infoBoxMessage && /*#__PURE__*/_react.default.createElement("div", {
99
99
  className: `jsx-${_DimensionSelectorStyle.default.__hash}` + " " + "info-container"
100
100
  }, /*#__PURE__*/_react.default.createElement("div", {
101
101
  className: `jsx-${_DimensionSelectorStyle.default.__hash}`
102
102
  }, /*#__PURE__*/_react.default.createElement(_ui.IconInfo16, null)), /*#__PURE__*/_react.default.createElement("span", {
103
103
  className: `jsx-${_DimensionSelectorStyle.default.__hash}` + " " + "info-text"
104
- }, infoText)), /*#__PURE__*/_react.default.createElement(_style.default, {
104
+ }, infoBoxMessage)), /*#__PURE__*/_react.default.createElement(_style.default, {
105
105
  id: _DimensionSelectorStyle.default.__hash
106
106
  }, _DimensionSelectorStyle.default));
107
107
  };
108
108
  RightHeader.propTypes = {
109
- infoText: _propTypes.default.string
109
+ infoBoxMessage: _propTypes.default.string
110
110
  };
111
111
  const SourceEmptyPlaceholder = _ref4 => {
112
112
  let {
@@ -138,6 +138,9 @@ const SourceEmptyPlaceholder = _ref4 => {
138
138
  case _dataTypes.DIMENSION_TYPE_PROGRAM_INDICATOR:
139
139
  message = _index.default.t('No program indicators found');
140
140
  break;
141
+ case _dataTypes.DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM:
142
+ message = _index.default.t('No calculations found');
143
+ break;
141
144
  default:
142
145
  message = _index.default.t('No data');
143
146
  break;
@@ -147,32 +150,37 @@ const SourceEmptyPlaceholder = _ref4 => {
147
150
  switch (dataType) {
148
151
  case _dataTypes.DIMENSION_TYPE_INDICATOR:
149
152
  message = _index.default.t('No indicators found for "{{- searchTerm}}"', {
150
- searchTerm: searchTerm
153
+ searchTerm
151
154
  });
152
155
  break;
153
156
  case _dataTypes.DIMENSION_TYPE_DATA_ELEMENT:
154
157
  message = _index.default.t('No data elements found for "{{- searchTerm}}"', {
155
- searchTerm: searchTerm
158
+ searchTerm
156
159
  });
157
160
  break;
158
161
  case _dataTypes.DIMENSION_TYPE_DATA_SET:
159
162
  message = _index.default.t('No data sets found for "{{- searchTerm}}"', {
160
- searchTerm: searchTerm
163
+ searchTerm
161
164
  });
162
165
  break;
163
166
  case _dataTypes.DIMENSION_TYPE_EVENT_DATA_ITEM:
164
167
  message = _index.default.t('No event data items found for "{{- searchTerm}}"', {
165
- searchTerm: searchTerm
168
+ searchTerm
166
169
  });
167
170
  break;
168
171
  case _dataTypes.DIMENSION_TYPE_PROGRAM_INDICATOR:
169
172
  message = _index.default.t('No program indicators found for "{{- searchTerm}}"', {
170
- searchTerm: searchTerm
173
+ searchTerm
174
+ });
175
+ break;
176
+ case _dataTypes.DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM:
177
+ message = _index.default.t('No calculations found for "{{- searchTerm}}"', {
178
+ searchTerm
171
179
  });
172
180
  break;
173
181
  default:
174
182
  message = _index.default.t('Nothing found for "{{- searchTerm}}"', {
175
- searchTerm: searchTerm
183
+ searchTerm
176
184
  });
177
185
  break;
178
186
  }
@@ -200,18 +208,27 @@ const ItemSelector = _ref5 => {
200
208
  rightFooter,
201
209
  displayNameProp,
202
210
  infoBoxMessage,
211
+ dataTypes,
203
212
  dataTest,
204
- supportsEDI,
205
213
  onEDISave
206
214
  } = _ref5;
207
215
  const [state, setState] = (0, _react.useState)({
208
216
  searchTerm: '',
217
+ dataTypes,
209
218
  filter: {
210
- dataType: _dataTypes.DIMENSION_TYPE_ALL
219
+ dataType: dataTypes.length === 1 ? dataTypes[0].id : _dataTypes.DIMENSION_TYPE_ALL,
220
+ group: null,
221
+ subGroup: dataTypes.length === 1 && dataTypes[0].id === _dataTypes.DIMENSION_TYPE_DATA_ELEMENT ? _dataTypes.TOTALS : null
211
222
  },
212
223
  options: [],
213
224
  loading: true,
214
- nextPage: 1
225
+ nextPage: 1,
226
+ supportsEDI: dataTypes.map(_ref6 => {
227
+ let {
228
+ id
229
+ } = _ref6;
230
+ return id;
231
+ }).includes(_dataTypes.DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM)
215
232
  });
216
233
  const [currentCalculation, setCurrentCalculation] = (0, _react.useState)();
217
234
  const dataEngine = (0, _appRuntime.useDataEngine)();
@@ -219,15 +236,12 @@ const ItemSelector = _ref5 => {
219
236
  ...state,
220
237
  searchTerm
221
238
  }));
222
- const setFilter = filter => setState(state => ({
223
- ...state,
224
- filter
225
- }));
226
239
  const debouncedSearchTerm = (0, _utils.useDebounce)(state.searchTerm, 500);
227
240
  const fetchItems = async page => {
228
241
  var _result$dimensionItem;
229
242
  setState(state => ({
230
243
  ...state,
244
+ nextPage: page === 1 ? 1 : state.nextPage,
231
245
  loading: true
232
246
  }));
233
247
  const result = await (0, _dimensions.apiFetchOptions)({
@@ -290,11 +304,6 @@ const ItemSelector = _ref5 => {
290
304
  }
291
305
  };
292
306
  (0, _utils.useDidUpdateEffect)(() => {
293
- setState(state => ({
294
- ...state,
295
- loading: true,
296
- nextPage: 1
297
- }));
298
307
  fetchItems(1);
299
308
  }, [debouncedSearchTerm, state.filter]);
300
309
  const onChange = newSelected => {
@@ -323,13 +332,13 @@ const ItemSelector = _ref5 => {
323
332
  var _find;
324
333
  return (_find = [...state.options, ...selectedItems].find(item => item.value === value)) === null || _find === void 0 ? void 0 : _find.type;
325
334
  };
326
- const onSaveCalculation = async _ref6 => {
335
+ const onSaveCalculation = async _ref7 => {
327
336
  let {
328
337
  id,
329
338
  name,
330
339
  expression,
331
340
  isNew
332
- } = _ref6;
341
+ } = _ref7;
333
342
  onEDISave({
334
343
  id,
335
344
  name,
@@ -352,10 +361,10 @@ const ItemSelector = _ref5 => {
352
361
  }]);
353
362
  }
354
363
  };
355
- const onDeleteCalculation = _ref7 => {
364
+ const onDeleteCalculation = _ref8 => {
356
365
  let {
357
366
  id
358
- } = _ref7;
367
+ } = _ref8;
359
368
  // close the modal
360
369
  setCurrentCalculation();
361
370
 
@@ -365,11 +374,37 @@ const ItemSelector = _ref5 => {
365
374
  // unselect the deleted calculation
366
375
  onSelect([...selectedItems.filter(item => item.value !== id)]);
367
376
  };
377
+ const onSetGroup = group => setState(state => ({
378
+ ...state,
379
+ nextPage: 1,
380
+ filter: {
381
+ ...state.filter,
382
+ group
383
+ }
384
+ }));
385
+ const onSetSubGroup = subGroup => setState(state => ({
386
+ ...state,
387
+ nextPage: 1,
388
+ filter: {
389
+ ...state.filter,
390
+ subGroup
391
+ }
392
+ }));
393
+ const onSetDataType = dataType => setState(state => ({
394
+ ...state,
395
+ nextPage: 1,
396
+ filter: {
397
+ ...state.filter,
398
+ dataType,
399
+ group: null,
400
+ subGroup: dataType === _dataTypes.DIMENSION_TYPE_DATA_ELEMENT ? _dataTypes.TOTALS : null
401
+ }
402
+ }));
368
403
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ui.Transfer, {
369
- onChange: _ref8 => {
404
+ onChange: _ref9 => {
370
405
  let {
371
406
  selected
372
- } = _ref8;
407
+ } = _ref9;
373
408
  return onChange(selected);
374
409
  },
375
410
  selected: selectedItems.map(item => item.value),
@@ -386,36 +421,19 @@ const ItemSelector = _ref5 => {
386
421
  }),
387
422
  onEndReached: onEndReached,
388
423
  leftHeader: /*#__PURE__*/_react.default.createElement(LeftHeader, {
424
+ dataTypes: state.dataTypes,
389
425
  dataType: state.filter.dataType,
390
- setDataType: dataType => {
391
- setFilter({
392
- ...state.filter,
393
- dataType,
394
- group: null,
395
- subGroup: dataType === _dataTypes.DIMENSION_TYPE_DATA_ELEMENT ? _dataTypes.TOTALS : null
396
- });
397
- },
426
+ setDataType: onSetDataType,
398
427
  group: state.filter.group,
399
- setGroup: group => {
400
- setFilter({
401
- ...state.filter,
402
- group
403
- });
404
- },
428
+ setGroup: onSetGroup,
405
429
  subGroup: state.filter.subGroup,
406
- setSubGroup: subGroup => {
407
- setFilter({
408
- ...state.filter,
409
- subGroup
410
- });
411
- },
430
+ setSubGroup: onSetSubGroup,
412
431
  searchTerm: state.searchTerm,
413
432
  setSearchTerm: setSearchTerm,
414
433
  displayNameProp: displayNameProp,
415
- dataTest: `${dataTest}-left-header`,
416
- supportsEDI: supportsEDI
434
+ dataTest: `${dataTest}-left-header`
417
435
  }),
418
- leftFooter: supportsEDI ? /*#__PURE__*/_react.default.createElement("div", {
436
+ leftFooter: state.supportsEDI ? /*#__PURE__*/_react.default.createElement("div", {
419
437
  className: `jsx-${_DimensionSelectorStyle.default.__hash}` + " " + "calculation-button"
420
438
  }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
421
439
  icon: /*#__PURE__*/_react.default.createElement(_ui.IconAdd24, null),
@@ -428,7 +446,7 @@ const ItemSelector = _ref5 => {
428
446
  selectedWidth: _dimensionSelectorHelper.TRANSFER_SELECTED_WIDTH,
429
447
  selectedEmptyComponent: /*#__PURE__*/_react.default.createElement(EmptySelection, null),
430
448
  rightHeader: /*#__PURE__*/_react.default.createElement(RightHeader, {
431
- infoText: infoBoxMessage
449
+ infoBoxMessage: infoBoxMessage
432
450
  }),
433
451
  rightFooter: rightFooter,
434
452
  renderOption: props => {
@@ -442,7 +460,7 @@ const ItemSelector = _ref5 => {
442
460
  expression: props.expression
443
461
  }),
444
462
  dataTest: `${dataTest}-transfer-option`,
445
- onEditClick: getItemType(props.value) === _dataTypes.DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM && !(((_props$access = props.access) === null || _props$access === void 0 ? void 0 : _props$access.write) === false) && supportsEDI ? () => setCurrentCalculation({
463
+ onEditClick: getItemType(props.value) === _dataTypes.DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM && !(((_props$access = props.access) === null || _props$access === void 0 ? void 0 : _props$access.write) === false) && state.supportsEDI ? () => setCurrentCalculation({
446
464
  id: props.value,
447
465
  name: props.label,
448
466
  expression: props.expression
@@ -452,7 +470,7 @@ const ItemSelector = _ref5 => {
452
470
  },
453
471
 
454
472
  dataTest: `${dataTest}-transfer`
455
- }), currentCalculation && supportsEDI && /*#__PURE__*/_react.default.createElement(_CalculationModal.default, {
473
+ }), currentCalculation && state.supportsEDI && /*#__PURE__*/_react.default.createElement(_CalculationModal.default, {
456
474
  calculation: currentCalculation,
457
475
  onSave: onSaveCalculation,
458
476
  onClose: () => setCurrentCalculation(),
@@ -466,6 +484,7 @@ ItemSelector.propTypes = {
466
484
  displayNameProp: _propTypes.default.string.isRequired,
467
485
  onSelect: _propTypes.default.func.isRequired,
468
486
  dataTest: _propTypes.default.string,
487
+ dataTypes: _propTypes.default.array,
469
488
  infoBoxMessage: _propTypes.default.string,
470
489
  noItemsMessage: _propTypes.default.string,
471
490
  rightFooter: _propTypes.default.node,
@@ -476,7 +495,6 @@ ItemSelector.propTypes = {
476
495
  type: _propTypes.default.string,
477
496
  expression: _propTypes.default.string
478
497
  })),
479
- supportsEDI: _propTypes.default.bool,
480
498
  onEDISave: _propTypes.default.func
481
499
  };
482
500
  ItemSelector.defaultProps = {
@@ -23,7 +23,8 @@ const PeriodDimension = _ref => {
23
23
  onSelect,
24
24
  selectedPeriods,
25
25
  rightFooter,
26
- excludedPeriodTypes
26
+ excludedPeriodTypes,
27
+ infoBoxMessage
27
28
  } = _ref;
28
29
  const {
29
30
  systemInfo
@@ -51,7 +52,8 @@ const PeriodDimension = _ref => {
51
52
  };
52
53
  return /*#__PURE__*/_react.default.createElement(_PeriodTransfer.default, {
53
54
  onSelect: selectPeriods,
54
- initialSelectedPeriods: selectedPeriods,
55
+ selectedItems: selectedPeriods,
56
+ infoBoxMessage: infoBoxMessage,
55
57
  rightFooter: rightFooter,
56
58
  dataTest: 'period-dimension',
57
59
  excludedPeriodTypes: excludedPeriodTypes,
@@ -61,6 +63,7 @@ const PeriodDimension = _ref => {
61
63
  PeriodDimension.propTypes = {
62
64
  onSelect: _propTypes.default.func.isRequired,
63
65
  excludedPeriodTypes: _propTypes.default.arrayOf(_propTypes.default.string),
66
+ infoBoxMessage: _propTypes.default.string,
64
67
  rightFooter: _propTypes.default.node,
65
68
  selectedPeriods: _propTypes.default.array
66
69
  };
@@ -23,15 +23,35 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
23
23
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
24
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
25
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } //TODO: Reimplement the icon.js
26
- const PeriodTransfer = _ref => {
26
+ const RightHeader = _ref => {
27
+ let {
28
+ infoBoxMessage
29
+ } = _ref;
30
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("p", {
31
+ className: `jsx-${_DimensionSelectorStyle.default.__hash}` + " " + "rightHeader"
32
+ }, _index.default.t('Selected Periods')), infoBoxMessage && /*#__PURE__*/_react.default.createElement("div", {
33
+ className: `jsx-${_DimensionSelectorStyle.default.__hash}` + " " + "info-container"
34
+ }, /*#__PURE__*/_react.default.createElement("div", {
35
+ className: `jsx-${_DimensionSelectorStyle.default.__hash}`
36
+ }, /*#__PURE__*/_react.default.createElement(_ui.IconInfo16, null)), /*#__PURE__*/_react.default.createElement("span", {
37
+ className: `jsx-${_DimensionSelectorStyle.default.__hash}` + " " + "info-text"
38
+ }, infoBoxMessage)), /*#__PURE__*/_react.default.createElement(_style.default, {
39
+ id: _DimensionSelectorStyle.default.__hash
40
+ }, _DimensionSelectorStyle.default));
41
+ };
42
+ RightHeader.propTypes = {
43
+ infoBoxMessage: _propTypes.default.string
44
+ };
45
+ const PeriodTransfer = _ref2 => {
27
46
  let {
28
47
  onSelect,
29
48
  dataTest,
30
- initialSelectedPeriods,
49
+ selectedItems,
31
50
  rightFooter,
32
51
  excludedPeriodTypes,
33
- periodsSettings
34
- } = _ref;
52
+ periodsSettings,
53
+ infoBoxMessage
54
+ } = _ref2;
35
55
  const defaultRelativePeriodType = excludedPeriodTypes.includes(_index2.MONTHLY) ? (0, _relativePeriods.getRelativePeriodsOptionsById)(_index2.QUARTERLY) : (0, _relativePeriods.getRelativePeriodsOptionsById)(_index2.MONTHLY);
36
56
  const defaultFixedPeriodType = excludedPeriodTypes.includes(_index2.MONTHLY) ? (0, _fixedPeriods.getFixedPeriodsOptionsById)(_index2.QUARTERLY, periodsSettings) : (0, _fixedPeriods.getFixedPeriodsOptionsById)(_index2.MONTHLY, periodsSettings);
37
57
  const now = (0, _multiCalendarDates.getNowInCalendar)(periodsSettings.calendar);
@@ -44,7 +64,6 @@ const PeriodTransfer = _ref => {
44
64
  reversePeriods: false
45
65
  });
46
66
  const [allPeriods, setAllPeriods] = (0, _react.useState)(defaultRelativePeriodType.getPeriods());
47
- const [selectedPeriods, setSelectedPeriods] = (0, _react.useState)(initialSelectedPeriods);
48
67
  const [isRelative, setIsRelative] = (0, _react.useState)(true);
49
68
  const [relativeFilter, setRelativeFilter] = (0, _react.useState)({
50
69
  periodType: defaultRelativePeriodType.id
@@ -53,6 +72,10 @@ const PeriodTransfer = _ref => {
53
72
  periodType: defaultFixedPeriodType.id,
54
73
  year: defaultFixedPeriodYear.toString()
55
74
  });
75
+ const isActive = value => {
76
+ const item = selectedItems.find(item => item.id === value);
77
+ return !item || item.isActive;
78
+ };
56
79
  const onIsRelativeClick = state => {
57
80
  if (state !== isRelative) {
58
81
  setIsRelative(state);
@@ -99,11 +122,6 @@ const PeriodTransfer = _ref => {
99
122
  })), /*#__PURE__*/_react.default.createElement(_style.default, {
100
123
  id: _DimensionSelectorStyle.default.__hash
101
124
  }, _DimensionSelectorStyle.default));
102
- const renderRightHeader = () => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("p", {
103
- className: `jsx-${_DimensionSelectorStyle.default.__hash}` + " " + "rightHeader"
104
- }, _index.default.t('Selected Periods')), /*#__PURE__*/_react.default.createElement(_style.default, {
105
- id: _DimensionSelectorStyle.default.__hash
106
- }, _DimensionSelectorStyle.default));
107
125
  const onSelectFixedPeriods = filter => {
108
126
  setFixedFilter(filter);
109
127
  setAllPeriods((0, _fixedPeriods.getFixedPeriodsOptionsById)(filter.periodType, periodsSettings).getPeriods(fixedPeriodConfig(Number(filter.year)), periodsSettings));
@@ -114,45 +132,58 @@ const PeriodTransfer = _ref => {
114
132
  id: _DimensionSelectorStyle.default.__hash
115
133
  }, _DimensionSelectorStyle.default));
116
134
  return /*#__PURE__*/_react.default.createElement(_ui.Transfer, {
117
- onChange: _ref2 => {
135
+ onChange: _ref3 => {
118
136
  let {
119
137
  selected
120
- } = _ref2;
121
- const formattedItems = selected.map(id => ({
122
- id,
123
- name: [...allPeriods, ...selectedPeriods].find(item => item.id === id).name
124
- }));
125
- setSelectedPeriods(formattedItems);
138
+ } = _ref3;
139
+ const formattedItems = selected.map(id => {
140
+ const matchingItem = [...allPeriods, ...selectedItems].find(item => item.id === id);
141
+ return {
142
+ id,
143
+ name: matchingItem.name,
144
+ isActive: matchingItem.isActive
145
+ };
146
+ });
126
147
  onSelect(formattedItems);
127
148
  },
128
- selected: selectedPeriods.map(period => period.id),
149
+ selected: selectedItems.map(period => period.id),
129
150
  leftHeader: renderLeftHeader(),
130
151
  enableOrderChange: true,
131
152
  height: _dimensionSelectorHelper.TRANSFER_HEIGHT,
132
153
  optionsWidth: _dimensionSelectorHelper.TRANSFER_OPTIONS_WIDTH,
133
154
  selectedWidth: _dimensionSelectorHelper.TRANSFER_SELECTED_WIDTH,
134
155
  selectedEmptyComponent: renderEmptySelection(),
135
- rightHeader: renderRightHeader(),
156
+ rightHeader: /*#__PURE__*/_react.default.createElement(RightHeader, {
157
+ infoBoxMessage: infoBoxMessage
158
+ }),
136
159
  rightFooter: rightFooter,
137
- options: [...allPeriods, ...selectedPeriods].map(_ref3 => {
160
+ options: [...allPeriods, ...selectedItems].map(_ref4 => {
138
161
  let {
139
162
  id,
140
163
  name
141
- } = _ref3;
164
+ } = _ref4;
142
165
  return {
143
166
  label: name,
144
167
  value: id
145
168
  };
146
169
  }),
147
- renderOption: props => /*#__PURE__*/_react.default.createElement(_TransferOption.TransferOption, _extends({}, props, {
148
- icon: _PeriodIcon.default,
149
- dataTest: `${dataTest}-transfer-option`
150
- })),
170
+ renderOption: _ref5 => {
171
+ let {
172
+ value,
173
+ ...props
174
+ } = _ref5;
175
+ return /*#__PURE__*/_react.default.createElement(_TransferOption.TransferOption, _extends({}, props, {
176
+ value: value,
177
+ active: isActive(value),
178
+ icon: _PeriodIcon.default,
179
+ dataTest: `${dataTest}-transfer-option`
180
+ }));
181
+ },
151
182
  dataTest: `${dataTest}-transfer`
152
183
  });
153
184
  };
154
185
  PeriodTransfer.defaultProps = {
155
- initialSelectedPeriods: [],
186
+ selectedItems: [],
156
187
  excludedPeriodTypes: [],
157
188
  periodsSettings: {
158
189
  calendar: 'gregory',
@@ -163,15 +194,17 @@ PeriodTransfer.propTypes = {
163
194
  onSelect: _propTypes.default.func.isRequired,
164
195
  dataTest: _propTypes.default.string,
165
196
  excludedPeriodTypes: _propTypes.default.arrayOf(_propTypes.default.string),
166
- initialSelectedPeriods: _propTypes.default.arrayOf(_propTypes.default.shape({
167
- id: _propTypes.default.string,
168
- name: _propTypes.default.string
169
- })),
197
+ infoBoxMessage: _propTypes.default.string,
170
198
  periodsSettings: _propTypes.default.shape({
171
199
  calendar: _propTypes.default.string,
172
200
  locale: _propTypes.default.string
173
201
  }),
174
- rightFooter: _propTypes.default.node
202
+ rightFooter: _propTypes.default.node,
203
+ selectedItems: _propTypes.default.arrayOf(_propTypes.default.shape({
204
+ id: _propTypes.default.string,
205
+ isActive: _propTypes.default.bool,
206
+ name: _propTypes.default.string
207
+ }))
175
208
  };
176
209
  var _default = PeriodTransfer;
177
210
  exports.default = _default;
@@ -4,7 +4,6 @@ exports[`The Period Dimension component matches the snapshot 1`] = `
4
4
  <PeriodTransfer
5
5
  dataTest="period-dimension"
6
6
  excludedPeriodTypes={Array []}
7
- initialSelectedPeriods={Array []}
8
7
  onSelect={[Function]}
9
8
  periodsSettings={
10
9
  Object {
@@ -13,5 +12,6 @@ exports[`The Period Dimension component matches the snapshot 1`] = `
13
12
  }
14
13
  }
15
14
  rightFooter={<React.Fragment />}
15
+ selectedItems={Array []}
16
16
  />
17
17
  `;
@@ -77,18 +77,7 @@ exports[`The Period Selector component matches the snapshot 1`] = `
77
77
  optionsWidth="420px"
78
78
  renderOption={[Function]}
79
79
  rightFooter={<React.Fragment />}
80
- rightHeader={
81
- <React.Fragment>
82
- <p
83
- className="rightHeader"
84
- >
85
- Selected Periods
86
- </p>
87
- <style>
88
-
89
- </style>
90
- </React.Fragment>
91
- }
80
+ rightHeader={<RightHeader />}
92
81
  selected={Array []}
93
82
  selectedEmptyComponent={
94
83
  <React.Fragment>
@@ -24,7 +24,7 @@ const VisTypeIcon = _ref => {
24
24
  }
25
25
  case _visTypes.VIS_TYPE_PIVOT_TABLE:
26
26
  {
27
- VisIcon = useSmall ? _ui.IconTable16 : _ui.IconTable24;
27
+ VisIcon = useSmall ? _ui.IconVisualizationPivotTable16 : _ui.IconVisualizationPivotTable24;
28
28
  break;
29
29
  }
30
30
  case _visTypes.VIS_TYPE_BAR:
@@ -92,6 +92,11 @@ const VisTypeIcon = _ref => {
92
92
  VisIcon = useSmall ? _ui.IconVisualizationScatter16 : _ui.IconVisualizationScatter24;
93
93
  break;
94
94
  }
95
+ case _visTypes.VIS_TYPE_OUTLIER_TABLE:
96
+ {
97
+ VisIcon = useSmall ? _ui.IconVisualizationOutlierTable16 : _ui.IconVisualizationOutlierTable24;
98
+ break;
99
+ }
95
100
  case _visTypes.VIS_TYPE_COLUMN:
96
101
  default:
97
102
  {