@dhis2/analytics 26.12.2 → 26.13.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 (117) hide show
  1. package/build/cjs/__demo__/DimensionsPanel.stories.js +29 -4
  2. package/build/cjs/__demo__/FileMenu.stories.js +1 -9
  3. package/build/cjs/__demo__/data/avgTotalAggregationType.visualization.json +256 -1
  4. package/build/cjs/__demo__/data/deep.visualization.json +613 -310
  5. package/build/cjs/__demo__/data/deepWithFilters.visualization.json +0 -3
  6. package/build/cjs/__demo__/data/degs.visualization.json +2 -7
  7. package/build/cjs/__demo__/data/diseaseWeeks.visualization.json +317 -153
  8. package/build/cjs/__demo__/data/emptyColumns.visualization.json +2 -7
  9. package/build/cjs/__demo__/data/emptyRows.visualization.json +292 -297
  10. package/build/cjs/__demo__/data/hierarchy.visualization.json +197 -1
  11. package/build/cjs/__demo__/data/lastFiveYears.visualization.json +2 -7
  12. package/build/cjs/__demo__/data/narrative.visualization.json +2 -7
  13. package/build/cjs/__demo__/data/simple.visualization.json +115 -105
  14. package/build/cjs/__demo__/data/target-with-legend.visualization.json +370 -115
  15. package/build/cjs/__demo__/data/under-above-100.legendSet.json +87 -103
  16. package/build/cjs/__demo__/data/weeklyColumns.visualization.json +2 -7
  17. package/build/cjs/__fixtures__/json/chartAllFields.json +8 -33
  18. package/build/cjs/api/dimensions.js +11 -1
  19. package/build/cjs/api/expression.js +19 -9
  20. package/build/cjs/assets/DimensionItemIcons/CalculationIcon.js +1 -1
  21. package/build/cjs/assets/DimensionItemIcons/DataElementIcon.js +1 -1
  22. package/build/cjs/assets/DimensionItemIcons/GenericIcon.js +1 -1
  23. package/build/cjs/assets/DimensionItemIcons/PeriodIcon.js +1 -1
  24. package/build/cjs/components/DataDimension/DataDimension.js +68 -10
  25. package/build/cjs/components/DataDimension/Info/CalculationInfo.js +3 -3
  26. package/build/cjs/components/DataDimension/Info/DataElementInfo.js +4 -4
  27. package/build/cjs/components/DataDimension/Info/DataElementOperandInfo.js +5 -5
  28. package/build/cjs/components/DataDimension/Info/DataSetInfo.js +3 -3
  29. package/build/cjs/components/DataDimension/Info/EventDataItemInfo.js +6 -6
  30. package/build/cjs/components/DataDimension/Info/IndicatorInfo.js +3 -3
  31. package/build/cjs/components/DataDimension/Info/InfoPopover.js +7 -3
  32. package/build/cjs/components/DataDimension/Info/InfoTable.js +1 -1
  33. package/build/cjs/components/DataDimension/Info/OptionInfo.js +70 -0
  34. package/build/cjs/components/DataDimension/Info/ProgramIndicatorInfo.js +9 -6
  35. package/build/cjs/components/DataDimension/ItemOptionsSelector/ItemOptionsSelector.js +257 -0
  36. package/build/cjs/components/DataDimension/ItemOptionsSelector/styles/ItemOptionSelector.style.js +10 -0
  37. package/build/cjs/components/DataDimension/{DataTypeSelector.js → ItemSelector/DataTypeSelector.js} +4 -4
  38. package/build/cjs/components/DataDimension/{DetailSelector.js → ItemSelector/DetailSelector.js} +2 -2
  39. package/build/cjs/components/DataDimension/{GroupSelector.js → ItemSelector/GroupSelector.js} +3 -3
  40. package/build/cjs/components/DataDimension/{ItemSelector.js → ItemSelector/ItemSelector.js} +76 -163
  41. package/build/cjs/components/DataDimension/{MetricSelector.js → ItemSelector/MetricSelector.js} +3 -3
  42. package/build/cjs/components/DataDimension/SelectedEmptyPlaceholder.js +17 -0
  43. package/build/cjs/components/DataDimension/SourceEmptyPlaceholder.js +113 -0
  44. package/build/cjs/components/DataDimension/TransferOption.js +34 -3
  45. package/build/cjs/components/DataDimension/styles/EmptyPlaceholder.style.js +10 -0
  46. package/build/cjs/components/DataDimension/styles/TransferOption.style.js +2 -2
  47. package/build/cjs/components/DimensionsPanel/List/OptionsButton.js +3 -3
  48. package/build/cjs/components/DimensionsPanel/List/styles/DimensionItem.style.js +2 -2
  49. package/build/cjs/components/DynamicDimension/DynamicDimension.js +1 -1
  50. package/build/cjs/components/DynamicDimension/ItemSelector.js +64 -111
  51. package/build/cjs/components/styles/DimensionSelector.style.js +2 -2
  52. package/build/cjs/locales/en/translations.json +18 -11
  53. package/build/cjs/modules/dataTypes.js +3 -1
  54. package/build/cjs/modules/dimensionListItem.js +4 -0
  55. package/build/es/__demo__/DimensionsPanel.stories.js +27 -3
  56. package/build/es/__demo__/FileMenu.stories.js +1 -9
  57. package/build/es/__demo__/data/avgTotalAggregationType.visualization.json +256 -1
  58. package/build/es/__demo__/data/deep.visualization.json +613 -310
  59. package/build/es/__demo__/data/deepWithFilters.visualization.json +0 -3
  60. package/build/es/__demo__/data/degs.visualization.json +2 -7
  61. package/build/es/__demo__/data/diseaseWeeks.visualization.json +317 -153
  62. package/build/es/__demo__/data/emptyColumns.visualization.json +2 -7
  63. package/build/es/__demo__/data/emptyRows.visualization.json +292 -297
  64. package/build/es/__demo__/data/hierarchy.visualization.json +197 -1
  65. package/build/es/__demo__/data/lastFiveYears.visualization.json +2 -7
  66. package/build/es/__demo__/data/narrative.visualization.json +2 -7
  67. package/build/es/__demo__/data/simple.visualization.json +115 -105
  68. package/build/es/__demo__/data/target-with-legend.visualization.json +370 -115
  69. package/build/es/__demo__/data/under-above-100.legendSet.json +87 -103
  70. package/build/es/__demo__/data/weeklyColumns.visualization.json +2 -7
  71. package/build/es/__fixtures__/json/chartAllFields.json +8 -33
  72. package/build/es/api/dimensions.js +12 -2
  73. package/build/es/api/expression.js +18 -8
  74. package/build/es/assets/DimensionItemIcons/CalculationIcon.js +1 -1
  75. package/build/es/assets/DimensionItemIcons/DataElementIcon.js +1 -1
  76. package/build/es/assets/DimensionItemIcons/GenericIcon.js +1 -1
  77. package/build/es/assets/DimensionItemIcons/PeriodIcon.js +1 -1
  78. package/build/es/components/DataDimension/DataDimension.js +69 -11
  79. package/build/es/components/DataDimension/Info/CalculationInfo.js +3 -3
  80. package/build/es/components/DataDimension/Info/DataElementInfo.js +4 -4
  81. package/build/es/components/DataDimension/Info/DataElementOperandInfo.js +5 -5
  82. package/build/es/components/DataDimension/Info/DataSetInfo.js +3 -3
  83. package/build/es/components/DataDimension/Info/EventDataItemInfo.js +6 -6
  84. package/build/es/components/DataDimension/Info/IndicatorInfo.js +3 -3
  85. package/build/es/components/DataDimension/Info/InfoPopover.js +9 -5
  86. package/build/es/components/DataDimension/Info/InfoTable.js +1 -1
  87. package/build/es/components/DataDimension/Info/OptionInfo.js +62 -0
  88. package/build/es/components/DataDimension/Info/ProgramIndicatorInfo.js +10 -7
  89. package/build/es/components/DataDimension/ItemOptionsSelector/ItemOptionsSelector.js +247 -0
  90. package/build/es/components/DataDimension/ItemOptionsSelector/styles/ItemOptionSelector.style.js +4 -0
  91. package/build/es/components/DataDimension/{DataTypeSelector.js → ItemSelector/DataTypeSelector.js} +4 -4
  92. package/build/es/components/DataDimension/{DetailSelector.js → ItemSelector/DetailSelector.js} +2 -2
  93. package/build/es/components/DataDimension/{GroupSelector.js → ItemSelector/GroupSelector.js} +3 -3
  94. package/build/es/components/DataDimension/{ItemSelector.js → ItemSelector/ItemSelector.js} +76 -163
  95. package/build/es/components/DataDimension/{MetricSelector.js → ItemSelector/MetricSelector.js} +3 -3
  96. package/build/es/components/DataDimension/SelectedEmptyPlaceholder.js +9 -0
  97. package/build/es/components/DataDimension/SourceEmptyPlaceholder.js +105 -0
  98. package/build/es/components/DataDimension/TransferOption.js +35 -4
  99. package/build/es/components/DataDimension/styles/EmptyPlaceholder.style.js +4 -0
  100. package/build/es/components/DataDimension/styles/TransferOption.style.js +2 -2
  101. package/build/es/components/DimensionsPanel/List/OptionsButton.js +3 -3
  102. package/build/es/components/DimensionsPanel/List/styles/DimensionItem.style.js +2 -2
  103. package/build/es/components/DynamicDimension/DynamicDimension.js +1 -1
  104. package/build/es/components/DynamicDimension/ItemSelector.js +66 -113
  105. package/build/es/components/styles/DimensionSelector.style.js +2 -2
  106. package/build/es/locales/en/translations.json +18 -11
  107. package/build/es/modules/dataTypes.js +2 -0
  108. package/build/es/modules/dimensionListItem.js +5 -1
  109. package/package.json +2 -2
  110. /package/build/cjs/components/DataDimension/{styles → ItemSelector/styles}/DataTypeSelector.style.js +0 -0
  111. /package/build/cjs/components/DataDimension/{styles → ItemSelector/styles}/DetailSelector.style.js +0 -0
  112. /package/build/cjs/components/DataDimension/{styles → ItemSelector/styles}/GroupSelector.style.js +0 -0
  113. /package/build/cjs/components/DataDimension/{styles → ItemSelector/styles}/MetricSelector.style.js +0 -0
  114. /package/build/es/components/DataDimension/{styles → ItemSelector/styles}/DataTypeSelector.style.js +0 -0
  115. /package/build/es/components/DataDimension/{styles → ItemSelector/styles}/DetailSelector.style.js +0 -0
  116. /package/build/es/components/DataDimension/{styles → ItemSelector/styles}/GroupSelector.style.js +0 -0
  117. /package/build/es/components/DataDimension/{styles → ItemSelector/styles}/MetricSelector.style.js +0 -0
