@dhis2/analytics 24.10.1 → 25.0.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 (84) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/build/cjs/__demo__/CalculationModal.stories.js +448 -0
  3. package/build/cjs/api/analytics/AnalyticsRequest.js +12 -1
  4. package/build/cjs/api/dimensions.js +1 -1
  5. package/build/cjs/api/expression.js +67 -0
  6. package/build/cjs/assets/DimensionItemIcons/CalculationIcon.js +25 -0
  7. package/build/cjs/assets/FormulaIcon.js +40 -0
  8. package/build/cjs/components/DataDimension/Calculation/CalculationModal.js +447 -0
  9. package/build/cjs/components/DataDimension/Calculation/DataElementOption.js +77 -0
  10. package/build/cjs/components/DataDimension/Calculation/DataElementSelector.js +306 -0
  11. package/build/cjs/components/DataDimension/Calculation/DndContext.js +213 -0
  12. package/build/cjs/components/DataDimension/Calculation/DragHandleIcon.js +23 -0
  13. package/build/cjs/components/DataDimension/Calculation/DraggingItem.js +58 -0
  14. package/build/cjs/components/DataDimension/Calculation/DropZone.js +58 -0
  15. package/build/cjs/components/DataDimension/Calculation/FormulaField.js +121 -0
  16. package/build/cjs/components/DataDimension/Calculation/FormulaItem.js +232 -0
  17. package/build/cjs/components/DataDimension/Calculation/MathOperatorSelector.js +57 -0
  18. package/build/cjs/components/DataDimension/Calculation/Operator.js +81 -0
  19. package/build/cjs/components/DataDimension/Calculation/styles/CalculationModal.style.js +13 -0
  20. package/build/cjs/components/DataDimension/Calculation/styles/DataElementOption.style.js +13 -0
  21. package/build/cjs/components/DataDimension/Calculation/styles/DataElementSelector.style.js +13 -0
  22. package/build/cjs/components/DataDimension/Calculation/styles/DraggingItem.style.js +13 -0
  23. package/build/cjs/components/DataDimension/Calculation/styles/DropZone.style.js +13 -0
  24. package/build/cjs/components/DataDimension/Calculation/styles/FormulaField.style.js +13 -0
  25. package/build/cjs/components/DataDimension/Calculation/styles/FormulaItem.style.js +13 -0
  26. package/build/cjs/components/DataDimension/Calculation/styles/MathOperatorSelector.style.js +13 -0
  27. package/build/cjs/components/DataDimension/Calculation/styles/Operator.style.js +13 -0
  28. package/build/cjs/components/DataDimension/DataDimension.js +22 -6
  29. package/build/cjs/components/DataDimension/DataTypeSelector.js +5 -3
  30. package/build/cjs/components/DataDimension/ItemSelector.js +111 -73
  31. package/build/cjs/components/TransferOption.js +13 -4
  32. package/build/cjs/components/styles/DimensionSelector.style.js +2 -2
  33. package/build/cjs/components/styles/TransferOption.style.js +2 -2
  34. package/build/cjs/index.js +6 -0
  35. package/build/cjs/locales/en/translations.json +32 -7
  36. package/build/cjs/modules/__tests__/expressions.spec.js +139 -0
  37. package/build/cjs/modules/__tests__/hash.spec.js +92 -0
  38. package/build/cjs/modules/__tests__/parseExpression.spec.js +46 -0
  39. package/build/cjs/modules/dataTypes.js +8 -1
  40. package/build/cjs/modules/dimensionListItem.js +82 -0
  41. package/build/cjs/modules/expressions.js +164 -0
  42. package/build/cjs/modules/hash.js +28 -0
  43. package/build/es/__demo__/CalculationModal.stories.js +440 -0
  44. package/build/es/api/analytics/AnalyticsRequest.js +11 -1
  45. package/build/es/api/dimensions.js +1 -1
  46. package/build/es/api/expression.js +57 -0
  47. package/build/es/assets/DimensionItemIcons/CalculationIcon.js +13 -0
  48. package/build/es/assets/FormulaIcon.js +30 -0
  49. package/build/es/components/DataDimension/Calculation/CalculationModal.js +418 -0
  50. package/build/es/components/DataDimension/Calculation/DataElementOption.js +60 -0
  51. package/build/es/components/DataDimension/Calculation/DataElementSelector.js +280 -0
  52. package/build/es/components/DataDimension/Calculation/DndContext.js +194 -0
  53. package/build/es/components/DataDimension/Calculation/DragHandleIcon.js +11 -0
  54. package/build/es/components/DataDimension/Calculation/DraggingItem.js +40 -0
  55. package/build/es/components/DataDimension/Calculation/DropZone.js +43 -0
  56. package/build/es/components/DataDimension/Calculation/FormulaField.js +98 -0
  57. package/build/es/components/DataDimension/Calculation/FormulaItem.js +207 -0
  58. package/build/es/components/DataDimension/Calculation/MathOperatorSelector.js +41 -0
  59. package/build/es/components/DataDimension/Calculation/Operator.js +64 -0
  60. package/build/es/components/DataDimension/Calculation/styles/CalculationModal.style.js +4 -0
  61. package/build/es/components/DataDimension/Calculation/styles/DataElementOption.style.js +4 -0
  62. package/build/es/components/DataDimension/Calculation/styles/DataElementSelector.style.js +4 -0
  63. package/build/es/components/DataDimension/Calculation/styles/DraggingItem.style.js +4 -0
  64. package/build/es/components/DataDimension/Calculation/styles/DropZone.style.js +4 -0
  65. package/build/es/components/DataDimension/Calculation/styles/FormulaField.style.js +4 -0
  66. package/build/es/components/DataDimension/Calculation/styles/FormulaItem.style.js +4 -0
  67. package/build/es/components/DataDimension/Calculation/styles/MathOperatorSelector.style.js +4 -0
  68. package/build/es/components/DataDimension/Calculation/styles/Operator.style.js +4 -0
  69. package/build/es/components/DataDimension/DataDimension.js +21 -6
  70. package/build/es/components/DataDimension/DataTypeSelector.js +6 -4
  71. package/build/es/components/DataDimension/ItemSelector.js +111 -73
  72. package/build/es/components/TransferOption.js +14 -5
  73. package/build/es/components/styles/DimensionSelector.style.js +2 -2
  74. package/build/es/components/styles/TransferOption.style.js +2 -2
  75. package/build/es/index.js +1 -1
  76. package/build/es/locales/en/translations.json +32 -7
  77. package/build/es/modules/__tests__/expressions.spec.js +136 -0
  78. package/build/es/modules/__tests__/hash.spec.js +88 -0
  79. package/build/es/modules/__tests__/parseExpression.spec.js +43 -0
  80. package/build/es/modules/dataTypes.js +6 -0
  81. package/build/es/modules/dimensionListItem.js +61 -0
  82. package/build/es/modules/expressions.js +131 -0
  83. package/build/es/modules/hash.js +12 -0
  84. package/package.json +6 -1