@@ -107,7 +107,7 @@ const DataElementInfo = _ref3 => {
107
107
  }, displayName);
108
108
  }))))), (data === null || data === void 0 ? void 0 : data.dataElement.optionSet) && /*#__PURE__*/_react.default.createElement("tr", {
109
109
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
110
- }, /*#__PURE__*/_react.default.createElement("td", {
110
+ }, /*#__PURE__*/_react.default.createElement("th", {
111
111
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
112
112
  }, _index.default.t('Option set')), /*#__PURE__*/_react.default.createElement("td", {
113
113
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
@@ -129,7 +129,7 @@ const DataElementInfo = _ref3 => {
129
129
  };
130
130
  exports.DataElementInfo = DataElementInfo;
131
131
  DataElementInfo.propTypes = {
132
- displayNameProp: _propTypes.default.string,
133
- id: _propTypes.default.string,
134
- type: _propTypes.default.string
132
+ displayNameProp: _propTypes.default.string.isRequired,
133
+ id: _propTypes.default.string.isRequired,
134
+ type: _propTypes.default.string.isRequired
135
135
  };
@@ -68,7 +68,7 @@ const DataElementOperandInfo = _ref2 => {
68
68
  dataElementOperand
69
69
  });
70
70
  setLoading(false);
71
- }, [displayNameProp, engine, id]);
71
+ }, [apiVersion, baseUrl, displayNameProp, engine, id]);
72
72
  (0, _react.useEffect)(() => {
73
73
  fetchData();
74
74
  }, [fetchData]);
@@ -131,7 +131,7 @@ const DataElementOperandInfo = _ref2 => {
131
131
  }, displayName);
132
132
  }))))), (data === null || data === void 0 ? void 0 : data.dataElementOperand.dataElement.optionSet) && /*#__PURE__*/_react.default.createElement("tr", {
133
133
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
134
- }, /*#__PURE__*/_react.default.createElement("td", {
134
+ }, /*#__PURE__*/_react.default.createElement("th", {
135
135
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
136
136
  }, _index.default.t('Option set')), /*#__PURE__*/_react.default.createElement("td", {
137
137
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
@@ -182,7 +182,7 @@ const DataElementOperandInfo = _ref2 => {
182
182
  };
183
183
  exports.DataElementOperandInfo = DataElementOperandInfo;
184
184
  DataElementOperandInfo.propTypes = {
185
- displayNameProp: _propTypes.default.string,
186
- id: _propTypes.default.string,
187
- type: _propTypes.default.string
185
+ displayNameProp: _propTypes.default.string.isRequired,
186
+ id: _propTypes.default.string.isRequired,
187
+ type: _propTypes.default.string.isRequired
188
188
  };
@@ -109,7 +109,7 @@ const DataSetInfo = _ref3 => {
109
109
  };
110
110
  exports.DataSetInfo = DataSetInfo;
111
111
  DataSetInfo.propTypes = {
112
- displayNameProp: _propTypes.default.string,
113
- id: _propTypes.default.string,
114
- type: _propTypes.default.string
112
+ displayNameProp: _propTypes.default.string.isRequired,
113
+ id: _propTypes.default.string.isRequired,
114
+ type: _propTypes.default.string.isRequired
115
115
  };
@@ -28,7 +28,7 @@ const programDataElementQuery = {
28
28
  displayNameProp
29
29
  } = _ref2;
30
30
  return {
31
- fields: `${(0, _InfoTable.getCommonFields)(displayNameProp)},aggregationType,dimensionItemType,legendSets[id,displayName],optionsSet[displayName],valueType,zeroIsSignificant`
31
+ fields: `${(0, _InfoTable.getCommonFields)(displayNameProp)},aggregationType,dimensionItemType,legendSets[id,displayName],optionSet[displayName],valueType,zeroIsSignificant`
32
32
  };
33
33
  }
34
34
  }
@@ -47,7 +47,7 @@ const programAttributeQuery = {
47
47
  displayNameProp
48
48
  } = _ref4;
49
49
  return {
50
- fields: `${(0, _InfoTable.getCommonFields)(displayNameProp)},aggregationType,dimensionItemType,legendSets[id,displayName],optionsSet[displayName],valueType,zeroIsSignificant`
50
+ fields: `${(0, _InfoTable.getCommonFields)(displayNameProp)},aggregationType,dimensionItemType,legendSets[id,displayName],optionSet[displayName],valueType,zeroIsSignificant`
51
51
  };
52
52
  }
53
53
  }