@@ -0,0 +1,447 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _style = _interopRequireDefault(require("styled-jsx/style"));
9
+
10
+ var _appRuntime = require("@dhis2/app-runtime");
11
+
12
+ var _ui = require("@dhis2/ui");
13
+
14
+ var _classnames = _interopRequireDefault(require("classnames"));
15
+
16
+ var _propTypes = _interopRequireDefault(require("prop-types"));
17
+
18
+ var _react = _interopRequireWildcard(require("react"));
19
+
20
+ var _expression = require("../../../api/expression.js");
21
+
22
+ var _index = _interopRequireDefault(require("../../../locales/index.js"));
23
+
24
+ var _expressions = require("../../../modules/expressions.js");
25
+
26
+ var _OfflineTooltip = require("../../OfflineTooltip.js");
27
+
28
+ var _DataElementSelector = _interopRequireDefault(require("./DataElementSelector.js"));
29
+
30
+ var _DndContext = _interopRequireWildcard(require("./DndContext.js"));
31
+
32
+ var _FormulaField = _interopRequireWildcard(require("./FormulaField.js"));
33
+
34
+ var _MathOperatorSelector = _interopRequireDefault(require("./MathOperatorSelector.js"));
35
+
36
+ var _CalculationModalStyle = _interopRequireDefault(require("./styles/CalculationModal.style.js"));
37
+
38
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
39
+
40
+ 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; }
41
+
42
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
43
+
44
+ const FIRST_POSITION = 0;
45
+ const LAST_POSITION = -1;
46
+
47
+ const CalculationModal = _ref => {
48
+ let {
49
+ calculation,
50
+ onSave,
51
+ onClose,
52
+ onDelete,
53
+ displayNameProp
54
+ } = _ref;
55
+ const {
56
+ show: showError
57
+ } = (0, _appRuntime.useAlert)(error => error, {
58
+ critical: true
59
+ });
60
+ const mutationParams = {
61
+ onError: error => showError(error)
62
+ };
63
+ const [createCalculation, {
64
+ loading: isCreatingCalculation
65
+ }] = (0, _appRuntime.useDataMutation)(_expression.createCalculationMutation, mutationParams);
66
+ const [updateCalculation, {
67
+ loading: isUpdatingCalculation
68
+ }] = (0, _appRuntime.useDataMutation)(_expression.updateCalculationMutation, mutationParams);
69
+ const [deleteCalculation, {
70
+ loading: isDeletingCalculation
71
+ }] = (0, _appRuntime.useDataMutation)(_expression.deleteCalculationMutation, mutationParams);
72
+ const [doBackendValidation, {
73
+ loading: isValidating
74
+ }] = (0, _appRuntime.useDataMutation)(_expression.validateExpressionMutation, {
75
+ onError: error => showError(error)
76
+ });
77
+ const query = {
78
+ dataElements: {
79
+ resource: 'dataElements',
80
+ params: _ref2 => {
81
+ let {
82
+ ids = []
83
+ } = _ref2;
84
+ return {
85
+ fields: "id,".concat(displayNameProp, "~rename(name)"),
86
+ filter: "id:in:[".concat(ids.join(','), "]"),
87
+ paging: false
88
+ };
89
+ }
90
+ },
91
+ dataElementOperands: {
92
+ resource: 'dataElementOperands',
93
+ params: _ref3 => {
94
+ let {
95
+ ids = []
96
+ } = _ref3;
97
+ return {
98
+ fields: "id,".concat(displayNameProp, "~rename(name)"),
99
+ filter: "id:in:[".concat(ids.join(','), "]"),
100
+ paging: false
101
+ };
102
+ }
103
+ }
104
+ };
105
+ const {
106
+ data,
107
+ refetch
108
+ } = (0, _appRuntime.useDataQuery)(query, {
109
+ lazy: true
110
+ });
111
+ (0, _react.useEffect)(() => {
112
+ const ids = (0, _expressions.getItemIdsFromExpression)(calculation.expression); // only fetch data if there are ids
113
+
114
+ if (ids !== null && ids !== void 0 && ids.length) {
115
+ refetch({
116
+ ids
117
+ });
118
+ } else {
119
+ setExpressionArray((0, _expressions.parseExpressionToArray)(calculation.expression).map((item, i) => ({ ...item,
120
+ id: "".concat(item.type, "-").concat(-i)
121
+ })));
122
+ }
123
+ }, [refetch, calculation.expression]);
124
+ (0, _react.useEffect)(() => {
125
+ if (data) {
126
+ var _data$dataElements, _data$dataElementOper;
127
+
128
+ const metadata = [...(((_data$dataElements = data.dataElements) === null || _data$dataElements === void 0 ? void 0 : _data$dataElements.dataElements) || []), ...(((_data$dataElementOper = data.dataElementOperands) === null || _data$dataElementOper === void 0 ? void 0 : _data$dataElementOper.dataElementOperands) || [])];
129
+ setExpressionArray((0, _expressions.parseExpressionToArray)(calculation.expression, metadata).map((item, i) => ({ ...item,
130
+ id: "".concat(item.type, "-").concat(-i)
131
+ })));
132
+ }
133
+ }, [data, calculation.expression]);
134
+ const [newIdCount, setNewIdCount] = (0, _react.useState)(1);
135
+ const [validationOutput, setValidationOutput] = (0, _react.useState)(null);
136
+ const [expressionArray, setExpressionArray] = (0, _react.useState)();
137
+ const [name, setName] = (0, _react.useState)(calculation.name);
138
+ const [showDeletePrompt, setShowDeletePrompt] = (0, _react.useState)(false);
139
+ const [isSavingCalculation, setIsSavingCalculation] = (0, _react.useState)();
140
+ const [focusItemId, setFocusItemId] = (0, _react.useState)(null);
141
+ const [selectedItemId, setSelectedItemId] = (0, _react.useState)(null);
142
+ const expressionStatus = validationOutput === null || validationOutput === void 0 ? void 0 : validationOutput.status;
143
+
144
+ const selectItem = itemId => setSelectedItemId(prevSelected => prevSelected !== itemId ? itemId : null);
145
+
146
+ const isLoading = isCreatingCalculation || isUpdatingCalculation || isDeletingCalculation || isSavingCalculation || isValidating;
147
+
148
+ const addItem = _ref4 => {
149
+ let {
150
+ label,
151
+ value,
152
+ type,
153
+ destIndex = LAST_POSITION
154
+ } = _ref4;
155
+
156
+ if (isLoading) {
157
+ return null;
158
+ }
159
+
160
+ setValidationOutput();
161
+ const newItem = {
162
+ id: "".concat(type, "-").concat(newIdCount),
163
+ value: type === _expressions.EXPRESSION_TYPE_DATA ? "#{".concat(value, "}") : value,
164
+ label,
165
+ type
166
+ };
167
+ setNewIdCount(newIdCount + 1);
168
+
169
+ if (destIndex === LAST_POSITION) {
170
+ setExpressionArray(prevArray => prevArray.concat([newItem]));
171
+ } else if (destIndex === FIRST_POSITION) {
172
+ setExpressionArray(prevArray => [newItem].concat(prevArray));
173
+ } else {
174
+ const items = Array.from(expressionArray);
175
+ const newFormulaItems = [...items.slice(0, destIndex), newItem, ...items.slice(destIndex)];
176
+ setExpressionArray(newFormulaItems);
177
+ }
178
+
179
+ if (newItem.type === _expressions.EXPRESSION_TYPE_NUMBER) {
180
+ setFocusItemId(newItem.id);
181
+ }
182
+ };
183
+
184
+ const moveItem = _ref5 => {
185
+ let {
186
+ sourceIndex,
187
+ destIndex
188
+ } = _ref5;
189
+
190
+ if (isLoading) {
191
+ return null;
192
+ }
193
+
194
+ setValidationOutput();
195
+ const sourceList = Array.from(expressionArray);
196
+ const [moved] = sourceList.splice(sourceIndex, 1);
197
+ sourceList.splice(destIndex, 0, moved);
198
+ setExpressionArray(sourceList);
199
+ };
200
+
201
+ const setItemValue = _ref6 => {
202
+ let {
203
+ itemId,
204
+ value
205
+ } = _ref6;
206
+ const updatedItems = expressionArray.map(item => item.id === itemId ? Object.assign({}, item, {
207
+ value
208
+ }) : item);
209
+ setExpressionArray(updatedItems);
210
+ };
211
+
212
+ const removeItem = itemId => {
213
+ if (!isLoading && itemId !== null) {
214
+ setValidationOutput();
215
+ const index = expressionArray.findIndex(item => item.id === itemId);
216
+ const sourceList = Array.from(expressionArray);
217
+ sourceList.splice(index, 1);
218
+ setExpressionArray(sourceList);
219
+ setSelectedItemId(null);
220
+ }
221
+ };
222
+
223
+ const addOrMoveDraggedItem = _ref7 => {
224
+ let {
225
+ item,
226
+ destination
227
+ } = _ref7;
228
+ const destContainerId = destination.containerId;
229
+ let destIndex = FIRST_POSITION;
230
+
231
+ if (item.sourceContainerId === _DndContext.OPTIONS_PANEL) {
232
+ if (destContainerId === _FormulaField.LAST_DROPZONE_ID) {
233
+ destIndex = LAST_POSITION;
234
+ } else if (destContainerId === _FormulaField.FORMULA_BOX_ID) {
235
+ destIndex = destination.index + 1;
236
+ }
237
+
238
+ addItem({ ...item.data,
239
+ destIndex
240
+ });
241
+ } else {
242
+ if (destContainerId === _FormulaField.LAST_DROPZONE_ID) {
243
+ destIndex = expressionArray.length;
244
+ } else if (destContainerId === _FormulaField.FORMULA_BOX_ID) {
245
+ destIndex = destination.index;
246
+ }
247
+
248
+ moveItem({
249
+ sourceIndex: item.sourceIndex,
250
+ destIndex
251
+ });
252
+ }
253
+ };
254
+
255
+ const validate = async () => {
256
+ var _result;
257
+
258
+ setValidationOutput();
259
+ const expression = (0, _expressions.parseArrayToExpression)(expressionArray);
260
+ let result = (0, _expressions.validateExpression)(expression);
261
+
262
+ if (!result) {
263
+ result = await doBackendValidation({
264
+ expression
265
+ });
266
+ }
267
+
268
+ setValidationOutput(result);
269
+ return (_result = result) === null || _result === void 0 ? void 0 : _result.status;
270
+ };
271
+
272
+ const onSaveClick = async () => {
273
+ setIsSavingCalculation(true);
274
+ let status = expressionStatus;
275
+
276
+ if (status !== _expressions.VALID_EXPRESSION) {
277
+ status = await validate();
278
+ }
279
+
280
+ if (status === _expressions.VALID_EXPRESSION) {
281
+ var _response;
282
+
283
+ let response;
284
+ const expression = (0, _expressions.parseArrayToExpression)(expressionArray);
285
+
286
+ if (calculation.id) {
287
+ response = await updateCalculation({
288
+ id: calculation.id,
289
+ name,
290
+ expression
291
+ });
292
+ } else {
293
+ response = await createCalculation({
294
+ name,
295
+ expression
296
+ });
297
+ }
298
+
299
+ onSave({
300
+ id: calculation.id || ((_response = response) === null || _response === void 0 ? void 0 : _response.response.uid),
301
+ name,
302
+ isNew: !calculation.id,
303
+ expression
304
+ });
305
+ }
306
+
307
+ setIsSavingCalculation(false);
308
+ };
309
+
310
+ const onDeleteClick = async () => {
311
+ setShowDeletePrompt();
312
+ await deleteCalculation({
313
+ id: calculation.id
314
+ });
315
+ onDelete({
316
+ id: calculation.id
317
+ });
318
+ };
319
+
320
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ui.Modal, {
321
+ dataTest: "calculation-modal",
322
+ position: "top",
323
+ large: true
324
+ }, /*#__PURE__*/_react.default.createElement(_ui.ModalTitle, {
325
+ dataTest: "calculation-modal-title"
326
+ }, calculation.id ? _index.default.t('Data / Edit calculation') : _index.default.t('Data / New calculation')), /*#__PURE__*/_react.default.createElement(_ui.ModalContent, {
327
+ dataTest: "calculation-modal-content"
328
+ }, /*#__PURE__*/_react.default.createElement(_DndContext.default, {
329
+ onDragStart: () => setFocusItemId(null),
330
+ onDragEnd: addOrMoveDraggedItem
331
+ }, /*#__PURE__*/_react.default.createElement("div", {
332
+ className: "jsx-".concat(_CalculationModalStyle.default.__hash) + " " + "content"
333
+ }, /*#__PURE__*/_react.default.createElement("div", {
334
+ className: "jsx-".concat(_CalculationModalStyle.default.__hash) + " " + "left-section"
335
+ }, /*#__PURE__*/_react.default.createElement(_DataElementSelector.default, {
336
+ displayNameProp: displayNameProp,
337
+ onDoubleClick: addItem
338
+ }), /*#__PURE__*/_react.default.createElement(_MathOperatorSelector.default, {
339
+ onDoubleClick: addItem
340
+ })), /*#__PURE__*/_react.default.createElement("div", {
341
+ className: "jsx-".concat(_CalculationModalStyle.default.__hash) + " " + "right-section"
342
+ }, /*#__PURE__*/_react.default.createElement(_FormulaField.default, {
343
+ items: expressionArray,
344
+ selectedItemId: selectedItemId,
345
+ focusItemId: focusItemId,
346
+ onChange: setItemValue,
347
+ onClick: selectItem,
348
+ onDoubleClick: removeItem,
349
+ loading: !expressionArray,
350
+ disabled: isLoading
351
+ }), /*#__PURE__*/_react.default.createElement("div", {
352
+ className: "jsx-".concat(_CalculationModalStyle.default.__hash) + " " + "actions-wrapper"
353
+ }, /*#__PURE__*/_react.default.createElement("div", {
354
+ className: "jsx-".concat(_CalculationModalStyle.default.__hash) + " " + "button-container"
355
+ }, /*#__PURE__*/_react.default.createElement("div", {
356
+ className: "jsx-".concat(_CalculationModalStyle.default.__hash) + " " + "remove-button"
357
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
358
+ small: true,
359
+ secondary: true,
360
+ onClick: () => removeItem(selectedItemId),
361
+ dataTest: "remove-button",
362
+ disabled: !selectedItemId
363
+ }, _index.default.t('Remove item'))), /*#__PURE__*/_react.default.createElement("div", {
364
+ className: "jsx-".concat(_CalculationModalStyle.default.__hash) + " " + "validate-button"
365
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
366
+ small: true,
367
+ secondary: true,
368
+ onClick: validate,
369
+ dataTest: "validate-button",
370
+ loading: isValidating,
371
+ disabled: isLoading
372
+ }, _index.default.t('Check formula')))), /*#__PURE__*/_react.default.createElement("span", {
373
+ "data-test": "validation-message",
374
+ className: "jsx-".concat(_CalculationModalStyle.default.__hash) + " " + ((0, _classnames.default)('validation-message', {
375
+ 'validation-error': expressionStatus === _expressions.INVALID_EXPRESSION,
376
+ 'validation-success': expressionStatus === _expressions.VALID_EXPRESSION
377
+ }) || "")
378
+ }, validationOutput === null || validationOutput === void 0 ? void 0 : validationOutput.message), /*#__PURE__*/_react.default.createElement("div", {
379
+ className: "jsx-".concat(_CalculationModalStyle.default.__hash) + " " + "name-input"
380
+ }, /*#__PURE__*/_react.default.createElement(_ui.InputField, {
381
+ label: _index.default.t('Calculation name'),
382
+ helpText: _index.default.t('Shown in table headers and chart axes/legends'),
383
+ onChange: _ref8 => {
384
+ let {
385
+ value
386
+ } = _ref8;
387
+ return setName(value.substr(0, 50));
388
+ },
389
+ value: name,
390
+ dataTest: "calculation-label",
391
+ dense: true
392
+ }))))))), /*#__PURE__*/_react.default.createElement(_ui.ModalActions, {
393
+ dataTest: "calculation-modal-actions"
394
+ }, /*#__PURE__*/_react.default.createElement(_ui.ButtonStrip, null, calculation.id && /*#__PURE__*/_react.default.createElement("div", {
395
+ className: "jsx-".concat(_CalculationModalStyle.default.__hash) + " " + "delete-button"
396
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
397
+ secondary: true,
398
+ onClick: () => setShowDeletePrompt(true),
399
+ dataTest: "delete-button",
400
+ loading: isDeletingCalculation,
401
+ disabled: isUpdatingCalculation
402
+ }, _index.default.t('Delete calculation'))), /*#__PURE__*/_react.default.createElement(_ui.Button, {
403
+ secondary: true,
404
+ onClick: onClose,
405
+ disabled: isLoading,
406
+ dataTest: "cancel-button"
407
+ }, _index.default.t('Cancel')), /*#__PURE__*/_react.default.createElement(_OfflineTooltip.OfflineTooltip, {
408
+ content: expressionStatus === _expressions.INVALID_EXPRESSION ? _index.default.t('The calculation can only be saved with a valid formula') : _index.default.t('Add a name to save this calculation'),
409
+ disabled: expressionStatus === _expressions.INVALID_EXPRESSION || !name,
410
+ disabledWhenOffline: false
411
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
412
+ primary: true,
413
+ onClick: onSaveClick,
414
+ disabled: expressionStatus === _expressions.INVALID_EXPRESSION || !name || isDeletingCalculation || isValidating,
415
+ loading: isCreatingCalculation || isUpdatingCalculation || isSavingCalculation,
416
+ dataTest: "save-button"
417
+ }, _index.default.t('Save calculation')))))), showDeletePrompt && /*#__PURE__*/_react.default.createElement(_ui.Modal, {
418
+ small: true
419
+ }, /*#__PURE__*/_react.default.createElement(_ui.ModalTitle, null, _index.default.t('Delete calculation')), /*#__PURE__*/_react.default.createElement(_ui.ModalContent, null, _index.default.t('Are you sure you want to delete this calculation? It may be used by other visualizations.')), /*#__PURE__*/_react.default.createElement(_ui.ModalActions, null, /*#__PURE__*/_react.default.createElement(_ui.ButtonStrip, {
420
+ end: true
421
+ }, /*#__PURE__*/_react.default.createElement(_ui.Button, {
422
+ secondary: true,
423
+ onClick: () => setShowDeletePrompt()
424
+ }, _index.default.t('Cancel')), /*#__PURE__*/_react.default.createElement(_ui.Button, {
425
+ onClick: onDeleteClick,
426
+ destructive: true
427
+ }, _index.default.t('Yes, delete'))))), /*#__PURE__*/_react.default.createElement(_style.default, {
428
+ id: _CalculationModalStyle.default.__hash
429
+ }, _CalculationModalStyle.default));
430
+ };
431
+
432
+ CalculationModal.propTypes = {
433
+ displayNameProp: _propTypes.default.string.isRequired,
434
+ onClose: _propTypes.default.func.isRequired,
435
+ onDelete: _propTypes.default.func.isRequired,
436
+ onSave: _propTypes.default.func.isRequired,
437
+ calculation: _propTypes.default.shape({
438
+ expression: _propTypes.default.string,
439
+ id: _propTypes.default.string,
440
+ name: _propTypes.default.string
441
+ })
442
+ };
443
+ CalculationModal.defaultProps = {
444
+ calculation: {}
445
+ };
446
+ var _default = CalculationModal;
447
+ exports.default = _default;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _style = _interopRequireDefault(require("styled-jsx/style"));
9
+
10
+ var _sortable = require("@dnd-kit/sortable");
11
+
12
+ var _utilities = require("@dnd-kit/utilities");
13
+
14
+ var _propTypes = _interopRequireDefault(require("prop-types"));
15
+
16
+ var _react = _interopRequireDefault(require("react"));
17
+
18
+ var _dataTypes = require("../../../modules/dataTypes.js");
19
+
20
+ var _dimensionListItem = require("../../../modules/dimensionListItem.js");
21
+
22
+ var _expressions = require("../../../modules/expressions.js");
23
+
24
+ var _DataElementOptionStyle = _interopRequireDefault(require("./styles/DataElementOption.style.js"));
25
+
26
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
+
28
+ function _extends() { _extends = Object.assign || 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); }
29
+
30
+ const DataElementOption = _ref => {
31
+ let {
32
+ label,
33
+ value,
34
+ onDoubleClick
35
+ } = _ref;
36
+ const data = {
37
+ label,
38
+ value,
39
+ type: _expressions.EXPRESSION_TYPE_DATA
40
+ };
41
+ const {
42
+ attributes,
43
+ listeners,
44
+ setNodeRef,
45
+ transform
46
+ } = (0, _sortable.useSortable)({
47
+ id: value,
48
+ data
49
+ });
50
+ const style = {
51
+ transform: _utilities.CSS.Translate.toString(transform)
52
+ };
53
+ return /*#__PURE__*/_react.default.createElement("div", {
54
+ className: "jsx-".concat(_DataElementOptionStyle.default.__hash) + " " + "wrapper"
55
+ }, /*#__PURE__*/_react.default.createElement("div", _extends({}, attributes, listeners, {
56
+ ref: setNodeRef,
57
+ style: style,
58
+ className: "jsx-".concat(_DataElementOptionStyle.default.__hash) + " " + (listeners && listeners.className != null && listeners.className || attributes && attributes.className != null && attributes.className || "draggable-item")
59
+ }), /*#__PURE__*/_react.default.createElement("div", {
60
+ onDoubleClick: () => onDoubleClick(data),
61
+ className: "jsx-".concat(_DataElementOptionStyle.default.__hash) + " " + "chip"
62
+ }, /*#__PURE__*/_react.default.createElement("span", {
63
+ className: "jsx-".concat(_DataElementOptionStyle.default.__hash) + " " + "icon"
64
+ }, (0, _dimensionListItem.getIcon)(_dataTypes.DIMENSION_TYPE_DATA_ELEMENT)), /*#__PURE__*/_react.default.createElement("span", {
65
+ className: "jsx-".concat(_DataElementOptionStyle.default.__hash) + " " + "label"
66
+ }, label))), /*#__PURE__*/_react.default.createElement(_style.default, {
67
+ id: _DataElementOptionStyle.default.__hash
68
+ }, _DataElementOptionStyle.default));
69
+ };
70
+
71
+ DataElementOption.propTypes = {
72
+ label: _propTypes.default.string,
73
+ value: _propTypes.default.string,
74
+ onDoubleClick: _propTypes.default.func
75
+ };
76
+ var _default = DataElementOption;
77
+ exports.default = _default;