@@ -88,7 +88,7 @@ const EventDataItemInfo = _ref5 => {
88
88
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
89
89
  }, _valueTypes.valueTypeDisplayNames[data === null || data === void 0 ? void 0 : data.valueType])), (data === null || data === void 0 ? void 0 : data.optionSet) && /*#__PURE__*/_react.default.createElement("tr", {
90
90
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
91
- }, /*#__PURE__*/_react.default.createElement("td", {
91
+ }, /*#__PURE__*/_react.default.createElement("th", {
92
92
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
93
93
  }, _index.default.t('Option set')), /*#__PURE__*/_react.default.createElement("td", {
94
94
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
@@ -105,7 +105,7 @@ const EventDataItemInfo = _ref5 => {
105
105
  };
106
106
  exports.EventDataItemInfo = EventDataItemInfo;
107
107
  EventDataItemInfo.propTypes = {
108
- displayNameProp: _propTypes.default.string,
109
- id: _propTypes.default.string,
110
- type: _propTypes.default.string
108
+ displayNameProp: _propTypes.default.string.isRequired,
109
+ id: _propTypes.default.string.isRequired,
110
+ type: _propTypes.default.string.isRequired
111
111
  };
@@ -173,7 +173,7 @@ const IndicatorInfo = _ref3 => {
173
173
  };
174
174
  exports.IndicatorInfo = IndicatorInfo;
175
175
  IndicatorInfo.propTypes = {
176
- displayNameProp: _propTypes.default.string,
177
- id: _propTypes.default.string,
178
- type: _propTypes.default.string
176
+ displayNameProp: _propTypes.default.string.isRequired,
177
+ id: _propTypes.default.string.isRequired,
178
+ type: _propTypes.default.string.isRequired
179
179
  };
@@ -16,6 +16,7 @@ var _DataElementOperandInfo = require("./DataElementOperandInfo.js");
16
16
  var _DataSetInfo = require("./DataSetInfo.js");
17
17
  var _EventDataItemInfo = require("./EventDataItemInfo.js");
18
18
  var _IndicatorInfo = require("./IndicatorInfo.js");
19
+ var _OptionInfo = require("./OptionInfo.js");
19
20
  var _ProgramIndicatorInfo = require("./ProgramIndicatorInfo.js");
20
21
  var _InfoPopoverStyle = _interopRequireDefault(require("./styles/InfoPopover.style.js"));
21
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -44,15 +45,18 @@ const InfoPopover = _ref => {
44
45
  }, /*#__PURE__*/_react.default.createElement("div", {
45
46
  "data-test": `${dataTest}-table`,
46
47
  className: `jsx-${_InfoPopoverStyle.default.__hash}` + " " + "popover"
47
- }, type === _dataTypes.DIMENSION_TYPE_DATA_ELEMENT && /*#__PURE__*/_react.default.createElement(_DataElementInfo.DataElementInfo, infoProps), type === _dataTypes.DIMENSION_TYPE_DATA_ELEMENT_OPERAND && /*#__PURE__*/_react.default.createElement(_DataElementOperandInfo.DataElementOperandInfo, infoProps), type === _dataTypes.DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM && /*#__PURE__*/_react.default.createElement(_CalculationInfo.CalculationInfo, infoProps), type === _dataSets.REPORTING_RATE /* TODO: verify this! */ && /*#__PURE__*/_react.default.createElement(_DataSetInfo.DataSetInfo, infoProps), type === _dataTypes.DIMENSION_TYPE_INDICATOR && /*#__PURE__*/_react.default.createElement(_IndicatorInfo.IndicatorInfo, infoProps), [_dataTypes.DIMENSION_TYPE_PROGRAM_ATTRIBUTE, _dataTypes.DIMENSION_TYPE_PROGRAM_DATA_ELEMENT].includes(type) && /*#__PURE__*/_react.default.createElement(_EventDataItemInfo.EventDataItemInfo, infoProps), type === _dataTypes.DIMENSION_TYPE_PROGRAM_INDICATOR && /*#__PURE__*/_react.default.createElement(_ProgramIndicatorInfo.ProgramIndicatorInfo, infoProps))), /*#__PURE__*/_react.default.createElement(_style.default, {
48
+ }, type === _dataTypes.DIMENSION_TYPE_DATA_ELEMENT && /*#__PURE__*/_react.default.createElement(_DataElementInfo.DataElementInfo, infoProps), type === _dataTypes.DIMENSION_TYPE_DATA_ELEMENT_OPERAND && /*#__PURE__*/_react.default.createElement(_DataElementOperandInfo.DataElementOperandInfo, infoProps), type === _dataTypes.DIMENSION_TYPE_EXPRESSION_DIMENSION_ITEM && /*#__PURE__*/_react.default.createElement(_CalculationInfo.CalculationInfo, infoProps), type === _dataSets.REPORTING_RATE /* TODO: verify this! */ && /*#__PURE__*/_react.default.createElement(_DataSetInfo.DataSetInfo, infoProps), type === _dataTypes.DIMENSION_TYPE_INDICATOR && /*#__PURE__*/_react.default.createElement(_IndicatorInfo.IndicatorInfo, infoProps), [_dataTypes.DIMENSION_TYPE_PROGRAM_ATTRIBUTE, _dataTypes.DIMENSION_TYPE_PROGRAM_DATA_ELEMENT].includes(type) && /*#__PURE__*/_react.default.createElement(_EventDataItemInfo.EventDataItemInfo, infoProps), type === _dataTypes.DIMENSION_TYPE_PROGRAM_INDICATOR && /*#__PURE__*/_react.default.createElement(_ProgramIndicatorInfo.ProgramIndicatorInfo, infoProps), [_dataTypes.DIMENSION_TYPE_PROGRAM_DATA_ELEMENT_OPTION, _dataTypes.DIMENSION_TYPE_PROGRAM_ATTRIBUTE_OPTION].includes(type) && /*#__PURE__*/_react.default.createElement(_OptionInfo.OptionInfo, infoProps))), /*#__PURE__*/_react.default.createElement(_style.default, {
48
49
  id: _InfoPopoverStyle.default.__hash
49
50
  }, _InfoPopoverStyle.default));
50
51
  };
51
52
  exports.InfoPopover = InfoPopover;
52
53
  InfoPopover.propTypes = {
54
+ displayNameProp: _propTypes.default.string.isRequired,
55
+ item: _propTypes.default.shape({
56
+ id: _propTypes.default.string.isRequired,
57
+ type: _propTypes.default.string.isRequired
58
+ }).isRequired,
53
59
  dataTest: _propTypes.default.string,
54
- displayNameProp: _propTypes.default.string,
55
- item: _propTypes.default.object,
56
60
  reference: _propTypes.default.object,
57
61
  onClose: _propTypes.default.func
58
62
  };
@@ -186,7 +186,7 @@ const InfoTable = _ref4 => {
186
186
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
187
187
  }, _index.default.t('Created date')), /*#__PURE__*/_react.default.createElement("td", {
188
188
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
189
- }, `${(0, _moment.default)(fromServerDate(data.created)).fromNow()} (${(0, _moment.default)(fromServerDate(data.created)).format('YYYY-MM-DD')})`)), /*#__PURE__*/_react.default.createElement("tr", {
189
+ }, `${(0, _moment.default)(fromServerDate(data.created)).fromNow()} (${(0, _moment.default)(fromServerDate(data.created)).format('YYYY-MM-DD')})`)), data.createdBy && /*#__PURE__*/_react.default.createElement("tr", {
190
190
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
191
191
  }, /*#__PURE__*/_react.default.createElement("th", {
192
192
  className: `jsx-${_InfoPopoverStyle.default.__hash}`
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.OptionInfo = void 0;
7
+ var _style = _interopRequireDefault(require("styled-jsx/style"));
8
+ var _appRuntime = require("@dhis2/app-runtime");
9
+ var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _react = _interopRequireDefault(require("react"));
11
+ var _index = _interopRequireDefault(require("../../../locales/index.js"));
12
+ var _InfoTable = require("./InfoTable.js");
13
+ var _InfoPopoverStyle = _interopRequireDefault(require("./styles/InfoPopover.style.js"));
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ const optionQuery = {
16
+ option: {
17
+ resource: 'options',
18
+ id: _ref => {
19
+ let {
20
+ id
21
+ } = _ref;
22
+ return id;
23
+ },
24
+ params: _ref2 => {
25
+ let {
26
+ displayNameProp
27
+ } = _ref2;
28
+ return {
29
+ fields: `${(0, _InfoTable.getCommonFields)(displayNameProp)},optionSet[displayName]`
30
+ };
31
+ }
32
+ }
33
+ };
34
+ const OptionInfo = _ref3 => {
35
+ let {
36
+ type,
37
+ id,
38
+ displayNameProp
39
+ } = _ref3;
40
+ const {
41
+ loading,
42
+ error,
43
+ data
44
+ } = (0, _appRuntime.useDataQuery)(optionQuery, {
45
+ variables: {
46
+ id: id.split('.').reverse()[0],
47
+ displayNameProp
48
+ }
49
+ });
50
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_InfoTable.InfoTable, {
51
+ dataType: type,
52
+ data: data === null || data === void 0 ? void 0 : data.option,
53
+ loading: loading,
54
+ error: error
55
+ }, (data === null || data === void 0 ? void 0 : data.option.optionSet) && /*#__PURE__*/_react.default.createElement("tr", {
56
+ className: `jsx-${_InfoPopoverStyle.default.__hash}`
57
+ }, /*#__PURE__*/_react.default.createElement("th", {
58
+ className: `jsx-${_InfoPopoverStyle.default.__hash}`
59
+ }, _index.default.t('Option set')), /*#__PURE__*/_react.default.createElement("td", {
60
+ className: `jsx-${_InfoPopoverStyle.default.__hash}`
61
+ }, data.option.optionSet.displayName))), /*#__PURE__*/_react.default.createElement(_style.default, {
62
+ id: _InfoPopoverStyle.default.__hash
63
+ }, _InfoPopoverStyle.default));
64
+ };
65
+ exports.OptionInfo = OptionInfo;
66
+ OptionInfo.propTypes = {
67
+ displayNameProp: _propTypes.default.string.isRequired,
68
+ id: _propTypes.default.string.isRequired,
69
+ type: _propTypes.default.string.isRequired
70
+ };
@@ -47,6 +47,9 @@ const ProgramIndicatorInfo = _ref3 => {
47
47
  const [getHumanReadableExpression] = (0, _appRuntime.useDataMutation)(_expression.validateProgramIndicatorExpressionMutation, {
48
48
  onError: setError
49
49
  });
50
+ const [getHumanReadableFilter] = (0, _appRuntime.useDataMutation)(_expression.validateProgramIndicatorFilterMutation, {
51
+ onError: setError
52
+ });
50
53
  const fetchData = (0, _react.useCallback)(async () => {
51
54
  const {
52
55
  programIndicator
@@ -66,8 +69,8 @@ const ProgramIndicatorInfo = _ref3 => {
66
69
  }
67
70
  }
68
71
  if (programIndicator.filter) {
69
- const result = await getHumanReadableExpression({
70
- expression: programIndicator.filter
72
+ const result = await getHumanReadableFilter({
73
+ filter: programIndicator.filter
71
74
  });
72
75
  if (result) {
73
76
  programIndicator.humanReadableFilter = result;
@@ -83,7 +86,7 @@ const ProgramIndicatorInfo = _ref3 => {
83
86
  programIndicator
84
87
  });
85
88
  setLoading(false);
86
- }, [displayNameProp, engine, id, getHumanReadableExpression]);
89
+ }, [displayNameProp, engine, id, getHumanReadableExpression, getHumanReadableFilter]);
87
90
  (0, _react.useEffect)(() => {
88
91
  fetchData();
89
92
  }, [fetchData]);
@@ -185,7 +188,7 @@ const ProgramIndicatorInfo = _ref3 => {
185
188
  };
186
189
  exports.ProgramIndicatorInfo = ProgramIndicatorInfo;
187
190
  ProgramIndicatorInfo.propTypes = {
188
- displayNameProp: _propTypes.default.string,
189
- id: _propTypes.default.string,
190
- type: _propTypes.default.string
191
+ displayNameProp: _propTypes.default.string.isRequired,
192
+ id: _propTypes.default.string.isRequired,
193
+ type: _propTypes.default.string.isRequired
191
194
  };
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ItemOptionsSelector = void 0;
7
+ var _style = _interopRequireDefault(require("styled-jsx/style"));
8
+ var _appRuntime = require("@dhis2/app-runtime");
9
+ var _ui = require("@dhis2/ui");
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+ var _react = _interopRequireWildcard(require("react"));
12
+ var _dimensions = require("../../../api/dimensions.js");
13
+ var _index = _interopRequireDefault(require("../../../locales/index.js"));
14
+ var _dataTypes = require("../../../modules/dataTypes.js");
15
+ var _dimensionListItem = require("../../../modules/dimensionListItem.js");
16
+ var _dimensionSelectorHelper = require("../../../modules/dimensionSelectorHelper.js");
17
+ var _utils = require("../../../modules/utils.js");
18
+ var _DimensionSelectorStyle = _interopRequireDefault(require("../../styles/DimensionSelector.style.js"));
19
+ var _SelectedEmptyPlaceholder = require("../SelectedEmptyPlaceholder.js");
20
+ var _SourceEmptyPlaceholder = require("../SourceEmptyPlaceholder.js");
21
+ var _TransferOption = require("../TransferOption.js");
22
+ var _ItemOptionSelectorStyle = _interopRequireDefault(require("./styles/ItemOptionSelector.style.js"));
23
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
24
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
25
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
26
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
27
+ const formatOptionsFilters = (dataItemType, dataItemId) => {
28
+ const optionsFilters = {
29
+ dataItemId
30
+ };
31
+ if (dataItemType === _dataTypes.DIMENSION_TYPE_PROGRAM_DATA_ELEMENT) {
32
+ optionsFilters.dataType = _dataTypes.DIMENSION_TYPE_PROGRAM_DATA_ELEMENT_OPTION;
33
+ } else if (dataItemType === _dataTypes.DIMENSION_TYPE_PROGRAM_ATTRIBUTE) {
34
+ optionsFilters.dataType = _dataTypes.DIMENSION_TYPE_PROGRAM_ATTRIBUTE_OPTION;
35
+ }
36
+ return optionsFilters;
37
+ };
38
+ const ItemOptionsSelector = _ref => {
39
+ var _state$filter;
40
+ let {
41
+ id: dataItemId,
42
+ name: dataItemName,
43
+ type: dataItemType,
44
+ selectedItems,
45
+ infoDataItem,
46
+ setInfoDataItem,
47
+ displayNameProp,
48
+ itemsRef,
49
+ onEditClick,
50
+ onSelect,
51
+ onClose,
52
+ dataTest
53
+ } = _ref;
54
+ const [state, setState] = (0, _react.useState)({
55
+ searchTerm: '',
56
+ filter: formatOptionsFilters(dataItemType, dataItemId),
57
+ options: [],
58
+ loading: true,
59
+ nextPage: 1
60
+ });
61
+ const debouncedSearchTerm = (0, _utils.useDebounce)(state.searchTerm, 500);
62
+ const dataEngine = (0, _appRuntime.useDataEngine)();
63
+ const setSearchTerm = searchTerm => setState(state => ({
64
+ ...state,
65
+ searchTerm
66
+ }));
67
+ const fetchItems = async page => {
68
+ var _result$dimensionItem;
69
+ setState(state => ({
70
+ ...state,
71
+ nextPage: page === 1 ? 1 : state.nextPage,
72
+ loading: true
73
+ }));
74
+ const result = await (0, _dimensions.apiFetchOptions)({
75
+ dataEngine,
76
+ nameProp: displayNameProp,
77
+ page,
78
+ filter: state.filter,
79
+ searchTerm: state.searchTerm
80
+ });
81
+ const newOptions = [];
82
+ (_result$dimensionItem = result.dimensionItems) === null || _result$dimensionItem === void 0 ? void 0 : _result$dimensionItem.forEach(item => {
83
+ newOptions.push({
84
+ label: item.name,
85
+ value: item.id,
86
+ disabled: item.disabled,
87
+ // XXX is this returned by the api?!
88
+ type: item.dimensionItemType,
89
+ expression: item.expression,
90
+ optionSetId: item.optionSetId
91
+ });
92
+ });
93
+ setState(state => ({
94
+ ...state,
95
+ loading: false,
96
+ options: page > 1 ? [...state.options, ...newOptions] : newOptions,
97
+ nextPage: result.nextPage
98
+ }));
99
+ /* The following handles a very specific edge-case where the user can select all items from a
100
+ page and then reopen the modal. Usually Transfer triggers the onEndReached when the end of
101
+ the page is reached (scrolling down) or if too few items are on the left side (e.g. selecting
102
+ 49 items from page 1, leaving only 1 item on the left side). However, due to the way Transfer
103
+ works, if 0 items are available, more items are fetched, but all items are already selected
104
+ (leaving 0 items on the left side still), the onReachedEnd won't trigger. Hence the code below:
105
+ IF there is a next page AND some options were just fetched AND you have the same or more
106
+ selected items than fetched items AND all fetched items are already selected -> fetch more!
107
+ */
108
+ if (result.nextPage && newOptions.length && selectedItems.length >= newOptions.length && newOptions.every(newOption => selectedItems.find(selectedItem => selectedItem.value === newOption.value))) {
109
+ fetchItems(result.nextPage);
110
+ }
111
+ };
112
+ (0, _react.useEffect)(() => {
113
+ setState(state => ({
114
+ ...state,
115
+ filter: {
116
+ ...state.filter,
117
+ ...formatOptionsFilters(dataItemType, dataItemId)
118
+ }
119
+ }));
120
+ }, [dataItemId, dataItemType]);
121
+ (0, _utils.useDidUpdateEffect)(() => {
122
+ fetchItems(1);
123
+ }, [debouncedSearchTerm, (_state$filter = state.filter) === null || _state$filter === void 0 ? void 0 : _state$filter.dataItemId]);
124
+ const onChange = selectedIds => {
125
+ const newSelectedItems = selectedIds.map(id => {
126
+ const matchingItem = [...state.options, ...selectedItems].find(item => item.value === id);
127
+ return {
128
+ value: id,
129
+ label: matchingItem.label,
130
+ type: matchingItem.type,
131
+ optionSetId: matchingItem.optionSetId,
132
+ ...(matchingItem.expression ? {
133
+ expression: matchingItem.expression
134
+ } : {})
135
+ };
136
+ });
137
+ onSelect(newSelectedItems);
138
+ };
139
+ const onEndReached = () => {
140
+ if (state.nextPage) {
141
+ fetchItems(state.nextPage);
142
+ }
143
+ };
144
+ const isActive = value => {
145
+ const item = selectedItems.find(item => item.value === value);
146
+ return !item || item.isActive;
147
+ };
148
+ return /*#__PURE__*/_react.default.createElement("div", {
149
+ className: `jsx-${_DimensionSelectorStyle.default.__hash} jsx-${_ItemOptionSelectorStyle.default.__hash}` + " " + "transfer-container"
150
+ }, /*#__PURE__*/_react.default.createElement(_ui.Transfer, {
151
+ onChange: _ref2 => {
152
+ let {
153
+ selected
154
+ } = _ref2;
155
+ return onChange(selected);
156
+ },
157
+ selected: selectedItems.map(item => item.value),
158
+ options: [...state.options,
159
+ // remove items already in the options list
160
+ ...selectedItems.filter(selectedItem => {
161
+ var _state$options;
162
+ return !((_state$options = state.options) !== null && _state$options !== void 0 && _state$options.find(option => option.value === selectedItem.value));
163
+ })],
164
+ loading: state.loading,
165
+ loadingPicked: state.loading,
166
+ sourceEmptyPlaceholder: /*#__PURE__*/_react.default.createElement(_SourceEmptyPlaceholder.SourceEmptyPlaceholder, {
167
+ loading: state.loading,
168
+ searchTerm: debouncedSearchTerm,
169
+ options: state.options,
170
+ allItemsSelectedMessage: state.options.every(sourceItem => Boolean(selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.find(selectedItem => sourceItem.value === selectedItem.value))) && !state.nextPage ? _index.default.t('All available options are already selected') : '',
171
+ noItemsMessage: _index.default.t('No available options for this item'),
172
+ dataType: state.filter.dataType,
173
+ dataTest: `${dataTest}-empty-source`
174
+ }),
175
+ onEndReached: onEndReached,
176
+ filterable: true,
177
+ filterPlaceholder: _index.default.t('Search by option name'),
178
+ filterablePicked: false,
179
+ searchTerm: state.searchTerm,
180
+ onFilterChange: _ref3 => {
181
+ let {
182
+ value
183
+ } = _ref3;
184
+ return setSearchTerm(value);
185
+ },
186
+ leftHeader: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
187
+ className: `jsx-${_DimensionSelectorStyle.default.__hash} jsx-${_ItemOptionSelectorStyle.default.__hash}` + " " + "option-set-back-button"
188
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
189
+ onClick: onClose,
190
+ icon: /*#__PURE__*/_react.default.createElement(_ui.IconArrowLeft16, null),
191
+ small: true,
192
+ dataTest: `${dataTest}-option-set-back-button`
193
+ }, _index.default.t('Back to all items'))), /*#__PURE__*/_react.default.createElement("div", {
194
+ className: `jsx-${_DimensionSelectorStyle.default.__hash} jsx-${_ItemOptionSelectorStyle.default.__hash}` + " " + "option-set-name"
195
+ }, dataItemName, ": ", _index.default.t('Options'))),
196
+ rightHeader: /*#__PURE__*/_react.default.createElement("p", {
197
+ className: `jsx-${_DimensionSelectorStyle.default.__hash} jsx-${_ItemOptionSelectorStyle.default.__hash}` + " " + "rightHeader"
198
+ }, _index.default.t('Selected items')),
199
+ enableOrderChange: true,
200
+ height: _dimensionSelectorHelper.TRANSFER_HEIGHT,
201
+ optionsWidth: _dimensionSelectorHelper.TRANSFER_OPTIONS_WIDTH,
202
+ selectedWidth: _dimensionSelectorHelper.TRANSFER_SELECTED_WIDTH,
203
+ selectedEmptyComponent: /*#__PURE__*/_react.default.createElement(_SelectedEmptyPlaceholder.SelectedEmptyPlaceholder, null),
204
+ renderOption: props => {
205
+ return /*#__PURE__*/_react.default.createElement(_TransferOption.TransferOption
206
+ /* eslint-disable react/prop-types */, _extends({}, props, {
207
+ active: isActive(props.value),
208
+ showingInfo: (infoDataItem === null || infoDataItem === void 0 ? void 0 : infoDataItem.id) === props.value,
209
+ icon: (0, _dimensionListItem.getIcon)(props.type),
210
+ dataItemType: props.type,
211
+ dimensionType: (0, _dimensionListItem.getDimensionType)({
212
+ type: props.type,
213
+ expression: props.expression
214
+ }),
215
+ dataTest: `${dataTest}-transfer-option`,
216
+ itemsRef: itemsRef,
217
+ onEditClick: () => onEditClick(props),
218
+ onInfoClick: () => setInfoDataItem({
219
+ id: props.value,
220
+ type: props.type
221
+ })
222
+ /* eslint-enable react/prop-types */
223
+ }));
224
+ },
225
+ dataTest: `${dataTest}-option-view-mode-transfer`
226
+ }), /*#__PURE__*/_react.default.createElement(_style.default, {
227
+ id: _DimensionSelectorStyle.default.__hash
228
+ }, _DimensionSelectorStyle.default), /*#__PURE__*/_react.default.createElement(_style.default, {
229
+ id: _ItemOptionSelectorStyle.default.__hash
230
+ }, _ItemOptionSelectorStyle.default));
231
+ };
232
+ exports.ItemOptionsSelector = ItemOptionsSelector;
233
+ ItemOptionsSelector.propTypes = {
234
+ displayNameProp: _propTypes.default.string.isRequired,
235
+ id: _propTypes.default.string.isRequired,
236
+ name: _propTypes.default.string.isRequired,
237
+ type: _propTypes.default.string.isRequired,
238
+ onClose: _propTypes.default.func.isRequired,
239
+ onSelect: _propTypes.default.func.isRequired,
240
+ dataTest: _propTypes.default.string,
241
+ infoDataItem: _propTypes.default.object,
242
+ itemsRef: _propTypes.default.object,
243
+ selectedItems: _propTypes.default.arrayOf(_propTypes.default.exact({
244
+ label: _propTypes.default.string.isRequired,
245
+ value: _propTypes.default.string.isRequired,
246
+ access: _propTypes.default.object,
247
+ isActive: _propTypes.default.bool,
248
+ type: _propTypes.default.string,
249
+ expression: _propTypes.default.string,
250
+ optionSetId: _propTypes.default.string
251
+ })),
252
+ setInfoDataItem: _propTypes.default.func,
253
+ onEditClick: _propTypes.default.func
254
+ };
255
+ ItemOptionsSelector.defaultProps = {
256
+ selectedItems: []
257
+ };
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _ui = require("@dhis2/ui");
8
+ const _defaultExport = [`.option-set-back-button.jsx-3422805239{margin:0 -${_ui.spacers.dp8};padding:${_ui.spacers.dp8};background:${_ui.colors.grey200};border-bottom:1px solid ${_ui.colors.grey400};}`, `.option-set-name.jsx-3422805239{font-size:14px;font-weight:500;padding:${_ui.spacers.dp12} 0;}`];
9
+ _defaultExport.__hash = "3422805239";
10
+ var _default = exports.default = _defaultExport;
@@ -8,10 +8,10 @@ var _style = _interopRequireDefault(require("styled-jsx/style"));
8
8
  var _ui = require("@dhis2/ui");
9
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
10
10
  var _react = _interopRequireDefault(require("react"));
11
- var _index = _interopRequireDefault(require("../../locales/index.js"));
12
- var _dataTypes = require("../../modules/dataTypes.js");
13
- var _visTypes = require("../../modules/visTypes.js");
14
- var _DataDimension = require("./DataDimension.js");
11
+ var _index = _interopRequireDefault(require("../../../locales/index.js"));
12
+ var _dataTypes = require("../../../modules/dataTypes.js");
13
+ var _visTypes = require("../../../modules/visTypes.js");
14
+ var _DataDimension = require("../DataDimension.js");
15
15
  var _DataTypeSelectorStyle = _interopRequireDefault(require("./styles/DataTypeSelector.style.js"));
16
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
17
  const DataTypeSelector = _ref => {
@@ -8,8 +8,8 @@ var _style = _interopRequireDefault(require("styled-jsx/style"));
8
8
  var _ui = require("@dhis2/ui");
9
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
10
10
  var _react = _interopRequireDefault(require("react"));
11
- var _index = _interopRequireDefault(require("../../locales/index.js"));
12
- var _dataTypes = require("../../modules/dataTypes.js");
11
+ var _index = _interopRequireDefault(require("../../../locales/index.js"));
12
+ var _dataTypes = require("../../../modules/dataTypes.js");
13
13
  var _DetailSelectorStyle = _interopRequireDefault(require("./styles/DetailSelector.style.js"));
14
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
15
  const getOptions = () => ({
@@ -9,9 +9,9 @@ var _appRuntime = require("@dhis2/app-runtime");
9
9
  var _ui = require("@dhis2/ui");
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _react = _interopRequireWildcard(require("react"));
12
- var _dimensions = require("../../api/dimensions.js");
13
- var _index = _interopRequireDefault(require("../../locales/index.js"));
14
- var _dataTypes = require("../../modules/dataTypes.js");
12
+ var _dimensions = require("../../../api/dimensions.js");
13
+ var _index = _interopRequireDefault(require("../../../locales/index.js"));
14
+ var _dataTypes = require("../../../modules/dataTypes.js");
15
15
  var _DetailSelector = require("./DetailSelector.js");
16
16
  var _MetricSelector = require("./MetricSelector.js");
17
17
  var _GroupSelectorStyle = _interopRequireDefault(require("./styles/GroupSelector.style.js"));